spec/util_serialization_spec.lua
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 9570 dbfa286cfa88
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9345
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
local serialization = require "util.serialization";
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
describe("util.serialization", function ()
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
	describe("serialize", function ()
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
		it("makes a string", function ()
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
			assert.is_string(serialization.serialize({}));
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
			assert.is_string(serialization.serialize(nil));
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
			assert.is_string(serialization.serialize(1));
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
			assert.is_string(serialization.serialize(true));
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
		end);
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
9483
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    12
		it("rejects function by default", function ()
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    13
			assert.has_error(function ()
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    14
				serialization.serialize(function () end)
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    15
			end);
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    16
		end);
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    17
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    18
		it("makes a string in debug mode", function ()
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    19
			assert.is_string(serialization.serialize(function () end, "debug"));
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    20
		end);
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    21
9484
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    22
		it("rejects cycles", function ()
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    23
			assert.has_error(function ()
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    24
				local t = {}
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    25
				t[t] = { t };
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    26
				serialization.serialize(t)
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    27
			end);
9570
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    28
			-- also with multirefs allowed
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    29
			assert.has_error(function ()
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    30
				local t = {}
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    31
				t[t] = { t };
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    32
				serialization.serialize(t, { multirefs = true })
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    33
			end);
9484
f34c635c5f42 util.serialization: Test that it rejects tables wit cycles
Kim Alvefur <zash@zash.se>
parents: 9483
diff changeset
    34
		end);
9483
006a71a83e6a util.serialization: Make errors fatal by default (like the previous implementation)
Kim Alvefur <zash@zash.se>
parents: 9346
diff changeset
    35
9569
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    36
		it("rejects multiple references to same table", function ()
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    37
			assert.has_error(function ()
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    38
				local t1 = {};
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    39
				local t2 = { t1, t1 };
9570
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    40
				serialization.serialize(t2, { multirefs = false });
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    41
			end);
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    42
		end);
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    43
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    44
		it("optionally allows multiple references to same table", function ()
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    45
			assert.has_error(function ()
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    46
				local t1 = {};
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    47
				local t2 = { t1, t1 };
dbfa286cfa88 util.serialization: Add option for allowing multiple references to the same table (but not cycles)
Kim Alvefur <zash@zash.se>
parents: 9569
diff changeset
    48
				serialization.serialize(t2, { multirefs = true });
9569
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    49
			end);
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    50
		end);
dad29508d0f2 util.serialization: Test rejection of multiple references to same table
Kim Alvefur <zash@zash.se>
parents: 9488
diff changeset
    51
9345
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
		it("roundtrips", function ()
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
			local function test(data)
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
				local serialized = serialization.serialize(data);
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
				assert.is_string(serialized);
9346
e767da06399d util.serialization: Use deserialize instead of envload directly
Kim Alvefur <zash@zash.se>
parents: 9345
diff changeset
    56
				local deserialized, err = serialization.deserialize(serialized);
e767da06399d util.serialization: Use deserialize instead of envload directly
Kim Alvefur <zash@zash.se>
parents: 9345
diff changeset
    57
				assert.same(data, deserialized, err);
9345
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
			end
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
			test({});
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
			test({hello="world"});
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
			test("foobar")
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
			test("\0\1\2\3");
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
			test("nödåtgärd");
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
			test({1,2,3,4});
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
			test({foo={[100]={{"bar"},{baz=1}}}});
9485
8791bfa3984a util.serialization: Test table keys that are Lua keywords
Kim Alvefur <zash@zash.se>
parents: 9484
diff changeset
    67
			test({["goto"] = {["function"]={["do"]="keywords"}}});
9345
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
		end);
9488
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    69
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    70
		it("can serialize with metatables", function ()
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    71
			local s = serialization.new({ freeze = true });
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    72
			local t = setmetatable({ a = "hi" }, { __freeze = function (t) return { t.a } end });
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    73
			local rt = serialization.deserialize(s(t));
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    74
			assert.same({"hi"}, rt);
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    75
		end);
c667887d78ad util.serialization: Simpler metatable pre-processing
Kim Alvefur <zash@zash.se>
parents: 9485
diff changeset
    76
9345
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    77
	end);
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    78
end);
83e4596c2824 util.serialization: Add brief initial tests
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79