Bug 1816170 - Disable perftest-on-autoland cron. r=aglavic
[gecko.git] / dom / indexedDB / test / unit / test_maximal_serialized_object_size.js
blob64ee2a0b9a321589d7319ecf5904d7ad973a0c4c
1 /**
2  * Any copyright is dedicated to the Public Domain.
3  * http://creativecommons.org/publicdomain/zero/1.0/
4  */
6 /* exported testGenerator, disableWorkerTest */
7 var disableWorkerTest = "Need a way to set temporary prefs from a worker";
9 var testGenerator = testSteps();
11 function* testSteps() {
12   const name = this.window
13     ? window.location.pathname
14     : "test_maximal_serialized_object_size.js";
15   const megaBytes = 1024 * 1024;
16   const kMessageOverhead = 1; // in MB
17   const kMaxIpcMessageSize = 20; // in MB
18   const kMaxIdbMessageSize = kMaxIpcMessageSize - kMessageOverhead;
20   let chunks = new Array(kMaxIdbMessageSize);
21   for (let i = 0; i < kMaxIdbMessageSize; i++) {
22     chunks[i] = new ArrayBuffer(1 * megaBytes);
23   }
25   if (this.window) {
26     SpecialPowers.pushPrefEnv(
27       {
28         set: [
29           [
30             "dom.indexedDB.maxSerializedMsgSize",
31             kMaxIpcMessageSize * megaBytes,
32           ],
33         ],
34       },
35       continueToNextStep
36     );
37     yield undefined;
38   } else {
39     setMaxSerializedMsgSize(kMaxIpcMessageSize * megaBytes);
40   }
42   let openRequest = indexedDB.open(name, 1);
43   openRequest.onerror = errorHandler;
44   openRequest.onupgradeneeded = grabEventAndContinueHandler;
45   openRequest.onsuccess = unexpectedSuccessHandler;
46   let event = yield undefined;
48   let db = event.target.result;
50   is(db.objectStoreNames.length, 0, "Correct objectStoreNames list");
52   let objectStore = db.createObjectStore("test store", { keyPath: "id" });
53   is(db.objectStoreNames.length, 1, "Correct objectStoreNames list");
54   is(
55     db.objectStoreNames.item(0),
56     objectStore.name,
57     "Correct object store name"
58   );
60   function testTooLargeError(aOperation, aObject) {
61     try {
62       objectStore[aOperation](aObject).onerror = errorHandler;
63       ok(false, "UnknownError is expected to be thrown!");
64     } catch (e) {
65       ok(e instanceof DOMException, "got a DOM exception");
66       is(e.name, "UnknownError", "correct error");
67       ok(!!e.message, "Error message: " + e.message);
68       ok(
69         e.message.startsWith(
70           `IDBObjectStore.${aOperation}: The serialized value is too large`
71         ),
72         "Correct error message prefix."
73       );
74     }
75   }
77   info("Verify IDBObjectStore.add() - object is too large");
78   testTooLargeError("add", { id: 1, data: chunks });
80   info(
81     "Verify IDBObjectStore.add() - object size is closed to the maximal size."
82   );
83   chunks.length = chunks.length - 1;
84   let request = objectStore.add({ id: 1, data: chunks });
85   request.onerror = errorHandler;
86   request.onsuccess = grabEventAndContinueHandler;
87   yield undefined;
89   info("Verify IDBObjectStore.add() - object key is too large");
90   chunks.length = 10;
91   testTooLargeError("add", { id: chunks });
93   objectStore.createIndex("index name", "index");
94   ok(objectStore.index("index name"), "Index created.");
96   info("Verify IDBObjectStore.add() - index key is too large");
97   testTooLargeError("add", { id: 2, index: chunks });
99   info("Verify IDBObjectStore.add() - object key and index key are too large");
100   let indexChunks = chunks.splice(0, 5);
101   testTooLargeError("add", { id: chunks, index: indexChunks });
103   openRequest.onsuccess = continueToNextStep;
104   yield undefined;
106   db.close();
108   finishTest();