File

spec/util_uuid_spec.lua @ 13452:69faf3552d52

mod_posix: Move POSIX signal handling into util.startup to avoid race When libunbound is initialized, it spawns a thread to work in. In case a module initializes libunbound, e.g. by triggering a s2s connection, Prosody would not handle signals, instead immediately quit on e.g. the reload (SIGHUP) signal. Likely because the libunbound thread would not have inherited the signal mask from the main Prosody thread. Thanks Menel, riau and franck-x for reporting and help narrowing down
author Kim Alvefur <zash@zash.se>
date Sat, 02 Mar 2024 13:23:24 +0100
parent 13317:e6a5f196fc1f
line wrap: on
line source

-- This tests the format, not the randomness

local uuid = require "util.uuid";

describe("util.uuid", function()
	describe("#generate()", function()
		it("should work follow the UUID pattern", function()
			-- https://www.rfc-editor.org/rfc/rfc4122.html#section-4.4

			local pattern = "^" .. table.concat({
				string.rep("%x", 8),
				string.rep("%x", 4),
				"4" .. -- version
				string.rep("%x", 3),
				"[89ab]" .. -- reserved bits of 1 and 0
				string.rep("%x", 3),
				string.rep("%x", 12),
			}, "%-") .. "$";

			for _ = 1, 100 do
				assert.is_string(uuid.generate():match(pattern));
			end

			assert.truthy(uuid.generate() ~= uuid.generate(), "does not generate the same UUIDv4 twice")
		end);
	end);
	describe("#v7", function()
		it("should also follow the UUID pattern", function()
			local pattern = "^" .. table.concat({
					string.rep("%x", 8),
					string.rep("%x", 4),
					"7" .. -- version
					string.rep("%x", 3),
					"[89ab]" .. -- reserved bits of 1 and 0
					string.rep("%x", 3),
					string.rep("%x", 12),
				}, "%-") .. "$";

			local one = uuid.v7(); -- one before the loop to ensure some time passes
			for _ = 1, 100 do
				assert.is_string(uuid.v7():match(pattern));
			end
			-- one after the loop when some time should have passed
			assert.truthy(one < uuid.v7(), "should be ordererd")
		end);
	end);
end);