spec/util_ip_spec.lua
author Matthew Wild <mwild1@gmail.com>
Sun, 17 Mar 2024 10:10:24 +0000
changeset 13464 a688947fab1e
parent 13432 dc1ad5f3f597
permissions -rw-r--r--
mod_bosh: Set base_type on session This fixes a traceback with mod_saslauth. Ideally we move this to util.session at some point, though.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8239
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     1
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     2
local ip = require "util.ip";
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     3
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     4
local new_ip = ip.new_ip;
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     5
local match = ip.match;
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     6
local parse_cidr = ip.parse_cidr;
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     7
local commonPrefixLength = ip.commonPrefixLength;
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     9
describe("util.ip", function()
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    10
	describe("#match()", function()
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    11
		it("should work", function()
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    12
			local _ = new_ip;
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    13
			local ip = _"10.20.30.40";
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    14
			assert.are.equal(match(ip, _"10.0.0.0", 8), true);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    15
			assert.are.equal(match(ip, _"10.0.0.0", 16), false);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    16
			assert.are.equal(match(ip, _"10.0.0.0", 24), false);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    17
			assert.are.equal(match(ip, _"10.0.0.0", 32), false);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    18
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    19
			assert.are.equal(match(ip, _"10.20.0.0", 8), true);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    20
			assert.are.equal(match(ip, _"10.20.0.0", 16), true);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    21
			assert.are.equal(match(ip, _"10.20.0.0", 24), false);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    22
			assert.are.equal(match(ip, _"10.20.0.0", 32), false);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    23
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    24
			assert.are.equal(match(ip, _"0.0.0.0", 32), false);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    25
			assert.are.equal(match(ip, _"0.0.0.0", 0), true);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    26
			assert.are.equal(match(ip, _"0.0.0.0"), false);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    27
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    28
			assert.are.equal(match(ip, _"10.0.0.0", 255), false, "excessive number of bits");
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    29
			assert.are.equal(match(ip, _"10.0.0.0", -8), true, "negative number of bits");
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    30
			assert.are.equal(match(ip, _"10.0.0.0", -32), true, "negative number of bits");
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    31
			assert.are.equal(match(ip, _"10.0.0.0", 0), true, "zero bits");
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    32
			assert.are.equal(match(ip, _"10.0.0.0"), false, "no specified number of bits (differing ip)");
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    33
			assert.are.equal(match(ip, _"10.20.30.40"), true, "no specified number of bits (same ip)");
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    34
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    35
			assert.are.equal(match(_"127.0.0.1", _"127.0.0.1"), true, "simple ip");
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    36
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    37
			assert.are.equal(match(_"8.8.8.8", _"8.8.0.0", 16), true);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    38
			assert.are.equal(match(_"8.8.4.4", _"8.8.0.0", 16), true);
13432
dc1ad5f3f597 util.ip: Add another test case for match() and commonPrefixLength()
Matthew Wild <mwild1@gmail.com>
parents: 12938
diff changeset
    39
dc1ad5f3f597 util.ip: Add another test case for match() and commonPrefixLength()
Matthew Wild <mwild1@gmail.com>
parents: 12938
diff changeset
    40
			assert.are.equal(match(_"fe80::1", _"fec0::", 10), false);
8239
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    41
		end);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    42
	end);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    43
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    44
	describe("#parse_cidr()", function()
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    45
		it("should work", function()
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    46
			assert.are.equal(new_ip"0.0.0.0", new_ip"0.0.0.0")
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    47
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    48
			local function assert_cidr(cidr, ip, bits)
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    49
				local parsed_ip, parsed_bits = parse_cidr(cidr);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    50
				assert.are.equal(new_ip(ip), parsed_ip, cidr.." parsed ip is "..ip);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    51
				assert.are.equal(bits, parsed_bits, cidr.." parsed bits is "..tostring(bits));
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    52
			end
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    53
			assert_cidr("0.0.0.0", "0.0.0.0", nil);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    54
			assert_cidr("127.0.0.1", "127.0.0.1", nil);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    55
			assert_cidr("127.0.0.1/0", "127.0.0.1", 0);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    56
			assert_cidr("127.0.0.1/8", "127.0.0.1", 8);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    57
			assert_cidr("127.0.0.1/32", "127.0.0.1", 32);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    58
			assert_cidr("127.0.0.1/256", "127.0.0.1", 256);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    59
			assert_cidr("::/48", "::", 48);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    60
		end);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    61
	end);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    62
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    63
	describe("#new_ip()", function()
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    64
		it("should work", function()
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    65
			local v4, v6 = "IPv4", "IPv6";
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    66
			local function assert_proto(s, proto)
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    67
				local ip = new_ip(s);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    68
				if proto then
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    69
					assert.are.equal(ip and ip.proto, proto, "protocol is correct for "..("%q"):format(s));
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    70
				else
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    71
					assert.are.equal(ip, nil, "address is invalid");
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    72
				end
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    73
			end
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    74
			assert_proto("127.0.0.1", v4);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    75
			assert_proto("::1", v6);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    76
			assert_proto("", nil);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    77
			assert_proto("abc", nil);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    78
			assert_proto("   ", nil);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    79
		end);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    80
	end);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    81
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    82
	describe("#commonPrefixLength()", function()
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    83
		it("should work", function()
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    84
			local function assert_cpl6(a, b, len, v4)
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    85
				local ipa, ipb = new_ip(a), new_ip(b);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    86
				if v4 then len = len+96; end
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    87
				assert.are.equal(commonPrefixLength(ipa, ipb), len, "common prefix length of "..a.." and "..b.." is "..len);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    88
				assert.are.equal(commonPrefixLength(ipb, ipa), len, "common prefix length of "..b.." and "..a.." is "..len);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    89
			end
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    90
			local function assert_cpl4(a, b, len)
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    91
				return assert_cpl6(a, b, len, "IPv4");
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    92
			end
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    93
			assert_cpl4("0.0.0.0", "0.0.0.0", 32);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    94
			assert_cpl4("255.255.255.255", "0.0.0.0", 0);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    95
			assert_cpl4("255.255.255.255", "255.255.0.0", 16);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    96
			assert_cpl4("255.255.255.255", "255.255.255.255", 32);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    97
			assert_cpl4("255.255.255.255", "255.255.255.255", 32);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    98
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    99
			assert_cpl6("::1", "::1", 128);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   100
			assert_cpl6("abcd::1", "abcd::1", 128);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   101
			assert_cpl6("abcd::abcd", "abcd::", 112);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   102
			assert_cpl6("abcd::abcd", "abcd::abcd:abcd", 96);
13432
dc1ad5f3f597 util.ip: Add another test case for match() and commonPrefixLength()
Matthew Wild <mwild1@gmail.com>
parents: 12938
diff changeset
   103
dc1ad5f3f597 util.ip: Add another test case for match() and commonPrefixLength()
Matthew Wild <mwild1@gmail.com>
parents: 12938
diff changeset
   104
			assert_cpl6("fe80::1", "fec0::", 9);
8239
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   105
		end);
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   106
	end);
12938
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   107
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   108
	describe("#truncate()", function ()
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   109
		it("should work for IPv4", function ()
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   110
			local ip1 = ip.new_ip("192.168.0.1");
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   111
			local ip2 = ip.truncate(ip1, 16);
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   112
			assert.truthy(ip.is_ip(ip2));
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   113
			assert.equal("192.168.0.0", ip2.normal);
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   114
			assert.equal("192.168.0.1", ip1.normal); -- original unmodified
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   115
		end);
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   116
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   117
		it("should work for IPv6", function ()
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   118
			local ip1 = ip.new_ip("2001:db8::ff00:42:8329");
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   119
			local ip2 = ip.truncate(ip1, 24);
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   120
			assert.truthy(ip.is_ip(ip2));
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   121
			assert.equal("2001:d00::", ip2.normal);
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   122
			assert.equal("2001:db8::ff00:42:8329", ip1.normal); -- original unmodified
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   123
		end);
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   124
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   125
		it("accepts a string", function ()
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   126
			assert.equal("127.0.0.0", ip.truncate("127.0.0.1", 8).normal);
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   127
		end);
c6dffebab2f8 util.ip: Tests for truncate()
Matthew Wild <mwild1@gmail.com>
parents: 8239
diff changeset
   128
	end);
8239
4878e4159e12 Port tests to the `busted` test runner
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   129
end);