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() {
     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 testForUriStringIPv4Mapped() {
    245     Inet4Address expected = (Inet4Address) InetAddresses.forString("192.0.2.1");
    246     assertEquals(expected, InetAddresses.forUriString("[::ffff:192.0.2.1]"));
    247   }
    248 
    249   public void testIsUriInetAddress() {
    250     assertTrue(InetAddresses.isUriInetAddress("192.168.1.1"));
    251     assertTrue(InetAddresses.isUriInetAddress("[3ffe:0:0:0:0:0:0:1]"));
    252     assertTrue(InetAddresses.isUriInetAddress("[::ffff:192.0.2.1]"));
    253 
    254     assertFalse(InetAddresses.isUriInetAddress("[192.168.1.1"));
    255     assertFalse(InetAddresses.isUriInetAddress("192.168.1.1]"));
    256     assertFalse(InetAddresses.isUriInetAddress(""));
    257     assertFalse(InetAddresses.isUriInetAddress("192.168.999.888"));
    258     assertFalse(InetAddresses.isUriInetAddress("www.google.com"));
    259     assertFalse(InetAddresses.isUriInetAddress("1:2e"));
    260     assertFalse(InetAddresses.isUriInetAddress("[3ffe:0:0:0:0:0:0:1"));
    261     assertFalse(InetAddresses.isUriInetAddress("3ffe:0:0:0:0:0:0:1]"));
    262     assertFalse(InetAddresses.isUriInetAddress("3ffe:0:0:0:0:0:0:1"));
    263     assertFalse(InetAddresses.isUriInetAddress("::ffff:192.0.2.1"));
    264   }
    265 
    266   public void testForUriStringBad() {
    267     try {
    268       InetAddresses.forUriString("");
    269       fail("expected IllegalArgumentException");  // COV_NF_LINE
    270     } catch (IllegalArgumentException e) {
    271       // expected
    272     }
    273 
    274     try {
    275       InetAddresses.forUriString("192.168.999.888");
    276       fail("expected IllegalArgumentException");  // COV_NF_LINE
    277     } catch (IllegalArgumentException e) {
    278       // expected
    279     }
    280 
    281     try {
    282       InetAddresses.forUriString("www.google.com");
    283       fail("expected IllegalArgumentException");  // COV_NF_LINE
    284     } catch (IllegalArgumentException e) {
    285       // expected
    286     }
    287 
    288     try {
    289       InetAddresses.forUriString("[1:2e]");
    290       fail("expected IllegalArgumentException");  // COV_NF_LINE
    291     } catch (IllegalArgumentException e) {
    292       // expected
    293     }
    294 
    295     try {
    296       InetAddresses.forUriString("[192.168.1.1]");
    297       fail("expected IllegalArgumentException");  // COV_NF_LINE
    298     } catch (IllegalArgumentException e) {
    299       // expected
    300     }
    301 
    302     try {
    303       InetAddresses.forUriString("192.168.1.1]");
    304       fail("expected IllegalArgumentException");  // COV_NF_LINE
    305     } catch (IllegalArgumentException e) {
    306       // expected
    307     }
    308 
    309     try {
    310       InetAddresses.forUriString("[192.168.1.1");
    311       fail("expected IllegalArgumentException");  // COV_NF_LINE
    312     } catch (IllegalArgumentException e) {
    313       // expected
    314     }
    315 
    316     try {
    317       InetAddresses.forUriString("[3ffe:0:0:0:0:0:0:1");
    318       fail("expected IllegalArgumentException");  // COV_NF_LINE
    319     } catch (IllegalArgumentException e) {
    320       // expected
    321     }
    322 
    323     try {
    324       InetAddresses.forUriString("3ffe:0:0:0:0:0:0:1]");
    325       fail("expected IllegalArgumentException");  // COV_NF_LINE
    326     } catch (IllegalArgumentException e) {
    327       // expected
    328     }
    329 
    330     try {
    331       InetAddresses.forUriString("3ffe:0:0:0:0:0:0:1");
    332       fail("expected IllegalArgumentException");  // COV_NF_LINE
    333     } catch (IllegalArgumentException e) {
    334       // expected
    335     }
    336 
    337     try {
    338       InetAddresses.forUriString("::ffff:192.0.2.1");
    339       fail("expected IllegalArgumentException");  // COV_NF_LINE
    340     } catch (IllegalArgumentException e) {
    341       // expected
    342     }
    343   }
    344 
    345   public void testCompatIPv4Addresses() {
    346     String[] nonCompatAddresses = {
    347         "3ffe::1",
    348         "::",
    349         "::1",
    350     };
    351 
    352     for (int i = 0; i < nonCompatAddresses.length; i++) {
    353       InetAddress ip = InetAddresses.forString(nonCompatAddresses[i]);
    354       assertFalse(InetAddresses.isCompatIPv4Address((Inet6Address) ip));
    355       try {
    356         InetAddresses.getCompatIPv4Address((Inet6Address) ip);
    357         fail("IllegalArgumentException expected for '" +
    358              nonCompatAddresses[i] + "'");
    359       } catch (IllegalArgumentException expected) {
    360         // expected behavior
    361       }
    362     }
    363 
    364     String[] validCompatAddresses = {
    365         "::1.2.3.4",
    366         "::102:304",
    367     };
    368     String compatStr = "1.2.3.4";
    369     InetAddress compat = InetAddresses.forString(compatStr);
    370 
    371     for (int i = 0; i < validCompatAddresses.length; i++) {
    372       InetAddress ip = InetAddresses.forString(validCompatAddresses[i]);
    373       assertTrue("checking '" + validCompatAddresses[i] + "'", ip instanceof Inet6Address);
    374       assertTrue("checking '" + validCompatAddresses[i] + "'",
    375           InetAddresses.isCompatIPv4Address((Inet6Address) ip));
    376       assertEquals("checking '" + validCompatAddresses[i] + "'", compat,
    377                    InetAddresses.getCompatIPv4Address((Inet6Address) ip));
    378     }
    379   }
    380 
    381   public void testMappedIPv4Addresses() throws UnknownHostException {
    382     /*
    383      * Verify that it is not possible to instantiate an Inet6Address
    384      * from an "IPv4 mapped" IPv6 address.  Our String-based method can
    385      * at least identify them, however.
    386      */
    387     String mappedStr = "::ffff:192.168.0.1";
    388     assertTrue(InetAddresses.isMappedIPv4Address(mappedStr));
    389     InetAddress mapped = InetAddresses.forString(mappedStr);
    390     assertFalse(mapped instanceof Inet6Address);
    391     assertEquals(InetAddress.getByName("192.168.0.1"), mapped);
    392 
    393     // check upper case
    394     mappedStr = "::FFFF:192.168.0.1";
    395     assertTrue(InetAddresses.isMappedIPv4Address(mappedStr));
    396     mapped = InetAddresses.forString(mappedStr);
    397     assertFalse(mapped instanceof Inet6Address);
    398     assertEquals(InetAddress.getByName("192.168.0.1"), mapped);
    399 
    400     mappedStr = "0:00:000:0000:0:ffff:1.2.3.4";
    401     assertTrue(InetAddresses.isMappedIPv4Address(mappedStr));
    402     mapped = InetAddresses.forString(mappedStr);
    403     assertFalse(mapped instanceof Inet6Address);
    404     assertEquals(InetAddress.getByName("1.2.3.4"), mapped);
    405 
    406     mappedStr = "::ffff:0102:0304";
    407     assertTrue(InetAddresses.isMappedIPv4Address(mappedStr));
    408     mapped = InetAddresses.forString(mappedStr);
    409     assertFalse(mapped instanceof Inet6Address);
    410     assertEquals(InetAddress.getByName("1.2.3.4"), mapped);
    411 
    412     assertFalse(InetAddresses.isMappedIPv4Address("::"));
    413     assertFalse(InetAddresses.isMappedIPv4Address("::ffff"));
    414     assertFalse(InetAddresses.isMappedIPv4Address("::ffff:0"));
    415     assertFalse(InetAddresses.isMappedIPv4Address("::fffe:0:0"));
    416     assertFalse(InetAddresses.isMappedIPv4Address("::1:ffff:0:0"));
    417     assertFalse(InetAddresses.isMappedIPv4Address("foo"));
    418     assertFalse(InetAddresses.isMappedIPv4Address("192.0.2.1"));
    419   }
    420 
    421   public void test6to4Addresses() {
    422     String[] non6to4Addresses = {
    423         "::1.2.3.4",
    424         "3ffe::1",
    425         "::",
    426         "::1",
    427     };
    428 
    429     for (int i = 0; i < non6to4Addresses.length; i++) {
    430       InetAddress ip = InetAddresses.forString(non6to4Addresses[i]);
    431       assertFalse(InetAddresses.is6to4Address((Inet6Address) ip));
    432       try {
    433         InetAddresses.get6to4IPv4Address(
    434             (Inet6Address) ip);
    435         fail("IllegalArgumentException expected for '" +
    436              non6to4Addresses[i] + "'");
    437       } catch (IllegalArgumentException expected) {
    438         // expected behavior
    439       }
    440     }
    441 
    442     String valid6to4Address = "2002:0102:0304::1";
    443     String ipv4Str = "1.2.3.4";
    444 
    445     InetAddress ipv4 = InetAddresses.forString(ipv4Str);
    446     InetAddress ip = InetAddresses.forString(valid6to4Address);
    447     assertTrue(InetAddresses.is6to4Address((Inet6Address) ip));
    448     assertEquals(ipv4, InetAddresses.get6to4IPv4Address((Inet6Address) ip));
    449   }
    450 
    451   public void testTeredoAddresses() {
    452     String[] nonTeredoAddresses = {
    453         "::1.2.3.4",
    454         "3ffe::1",
    455         "::",
    456         "::1",
    457     };
    458 
    459     for (int i = 0; i < nonTeredoAddresses.length; i++) {
    460       InetAddress ip = InetAddresses.forString(nonTeredoAddresses[i]);
    461       assertFalse(InetAddresses.isTeredoAddress((Inet6Address) ip));
    462       try {
    463         InetAddresses.getTeredoInfo((Inet6Address) ip);
    464         fail("IllegalArgumentException expected for '" +
    465              nonTeredoAddresses[i] + "'");
    466       } catch (IllegalArgumentException expected) {
    467         // expected behavior
    468       }
    469     }
    470 
    471     String validTeredoAddress = "2001:0000:4136:e378:8000:63bf:3fff:fdd2";
    472     String serverStr = "65.54.227.120";
    473     String clientStr = "192.0.2.45";
    474     int port = 40000;
    475     int flags = 0x8000;
    476 
    477     InetAddress ip = InetAddresses.forString(validTeredoAddress);
    478     assertTrue(InetAddresses.isTeredoAddress((Inet6Address) ip));
    479     InetAddresses.TeredoInfo teredo =
    480         InetAddresses.getTeredoInfo((Inet6Address) ip);
    481 
    482     InetAddress server = InetAddresses.forString(serverStr);
    483     assertEquals(server, teredo.getServer());
    484 
    485     InetAddress client = InetAddresses.forString(clientStr);
    486     assertEquals(client, teredo.getClient());
    487 
    488     assertEquals(port, teredo.getPort());
    489     assertEquals(flags, teredo.getFlags());
    490   }
    491 
    492   public void testTeredoAddress_nullServer() {
    493     InetAddresses.TeredoInfo info = new InetAddresses.TeredoInfo(null, null, 80, 1000);
    494     assertEquals(InetAddresses.forString("0.0.0.0"), info.getServer());
    495     assertEquals(InetAddresses.forString("0.0.0.0"), info.getClient());
    496     assertEquals(80, info.getPort());
    497     assertEquals(1000, info.getFlags());
    498   }
    499 
    500   public void testIsatapAddresses() {
    501     InetAddress ipv4 = InetAddresses.forString("1.2.3.4");
    502     String[] validIsatapAddresses = {
    503         "2001:db8::5efe:102:304",
    504         "2001:db8::100:5efe:102:304",  // Private Multicast? Not likely.
    505         "2001:db8::200:5efe:102:304",
    506         "2001:db8::300:5efe:102:304"   // Public Multicast? Also unlikely.
    507     };
    508     String[] nonIsatapAddresses = {
    509         "::1.2.3.4",
    510         "3ffe::1",
    511         "::",
    512         "::1",
    513         "2001:db8::0040:5efe:102:304",
    514         "2001:db8::5ffe:102:304",
    515         "2001:db8::5eff:102:304",
    516         "2001:0:102:203:200:5efe:506:708",  // Teredo address; not ISATAP
    517     };
    518 
    519     for (int i = 0; i < validIsatapAddresses.length; i++) {
    520       InetAddress ip = InetAddresses.forString(validIsatapAddresses[i]);
    521       assertTrue(InetAddresses.isIsatapAddress((Inet6Address) ip));
    522       assertEquals("checking '" + validIsatapAddresses[i] + "'", ipv4,
    523                    InetAddresses.getIsatapIPv4Address((Inet6Address) ip));
    524     }
    525     for (int i = 0; i < nonIsatapAddresses.length; i++) {
    526       InetAddress ip = InetAddresses.forString(nonIsatapAddresses[i]);
    527       assertFalse(InetAddresses.isIsatapAddress((Inet6Address) ip));
    528       try {
    529         InetAddresses.getIsatapIPv4Address((Inet6Address) ip);
    530         fail("IllegalArgumentException expected for '" +
    531              nonIsatapAddresses[i] + "'");
    532       } catch (IllegalArgumentException expected) {
    533         // expected behavior
    534       }
    535     }
    536   }
    537 
    538   public void testGetEmbeddedIPv4ClientAddress() {
    539     Inet6Address testIp;
    540 
    541     // Test regular global unicast address.
    542     testIp = (Inet6Address) InetAddresses.forString("2001:db8::1");
    543     assertFalse(InetAddresses.hasEmbeddedIPv4ClientAddress(testIp));
    544 
    545     // Test ISATAP address.
    546     testIp = (Inet6Address) InetAddresses.forString("2001:db8::5efe:102:304");
    547     assertFalse(InetAddresses.hasEmbeddedIPv4ClientAddress(testIp));
    548 
    549     // Test compat address.
    550     testIp = (Inet6Address) InetAddresses.forString("::1.2.3.4");
    551     assertTrue(InetAddresses.hasEmbeddedIPv4ClientAddress(testIp));
    552     InetAddress ipv4 = InetAddresses.forString("1.2.3.4");
    553     assertEquals(ipv4, InetAddresses.getEmbeddedIPv4ClientAddress(testIp));
    554 
    555     // Test 6to4 address.
    556     testIp = (Inet6Address) InetAddresses.forString("2002:0102:0304::1");
    557     assertTrue(InetAddresses.hasEmbeddedIPv4ClientAddress(testIp));
    558     ipv4 = InetAddresses.forString("1.2.3.4");
    559     assertEquals(ipv4, InetAddresses.getEmbeddedIPv4ClientAddress(testIp));
    560 
    561     // Test Teredo address.
    562     testIp = (Inet6Address) InetAddresses.forString(
    563         "2001:0000:4136:e378:8000:63bf:3fff:fdd2");
    564     assertTrue(InetAddresses.hasEmbeddedIPv4ClientAddress(testIp));
    565     ipv4 = InetAddresses.forString("192.0.2.45");
    566     assertEquals(ipv4, InetAddresses.getEmbeddedIPv4ClientAddress(testIp));
    567   }
    568 
    569   public void testGetCoercedIPv4Address() {
    570     // Check that a coerced IPv4 address is unaltered.
    571     InetAddress localHost4 = InetAddresses.forString("127.0.0.1");
    572     assertEquals(localHost4,
    573                  InetAddresses.getCoercedIPv4Address(localHost4));
    574 
    575     // ::1 special case
    576     assertEquals(localHost4,
    577                  InetAddresses.getCoercedIPv4Address(
    578                      InetAddresses.forString("::1")));
    579 
    580     // :: special case
    581     assertEquals(InetAddresses.forString("0.0.0.0"),
    582                  InetAddresses.getCoercedIPv4Address(
    583                      InetAddresses.forString("::")));
    584 
    585     // test compat address (should be hashed)
    586     assertTrue(InetAddresses.forString("1.2.3.4") !=
    587                InetAddresses.getCoercedIPv4Address(
    588                    InetAddresses.forString("::1.2.3.4")));
    589 
    590     // test 6to4 address (should be hashed)
    591     assertTrue(InetAddresses.forString("1.2.3.4") !=
    592                InetAddresses.getCoercedIPv4Address(
    593                    InetAddresses.forString("2002:0102:0304::1")));
    594 
    595     // 2 6to4 addresses differing in the embedded IPv4 address should
    596     // hash to the different values.
    597     assertTrue(InetAddresses.getCoercedIPv4Address(
    598                    InetAddresses.forString("2002:0102:0304::1")) !=
    599                InetAddresses.getCoercedIPv4Address(
    600                    InetAddresses.forString("2002:0506:0708::1")));
    601 
    602     // 2 6to4 addresses NOT differing in the embedded IPv4 address should
    603     // hash to the same value.
    604     assertTrue(InetAddresses.getCoercedIPv4Address(
    605                    InetAddresses.forString("2002:0102:0304::1")) !=
    606                InetAddresses.getCoercedIPv4Address(
    607                    InetAddresses.forString("2002:0102:0304::2")));
    608 
    609     // test Teredo address (should be hashed)
    610     assertTrue(InetAddresses.forString("192.0.2.45") !=
    611                InetAddresses.getCoercedIPv4Address(
    612                    InetAddresses.forString(
    613                        "2001:0000:4136:e378:8000:63bf:3fff:fdd2")));
    614 
    615     // 2 Teredo addresses differing in the embedded IPv4 address should
    616     // hash to the different values.
    617     assertTrue(InetAddresses.getCoercedIPv4Address(
    618                    InetAddresses.forString(
    619                        "2001:0000:4136:e378:8000:63bf:3fff:fdd2")) !=
    620                InetAddresses.getCoercedIPv4Address(
    621                    InetAddresses.forString(
    622                        "2001:0000:4136:e379:8000:63bf:3fff:fdd2")));
    623 
    624     // 2 Teredo addresses NOT differing in the embedded IPv4 address should
    625     // hash to the same value.
    626     assertEquals(InetAddresses.getCoercedIPv4Address(
    627                      InetAddresses.forString(
    628                          "2001:0000:4136:e378:8000:63bf:3fff:fdd2")),
    629                  InetAddresses.getCoercedIPv4Address(
    630                      InetAddresses.forString(
    631                          "2001:0000:4136:e378:9000:63bf:3fff:fdd2")));
    632 
    633     // Test that an address hashes in to the 224.0.0.0/3 number-space.
    634     InetAddress coerced = InetAddresses.getCoercedIPv4Address(
    635                               InetAddresses.forString("2001:4860::1"));
    636     assertTrue(0xe0000000 <= InetAddresses.coerceToInteger(coerced));
    637     assertTrue(InetAddresses.coerceToInteger(coerced) <= 0xfffffffe);
    638   }
    639 
    640   public void testToInteger() {
    641     InetAddress ipv4Addr = InetAddresses.forString("127.0.0.1");
    642     assertEquals(0x7f000001, InetAddresses.coerceToInteger(ipv4Addr));
    643   }
    644 
    645   public void testFromInteger() {
    646     assertEquals(InetAddresses.fromInteger(0x7f000001),
    647                  InetAddresses.forString("127.0.0.1"));
    648   }
    649 
    650   public void testFromLittleEndianByteArray() throws UnknownHostException {
    651     assertEquals(
    652         InetAddresses.fromLittleEndianByteArray(new byte[] {1, 2, 3, 4}),
    653         InetAddress.getByAddress(new byte[] {4, 3, 2, 1}));
    654 
    655     assertEquals(
    656         InetAddresses.fromLittleEndianByteArray(
    657             new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}),
    658         InetAddress.getByAddress(
    659             new byte[] {16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}));
    660 
    661     try {
    662       InetAddresses.fromLittleEndianByteArray(new byte[3]);
    663       fail("expected exception");
    664     } catch (UnknownHostException expected) {
    665       // success
    666     }
    667   }
    668 
    669   public void testIsMaximum() throws UnknownHostException {
    670     InetAddress address = InetAddress.getByName("255.255.255.254");
    671     assertFalse(InetAddresses.isMaximum(address));
    672 
    673     address = InetAddress.getByName("255.255.255.255");
    674     assertTrue(InetAddresses.isMaximum(address));
    675 
    676     address = InetAddress.getByName("ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffe");
    677     assertFalse(InetAddresses.isMaximum(address));
    678 
    679     address = InetAddress.getByName("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
    680     assertTrue(InetAddresses.isMaximum(address));
    681   }
    682 
    683   public void testIncrementIPv4() throws UnknownHostException {
    684     InetAddress address_66_0 = InetAddress.getByName("172.24.66.0");
    685     InetAddress address_66_255 = InetAddress.getByName("172.24.66.255");
    686     InetAddress address_67_0 = InetAddress.getByName("172.24.67.0");
    687 
    688     InetAddress address = address_66_0;
    689     for (int i = 0; i < 255; i++) {
    690       address = InetAddresses.increment(address);
    691     }
    692     assertEquals(address_66_255, address);
    693 
    694     address = InetAddresses.increment(address);
    695     assertEquals(address_67_0, address);
    696 
    697     InetAddress address_ffffff = InetAddress.getByName("255.255.255.255");
    698     address = address_ffffff;
    699     try {
    700       address = InetAddresses.increment(address);
    701       fail();
    702     } catch (IllegalArgumentException expected) {}
    703   }
    704 
    705   public void testIncrementIPv6() throws UnknownHostException {
    706     InetAddress addressV6_66_0 = InetAddress.getByName("2001:db8::6600");
    707     InetAddress addressV6_66_ff = InetAddress.getByName("2001:db8::66ff");
    708     InetAddress addressV6_67_0 = InetAddress.getByName("2001:db8::6700");
    709 
    710     InetAddress address = addressV6_66_0;
    711     for (int i = 0; i < 255; i++) {
    712       address = InetAddresses.increment(address);
    713     }
    714     assertEquals(addressV6_66_ff, address);
    715 
    716     address = InetAddresses.increment(address);
    717     assertEquals(addressV6_67_0, address);
    718 
    719     InetAddress addressV6_ffffff =
    720         InetAddress.getByName("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
    721     address = addressV6_ffffff;
    722     try {
    723       address = InetAddresses.increment(address);
    724       fail();
    725     } catch (IllegalArgumentException expected) {}
    726   }
    727 
    728   public void testDecrementIPv4() throws UnknownHostException {
    729     InetAddress address660 = InetAddress.getByName("172.24.66.0");
    730     InetAddress address66255 = InetAddress.getByName("172.24.66.255");
    731     InetAddress address670 = InetAddress.getByName("172.24.67.0");
    732 
    733     InetAddress address = address670;
    734     address = InetAddresses.decrement(address);
    735 
    736     assertEquals(address66255, address);
    737 
    738     for (int i = 0; i < 255; i++) {
    739       address = InetAddresses.decrement(address);
    740     }
    741     assertEquals(address660, address);
    742 
    743     InetAddress address0000 = InetAddress.getByName("0.0.0.0");
    744     address = address0000;
    745     try {
    746       address = InetAddresses.decrement(address);
    747       fail();
    748     } catch (IllegalArgumentException expected) {}
    749   }
    750 
    751   public void testDecrementIPv6() throws UnknownHostException {
    752     InetAddress addressV6660 = InetAddress.getByName("2001:db8::6600");
    753     InetAddress addressV666ff = InetAddress.getByName("2001:db8::66ff");
    754     InetAddress addressV6670 = InetAddress.getByName("2001:db8::6700");
    755 
    756     InetAddress address = addressV6670;
    757     address = InetAddresses.decrement(address);
    758 
    759     assertEquals(addressV666ff, address);
    760 
    761     for (int i = 0; i < 255; i++) {
    762       address = InetAddresses.decrement(address);
    763     }
    764     assertEquals(addressV6660, address);
    765 
    766     InetAddress addressV6000000 =
    767         InetAddress.getByName("0:0:0:0:0:0:0:0");
    768     address = addressV6000000;
    769     try {
    770       address = InetAddresses.decrement(address);
    771       fail();
    772     } catch (IllegalArgumentException expected) {}
    773   }
    774 }
    775