Add a test that checks the contents of DISCOVER packets.
Change-Id: I571d560cf7032babf7b7867ad748e2a896116ce7
diff --git a/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java b/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java
index 7e60bf1..2a967e6 100644
--- a/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java
+++ b/services/tests/servicestests/src/android/net/dhcp/DhcpPacketTest.java
@@ -29,6 +29,7 @@
import junit.framework.TestCase;
import libcore.util.HexEncoding;
+import java.util.Arrays;
import static android.net.dhcp.DhcpPacket.*;
@@ -47,6 +48,11 @@
return (Inet4Address) NetworkUtils.numericToInetAddress(addrString);
}
+ public void setUp() {
+ DhcpPacket.testOverrideVendorId = "android-dhcp-???";
+ DhcpPacket.testOverrideHostname = "android-01234567890abcde";
+ }
+
class TestDhcpPacket extends DhcpPacket {
private byte mType;
// TODO: Make this a map of option numbers to bytes instead.
@@ -584,4 +590,93 @@
assertDhcpResults("192.168.189.49/24", "192.168.189.1", "8.8.8.8,8.8.4.4",
null, "192.171.189.2", null, 28800, false, dhcpResults);
}
+
+ @SmallTest
+ public void testDiscoverPacket() throws Exception {
+ short secs = 7;
+ int transactionId = 0xdeadbeef;
+ byte[] hwaddr = {
+ (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a
+ };
+ byte[] params = new byte[] {
+ DHCP_SUBNET_MASK,
+ DHCP_ROUTER,
+ DHCP_DNS_SERVER,
+ DHCP_DOMAIN_NAME,
+ DHCP_MTU,
+ DHCP_LEASE_TIME,
+ };
+
+ ByteBuffer packet = DhcpPacket.buildDiscoverPacket(
+ DhcpPacket.ENCAP_L2, transactionId, secs, hwaddr,
+ false /* do unicast */, params);
+
+ byte[] headers = new byte[] {
+ // Ethernet header.
+ (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+ (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a,
+ (byte) 0x08, (byte) 0x00,
+ // IP header.
+ (byte) 0x45, (byte) 0x10, (byte) 0x01, (byte) 0x52,
+ (byte) 0x00, (byte) 0x00, (byte) 0x40, (byte) 0x00,
+ (byte) 0x40, (byte) 0x11, (byte) 0x39, (byte) 0x8c,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+ // UDP header.
+ (byte) 0x00, (byte) 0x44, (byte) 0x00, (byte) 0x43,
+ (byte) 0x01, (byte) 0x3e, (byte) 0xd8, (byte) 0xa4,
+ // BOOTP.
+ (byte) 0x01, (byte) 0x01, (byte) 0x06, (byte) 0x00,
+ (byte) 0xde, (byte) 0xad, (byte) 0xbe, (byte) 0xef,
+ (byte) 0x00, (byte) 0x07, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
+ (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b,
+ (byte) 0xb1, (byte) 0x7a
+ };
+ byte[] options = new byte[] {
+ // Magic cookie 0x63825363.
+ (byte) 0x63, (byte) 0x82, (byte) 0x53, (byte) 0x63,
+ // Message type DISCOVER.
+ (byte) 0x35, (byte) 0x01, (byte) 0x01,
+ // Client identifier Ethernet, da:01:19:5b:b1:7a.
+ (byte) 0x3d, (byte) 0x07,
+ (byte) 0x01,
+ (byte) 0xda, (byte) 0x01, (byte) 0x19, (byte) 0x5b, (byte) 0xb1, (byte) 0x7a,
+ // Max message size 1500.
+ (byte) 0x39, (byte) 0x02, (byte) 0x05, (byte) 0xdc,
+ // Version "android-dhcp-???".
+ (byte) 0x3c, (byte) 0x10,
+ 'a', 'n', 'd', 'r', 'o', 'i', 'd', '-', 'd', 'h', 'c', 'p', '-', '?', '?', '?',
+ // Hostname "android-01234567890abcde"
+ (byte) 0x0c, (byte) 0x18,
+ 'a', 'n', 'd', 'r', 'o', 'i', 'd', '-',
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'a', 'b', 'c', 'd', 'e',
+ // Requested parameter list.
+ (byte) 0x37, (byte) 0x06,
+ DHCP_SUBNET_MASK,
+ DHCP_ROUTER,
+ DHCP_DNS_SERVER,
+ DHCP_DOMAIN_NAME,
+ DHCP_MTU,
+ DHCP_LEASE_TIME,
+ // End options.
+ (byte) 0xff,
+ // Our packets are always of even length. TODO: find out why and possibly fix it.
+ (byte) 0x00
+ };
+ byte[] expected = new byte[DhcpPacket.MIN_PACKET_LENGTH_L2 + options.length];
+ assertTrue((expected.length & 1) == 0);
+ System.arraycopy(headers, 0, expected, 0, headers.length);
+ System.arraycopy(options, 0, expected, DhcpPacket.MIN_PACKET_LENGTH_L2, options.length);
+
+ byte[] actual = new byte[packet.limit()];
+ packet.get(actual);
+ String msg =
+ "Expected:\n " + Arrays.toString(expected) +
+ "\nActual:\n " + Arrays.toString(actual);
+ assertTrue(msg, Arrays.equals(expected, actual));
+ }
}