blob: 46f39dd016fd2993bd365aa689fab0f4c5b43080 [file] [log] [blame]
Chiachang Wang5b710612020-03-13 16:37:04 +08001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.net
18
19import android.net.InvalidPacketException.ERROR_INVALID_IP_ADDRESS
20import android.net.InvalidPacketException.ERROR_INVALID_PORT
21import android.net.NattSocketKeepalive.NATT_PORT
22import android.os.Build
23import androidx.test.filters.SmallTest
24import androidx.test.runner.AndroidJUnit4
25import com.android.testutils.assertEqualBothWays
26import com.android.testutils.assertFieldCountEquals
27import com.android.testutils.assertParcelSane
28import com.android.testutils.DevSdkIgnoreRule
29import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
30import com.android.testutils.parcelingRoundTrip
31import java.net.InetAddress
32import org.junit.Assert.assertEquals
33import org.junit.Assert.assertNotEquals
34import org.junit.Assert.fail
35import org.junit.Rule
36import org.junit.Test
37import org.junit.runner.RunWith
38
39@RunWith(AndroidJUnit4::class)
40@SmallTest
41class NattKeepalivePacketDataTest {
42 @Rule @JvmField
43 val ignoreRule: DevSdkIgnoreRule = DevSdkIgnoreRule()
44
45 /* Refer to the definition in {@code NattKeepalivePacketData} */
46 private val IPV4_HEADER_LENGTH = 20
47 private val UDP_HEADER_LENGTH = 8
48
49 private val TEST_PORT = 4243
50 private val TEST_PORT2 = 4244
51 private val TEST_SRC_ADDRV4 = "198.168.0.2".address()
52 private val TEST_DST_ADDRV4 = "198.168.0.1".address()
53 private val TEST_ADDRV6 = "2001:db8::1".address()
54
55 private fun String.address() = InetAddresses.parseNumericAddress(this)
56 private fun nattKeepalivePacket(
57 srcAddress: InetAddress? = TEST_SRC_ADDRV4,
58 srcPort: Int = TEST_PORT,
59 dstAddress: InetAddress? = TEST_DST_ADDRV4,
60 dstPort: Int = NATT_PORT
61 ) = NattKeepalivePacketData.nattKeepalivePacket(srcAddress, srcPort, dstAddress, dstPort)
62
63 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
64 fun testConstructor() {
65 try {
66 nattKeepalivePacket(dstPort = TEST_PORT)
67 fail("Dst port is not NATT port should cause exception")
68 } catch (e: InvalidPacketException) {
69 assertEquals(e.error, ERROR_INVALID_PORT)
70 }
71
72 try {
73 nattKeepalivePacket(srcAddress = TEST_ADDRV6)
74 fail("A v6 srcAddress should cause exception")
75 } catch (e: InvalidPacketException) {
76 assertEquals(e.error, ERROR_INVALID_IP_ADDRESS)
77 }
78
79 try {
80 nattKeepalivePacket(dstAddress = TEST_ADDRV6)
81 fail("A v6 dstAddress should cause exception")
82 } catch (e: InvalidPacketException) {
83 assertEquals(e.error, ERROR_INVALID_IP_ADDRESS)
84 }
85
86 try {
87 parcelingRoundTrip(
88 NattKeepalivePacketData(TEST_SRC_ADDRV4, TEST_PORT, TEST_DST_ADDRV4, TEST_PORT,
89 byteArrayOf(12, 31, 22, 44)))
90 fail("Invalid data should cause exception")
91 } catch (e: IllegalArgumentException) { }
92 }
93
94 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
95 fun testParcel() {
96 assertParcelSane(nattKeepalivePacket(), 0)
97 }
98
99 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
100 fun testEquals() {
101 assertEqualBothWays(nattKeepalivePacket(), nattKeepalivePacket())
102 assertNotEquals(nattKeepalivePacket(dstAddress = TEST_SRC_ADDRV4), nattKeepalivePacket())
103 assertNotEquals(nattKeepalivePacket(srcAddress = TEST_DST_ADDRV4), nattKeepalivePacket())
104 // Test src port only because dst port have to be NATT_PORT
105 assertNotEquals(nattKeepalivePacket(srcPort = TEST_PORT2), nattKeepalivePacket())
106 // Make sure the parceling test is updated if fields are added in the base class.
107 assertFieldCountEquals(5, KeepalivePacketData::class.java)
108 }
109
110 @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
111 fun testHashCode() {
112 assertEquals(nattKeepalivePacket().hashCode(), nattKeepalivePacket().hashCode())
113 }
114}