File

spec/util_iterators_spec.lua @ 13765:7c57fb2ffbb0 13.0

mod_websocket: Merge session close handling changes from mod_c2s (bug fixes) This should bring some fixes and general robustness that mod_websocket had missed out on. The duplicated code here is not at all ideal. To prevent this happening again, we should figure out how to have the common logic in a single place, while still being able to do the websocket-specific parts that we need. The main known bug that this fixes is that it's possible for a session to get into a non-destroyable state. For example, if we try to session:close() a hibernating session, then session.conn is nil and the function will simply return without doing anything. In the mod_c2s code we already handle this, and just destroy the session. But if a hibernating websocket session is never resumed or becomes non-resumable, it will become immortal! By merging the fix from mod_c2s, the session should now be correctly destroyed.
author Matthew Wild <mwild1@gmail.com>
date Tue, 11 Mar 2025 18:44:40 +0000
parent 12744:e894677359e5
line wrap: on
line source

local iter = require "util.iterators";

describe("util.iterators", function ()
	describe("join", function ()
		it("should produce a joined iterator", function ()
			local expect = { "a", "b", "c", 1, 2, 3 };
			local output = {};
			for x in iter.join(iter.values({"a", "b", "c"})):append(iter.values({1, 2, 3})) do
				table.insert(output, x);
			end
			assert.same(output, expect);
		end);
		it("should work with only a single iterator", function ()
			local expect = { "a", "b", "c" };
			local output = {};
			for x in iter.join(iter.values({"a", "b", "c"})) do
				table.insert(output, x);
			end
			assert.same(output, expect);
		end);
	end);

	describe("sorted_pairs", function ()
		it("should produce sorted pairs", function ()
			local orig = { b = 1, c = 2, a = "foo", d = false };
			local n, last_key = 0, nil;
			for k, v in iter.sorted_pairs(orig) do
				n = n + 1;
				if last_key then
					assert(k > last_key, "Expected "..k.." > "..last_key)
				end
				assert.equal(orig[k], v);
				last_key = k;
			end
			assert.equal("d", last_key);
			assert.equal(4, n);
		end);

		it("should allow a custom sort function", function ()
			local orig = { b = 1, c = 2, a = "foo", d = false };
			local n, last_key = 0, nil;
			for k, v in iter.sorted_pairs(orig, function (a, b) return a > b end) do
				n = n + 1;
				if last_key then
					assert(k < last_key, "Expected "..k.." > "..last_key)
				end
				assert.equal(orig[k], v);
				last_key = k;
			end
			assert.equal("a", last_key);
			assert.equal(4, n);
		end);
	end);
end);