aboutsummaryrefslogtreecommitdiff
path: root/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2021-02-22 14:27:54 +0100
committerFlorian Dold <florian@dold.me>2021-02-22 14:27:54 +0100
commit3eced74a88de43ab9afe542fcce20a8db8e3fe60 (patch)
tree8ef74cfd5cf3bea8fe90cd20746e4fadb0afc349 /packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts
parente6946694f2e7ae6ff25f490fa76f3da583c44c74 (diff)
downloadwallet-core-3eced74a88de43ab9afe542fcce20a8db8e3fe60.tar.xz
more tests, fix event ordering issue
Diffstat (limited to 'packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts')
-rw-r--r--packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts64
1 files changed, 63 insertions, 1 deletions
diff --git a/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts b/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts
index 6777dc122..9ec46c765 100644
--- a/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts
+++ b/packages/idb-bridge/src/idb-wpt-ported/wptsupport.ts
@@ -1,5 +1,5 @@
import test, { ExecutionContext } from "ava";
-import { BridgeIDBFactory } from "..";
+import { BridgeIDBFactory, BridgeIDBRequest } from "..";
import {
IDBDatabase,
IDBIndex,
@@ -480,3 +480,65 @@ export function indexeddb_test(
}
});
}
+
+/**
+ * Keeps the passed transaction alive indefinitely (by making requests
+ * against the named store). Returns a function that asserts that the
+ * transaction has not already completed and then ends the request loop so that
+ * the transaction may autocommit and complete.
+ */
+export function keep_alive(
+ t: ExecutionContext,
+ tx: IDBTransaction,
+ store_name: string,
+) {
+ let completed = false;
+ tx.addEventListener("complete", () => {
+ completed = true;
+ });
+
+ let keepSpinning = true;
+ let spinCount = 0;
+
+ function spin() {
+ console.log("spinning");
+ if (!keepSpinning) return;
+ const request = tx.objectStore(store_name).get(0);
+ (request as BridgeIDBRequest)._debugName = `req-spin-${spinCount}`;
+ spinCount++;
+ request.onsuccess = spin;
+ }
+ spin();
+
+ return () => {
+ t.log("stopping spin");
+ t.false(completed, "Transaction completed while kept alive");
+ keepSpinning = false;
+ };
+}
+
+// Checks to see if the passed transaction is active (by making
+// requests against the named store).
+export function is_transaction_active(
+ t: ExecutionContext,
+ tx: IDBTransaction,
+ store_name: string,
+) {
+ try {
+ const request = tx.objectStore(store_name).get(0);
+ request.onerror = (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ };
+ return true;
+ } catch (ex) {
+ console.log(ex.stack);
+ t.deepEqual(
+ ex.name,
+ "TransactionInactiveError",
+ "Active check should either not throw anything, or throw " +
+ "TransactionInactiveError",
+ );
+ return false;
+ }
+}