summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2021-03-16 00:14:48 +0900
committerLorenzo Colitti <lorenzo@google.com>2021-03-16 00:14:48 +0900
commit98ff7450abb148ce896d1a0ec2f7527d7e60dc4c (patch)
treef44e648ccfed9262e20f3f0410878ade132d3f87 /common
parent928d2d4e32b46d1847f19e59550c5fdbc141b2aa (diff)
downloadnet-98ff7450abb148ce896d1a0ec2f7527d7e60dc4c.tar.gz
Add a simple test for Ipv6Utils.
This will increase test coverage numbers for Tethering until TetheringPrivilegedTests can be put into coverage runs. Bug: 182785371 Test: atest NetworkStaticLibTests Change-Id: Id93e6190e76bfacfe17082848d40f161b3fcab6a
Diffstat (limited to 'common')
-rw-r--r--common/tests/unit/src/com/android/net/module/util/Ipv6UtilsTest.java134
1 files changed, 134 insertions, 0 deletions
diff --git a/common/tests/unit/src/com/android/net/module/util/Ipv6UtilsTest.java b/common/tests/unit/src/com/android/net/module/util/Ipv6UtilsTest.java
new file mode 100644
index 00000000..37278b3d
--- /dev/null
+++ b/common/tests/unit/src/com/android/net/module/util/Ipv6UtilsTest.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.net.module.util;
+
+import static org.junit.Assert.assertEquals;
+
+import android.net.InetAddresses;
+import android.net.IpPrefix;
+import android.net.MacAddress;
+import android.system.OsConstants;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.net.module.util.structs.EthernetHeader;
+import com.android.net.module.util.structs.Icmpv6Header;
+import com.android.net.module.util.structs.Ipv6Header;
+import com.android.net.module.util.structs.PrefixInformationOption;
+import com.android.net.module.util.structs.RaHeader;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.net.Inet6Address;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class Ipv6UtilsTest {
+
+ private static final MacAddress MAC1 = MacAddress.fromString("11:22:33:44:55:66");
+ private static final MacAddress MAC2 = MacAddress.fromString("aa:bb:cc:dd:ee:ff");
+ private static final Inet6Address LINK_LOCAL = addr("fe80::1");
+ private static final Inet6Address ROUTER_LINK_LOCAL = addr("fe80::cafe:d00d");
+ private static final Inet6Address ALL_ROUTERS =
+ NetworkStackConstants.IPV6_ADDR_ALL_ROUTERS_MULTICAST;
+ private static final Inet6Address ALL_NODES =
+ NetworkStackConstants.IPV6_ADDR_ALL_NODES_MULTICAST;
+
+ @Test
+ public void testBuildRsPacket() {
+ ByteBuffer b = Ipv6Utils.buildRsPacket(MAC1, MAC2, LINK_LOCAL, ALL_ROUTERS /* no opts */);
+
+ EthernetHeader eth = Struct.parse(EthernetHeader.class, b);
+ assertEquals(MAC1, eth.srcMac);
+ assertEquals(MAC2, eth.dstMac);
+
+ Ipv6Header ipv6 = Struct.parse(Ipv6Header.class, b);
+ assertEquals(255, ipv6.hopLimit);
+ assertEquals(OsConstants.IPPROTO_ICMPV6, ipv6.nextHeader);
+ assertEquals(LINK_LOCAL, ipv6.srcIp);
+ assertEquals(ALL_ROUTERS, ipv6.dstIp);
+
+ Icmpv6Header icmpv6 = Struct.parse(Icmpv6Header.class, b);
+ assertEquals(NetworkStackConstants.ICMPV6_ROUTER_SOLICITATION, icmpv6.type);
+ assertEquals(0, icmpv6.code);
+ }
+
+ @Test
+ public void testBuildRaPacket() {
+ final byte pioFlags =
+ NetworkStackConstants.PIO_FLAG_AUTONOMOUS | NetworkStackConstants.PIO_FLAG_ON_LINK;
+ ByteBuffer pio1 = PrefixInformationOption.build(new IpPrefix("2001:db8:1::/64"),
+ pioFlags, 3600 /* validLifetime */, 1800 /* preferredLifetime */);
+ ByteBuffer pio2 = PrefixInformationOption.build(new IpPrefix("fdcd:a17f:6502:1::/64"),
+ pioFlags, 86400 /* validLifetime */, 86400 /* preferredLifetime */);
+
+ ByteBuffer b = Ipv6Utils.buildRaPacket(MAC2, MAC1, ROUTER_LINK_LOCAL, ALL_NODES,
+ (byte) 0 /* flags */, 7200 /* lifetime */,
+ 30_000 /* reachableTime */, 750 /* retransTimer */,
+ pio1, pio2);
+
+ EthernetHeader eth = Struct.parse(EthernetHeader.class, b);
+ assertEquals(MAC2, eth.srcMac);
+ assertEquals(MAC1, eth.dstMac);
+
+ Ipv6Header ipv6 = Struct.parse(Ipv6Header.class, b);
+ assertEquals(255, ipv6.hopLimit);
+ assertEquals(OsConstants.IPPROTO_ICMPV6, ipv6.nextHeader);
+ assertEquals(ROUTER_LINK_LOCAL, ipv6.srcIp);
+ assertEquals(ALL_NODES, ipv6.dstIp);
+
+ Icmpv6Header icmpv6 = Struct.parse(Icmpv6Header.class, b);
+ assertEquals(NetworkStackConstants.ICMPV6_ROUTER_ADVERTISEMENT, icmpv6.type);
+ assertEquals(0, icmpv6.code);
+
+ RaHeader ra = Struct.parse(RaHeader.class, b);
+ assertEquals(0, ra.hopLimit); // Hop limit: unspecified.
+ assertEquals(0, ra.flags);
+ assertEquals(7200, ra.lifetime);
+ assertEquals(30_000, ra.reachableTime);
+ assertEquals(750, ra.retransTimer);
+
+ PrefixInformationOption pio = Struct.parse(PrefixInformationOption.class, b);
+ assertPioEquals(pio, "2001:db8:1::/64", pioFlags, 3600, 1800);
+ pio = Struct.parse(PrefixInformationOption.class, b);
+ assertPioEquals(pio, "fdcd:a17f:6502:1::/64", pioFlags, 86400, 86400);
+ }
+
+ private void assertPioEquals(PrefixInformationOption pio, String prefix, byte flags,
+ long valid, long preferred) {
+ assertEquals(NetworkStackConstants.ICMPV6_ND_OPTION_PIO, pio.type);
+ assertEquals(4, pio.length);
+ assertEquals(flags, pio.flags);
+ assertEquals(valid, pio.validLifetime);
+ assertEquals(preferred, pio.preferredLifetime);
+ IpPrefix expected = new IpPrefix(prefix);
+ IpPrefix actual = new IpPrefix(pio.prefix, pio.prefixLen);
+ assertEquals(expected, actual);
+ }
+
+ private static Inet6Address addr(String addr) {
+ return (Inet6Address) InetAddresses.parseNumericAddress(addr);
+ }
+
+ private byte[] slice(byte[] array, int length) {
+ return Arrays.copyOf(array, length);
+ }
+}