Home | History | Annotate | Download | only in net
      1 /*
      2  * Copyright (C) 2008 The Guava Authors
      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 
     17 package com.google.common.net;
     18 
     19 import com.google.common.testing.NullPointerTester;
     20 
     21 import junit.framework.TestCase;
     22 
     23 import java.net.Inet4Address;
     24 import java.net.Inet6Address;
     25 import java.net.InetAddress;
     26 import java.net.UnknownHostException;
     27 
     28 /**
     29  * Tests for {@link InetAddresses}.
     30  *
     31  * @author Erik Kline
     32  */
     33 public class InetAddressesTest extends TestCase {
     34 
     35   public void testNulls() throws Exception {
     36     NullPointerTester tester = new NullPointerTester();
     37 
     38     tester.testAllPublicStaticMethods(InetAddresses.class);
     39   }
     40 
     41   public void testForStringBogusInput() {
     42     String[] bogusInputs = {
     43         "",
     44         "016.016.016.016",
     45         "016.016.016",
     46         "016.016",
     47         "016",
     48         "000.000.000.000",
     49         "000",
     50         "0x0a.0x0a.0x0a.0x0a",
     51         "0x0a.0x0a.0x0a",
     52         "0x0a.0x0a",
     53         "0x0a",
     54         "42.42.42.42.42",
     55         "42.42.42",
     56         "42.42",
     57         "42",
     58         "42..42.42",
     59         "42..42.42.42",
     60         "42.42.42.42.",
     61         "42.42.42.42...",
     62         ".42.42.42.42",
     63         "...42.42.42.42",
     64         "42.42.42.-0",
     65         "42.42.42.+0",
     66         ".",
     67         "...",
     68         "bogus",
     69         "bogus.com",
     70         "192.168.0.1.com",
     71         "12345.67899.-54321.-98765",
     72         "257.0.0.0",
     73         "42.42.42.-42",
     74         "3ffe::1.net",
     75         "3ffe::1::1",
     76         "1::2::3::4:5",
     77         "::7:6:5:4:3:2:",  // should end with ":0"
     78         ":6:5:4:3:2:1::",  // should begin with "0:"
     79         "2001::db:::1",
     80         "FEDC:9878",
     81         "+1.+2.+3.4",
     82         "1.2.3.4e0",
     83         "::7:6:5:4:3:2:1:0",  // too many parts
     84         "7:6:5:4:3:2:1:0::",  // too many parts
     85         "9:8:7:6:5:4:3::2:1",  // too many parts
     86         "0:1:2:3::4:5:6:7",  // :: must remove at least one 0.
     87         "3ffe:0:0:0:0:0:0:0:1",  // too many parts (9 instead of 8)
     88         "3ffe::10000",  // hextet exceeds 16 bits
     89         "3ffe::goog",
     90         "3ffe::-0",
     91         "3ffe::+0",
     92         "3ffe::-1",
     93         ":",
     94         ":::",
     95         "::1.2.3",
     96         "::1.2.3.4.5",
     97         "::1.2.3.4:",
     98         "1.2.3.4::",
     99         "2001:db8::1:",
    100         ":2001:db8::1",
    101         ":1:2:3:4:5:6:7",
    102         "1:2:3:4:5:6:7:",
    103         ":1:2:3:4:5:6:"
    104     };
    105 
    106     for (int i = 0; i < bogusInputs.length; i++) {
    107       try {
    108         InetAddresses.forString(bogusInputs[i]);
    109         fail("IllegalArgumentException expected for '" + bogusInputs[i] + "'");
    110       } catch (IllegalArgumentException expected) {
    111         // expected behavior
    112       }
    113       assertFalse(InetAddresses.isInetAddress(bogusInputs[i]));
    114     }
    115   }
    116 
    117   public void test3ff31() {
    118     try {
    119       InetAddresses.forString("3ffe:::1");
    120       fail("IllegalArgumentException expected");
    121     } catch (IllegalArgumentException expected) {
    122       // expected behavior
    123     }
    124     assertFalse(InetAddresses.isInetAddress("016.016.016.016"));
    125   }
    126 
    127   public void testForStringIPv4Input() throws UnknownHostException {
    128     String ipStr = "192.168.0.1";
    129     InetAddress ipv4Addr = null;
    130     // Shouldn't hit DNS, because it's an IP string literal.
    131     ipv4Addr = InetAddress.getByName(ipStr);
    132     assertEquals(ipv4Addr, InetAddresses.forString(ipStr));
    133     assertTrue(InetAddresses.isInetAddress(ipStr));
    134   }
    135 
    136   public void testForStringIPv6Input() throws UnknownHostException {
    137     String ipStr = "3ffe::1";
    138     InetAddress ipv6Addr = null;
    139     // Shouldn't hit DNS, because it's an IP string literal.
    140     ipv6Addr = InetAddress.getByName(ipStr);
    141     assertEquals(ipv6Addr, InetAddresses.forString(ipStr));
    142     assertTrue(InetAddresses.isInetAddress(ipStr));
    143   }
    144 
    145   public void testForStringIPv6EightColons() throws UnknownHostException {
    146     String[] eightColons = {
    147       "::7:6:5:4:3:2:1",
    148       "::7:6:5:4:3:2:0",
    149       "7:6:5:4:3:2:1::",
    150       "0:6:5:4:3:2:1::",
    151     };
    152 
    153     for (int i = 0; i < eightColons.length; i++) {
    154       InetAddress ipv6Addr = null;
    155       // Shouldn't hit DNS, because it's an IP string literal.
    156       ipv6Addr = InetAddress.getByName(eightColons[i]);
    157       assertEquals(ipv6Addr, InetAddresses.forString(eightColons[i]));
    158       assertTrue(InetAddresses.isInetAddress(eightColons[i]));
    159     }
    160   }
    161 
    162   public void testConvertDottedQuadToHex() throws UnknownHostException {
    163     String[] ipStrings = {"7::0.128.0.127", "7::0.128.0.128",
    164         "7::128.128.0.127", "7::0.128.128.127"};
    165 
    166     for (String ipString : ipStrings) {
    167       // Shouldn't hit DNS, because it's an IP string literal.
    168       InetAddress ipv6Addr = InetAddress.getByName(ipString);
    169       assertEquals(ipv6Addr, InetAddresses.forString(ipString));
    170       assertTrue(InetAddresses.isInetAddress(ipString));
    171     }
    172   }
    173 
    174   public void testToAddrStringIPv4() {
    175     // Don't need to test IPv4 much; it just calls getHostAddress().
    176     assertEquals("1.2.3.4",
    177                  InetAddresses.toAddrString(
    178                      InetAddresses.forString("1.2.3.4")));
    179   }
    180 
    181   public void testToAddrStringIPv6() {
    182     assertEquals("1:2:3:4:5:6:7:8",
    183                  InetAddresses.toAddrString(
    184                      InetAddresses.forString("1:2:3:4:5:6:7:8")));
    185     assertEquals("2001:0:0:4::8",
    186                  InetAddresses.toAddrString(
    187                      InetAddresses.forString("2001:0:0:4:0:0:0:8")));
    188     assertEquals("2001::4:5:6:7:8",
    189                  InetAddresses.toAddrString(
    190                      InetAddresses.forString("2001:0:0:4:5:6:7:8")));
    191     assertEquals("2001:0:3:4:5:6:7:8",
    192                  InetAddresses.toAddrString(
    193                      InetAddresses.forString("2001:0:3:4:5:6:7:8")));
    194     assertEquals("0:0:3::ffff",
    195                  InetAddresses.toAddrString(
    196                      InetAddresses.forString("0:0:3:0:0:0:0:ffff")));
    197     assertEquals("::4:0:0:0:ffff",
    198                  InetAddresses.toAddrString(
    199                      InetAddresses.forString("0:0:0:4:0:0:0:ffff")));
    200     assertEquals("::5:0:0:ffff",
    201                  InetAddresses.toAddrString(
    202                      InetAddresses.forString("0:0:0:0:5:0:0:ffff")));
    203     assertEquals("1::4:0:0:7:8",
    204                  InetAddresses.toAddrString(
    205                      InetAddresses.forString("1:0:0:4:0:0:7:8")));
    206     assertEquals("::",
    207                  InetAddresses.toAddrString(
    208                      InetAddresses.forString("0:0:0:0:0:0:0:0")));
    209     assertEquals("::1",
    210                  InetAddresses.toAddrString(
    211                      InetAddresses.forString("0:0:0:0:0:0:0:1")));
    212     assertEquals("2001:658:22a:cafe::",
    213                  InetAddresses.toAddrString(
    214                      InetAddresses.forString("2001:0658:022a:cafe::")));
    215     assertEquals("::102:304",
    216                  InetAddresses.toAddrString(
    217                      InetAddresses.forString("::1.2.3.4")));
    218   }
    219 
    220   public void testToUriStringIPv4() {
    221     String ipStr = "1.2.3.4";
    222     InetAddress ip = InetAddresses.forString(ipStr);
    223     assertEquals("1.2.3.4", InetAddresses.toUriString(ip));
    224   }
    225 
    226   public void testToUriStringIPv6() {
    227     // Unfortunately the InetAddress.toString() method for IPv6 addresses
    228     // does not collapse contiguous shorts of zeroes with the :: abbreviation.
    229     String ipStr = "3ffe::1";
    230     InetAddress ip = InetAddresses.forString(ipStr);
    231     assertEquals("[3ffe::1]", InetAddresses.toUriString(ip));
    232   }
    233 
    234   public void testForUriStringIPv4() {
    235     Inet4Address expected = (Inet4Address) InetAddresses.forString("192.168.1.1");
    236     assertEquals(expected, InetAddresses.forUriString("192.168.1.1"));
    237   }
    238 
    239   public void testForUriStringIPv6() {
    240     Inet6Address expected = (Inet6Address) InetAddresses.forString("3ffe:0:0:0:0:0:0:1");
    241     assertEquals(expected, InetAddresses.forUriString("[3ffe:0:0:0:0:0:0:1]"));
    242   }
    243 
    244   public void testIsUriInetAddress() {
    245     assertTrue(InetAddresses.isUriInetAddress("192.168.1.1"));
    246     assertTrue(InetAddresses.isUriInetAddress("[3ffe:0:0:0:0:0:0:1]"));
    247 
    248     assertFalse(InetAddresses.isUriInetAddress("[192.168.1.1"));
    249     assertFalse(InetAddresses.isUriInetAddress("192.168.1.1]"));
    250     assertFalse(InetAddresses.isUriInetAddress(""));
    251     assertFalse(InetAddresses.isUriInetAddress("192.168.999.888"));
    252     assertFalse(InetAddresses.isUriInetAddress("www.google.com"));
    253     assertFalse(InetAddresses.isUriInetAddress("1:2e"));
    254     assertFalse(InetAddresses.isUriInetAddress("[3ffe:0:0:0:0:0:0:1"));
    255     assertFalse(InetAddresses.isUriInetAddress("3ffe:0:0:0:0:0:0:1]"));
    256   }
    257 
    258   public void testForUriStringBad() {
    259     try {
    260       InetAddresses.forUriString("");
    261       fail("expected IllegalArgumentException");  // COV_NF_LINE
    262     } catch (IllegalArgumentException e) {
    263       // expected
    264     }
    265 
    266     try {
    267       InetAddresses.forUriString("192.168.999.888");
    268       fail("expected IllegalArgumentException");  // COV_NF_LINE
    269     } catch (IllegalArgumentException e) {
    270       // expected
    271     }
    272 
    273     try {
    274       InetAddresses.forUriString("www.google.com");
    275       fail("expected IllegalArgumentException");  // COV_NF_LINE
    276     } catch (IllegalArgumentException e) {
    277       // expected
    278     }
    279 
    280     try {
    281       InetAddresses.forUriString("[1:2e]");
    282       fail("expected IllegalArgumentException");  // COV_NF_LINE
    283     } catch (IllegalArgumentException e) {
    284       // expected
    285     }
    286 
    287     try {
    288       InetAddresses.forUriString("[192.168.1.1]");
    289       fail("expected IllegalArgumentException");  // COV_NF_LINE
    290     } catch (IllegalArgumentException e) {
    291       // expected
    292     }
    293 
    294     try {
    295       InetAddresses.forUriString("192.168.1.1]");
    296       fail("expected IllegalArgumentException");  // COV_NF_LINE
    297     } catch (IllegalArgumentException e) {
    298       // expected
    299     }
    300 
    301     try {
    302       InetAddresses.forUriString("[192.168.1.1");
    303       fail("expected IllegalArgumentException");  // COV_NF_LINE
    304     } catch (IllegalArgumentException e) {
    305       // expected
    306     }
    307 
    308     try {
    309       InetAddresses.forUriString("[3ffe:0:0:0:0:0:0:1");
    310       fail("expected IllegalArgumentException");  // COV_NF_LINE
    311     } catch (IllegalArgumentException e) {
    312       // expected
    313     }
    314 
    315     try {
    316       InetAddresses.forUriString("3ffe:0:0:0:0:0:0:1]");
    317       fail("expected IllegalArgumentException");  // COV_NF_LINE
    318     } catch (IllegalArgumentException e) {
    319       // expected
    320     }
    321   }
    322 
    323   public void testCompatIPv4Addresses() {
    324     String[] nonCompatAddresses = {
    325         "3ffe::1",
    326         "::",
    327         "::1",
    328     };
    329 
    330     for (int i = 0; i < nonCompatAddresses.length; i++) {
    331       InetAddress ip = InetAddresses.forString(nonCompatAddresses[i]);
    332       assertFalse(InetAddresses.isCompatIPv4Address((Inet6Address) ip));
    333       try {
    334         InetAddresses.getCompatIPv4Address((Inet6Address) ip);
    335         fail("IllegalArgumentException expected for '" +
    336              nonCompatAddresses[i] + "'");
    337       } catch (IllegalArgumentException expected) {
    338         // expected behavior
    339       }
    340     }
    341 
    342     String[] validCompatAddresses = {
    343         "::1.2.3.4",
    344         "::102:304",
    345     };
    346     String compatStr = "1.2.3.4";
    347     InetAddress compat = InetAddresses.forString(compatStr);
    348 
    349     for (int i = 0; i < validCompatAddresses.length; i++) {
    350       InetAddress ip = InetAddresses.forString(validCompatAddresses[i]);
    351       assertTrue("checking '" + validCompatAddresses[i] + "'", ip instanceof Inet6Address);
    352       assertTrue("checking '" + validCompatAddresses[i] + "'",
    353           InetAddresses.isCompatIPv4Address((Inet6Address) ip));
    354       assertEquals("checking '" + validCompatAddresses[i] + "'", compat,
    355                    InetAddresses.getCompatIPv4Address((Inet6Address) ip));
    356     }
    357   }
    358 
    359   public void testMappedIPv4Addresses() throws UnknownHostException {
    360     /*
    361      * Verify that it is not possible to instantiate an Inet6Address
    362      * from an "IPv4 mapped" IPv6 address.  Our String-based method can
    363      * at least identify them, however.
    364      */
    365     String mappedStr = "::ffff:192.168.0.1";
    366     assertTrue(InetAddresses.isMappedIPv4Address(mappedStr));
    367     InetAddress mapped = InetAddresses.forString(mappedStr);
    368     assertFalse(mapped instanceof Inet6Address);
    369     assertEquals(InetAddress.getByName("192.168.0.1"), mapped);
    370 
    371     // check upper case
    372     mappedStr = "::FFFF:192.168.0.1";
    373     assertTrue(InetAddresses.isMappedIPv4Address(mappedStr));
    374     mapped = InetAddresses.forString(mappedStr);
    375     assertFalse(mapped instanceof Inet6Address);
    376     assertEquals(InetAddress.getByName("192.168.0.1"), mapped);
    377 
    378     mappedStr = "0:00:000:0000:0:ffff:1.2.3.4";
    379     assertTrue(InetAddresses.isMappedIPv4Address(mappedStr));
    380     mapped = InetAddresses.forString(mappedStr);
    381     assertFalse(mapped instanceof Inet6Address);
    382     assertEquals(InetAddress.getByName("1.2.3.4"), mapped);
    383 
    384     mappedStr = "::ffff:0102:0304";
    385     assertTrue(InetAddresses.isMappedIPv4Address(mappedStr));
    386     mapped = InetAddresses.forString(mappedStr);
    387     assertFalse(mapped instanceof Inet6Address);
    388     assertEquals(InetAddress.getByName("1.2.3.4"), mapped);
    389 
    390     assertFalse(InetAddresses.isMappedIPv4Address("::"));
    391     assertFalse(InetAddresses.isMappedIPv4Address("::ffff"));
    392     assertFalse(InetAddresses.isMappedIPv4Address("::ffff:0"));
    393     assertFalse(InetAddresses.isMappedIPv4Address("::fffe:0:0"));
    394     assertFalse(InetAddresses.isMappedIPv4Address("::1:ffff:0:0"));
    395     assertFalse(InetAddresses.isMappedIPv4Address("foo"));
    396     assertFalse(InetAddresses.isMappedIPv4Address("192.0.2.1"));
    397   }
    398 
    399   public void test6to4Addresses() {
    400     String[] non6to4Addresses = {
    401         "::1.2.3.4",
    402         "3ffe::1",
    403         "::",
    404         "::1",
    405     };
    406 
    407     for (int i = 0; i < non6to4Addresses.length; i++) {
    408       InetAddress ip = InetAddresses.forString(non6to4Addresses[i]);
    409       assertFalse(InetAddresses.is6to4Address((Inet6Address) ip));
    410       try {
    411         InetAddresses.get6to4IPv4Address(
    412             (Inet6Address) ip);
    413         fail("IllegalArgumentException expected for '" +
    414              non6to4Addresses[i] + "'");
    415       } catch (IllegalArgumentException expected) {
    416         // expected behavior
    417       }
    418     }
    419 
    420     String valid6to4Address = "2002:0102:0304::1";
    421     String ipv4Str = "1.2.3.4";
    422 
    423     InetAddress ipv4 = InetAddresses.forString(ipv4Str);
    424     InetAddress ip = InetAddresses.forString(valid6to4Address);
    425     assertTrue(InetAddresses.is6to4Address((Inet6Address) ip));
    426     assertEquals(ipv4, InetAddresses.get6to4IPv4Address((Inet6Address) ip));
    427   }
    428 
    429   public void testTeredoAddresses() {
    430     String[] nonTeredoAddresses = {
    431         "::1.2.3.4",
    432         "3ffe::1",
    433         "::",
    434         "::1",
    435     };
    436 
    437     for (int i = 0; i < nonTeredoAddresses.length; i++) {
    438       InetAddress ip = InetAddresses.forString(nonTeredoAddresses[i]);
    439       assertFalse(InetAddresses.isTeredoAddress((Inet6Address) ip));
    440       try {
    441         InetAddresses.getTeredoInfo((Inet6Address) ip);
    442         fail("IllegalArgumentException expected for '" +
    443              nonTeredoAddresses[i] + "'");
    444       } catch (IllegalArgumentException expected) {
    445         // expected behavior
    446       }
    447     }
    448 
    449     String validTeredoAddress = "2001:0000:4136:e378:8000:63bf:3fff:fdd2";
    450     String serverStr = "65.54.227.120";
    451     String clientStr = "192.0.2.45";
    452     int port = 40000;
    453     int flags = 0x8000;
    454 
    455     InetAddress ip = InetAddresses.forString(validTeredoAddress);
    456     assertTrue(InetAddresses.isTeredoAddress((Inet6Address) ip));
    457     InetAddresses.TeredoInfo teredo =
    458         InetAddresses.getTeredoInfo((Inet6Address) ip);
    459 
    460     InetAddress server = InetAddresses.forString(serverStr);
    461     assertEquals(server, teredo.getServer());
    462 
    463     InetAddress client = InetAddresses.forString(clientStr);
    464     assertEquals(client, teredo.getClient());
    465 
    466     assertEquals(port, teredo.getPort());
    467     assertEquals(flags, teredo.getFlags());
    468   }
    469 
    470   public void testIsatapAddresses() {
    471     InetAddress ipv4 = InetAddresses.forString("1.2.3.4");
    472     String[] validIsatapAddresses = {
    473         "2001:db8::5efe:102:304",
    474         "2001:db8::100:5efe:102:304",  // Private Multicast? Not likely.
    475         "2001:db8::200:5efe:102:304",
    476         "2001:db8::300:5efe:102:304"   // Public Multicast? Also unlikely.
    477     };
    478     String[] nonIsatapAddresses = {
    479         "::1.2.3.4",
    480         "3ffe::1",
    481         "::",
    482         "::1",
    483         "2001:db8::0040:5efe:102:304",
    484         "2001:db8::5ffe:102:304",
    485         "2001:db8::5eff:102:304",
    486         "2001:0:102:203:200:5efe:506:708",  // Teredo address; not ISATAP
    487     };
    488 
    489     for (int i = 0; i < validIsatapAddresses.length; i++) {
    490       InetAddress ip = InetAddresses.forString(validIsatapAddresses[i]);
    491       assertTrue(InetAddresses.isIsatapAddress((Inet6Address) ip));
    492       assertEquals("checking '" + validIsatapAddresses[i] + "'", ipv4,
    493                    InetAddresses.getIsatapIPv4Address((Inet6Address) ip));
    494     }
    495     for (int i = 0; i < nonIsatapAddresses.length; i++) {
    496       InetAddress ip = InetAddresses.forString(nonIsatapAddresses[i]);
    497       assertFalse(InetAddresses.isIsatapAddress((Inet6Address) ip));
    498       try {
    499         InetAddresses.getIsatapIPv4Address((Inet6Address) ip);
    500         fail("IllegalArgumentException expected for '" +
    501              nonIsatapAddresses[i] + "'");
    502       } catch (IllegalArgumentException expected) {
    503         // expected behavior
    504       }
    505     }
    506   }
    507 
    508   public void testGetEmbeddedIPv4ClientAddress() {
    509     Inet6Address testIp;
    510 
    511     // Test regular global unicast address.
    512     testIp = (Inet6Address) InetAddresses.forString("2001:db8::1");
    513     assertFalse(InetAddresses.hasEmbeddedIPv4ClientAddress(testIp));
    514 
    515     // Test ISATAP address.
    516     testIp = (Inet6Address) InetAddresses.forString("2001:db8::5efe:102:304");
    517     assertFalse(InetAddresses.hasEmbeddedIPv4ClientAddress(testIp));
    518 
    519     // Test compat address.
    520     testIp = (Inet6Address) InetAddresses.forString("::1.2.3.4");
    521     assertTrue(InetAddresses.hasEmbeddedIPv4ClientAddress(testIp));
    522     InetAddress ipv4 = InetAddresses.forString("1.2.3.4");
    523     assertEquals(ipv4, InetAddresses.getEmbeddedIPv4ClientAddress(testIp));
    524 
    525     // Test 6to4 address.
    526     testIp = (Inet6Address) InetAddresses.forString("2002:0102:0304::1");
    527     assertTrue(InetAddresses.hasEmbeddedIPv4ClientAddress(testIp));
    528     ipv4 = InetAddresses.forString("1.2.3.4");
    529     assertEquals(ipv4, InetAddresses.getEmbeddedIPv4ClientAddress(testIp));
    530 
    531     // Test Teredo address.
    532     testIp = (Inet6Address) InetAddresses.forString(
    533         "2001:0000:4136:e378:8000:63bf:3fff:fdd2");
    534     assertTrue(InetAddresses.hasEmbeddedIPv4ClientAddress(testIp));
    535     ipv4 = InetAddresses.forString("192.0.2.45");
    536     assertEquals(ipv4, InetAddresses.getEmbeddedIPv4ClientAddress(testIp));
    537   }
    538 
    539   public void testGetCoercedIPv4Address() {
    540     // Check that a coerced IPv4 address is unaltered.
    541     InetAddress localHost4 = InetAddresses.forString("127.0.0.1");
    542     assertEquals(localHost4,
    543                  InetAddresses.getCoercedIPv4Address(localHost4));
    544 
    545     // ::1 special case
    546     assertEquals(localHost4,
    547                  InetAddresses.getCoercedIPv4Address(
    548                      InetAddresses.forString("::1")));
    549 
    550     // :: special case
    551     assertEquals(InetAddresses.forString("0.0.0.0"),
    552                  InetAddresses.getCoercedIPv4Address(
    553                      InetAddresses.forString("::")));
    554 
    555     // test compat address (should be hashed)
    556     assertTrue(InetAddresses.forString("1.2.3.4") !=
    557                InetAddresses.getCoercedIPv4Address(
    558                    InetAddresses.forString("::1.2.3.4")));
    559 
    560     // test 6to4 address (should be hashed)
    561     assertTrue(InetAddresses.forString("1.2.3.4") !=
    562                InetAddresses.getCoercedIPv4Address(
    563                    InetAddresses.forString("2002:0102:0304::1")));
    564 
    565     // 2 6to4 addresses differing in the embedded IPv4 address should
    566     // hash to the different values.
    567     assertTrue(InetAddresses.getCoercedIPv4Address(
    568                    InetAddresses.forString("2002:0102:0304::1")) !=
    569                InetAddresses.getCoercedIPv4Address(
    570                    InetAddresses.forString("2002:0506:0708::1")));
    571 
    572     // 2 6to4 addresses NOT differing in the embedded IPv4 address should
    573     // hash to the same value.
    574     assertTrue(InetAddresses.getCoercedIPv4Address(
    575                    InetAddresses.forString("2002:0102:0304::1")) !=
    576                InetAddresses.getCoercedIPv4Address(
    577                    InetAddresses.forString("2002:0102:0304::2")));
    578 
    579     // test Teredo address (should be hashed)
    580     assertTrue(InetAddresses.forString("192.0.2.45") !=
    581                InetAddresses.getCoercedIPv4Address(
    582                    InetAddresses.forString(
    583                        "2001:0000:4136:e378:8000:63bf:3fff:fdd2")));
    584 
    585     // 2 Teredo addresses differing in the embedded IPv4 address should
    586     // hash to the different values.
    587     assertTrue(InetAddresses.getCoercedIPv4Address(
    588                    InetAddresses.forString(
    589                        "2001:0000:4136:e378:8000:63bf:3fff:fdd2")) !=
    590                InetAddresses.getCoercedIPv4Address(
    591                    InetAddresses.forString(
    592                        "2001:0000:4136:e379:8000:63bf:3fff:fdd2")));
    593 
    594     // 2 Teredo addresses NOT differing in the embedded IPv4 address should
    595     // hash to the same value.
    596     assertEquals(InetAddresses.getCoercedIPv4Address(
    597                      InetAddresses.forString(
    598                          "2001:0000:4136:e378:8000:63bf:3fff:fdd2")),
    599                  InetAddresses.getCoercedIPv4Address(
    600                      InetAddresses.forString(
    601                          "2001:0000:4136:e378:9000:63bf:3fff:fdd2")));
    602 
    603     // Test that an address hashes in to the 224.0.0.0/3 number-space.
    604     InetAddress coerced = InetAddresses.getCoercedIPv4Address(
    605                               InetAddresses.forString("2001:4860::1"));
    606     assertTrue(0xe0000000 <= InetAddresses.coerceToInteger(coerced));
    607     assertTrue(InetAddresses.coerceToInteger(coerced) <= 0xfffffffe);
    608   }
    609 
    610   public void testHash64To32() {
    611     // Make sure the output looks reasonably sane.
    612     assertEquals(532412650, InetAddresses.hash64To32(-1));
    613     assertEquals(720020139, InetAddresses.hash64To32(0));
    614     assertEquals(357654460, InetAddresses.hash64To32(1));
    615     assertEquals(-1977349188, InetAddresses.hash64To32(0x7fffffffffffffffL));
    616   }
    617 
    618   public void testToInteger() {
    619     InetAddress ipv4Addr = InetAddresses.forString("127.0.0.1");
    620     assertEquals(0x7f000001, InetAddresses.coerceToInteger(ipv4Addr));
    621   }
    622 
    623   public void testFromInteger() {
    624     assertEquals(InetAddresses.fromInteger(0x7f000001),
    625                  InetAddresses.forString("127.0.0.1"));
    626   }
    627 
    628   public void testFromLittleEndianByteArray() throws UnknownHostException {
    629     assertEquals(
    630         InetAddresses.fromLittleEndianByteArray(new byte[] {1, 2, 3, 4}),
    631         InetAddress.getByAddress(new byte[] {4, 3, 2, 1}));
    632 
    633     assertEquals(
    634         InetAddresses.fromLittleEndianByteArray(
    635             new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}),
    636         InetAddress.getByAddress(
    637             new byte[] {16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}));
    638 
    639     try {
    640       InetAddresses.fromLittleEndianByteArray(new byte[3]);
    641       fail("expected exception");
    642     } catch (UnknownHostException expected) {
    643       // success
    644     }
    645   }
    646 
    647   public void testIsMaximum() throws UnknownHostException {
    648     InetAddress address = InetAddress.getByName("255.255.255.254");
    649     assertFalse(InetAddresses.isMaximum(address));
    650 
    651     address = InetAddress.getByName("255.255.255.255");
    652     assertTrue(InetAddresses.isMaximum(address));
    653 
    654     address = InetAddress.getByName("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe");
    655     assertFalse(InetAddresses.isMaximum(address));
    656 
    657     address = InetAddress.getByName("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
    658     assertTrue(InetAddresses.isMaximum(address));
    659   }
    660 
    661   public void testIncrementIPv4() throws UnknownHostException {
    662     InetAddress address_66_0 = InetAddress.getByName("172.24.66.0");
    663     InetAddress address_66_255 = InetAddress.getByName("172.24.66.255");
    664     InetAddress address_67_0 = InetAddress.getByName("172.24.67.0");
    665 
    666     InetAddress address = address_66_0;
    667     for (int i = 0; i < 255; i++) {
    668       address = InetAddresses.increment(address);
    669     }
    670     assertEquals(address_66_255, address);
    671 
    672     address = InetAddresses.increment(address);
    673     assertEquals(address_67_0, address);
    674 
    675     InetAddress address_ffffff = InetAddress.getByName("255.255.255.255");
    676     address = address_ffffff;
    677     try {
    678       address = InetAddresses.increment(address);
    679       fail();
    680     } catch (IllegalArgumentException expected) { }
    681   }
    682 
    683   public void testIncrementIPv6() throws UnknownHostException {
    684     InetAddress addressV6_66_0 = InetAddress.getByName("2001:db8::6600");
    685     InetAddress addressV6_66_ff = InetAddress.getByName("2001:db8::66ff");
    686     InetAddress addressV6_67_0 = InetAddress.getByName("2001:db8::6700");
    687 
    688     InetAddress address = addressV6_66_0;
    689     for (int i = 0; i < 255; i++) {
    690       address = InetAddresses.increment(address);
    691     }
    692     assertEquals(addressV6_66_ff, address);
    693 
    694     address = InetAddresses.increment(address);
    695     assertEquals(addressV6_67_0, address);
    696 
    697     InetAddress addressV6_ffffff =
    698         InetAddress.getByName("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
    699     address = addressV6_ffffff;
    700     try {
    701       address = InetAddresses.increment(address);
    702       fail();
    703     } catch (IllegalArgumentException expected) { }
    704   }
    705 }
    706