spec/util_ringbuffer_spec.lua
author Kim Alvefur <zash@zash.se>
Sat, 23 Mar 2024 20:48:19 +0100
changeset 13465 c673ff1075bd
parent 10964 f84e0e2faae2
permissions -rw-r--r--
mod_posix: Move everything to util.startup This allows greater control over the order of events. Notably, the internal ordering between daemonization, initialization of libunbound and setup of signal handling is sensitive. libunbound starts a separate thread for processing DNS requests. If this thread is started before signal handling has been set up, it will not inherit the signal handlers and instead behave as it would have before signal handlers were set up, i.e. cause the whole process to immediately exit. libunbound is usually initialized on the first DNS request, usually triggered by an outgoing s2s connection attempt. If daemonization happens before signals have been set up, signals may not be processed at all.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10901
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
local rb = require "util.ringbuffer";
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
describe("util.ringbuffer", function ()
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
	describe("#new", function ()
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
		it("has a constructor", function ()
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
			assert.Function(rb.new);
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
		end);
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
		it("can be created", function ()
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
			assert.truthy(rb.new());
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
		end);
10902
c6465fb3c839 util.ringbuffer: Prevent creation of zero-size buffer
Kim Alvefur <zash@zash.se>
parents: 10901
diff changeset
    10
		it("won't create an empty buffer", function ()
c6465fb3c839 util.ringbuffer: Prevent creation of zero-size buffer
Kim Alvefur <zash@zash.se>
parents: 10901
diff changeset
    11
			assert.has_error(function ()
c6465fb3c839 util.ringbuffer: Prevent creation of zero-size buffer
Kim Alvefur <zash@zash.se>
parents: 10901
diff changeset
    12
				rb.new(0);
c6465fb3c839 util.ringbuffer: Prevent creation of zero-size buffer
Kim Alvefur <zash@zash.se>
parents: 10901
diff changeset
    13
			end);
c6465fb3c839 util.ringbuffer: Prevent creation of zero-size buffer
Kim Alvefur <zash@zash.se>
parents: 10901
diff changeset
    14
		end);
10903
8048255ae61e util.ringbuffer: Prevent creation of buffer with negative size
Kim Alvefur <zash@zash.se>
parents: 10902
diff changeset
    15
		it("won't create a negatively sized buffer", function ()
8048255ae61e util.ringbuffer: Prevent creation of buffer with negative size
Kim Alvefur <zash@zash.se>
parents: 10902
diff changeset
    16
			assert.has_error(function ()
8048255ae61e util.ringbuffer: Prevent creation of buffer with negative size
Kim Alvefur <zash@zash.se>
parents: 10902
diff changeset
    17
				rb.new(-1);
8048255ae61e util.ringbuffer: Prevent creation of buffer with negative size
Kim Alvefur <zash@zash.se>
parents: 10902
diff changeset
    18
			end);
8048255ae61e util.ringbuffer: Prevent creation of buffer with negative size
Kim Alvefur <zash@zash.se>
parents: 10902
diff changeset
    19
		end);
10901
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
	end);
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
	describe(":write", function ()
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
		local b = rb.new();
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
		it("works", function ()
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
			assert.truthy(b:write("hi"));
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
		end);
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
	end);
10953
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    27
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    28
	describe(":discard", function ()
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    29
		local b = rb.new();
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    30
		it("works", function ()
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    31
			assert.truthy(b:write("hello world"));
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    32
			assert.truthy(b:discard(6));
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    33
			assert.equal(5, #b);
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    34
			assert.equal("world", b:read(5));
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    35
		end);
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    36
	end);
8b5b35baf370 util.ringbuffer: Add test for :discard()
Matthew Wild <mwild1@gmail.com>
parents: 10905
diff changeset
    37
10905
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    38
	describe(":sub", function ()
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    39
		-- Helper function to compare buffer:sub() with string:sub()
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    40
		local function test_sub(b, x, y)
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    41
			local s = b:read(#b, true);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    42
			local string_result, buffer_result = s:sub(x, y), b:sub(x, y);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    43
			assert.equals(string_result, buffer_result, ("buffer:sub(%d, %s) does not match string:sub()"):format(x, y and ("%d"):format(y) or "nil"));
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    44
		end
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    45
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    46
		it("works", function ()
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    47
			local b = rb.new();
10958
fc310727adfb util.ringbuffer: Add some additional asserts to tests
Matthew Wild <mwild1@gmail.com>
parents: 10957
diff changeset
    48
			assert.truthy(b:write("hello world"));
10905
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    49
			assert.equals("hello", b:sub(1, 5));
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    50
		end);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    51
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    52
		it("supports optional end parameter", function ()
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    53
			local b = rb.new();
10958
fc310727adfb util.ringbuffer: Add some additional asserts to tests
Matthew Wild <mwild1@gmail.com>
parents: 10957
diff changeset
    54
			assert.truthy(b:write("hello world"));
10905
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    55
			assert.equals("hello world", b:sub(1));
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    56
			assert.equals("world", b:sub(-5));
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    57
		end);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    58
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    59
		it("is equivalent to string:sub", function ()
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    60
			local b = rb.new(6);
10958
fc310727adfb util.ringbuffer: Add some additional asserts to tests
Matthew Wild <mwild1@gmail.com>
parents: 10957
diff changeset
    61
			assert.truthy(b:write("foobar"));
10905
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    62
			b:read(3);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    63
			b:write("foo");
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    64
			for i = -13, 13 do
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    65
				for j = -13, 13 do
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    66
					test_sub(b, i, j);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    67
				end
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    68
			end
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    69
		end);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    70
	end);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    71
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    72
	describe(":byte", function ()
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    73
		-- Helper function to compare buffer:byte() with string:byte()
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    74
		local function test_byte(b, x, y)
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    75
			local s = b:read(#b, true);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    76
			local string_result, buffer_result = {s:byte(x, y)}, {b:byte(x, y)};
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    77
			assert.same(string_result, buffer_result, ("buffer:byte(%d, %s) does not match string:byte()"):format(x, y and ("%d"):format(y) or "nil"));
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    78
		end
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    79
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    80
		it("is equivalent to string:byte", function ()
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    81
			local b = rb.new(6);
10964
f84e0e2faae2 util.ringbuffer: Fix accidentally committed test change (thanks buildbot)
Matthew Wild <mwild1@gmail.com>
parents: 10958
diff changeset
    82
			assert.truthy(b:write("foobar"));
10905
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    83
			b:read(3);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    84
			b:write("foo");
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    85
			test_byte(b, 1);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    86
			test_byte(b, 3);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    87
			test_byte(b, -1);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    88
			test_byte(b, -3);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    89
			for i = -13, 13 do
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    90
				for j = -13, 13 do
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    91
					test_byte(b, i, j);
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    92
				end
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    93
			end
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
    94
		end);
10957
c3b3ac63f4c3 util.ringbuffer: Ensure unsigned chars are always returned from :byte()
Matthew Wild <mwild1@gmail.com>
parents: 10953
diff changeset
    95
c3b3ac63f4c3 util.ringbuffer: Ensure unsigned chars are always returned from :byte()
Matthew Wild <mwild1@gmail.com>
parents: 10953
diff changeset
    96
		it("works with characters > 127", function ()
c3b3ac63f4c3 util.ringbuffer: Ensure unsigned chars are always returned from :byte()
Matthew Wild <mwild1@gmail.com>
parents: 10953
diff changeset
    97
			local b = rb.new();
c3b3ac63f4c3 util.ringbuffer: Ensure unsigned chars are always returned from :byte()
Matthew Wild <mwild1@gmail.com>
parents: 10953
diff changeset
    98
			b:write(string.char(0, 140));
c3b3ac63f4c3 util.ringbuffer: Ensure unsigned chars are always returned from :byte()
Matthew Wild <mwild1@gmail.com>
parents: 10953
diff changeset
    99
			local r = { b:byte(1, 2) };
c3b3ac63f4c3 util.ringbuffer: Ensure unsigned chars are always returned from :byte()
Matthew Wild <mwild1@gmail.com>
parents: 10953
diff changeset
   100
			assert.same({ 0, 140 }, r);
c3b3ac63f4c3 util.ringbuffer: Ensure unsigned chars are always returned from :byte()
Matthew Wild <mwild1@gmail.com>
parents: 10953
diff changeset
   101
		end);
10905
5e33926f4b43 util.ringbuffer: Add :sub() and :byte() methods equivalent to the string methods
Matthew Wild <mwild1@gmail.com>
parents: 10903
diff changeset
   102
	end);
10901
37df1e757f02 util.ringbuffer: Add some initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   103
end);