1 description("Canonicalization of IPv4 addresses."); 2 3 cases = [ 4 [".", ""], 5 6 // Regular IP addresses in different bases. 7 ["192.168.0.1", "192.168.0.1"], 8 ["0300.0250.00.01", "192.168.0.1"], 9 ["0xC0.0Xa8.0x0.0x1", "192.168.0.1"], 10 11 // Non-IP addresses due to invalid characters. 12 ["192.168.9.com", ""], 13 14 // Invalid characters for the base should be rejected. 15 ["19a.168.0.1", ""], 16 ["0308.0250.00.01", ""], 17 ["0xCG.0xA8.0x0.0x1", ""], 18 19 // If there are not enough components, the last one should fill them out. 20 ["192", "0.0.0.192"], 21 ["0xC0a80001", "192.168.0.1"], 22 ["030052000001", "192.168.0.1"], 23 ["000030052000001", "192.168.0.1"], 24 ["192.168", "192.0.0.168"], 25 ["192.0x00A80001", "192.168.0.1"], 26 ["0xc0.052000001", "192.168.0.1"], 27 ["192.168.1", "192.168.0.1"], 28 29 // Too many components means not an IP address. 30 ["192.168.0.0.1", ""], 31 32 // We allow a single trailing dot. 33 ["192.168.0.1.", "192.168.0.1"], 34 ["192.168.0.1. hello", ""], 35 ["192.168.0.1..", ""], 36 37 // Two dots in a row means not an IP address. 38 ["192.168..1", ""], 39 40 // Any numerical overflow should be marked as BROKEN. 41 ["0x100.0", ""], 42 ["0x100.0.0", ""], 43 ["0x100.0.0.0", ""], 44 ["0.0x100.0.0", ""], 45 ["0.0.0x100.0", ""], 46 ["0.0.0.0x100", ""], 47 ["0.0.0x10000", ""], 48 ["0.0x1000000", ""], 49 ["0x100000000", ""], 50 51 // Repeat the previous tests, minus 1, to verify boundaries. 52 ["0xFF.0", "255.0.0.0"], 53 ["0xFF.0.0", "255.0.0.0"], 54 ["0xFF.0.0.0", "255.0.0.0"], 55 ["0.0xFF.0.0", "0.255.0.0"], 56 ["0.0.0xFF.0", "0.0.255.0"], 57 ["0.0.0.0xFF", "0.0.0.255"], 58 ["0.0.0xFFFF", "0.0.255.255"], 59 ["0.0xFFFFFF", "0.255.255.255"], 60 ["0xFFFFFFFF", "255.255.255.255"], 61 62 // Old trunctations tests. They're all "BROKEN" now. 63 ["276.256.0xf1a2.077777", ""], 64 ["192.168.0.257", ""], 65 ["192.168.0xa20001", ""], 66 ["192.015052000001", ""], 67 ["0X12C0a80001", ""], 68 ["276.1.2", ""], 69 70 // Spaces should be rejected. 71 ["192.168.0.1 hello", ""], 72 73 // Very large numbers. 74 ["0000000000000300.0x00000000000000fF.00000000000000001", "192.255.0.1"], 75 ["0000000000000300.0xffffffffFFFFFFFF.3022415481470977", ""], 76 77 // A number has no length limit, but long numbers can still overflow. 78 ["00000000000000000001", "0.0.0.1"], 79 ["0000000000000000100000000000000001", ""], 80 81 // If a long component is non-numeric, it's a hostname, *not* a broken IP. 82 ["0.0.0.000000000000000000z", ""], 83 ["0.0.0.100000000000000000z", ""], 84 85 // Truncation of all zeros should still result in 0. 86 ["0.00.0x.0x0", "0.0.0.0"] 87 ]; 88 89 // We test the empty string individually. 90 shouldBe("canonicalize('http:///')", "'http:'"); 91 92 for (var i = 0; i < cases.length; ++i) { 93 test_vector = cases[i][0]; 94 expected_result = cases[i][1]; 95 if (expected_result === "") { 96 // We use "" to represent that the test vector ought not to parse. 97 // It appears that we're supposed to apply a default canonicalization. 98 expected_result = escape(test_vector.toLowerCase()); 99 } 100 shouldBe("canonicalize('http://" + test_vector + "/')", 101 "'http://" + expected_result + "/'"); 102 } 103 104 var successfullyParsed = true; 105