From 7c008262bfef15165e6c9e5f16aaffa8177e5fbb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Felix=20D=C3=B6rre?= Date: Thu, 13 Nov 2014 12:18:48 +0100 Subject: [PATCH] UPD: Public Suffixes Parameterized. --- .../cacert/gigi/util/TestPublicSuffixes.java | 154 ++++++------------ .../cacert/gigi/util/TestPublicSuffixes.txt | 98 +++++++++++ 2 files changed, 145 insertions(+), 107 deletions(-) create mode 100644 tests/org/cacert/gigi/util/TestPublicSuffixes.txt diff --git a/tests/org/cacert/gigi/util/TestPublicSuffixes.java b/tests/org/cacert/gigi/util/TestPublicSuffixes.java index 98c3e112..dba88303 100644 --- a/tests/org/cacert/gigi/util/TestPublicSuffixes.java +++ b/tests/org/cacert/gigi/util/TestPublicSuffixes.java @@ -2,10 +2,19 @@ package org.cacert.gigi.util; import static org.junit.Assert.*; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; import java.net.IDN; +import java.util.ArrayList; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; +@RunWith(Parameterized.class) public class TestPublicSuffixes { /** @@ -13,120 +22,51 @@ public class TestPublicSuffixes { * http://mxr.mozilla.org/mozilla-central/source/netwerk/test/unit * /data/test_psl.txt?raw=1 */ - @Test - public void testMozilla() { - // Any copyright is dedicated to the Public Domain. - // http://creativecommons.org/publicdomain/zero/1.0/ + @Parameters(name = "publicSuffix({0}) = {1}") + public static Iterable genParams() throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(TestPublicSuffixes.class.getResourceAsStream("TestPublicSuffixes.txt"), "UTF-8")); + ArrayList result = new ArrayList<>(); + String line; + while ((line = br.readLine()) != null) { + if (line.startsWith("//") || line.isEmpty()) { + continue; + } + String parseSuffix = "checkPublicSuffix("; + if (line.startsWith(parseSuffix)) { + String data = line.substring(parseSuffix.length(), line.length() - 2); + String[] parts = data.split(", "); + if (parts.length != 2) { + throw new Error("Syntax error in public suffix test data file: " + line); + } + result.add(new String[] { + parse(parts[0]), parse(parts[1]) + }); + } else { + throw new Error("Unparsable line: " + line); + } + } - // null input. - checkPublicSuffix(null, null); - // Mixed case. - checkPublicSuffix("COM", null); - checkPublicSuffix("example.COM", "example.com"); - checkPublicSuffix("WwW.example.COM", "example.com"); - // Leading dot. - // checkPublicSuffix(".com", null); - // checkPublicSuffix(".example", null); - // checkPublicSuffix(".example.com", null); - // checkPublicSuffix(".example.example", null); - // Unlisted TLD. - /* - * checkPublicSuffix("example", null); - * checkPublicSuffix("example.example", "example.example"); - * checkPublicSuffix("b.example.example", "example.example"); - * checkPublicSuffix("a.b.example.example", "example.example"); - */ - // Listed, but non-Internet, TLD. - checkPublicSuffix("local", null); - checkPublicSuffix("example.local", null); - checkPublicSuffix("b.example.local", null); - checkPublicSuffix("a.b.example.local", null); - // TLD with only 1 rule. - checkPublicSuffix("biz", null); - checkPublicSuffix("domain.biz", "domain.biz"); - checkPublicSuffix("b.domain.biz", "domain.biz"); - checkPublicSuffix("a.b.domain.biz", "domain.biz"); - // TLD with some 2-level rules. - checkPublicSuffix("com", null); - checkPublicSuffix("example.com", "example.com"); - checkPublicSuffix("b.example.com", "example.com"); - checkPublicSuffix("a.b.example.com", "example.com"); - checkPublicSuffix("uk.com", null); - checkPublicSuffix("example.uk.com", "example.uk.com"); - checkPublicSuffix("b.example.uk.com", "example.uk.com"); - checkPublicSuffix("a.b.example.uk.com", "example.uk.com"); - checkPublicSuffix("test.ac", "test.ac"); - // TLD with only 1 (wildcard) rule. - checkPublicSuffix("cy", null); - checkPublicSuffix("c.cy", null); - checkPublicSuffix("b.c.cy", "b.c.cy"); - checkPublicSuffix("a.b.c.cy", "b.c.cy"); - // More complex TLD. - checkPublicSuffix("jp", null); - checkPublicSuffix("test.jp", "test.jp"); - checkPublicSuffix("www.test.jp", "test.jp"); - checkPublicSuffix("ac.jp", null); - checkPublicSuffix("test.ac.jp", "test.ac.jp"); - checkPublicSuffix("www.test.ac.jp", "test.ac.jp"); - checkPublicSuffix("kyoto.jp", null); - checkPublicSuffix("test.kyoto.jp", "test.kyoto.jp"); - checkPublicSuffix("ide.kyoto.jp", null); - checkPublicSuffix("b.ide.kyoto.jp", "b.ide.kyoto.jp"); - checkPublicSuffix("a.b.ide.kyoto.jp", "b.ide.kyoto.jp"); - checkPublicSuffix("c.kobe.jp", null); - checkPublicSuffix("b.c.kobe.jp", "b.c.kobe.jp"); - checkPublicSuffix("a.b.c.kobe.jp", "b.c.kobe.jp"); - checkPublicSuffix("city.kobe.jp", "city.kobe.jp"); - checkPublicSuffix("www.city.kobe.jp", "city.kobe.jp"); - // TLD with a wildcard rule and exceptions. - checkPublicSuffix("ck", null); - checkPublicSuffix("test.ck", null); - checkPublicSuffix("b.test.ck", "b.test.ck"); - checkPublicSuffix("a.b.test.ck", "b.test.ck"); - checkPublicSuffix("www.ck", "www.ck"); - checkPublicSuffix("www.www.ck", "www.ck"); - // US K12. - checkPublicSuffix("us", null); - checkPublicSuffix("test.us", "test.us"); - checkPublicSuffix("www.test.us", "test.us"); - checkPublicSuffix("ak.us", null); - checkPublicSuffix("test.ak.us", "test.ak.us"); - checkPublicSuffix("www.test.ak.us", "test.ak.us"); - checkPublicSuffix("k12.ak.us", null); - checkPublicSuffix("test.k12.ak.us", "test.k12.ak.us"); - checkPublicSuffix("www.test.k12.ak.us", "test.k12.ak.us"); + return result; } - @Test - public void testMozillaIDN() { - // IDN labels. - checkPublicSuffix("食狮.com.cn", "食狮.com.cn"); - checkPublicSuffix("食狮.公司.cn", "食狮.公司.cn"); - checkPublicSuffix("www.食狮.公司.cn", "食狮.公司.cn"); - checkPublicSuffix("shishi.公司.cn", "shishi.公司.cn"); - checkPublicSuffix("公司.cn", null); - checkPublicSuffix("食狮.中国", "食狮.中国"); - checkPublicSuffix("www.食狮.中国", "食狮.中国"); - checkPublicSuffix("shishi.中国", "shishi.中国"); - checkPublicSuffix("中国", null); + private static String parse(String data) { + if (data.equals("null")) { + return null; + } + if (data.startsWith("'") && data.endsWith("'")) { + return data.substring(1, data.length() - 1); + } + throw new Error("Syntax error with literal: " + data); } - @Test - public void testMozillaIDNPuny() { - // Same as above, but punycoded. - checkPublicSuffix("xn--85x722f.com.cn", "xn--85x722f.com.cn"); - checkPublicSuffix("xn--85x722f.xn--55qx5d.cn", "xn--85x722f.xn--55qx5d.cn"); - checkPublicSuffix("www.xn--85x722f.xn--55qx5d.cn", "xn--85x722f.xn--55qx5d.cn"); - checkPublicSuffix("shishi.xn--55qx5d.cn", "shishi.xn--55qx5d.cn"); - checkPublicSuffix("xn--55qx5d.cn", null); - checkPublicSuffix("xn--85x722f.xn--fiqs8s", "xn--85x722f.xn--fiqs8s"); - checkPublicSuffix("www.xn--85x722f.xn--fiqs8s", "xn--85x722f.xn--fiqs8s"); - checkPublicSuffix("shishi.xn--fiqs8s", "shishi.xn--fiqs8s"); - checkPublicSuffix("xn--fiqs8s", null); + @Parameter(0) + public String domain; - } + @Parameter(1) + public String suffix; - private void checkPublicSuffix(String domain, String suffix) { + @Test + public void testPublicSuffix() { if (domain != null) { domain = domain.toLowerCase(); } diff --git a/tests/org/cacert/gigi/util/TestPublicSuffixes.txt b/tests/org/cacert/gigi/util/TestPublicSuffixes.txt new file mode 100644 index 00000000..9c7a4aa5 --- /dev/null +++ b/tests/org/cacert/gigi/util/TestPublicSuffixes.txt @@ -0,0 +1,98 @@ +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ + +// null input. +checkPublicSuffix(null, null); +// Mixed case. +checkPublicSuffix('COM', null); +checkPublicSuffix('example.COM', 'example.com'); +checkPublicSuffix('WwW.example.COM', 'example.com'); +// Leading dot. +//checkPublicSuffix('.com', null); +//checkPublicSuffix('.example', null); +//checkPublicSuffix('.example.com', null); +//checkPublicSuffix('.example.example', null); +// Unlisted TLD. +//checkPublicSuffix('example', null); +//checkPublicSuffix('example.example', 'example.example'); +//checkPublicSuffix('b.example.example', 'example.example'); +//checkPublicSuffix('a.b.example.example', 'example.example'); +// Listed, but non-Internet, TLD. +checkPublicSuffix('local', null); +checkPublicSuffix('example.local', null); +checkPublicSuffix('b.example.local', null); +checkPublicSuffix('a.b.example.local', null); +// TLD with only 1 rule. +checkPublicSuffix('biz', null); +checkPublicSuffix('domain.biz', 'domain.biz'); +checkPublicSuffix('b.domain.biz', 'domain.biz'); +checkPublicSuffix('a.b.domain.biz', 'domain.biz'); +// TLD with some 2-level rules. +checkPublicSuffix('com', null); +checkPublicSuffix('example.com', 'example.com'); +checkPublicSuffix('b.example.com', 'example.com'); +checkPublicSuffix('a.b.example.com', 'example.com'); +checkPublicSuffix('uk.com', null); +checkPublicSuffix('example.uk.com', 'example.uk.com'); +checkPublicSuffix('b.example.uk.com', 'example.uk.com'); +checkPublicSuffix('a.b.example.uk.com', 'example.uk.com'); +checkPublicSuffix('test.ac', 'test.ac'); +// TLD with only 1 (wildcard) rule. +checkPublicSuffix('cy', null); +checkPublicSuffix('c.cy', null); +checkPublicSuffix('b.c.cy', 'b.c.cy'); +checkPublicSuffix('a.b.c.cy', 'b.c.cy'); +// More complex TLD. +checkPublicSuffix('jp', null); +checkPublicSuffix('test.jp', 'test.jp'); +checkPublicSuffix('www.test.jp', 'test.jp'); +checkPublicSuffix('ac.jp', null); +checkPublicSuffix('test.ac.jp', 'test.ac.jp'); +checkPublicSuffix('www.test.ac.jp', 'test.ac.jp'); +checkPublicSuffix('kyoto.jp', null); +checkPublicSuffix('test.kyoto.jp', 'test.kyoto.jp'); +checkPublicSuffix('ide.kyoto.jp', null); +checkPublicSuffix('b.ide.kyoto.jp', 'b.ide.kyoto.jp'); +checkPublicSuffix('a.b.ide.kyoto.jp', 'b.ide.kyoto.jp'); +checkPublicSuffix('c.kobe.jp', null); +checkPublicSuffix('b.c.kobe.jp', 'b.c.kobe.jp'); +checkPublicSuffix('a.b.c.kobe.jp', 'b.c.kobe.jp'); +checkPublicSuffix('city.kobe.jp', 'city.kobe.jp'); +checkPublicSuffix('www.city.kobe.jp', 'city.kobe.jp'); +// TLD with a wildcard rule and exceptions. +checkPublicSuffix('ck', null); +checkPublicSuffix('test.ck', null); +checkPublicSuffix('b.test.ck', 'b.test.ck'); +checkPublicSuffix('a.b.test.ck', 'b.test.ck'); +checkPublicSuffix('www.ck', 'www.ck'); +checkPublicSuffix('www.www.ck', 'www.ck'); +// US K12. +checkPublicSuffix('us', null); +checkPublicSuffix('test.us', 'test.us'); +checkPublicSuffix('www.test.us', 'test.us'); +checkPublicSuffix('ak.us', null); +checkPublicSuffix('test.ak.us', 'test.ak.us'); +checkPublicSuffix('www.test.ak.us', 'test.ak.us'); +checkPublicSuffix('k12.ak.us', null); +checkPublicSuffix('test.k12.ak.us', 'test.k12.ak.us'); +checkPublicSuffix('www.test.k12.ak.us', 'test.k12.ak.us'); +// IDN labels. +checkPublicSuffix('食狮.com.cn', '食狮.com.cn'); +checkPublicSuffix('食狮.公司.cn', '食狮.公司.cn'); +checkPublicSuffix('www.食狮.公司.cn', '食狮.公司.cn'); +checkPublicSuffix('shishi.公司.cn', 'shishi.公司.cn'); +checkPublicSuffix('公司.cn', null); +checkPublicSuffix('食狮.中国', '食狮.中国'); +checkPublicSuffix('www.食狮.中国', '食狮.中国'); +checkPublicSuffix('shishi.中国', 'shishi.中国'); +checkPublicSuffix('中国', null); +// Same as above, but punycoded. +checkPublicSuffix('xn--85x722f.com.cn', 'xn--85x722f.com.cn'); +checkPublicSuffix('xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); +checkPublicSuffix('www.xn--85x722f.xn--55qx5d.cn', 'xn--85x722f.xn--55qx5d.cn'); +checkPublicSuffix('shishi.xn--55qx5d.cn', 'shishi.xn--55qx5d.cn'); +checkPublicSuffix('xn--55qx5d.cn', null); +checkPublicSuffix('xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); +checkPublicSuffix('www.xn--85x722f.xn--fiqs8s', 'xn--85x722f.xn--fiqs8s'); +checkPublicSuffix('shishi.xn--fiqs8s', 'shishi.xn--fiqs8s'); +checkPublicSuffix('xn--fiqs8s', null); -- 2.39.2