11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2009 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.net;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Strings;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.ImmutableList;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.Iterables;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.EqualsTester;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Locale;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link TestCase} for {@link InternetDomainName}.
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Craig Berry
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class InternetDomainNameTest extends TestCase {
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final InternetDomainName UNICODE_EXAMPLE =
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      InternetDomainName.from("j\u00f8rpeland.no");
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final InternetDomainName PUNYCODE_EXAMPLE =
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      InternetDomainName.from("xn--jrpeland-54a.no");
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The Greek letter delta, used in unicode testing.
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final String DELTA = "\u0394";
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * A domain part which is valid under lenient validation, but invalid under
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * strict validation.
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static final String LOTS_OF_DELTAS = Strings.repeat(DELTA, 62);
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final String ALMOST_TOO_MANY_LEVELS =
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Strings.repeat("a.", 127);
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final String ALMOST_TOO_LONG =
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Strings.repeat("aaaaa.", 40) + "1234567890.c";
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> VALID_NAME = ImmutableList.of(
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "foo.com",
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "f-_-o.cOM",
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "f--1.com",
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "f11-1.com",
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "www",
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "abc.a23",
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "biz.com.ua",
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "x",
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "fOo",
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "f--o",
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "f_a",
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "foo.net.us\uFF61ocm",
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "woo.com.",
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "a" + DELTA + "b.com",
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ALMOST_TOO_MANY_LEVELS,
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ALMOST_TOO_LONG);
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> INVALID_NAME = ImmutableList.of(
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "",
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      " ",
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "127.0.0.1",
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "::1", "13",
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "abc.12c",
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "foo-.com",
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "_bar.quux",
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "foo+bar.com",
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "foo!bar.com",
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ".foo.com",
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "..bar.com",
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "baz..com",
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "..quiffle.com",
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "fleeb.com..",
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ".",
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "..",
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "...",
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "a" + DELTA + " .com",
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ALMOST_TOO_MANY_LEVELS + "com",
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ALMOST_TOO_LONG + ".c");
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> PS = ImmutableList.of(
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "com",
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "co.uk",
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "foo.ar",
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "xxxxxx.ar",
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "org.mK",
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "us",
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "uk\uFF61com.",  // Alternate dot character
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "\u7f51\u7edc.Cn",  // "网络.Cn"
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "j\u00f8rpeland.no",  // "jorpeland.no" (first o slashed)
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "xn--jrpeland-54a.no"  // IDNA (punycode) encoding of above
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  );
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> NO_PS = ImmutableList.of(
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "www", "foo.google", "x.y.z");
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> NON_PS = ImmutableList.of(
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "foo.bar.com", "foo.ca", "foo.bar.ca",
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "foo.bar.co.il", "state.CA.us", "www.state.pa.us", "pvt.k12.ca.us",
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "www.google.com", "www4.yahoo.co.uk", "home.netscape.com",
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "web.MIT.edu", "foo.eDu.au", "utenti.blah.IT", "dominio.com.co");
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> TOP_PRIVATE_DOMAIN = ImmutableList.of(
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "google.com", "foo.Co.uk", "foo.ca.us.");
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> UNDER_PRIVATE_DOMAIN = ImmutableList.of(
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "foo.bar.google.com", "a.b.co.uk", "x.y.ca.us");
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> VALID_IP_ADDRS = ImmutableList.of(
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "1.2.3.4", "127.0.0.1", "::1", "2001:db8::1");
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> INVALID_IP_ADDRS = ImmutableList.of(
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "", "1", "1.2.3", "...", "1.2.3.4.5", "400.500.600.700",
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ":", ":::1", "2001:db8:");
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> SOMEWHERE_UNDER_PS = ImmutableList.of(
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "foo.bar.google.com",
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "a.b.c.1.2.3.ca.us",
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.jp",
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "uomi-online.kir.jp",
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "jprs.co.jp",
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.quick.jp",
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.tenki.jp",
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.or.jp",
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.gr.jp",
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.ne.jp",
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.ac.jp",
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.ad.jp",
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.ed.jp",
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.geo.jp",
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.go.jp",
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.lg.jp",
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "1.fm",
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.cc",
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.ee",
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.fi",
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.fm",
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.gr",
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "www.leguide.ma",
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.ma",
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "some.org.mk",
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.mk",
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.tv",
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "site.us",
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "www.odev.us",
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "www.GOOGLE.com",
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "www.com",
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "google.com",
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "www7.google.co.uk",
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "google.Co.uK",
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "jobs.kt.com.",
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "home.netscape.com",
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "web.stanford.edu",
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "stanford.edu",
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "state.ca.us",
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "www.state.ca.us",
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "state.ca.us",
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "pvt.k12.ca.us",
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "www.rave.ca.",
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "cnn.ca",
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "ledger-enquirer.com",
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "it-trace.ch",
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "cool.dk",
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "cool.co.uk",
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "cool.de",
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "cool.es",
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "cool\uFF61fr", // Alternate dot character
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "cool.nl",
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "members.blah.nl.",
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "cool.se",
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "utenti.blah.it",
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "kt.co",
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      "a\u7f51\u7edcA.\u7f51\u7edc.Cn"  // "a网络A.网络.Cn"
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  );
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValid() {
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String name : VALID_NAME) {
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      InternetDomainName.from(name);
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInvalid() {
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String name : INVALID_NAME) {
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        InternetDomainName.from(name);
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Should have been invalid: '" + name + "'");
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalArgumentException expected) {
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        // Expected case
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPublicSuffix() {
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String name : PS) {
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final InternetDomainName domain = InternetDomainName.from(name);
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.isPublicSuffix());
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.hasPublicSuffix());
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.isUnderPublicSuffix());
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.isTopPrivateDomain());
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(domain, domain.publicSuffix());
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String name : NO_PS) {
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final InternetDomainName domain = InternetDomainName.from(name);
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.isPublicSuffix());
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.hasPublicSuffix());
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.isUnderPublicSuffix());
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.isTopPrivateDomain());
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertNull(domain.publicSuffix());
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String name : NON_PS) {
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final InternetDomainName domain = InternetDomainName.from(name);
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.isPublicSuffix());
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.hasPublicSuffix());
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.isUnderPublicSuffix());
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testUnderPublicSuffix() {
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String name : SOMEWHERE_UNDER_PS) {
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final InternetDomainName domain = InternetDomainName.from(name);
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.isPublicSuffix());
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.hasPublicSuffix());
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.isUnderPublicSuffix());
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTopPrivateDomain() {
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String name : TOP_PRIVATE_DOMAIN) {
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final InternetDomainName domain = InternetDomainName.from(name);
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.isPublicSuffix());
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.hasPublicSuffix());
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.isUnderPublicSuffix());
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.isTopPrivateDomain());
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(domain.parent(), domain.publicSuffix());
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testUnderPrivateDomain() {
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String name : UNDER_PRIVATE_DOMAIN) {
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      final InternetDomainName domain = InternetDomainName.from(name);
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.isPublicSuffix());
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.hasPublicSuffix());
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(name, domain.isUnderPublicSuffix());
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(name, domain.isTopPrivateDomain());
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testParent() {
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "com",
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        InternetDomainName.from("google.com").parent().name());
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "uk",
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        InternetDomainName.from("co.uk").parent().name());
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "google.com",
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        InternetDomainName.from("www.google.com").parent().name());
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      InternetDomainName.from("com").parent();
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("'com' should throw ISE on .parent() call");
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testChild() {
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    InternetDomainName domain = InternetDomainName.from("foo.com");
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("www.foo.com", domain.child("www").name());
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      domain.child("www.");
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("www..google.com should have been invalid");
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Expected outcome
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testParentChild() {
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    InternetDomainName origin = InternetDomainName.from("foo.com");
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    InternetDomainName parent = origin.parent();
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("com", parent.name());
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // These would throw an exception if leniency were not preserved during parent() and child()
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // calls.
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    InternetDomainName child = parent.child(LOTS_OF_DELTAS);
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    child.child(LOTS_OF_DELTAS);
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testValidTopPrivateDomain() {
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    InternetDomainName googleDomain = InternetDomainName.from("google.com");
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(googleDomain, googleDomain.topPrivateDomain());
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(googleDomain, googleDomain.child("mail").topPrivateDomain());
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(googleDomain, googleDomain.child("foo.bar").topPrivateDomain());
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testInvalidTopPrivateDomain() {
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> badCookieDomains = ImmutableList.of("co.uk", "foo", "com");
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String domain : badCookieDomains) {
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        InternetDomainName.from(domain).topPrivateDomain();
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail(domain);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (IllegalStateException expected) {
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsValid() {
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Iterable<String> validCases = Iterables.concat(
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        VALID_NAME, PS, NO_PS, NON_PS);
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Iterable<String> invalidCases = Iterables.concat(
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        INVALID_NAME, VALID_IP_ADDRS, INVALID_IP_ADDRS);
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String valid : validCases) {
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(valid, InternetDomainName.isValid(valid));
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String invalid : invalidCases) {
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(invalid, InternetDomainName.isValid(invalid));
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO(hhchan): Resurrect this test after removing the reference to
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // String.toLowerCase(Locale)
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("String.toLowerCase(Locale)")
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testName() {
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String inputName : SOMEWHERE_UNDER_PS) {
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      InternetDomainName domain = InternetDomainName.from(inputName);
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      /*
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       * We would ordinarily use constants for the expected results, but
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       * doing it by derivation allows us to reuse the test case definitions
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       * used in other tests.
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       */
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String expectedName = inputName.toLowerCase(Locale.ENGLISH);
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      expectedName = expectedName.replaceAll("[\u3002\uFF0E\uFF61]", ".");
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (expectedName.endsWith(".")) {
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        expectedName = expectedName.substring(0, expectedName.length() - 1);
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(expectedName, domain.name());
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testExclusion() {
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    InternetDomainName domain = InternetDomainName.from("foo.nhs.uk");
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(domain.hasPublicSuffix());
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("uk", domain.publicSuffix().name());
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Behold the weirdness!
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(domain.publicSuffix().isPublicSuffix());
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEquality() {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EqualsTester()
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            idn("google.com"), idn("google.com"), idn("GOOGLE.COM"))
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(idn("www.google.com"))
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(UNICODE_EXAMPLE)
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addEqualityGroup(PUNYCODE_EXAMPLE)
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .testEquals();
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static InternetDomainName idn(String domain) {
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return InternetDomainName.from(domain);
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNulls() throws Exception {
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final NullPointerTester tester = new NullPointerTester();
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(InternetDomainName.class);
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicInstanceMethods(InternetDomainName.from("google.com"));
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
404