1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
local ip = require "util.ip";
local new_ip = ip.new_ip;
local match = ip.match;
local parse_cidr = ip.parse_cidr;
local commonPrefixLength = ip.commonPrefixLength;
describe("util.ip", function()
describe("#match()", function()
it("should work", function()
local _ = new_ip;
local ip = _"10.20.30.40";
assert.are.equal(match(ip, _"10.0.0.0", 8), true);
assert.are.equal(match(ip, _"10.0.0.0", 16), false);
assert.are.equal(match(ip, _"10.0.0.0", 24), false);
assert.are.equal(match(ip, _"10.0.0.0", 32), false);
assert.are.equal(match(ip, _"10.20.0.0", 8), true);
assert.are.equal(match(ip, _"10.20.0.0", 16), true);
assert.are.equal(match(ip, _"10.20.0.0", 24), false);
assert.are.equal(match(ip, _"10.20.0.0", 32), false);
assert.are.equal(match(ip, _"0.0.0.0", 32), false);
assert.are.equal(match(ip, _"0.0.0.0", 0), true);
assert.are.equal(match(ip, _"0.0.0.0"), false);
assert.are.equal(match(ip, _"10.0.0.0", 255), false, "excessive number of bits");
assert.are.equal(match(ip, _"10.0.0.0", -8), true, "negative number of bits");
assert.are.equal(match(ip, _"10.0.0.0", -32), true, "negative number of bits");
assert.are.equal(match(ip, _"10.0.0.0", 0), true, "zero bits");
assert.are.equal(match(ip, _"10.0.0.0"), false, "no specified number of bits (differing ip)");
assert.are.equal(match(ip, _"10.20.30.40"), true, "no specified number of bits (same ip)");
assert.are.equal(match(_"127.0.0.1", _"127.0.0.1"), true, "simple ip");
assert.are.equal(match(_"8.8.8.8", _"8.8.0.0", 16), true);
assert.are.equal(match(_"8.8.4.4", _"8.8.0.0", 16), true);
assert.are.equal(match(_"fe80::1", _"fec0::", 10), false);
end);
end);
describe("#parse_cidr()", function()
it("should work", function()
assert.are.equal(new_ip"0.0.0.0", new_ip"0.0.0.0")
local function assert_cidr(cidr, ip, bits)
local parsed_ip, parsed_bits = parse_cidr(cidr);
assert.are.equal(new_ip(ip), parsed_ip, cidr.." parsed ip is "..ip);
assert.are.equal(bits, parsed_bits, cidr.." parsed bits is "..tostring(bits));
end
assert_cidr("0.0.0.0", "0.0.0.0", nil);
assert_cidr("127.0.0.1", "127.0.0.1", nil);
assert_cidr("127.0.0.1/0", "127.0.0.1", 0);
assert_cidr("127.0.0.1/8", "127.0.0.1", 8);
assert_cidr("127.0.0.1/32", "127.0.0.1", 32);
assert_cidr("127.0.0.1/256", "127.0.0.1", 256);
assert_cidr("::/48", "::", 48);
end);
end);
describe("#new_ip()", function()
it("should work", function()
local v4, v6 = "IPv4", "IPv6";
local function assert_proto(s, proto)
local ip = new_ip(s);
if proto then
assert.are.equal(ip and ip.proto, proto, "protocol is correct for "..("%q"):format(s));
else
assert.are.equal(ip, nil, "address is invalid");
end
end
assert_proto("127.0.0.1", v4);
assert_proto("::1", v6);
assert_proto("", nil);
assert_proto("abc", nil);
assert_proto(" ", nil);
end);
end);
describe("#commonPrefixLength()", function()
it("should work", function()
local function assert_cpl6(a, b, len, v4)
local ipa, ipb = new_ip(a), new_ip(b);
if v4 then len = len+96; end
assert.are.equal(commonPrefixLength(ipa, ipb), len, "common prefix length of "..a.." and "..b.." is "..len);
assert.are.equal(commonPrefixLength(ipb, ipa), len, "common prefix length of "..b.." and "..a.." is "..len);
end
local function assert_cpl4(a, b, len)
return assert_cpl6(a, b, len, "IPv4");
end
assert_cpl4("0.0.0.0", "0.0.0.0", 32);
assert_cpl4("255.255.255.255", "0.0.0.0", 0);
assert_cpl4("255.255.255.255", "255.255.0.0", 16);
assert_cpl4("255.255.255.255", "255.255.255.255", 32);
assert_cpl4("255.255.255.255", "255.255.255.255", 32);
assert_cpl6("::1", "::1", 128);
assert_cpl6("abcd::1", "abcd::1", 128);
assert_cpl6("abcd::abcd", "abcd::", 112);
assert_cpl6("abcd::abcd", "abcd::abcd:abcd", 96);
assert_cpl6("fe80::1", "fec0::", 9);
end);
end);
describe("#truncate()", function ()
it("should work for IPv4", function ()
local ip1 = ip.new_ip("192.168.0.1");
local ip2 = ip.truncate(ip1, 16);
assert.truthy(ip.is_ip(ip2));
assert.equal("192.168.0.0", ip2.normal);
assert.equal("192.168.0.1", ip1.normal); -- original unmodified
end);
it("should work for IPv6", function ()
local ip1 = ip.new_ip("2001:db8::ff00:42:8329");
local ip2 = ip.truncate(ip1, 24);
assert.truthy(ip.is_ip(ip2));
assert.equal("2001:d00::", ip2.normal);
assert.equal("2001:db8::ff00:42:8329", ip1.normal); -- original unmodified
end);
it("accepts a string", function ()
assert.equal("127.0.0.0", ip.truncate("127.0.0.1", 8).normal);
end);
end);
end);
|