1 /*
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 package android.net
17 
18 import android.net.InvalidPacketException.ERROR_INVALID_IP_ADDRESS
19 import android.net.InvalidPacketException.ERROR_INVALID_PORT
20 import android.os.Build
21 import androidx.test.filters.SmallTest
22 import androidx.test.runner.AndroidJUnit4
23 import com.android.testutils.DevSdkIgnoreRule
24 import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
25 import java.net.InetAddress
26 import java.util.Arrays
27 import org.junit.Assert.assertEquals
28 import org.junit.Assert.assertTrue
29 import org.junit.Assert.fail
30 import org.junit.Rule
31 import org.junit.Test
32 import org.junit.runner.RunWith
33 
34 @RunWith(AndroidJUnit4::class)
35 @SmallTest
36 class KeepalivePacketDataTest {
37     @Rule @JvmField
38     val ignoreRule: DevSdkIgnoreRule = DevSdkIgnoreRule()
39 
40     private val INVALID_PORT = 65537
41     private val TEST_DST_PORT = 4244
42     private val TEST_SRC_PORT = 4243
43 
44     private val TESTBYTES = byteArrayOf(12, 31, 22, 44)
45     private val TEST_SRC_ADDRV4 = "198.168.0.2".address()
46     private val TEST_DST_ADDRV4 = "198.168.0.1".address()
47     private val TEST_ADDRV6 = "2001:db8::1".address()
48 
49     private fun String.address() = InetAddresses.parseNumericAddress(this)
50 
51     // Add for test because constructor of KeepalivePacketData is protected.
52     private inner class TestKeepalivePacketData(
53         srcAddress: InetAddress? = TEST_SRC_ADDRV4,
54         srcPort: Int = TEST_SRC_PORT,
55         dstAddress: InetAddress? = TEST_DST_ADDRV4,
56         dstPort: Int = TEST_DST_PORT,
57         data: ByteArray = TESTBYTES
58     ) : KeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, data)
59 
60     @Test
61     @IgnoreUpTo(Build.VERSION_CODES.Q)
62     fun testConstructor() {
63         var data: TestKeepalivePacketData
64 
65         try {
66             data = TestKeepalivePacketData(srcAddress = null)
67             fail("Null src address should cause exception")
68         } catch (e: InvalidPacketException) {
69             assertEquals(e.error, ERROR_INVALID_IP_ADDRESS)
70         }
71 
72         try {
73             data = TestKeepalivePacketData(dstAddress = null)
74             fail("Null dst address should cause exception")
75         } catch (e: InvalidPacketException) {
76             assertEquals(e.error, ERROR_INVALID_IP_ADDRESS)
77         }
78 
79         try {
80             data = TestKeepalivePacketData(dstAddress = TEST_ADDRV6)
81             fail("Ip family mismatched should cause exception")
82         } catch (e: InvalidPacketException) {
83             assertEquals(e.error, ERROR_INVALID_IP_ADDRESS)
84         }
85 
86         try {
87             data = TestKeepalivePacketData(srcPort = INVALID_PORT)
88             fail("Invalid srcPort should cause exception")
89         } catch (e: InvalidPacketException) {
90             assertEquals(e.error, ERROR_INVALID_PORT)
91         }
92 
93         try {
94             data = TestKeepalivePacketData(dstPort = INVALID_PORT)
95             fail("Invalid dstPort should cause exception")
96         } catch (e: InvalidPacketException) {
97             assertEquals(e.error, ERROR_INVALID_PORT)
98         }
99     }
100 
101     @Test
102     @IgnoreUpTo(Build.VERSION_CODES.Q)
103     fun testSrcAddress() = assertEquals(TEST_SRC_ADDRV4, TestKeepalivePacketData().srcAddress)
104 
105     @Test
106     @IgnoreUpTo(Build.VERSION_CODES.Q)
107     fun testDstAddress() = assertEquals(TEST_DST_ADDRV4, TestKeepalivePacketData().dstAddress)
108 
109     @Test
110     @IgnoreUpTo(Build.VERSION_CODES.Q)
111     fun testSrcPort() = assertEquals(TEST_SRC_PORT, TestKeepalivePacketData().srcPort)
112 
113     @Test
114     @IgnoreUpTo(Build.VERSION_CODES.Q)
115     fun testDstPort() = assertEquals(TEST_DST_PORT, TestKeepalivePacketData().dstPort)
116 
117     @Test
118     @IgnoreUpTo(Build.VERSION_CODES.Q)
119     fun testPacket() = assertTrue(Arrays.equals(TESTBYTES, TestKeepalivePacketData().packet))
120 }