aboutsummaryrefslogtreecommitdiffstats
path: root/spec/core_storagemanager_spec.lua
diff options
context:
space:
mode:
Diffstat (limited to 'spec/core_storagemanager_spec.lua')
-rw-r--r--spec/core_storagemanager_spec.lua201
1 files changed, 179 insertions, 22 deletions
diff --git a/spec/core_storagemanager_spec.lua b/spec/core_storagemanager_spec.lua
index ae4f44c8..f1adcd50 100644
--- a/spec/core_storagemanager_spec.lua
+++ b/spec/core_storagemanager_spec.lua
@@ -1,13 +1,11 @@
-local unpack = table.unpack or unpack; -- luacheck: ignore 113
-local server = require "net.server_select";
-package.loaded["net.server"] = server;
+local unpack = table.unpack;
-local st = require "util.stanza";
+local st = require "prosody.util.stanza";
local function mock_prosody()
_G.prosody = {
core_post_stanza = function () end;
- events = require "util.events".new();
+ events = require "prosody.util.events".new();
hosts = {};
paths = {
data = "./data";
@@ -36,6 +34,11 @@ local configs = {
};
};
+local test_only_driver = os.getenv "PROSODY_TEST_ONLY_STORAGE";
+if test_only_driver then
+ configs = { [test_only_driver] = configs[test_only_driver] }
+end
+
local test_host = "storage-unit-tests.invalid";
describe("storagemanager", function ()
@@ -47,10 +50,10 @@ describe("storagemanager", function ()
insulate(tagged_name.." #storage backend", function ()
mock_prosody();
- local config = require "core.configmanager";
- local sm = require "core.storagemanager";
- local hm = require "core.hostmanager";
- local mm = require "core.modulemanager";
+ local config = require "prosody.core.configmanager";
+ local sm = require "prosody.core.storagemanager";
+ local hm = require "prosody.core.hostmanager";
+ local mm = require "prosody.core.modulemanager";
-- Simple check to ensure insulation is working correctly
assert.is_nil(config.get(test_host, "storage"));
@@ -196,6 +199,136 @@ describe("storagemanager", function ()
end);
end);
+ describe("keyval+ stores", function ()
+ -- These tests rely on being executed in order, disable any order
+ -- randomization for this block
+ randomize(false);
+
+ local store, kv_store, map_store;
+ it("may be opened", function ()
+ store = assert(sm.open(test_host, "test-kv+", "keyval+"));
+ end);
+
+ local simple_data = { foo = "bar" };
+
+ it("may set data for a user", function ()
+ assert(store:set("user9999", simple_data));
+ end);
+
+ it("may get data for a user", function ()
+ assert.same(simple_data, assert(store:get("user9999")));
+ end);
+
+ it("may be opened as a keyval store", function ()
+ kv_store = assert(sm.open(test_host, "test-kv+", "keyval"));
+ assert.same(simple_data, assert(kv_store:get("user9999")));
+ end);
+
+ it("may be opened as a map store", function ()
+ map_store = assert(sm.open(test_host, "test-kv+", "map"));
+ assert.same("bar", assert(map_store:get("user9999", "foo")));
+ end);
+
+ it("may remove data for a user", function ()
+ assert(store:set("user9999", nil));
+ local ret, err = store:get("user9999");
+ assert.is_nil(ret);
+ assert.is_nil(err);
+ end);
+
+
+ it("may set a specific key for a user", function ()
+ assert(store:set_key("user9999", "foo", "bar"));
+ assert.same(kv_store:get("user9999"), { foo = "bar" });
+ end);
+
+ it("may get a specific key for a user", function ()
+ assert.equal("bar", store:get_key("user9999", "foo"));
+ end);
+
+ it("may find all users with a specific key", function ()
+ assert.is_function(store.get_key_from_all);
+ assert(store:set_key("user9999b", "bar", "bar"));
+ assert(store:set_key("user9999c", "foo", "blah"));
+ local ret, err = store:get_key_from_all("foo");
+ assert.is_nil(err);
+ assert.same({ user9999 = "bar", user9999c = "blah" }, ret);
+ end);
+
+ it("rejects empty or non-string keys to get_all", function ()
+ assert.is_function(store.get_key_from_all);
+ do
+ local ret, err = store:get_key_from_all("");
+ assert.is_nil(ret);
+ assert.is_not_nil(err);
+ end
+ do
+ local ret, err = store:get_key_from_all(true);
+ assert.is_nil(ret);
+ assert.is_not_nil(err);
+ end
+ end);
+
+ it("rejects empty or non-string keys to delete_all", function ()
+ assert.is_function(store.delete_key_from_all);
+ do
+ local ret, err = store:delete_key_from_all("");
+ assert.is_nil(ret);
+ assert.is_not_nil(err);
+ end
+ do
+ local ret, err = store:delete_key_from_all(true);
+ assert.is_nil(ret);
+ assert.is_not_nil(err);
+ end
+ end);
+
+ it("may delete all instances of a specific key", function ()
+ assert.is_function(store.delete_key_from_all);
+ assert(store:set_key("user9999b", "foo", "hello"));
+
+ assert(store:delete_key_from_all("bar"));
+ -- Ensure key was deleted
+ do
+ local ret, err = store:get_key("user9999b", "bar");
+ assert.is_nil(ret);
+ assert.is_nil(err);
+ end
+ -- Ensure other users/keys are intact
+ do
+ local ret, err = store:get_key("user9999", "foo");
+ assert.equal("bar", ret);
+ assert.is_nil(err);
+ end
+ do
+ local ret, err = store:get_key("user9999b", "foo");
+ assert.equal("hello", ret);
+ assert.is_nil(err);
+ end
+ do
+ local ret, err = store:get_key("user9999c", "foo");
+ assert.equal("blah", ret);
+ assert.is_nil(err);
+ end
+ end);
+
+ it("may remove data for a specific key for a user", function ()
+ assert(store:set_key("user9999", "foo", nil));
+ do
+ local ret, err = store:get_key("user9999", "foo");
+ assert.is_nil(ret);
+ assert.is_nil(err);
+ end
+
+ assert(store:set_key("user9999b", "foo", nil));
+ do
+ local ret, err = store:get_key("user9999b", "foo");
+ assert.is_nil(ret);
+ assert.is_nil(err);
+ end
+ end);
+ end);
+
describe("archive stores", function ()
randomize(false);
@@ -211,13 +344,13 @@ describe("storagemanager", function ()
local test_time = 1539204123;
local test_data = {
- { nil, test_stanza, test_time, "contact@example.com" };
- { nil, test_stanza, test_time+1, "contact2@example.com" };
- { nil, test_stanza, test_time+2, "contact2@example.com" };
+ { nil, test_stanza, test_time-3, "contact@example.com" };
+ { nil, test_stanza, test_time-2, "contact2@example.com" };
{ nil, test_stanza, test_time-1, "contact2@example.com" };
- { nil, test_stanza, test_time-1, "contact3@example.com" };
- { nil, test_stanza, test_time+0, "contact3@example.com" };
+ { nil, test_stanza, test_time+0, "contact2@example.com" };
{ nil, test_stanza, test_time+1, "contact3@example.com" };
+ { nil, test_stanza, test_time+2, "contact3@example.com" };
+ { nil, test_stanza, test_time+3, "contact3@example.com" };
};
it("can be added to", function ()
@@ -260,7 +393,7 @@ describe("storagemanager", function ()
assert.equal("test", item.name);
assert.equal("urn:example:foo", item.attr.xmlns);
assert.equal(2, #item.tags);
- assert.equal(test_time, when);
+ assert.equal(test_time-3, when);
end
assert.equal(1, count);
end);
@@ -298,16 +431,16 @@ describe("storagemanager", function ()
assert.equal("test", item.name);
assert.equal("urn:example:foo", item.attr.xmlns);
assert.equal(2, #item.tags);
- assert(test_time <= when);
+ assert(when >= test_time, ("%d >= %d"):format(when, test_time));
end
- assert.equal(#test_data - 2, count);
+ assert.equal(#test_data - 3, count);
end);
it("by time (start+end)", function ()
-- luacheck: ignore 211/err
local data, err = archive:find("user", {
- ["start"] = test_time;
- ["end"] = test_time+1;
+ ["start"] = test_time-1;
+ ["end"] = test_time+2;
});
assert.truthy(data);
local count = 0;
@@ -318,8 +451,8 @@ describe("storagemanager", function ()
assert.equal("test", item.name);
assert.equal("urn:example:foo", item.attr.xmlns);
assert.equal(2, #item.tags);
- assert(when >= test_time, ("%d >= %d"):format(when, test_time));
- assert(when <= test_time+1, ("%d <= %d"):format(when, test_time+1));
+ assert(when >= test_time-1, ("%d >= %d"):format(when, test_time));
+ assert(when <= test_time+2, ("%d <= %d"):format(when, test_time+1));
end
assert.equal(4, count);
end);
@@ -427,6 +560,30 @@ describe("storagemanager", function ()
end);
+ -- This tests combines the reverse flag with 'before' and 'after' to
+ -- ensure behaviour remains correct
+ it("by id (before and after) in reverse #full_id_range", function ()
+ assert.truthy(archive.caps and archive.caps.full_id_range, "full ID range support")
+ local data, err = archive:find("user", {
+ ["after"] = test_data[1][1];
+ ["before"] = test_data[4][1];
+ reverse = true;
+ });
+ assert.truthy(data, err);
+ local count = 0;
+ for id, item in data do
+ count = count + 1;
+ assert.truthy(id);
+ assert.equal(test_data[4-count][1], id);
+ assert(st.is_stanza(item));
+ assert.equal("test", item.name);
+ assert.equal("urn:example:foo", item.attr.xmlns);
+ assert.equal(2, #item.tags);
+ end
+ assert.equal(2, count);
+ end);
+
+
end);
@@ -466,7 +623,7 @@ describe("storagemanager", function ()
local data, err = archive:find("user", {
with = "contact@example.com";
});
- assert.truthy(data);
+ assert.truthy(data, err);
local count = 0;
for id, item, when in data do -- luacheck: ignore id item when
count = count + 1;