summaryrefslogtreecommitdiff
path: root/cli/tests
diff options
context:
space:
mode:
authorIgor Zinkovsky <igor@deno.com>2023-09-29 11:40:36 -0700
committerGitHub <noreply@github.com>2023-09-29 11:40:36 -0700
commit61b91e10ad41e6d207d60113a2f6f2b63a706940 (patch)
tree89e448051b6f4939c1bfa9bb047d94da2970bcbe /cli/tests
parent5edd102f3f912a53c7bcad3b0fa4feb672ada323 (diff)
fix(ext/kv): send queue wake messages accross different kv instances (#20465)
fixes #20454 Current KV queues implementation assumes that `enqueue` and `listenQueue` are called on the same instance of `Deno.Kv`. It's possible that the same Deno process opens multiple KV instances pointing to the same fs path, and in that case `listenQueue` should still get notified of messages enqueued through a different KV instance.
Diffstat (limited to 'cli/tests')
-rw-r--r--cli/tests/unit/kv_test.ts34
1 files changed, 34 insertions, 0 deletions
diff --git a/cli/tests/unit/kv_test.ts b/cli/tests/unit/kv_test.ts
index 25abf4cde..7cb8ebccf 100644
--- a/cli/tests/unit/kv_test.ts
+++ b/cli/tests/unit/kv_test.ts
@@ -1820,6 +1820,40 @@ Deno.test({
});
Deno.test({
+ name: "different kv instances for enqueue and queueListen",
+ async fn() {
+ const filename = await Deno.makeTempFile({ prefix: "queue_db" });
+ try {
+ const db0 = await Deno.openKv(filename);
+ const db1 = await Deno.openKv(filename);
+ const promise = deferred();
+ let dequeuedMessage: unknown = null;
+ const listener = db0.listenQueue((msg) => {
+ dequeuedMessage = msg;
+ promise.resolve();
+ });
+ try {
+ const res = await db1.enqueue("test");
+ assert(res.ok);
+ assertNotEquals(res.versionstamp, null);
+ await promise;
+ assertEquals(dequeuedMessage, "test");
+ } finally {
+ db0.close();
+ await listener;
+ db1.close();
+ }
+ } finally {
+ try {
+ await Deno.remove(filename);
+ } catch {
+ // pass
+ }
+ }
+ },
+});
+
+Deno.test({
name: "queue graceful close",
async fn() {
const db: Deno.Kv = await Deno.openKv(":memory:");