Bug 1816170 - Disable perftest-on-autoland cron. r=aglavic
[gecko.git] / dom / indexedDB / test / unit / test_cursors.js
blob3b2ed252392875b9f19593e6ecf23be54ae52577
1 /**
2  * Any copyright is dedicated to the Public Domain.
3  * http://creativecommons.org/publicdomain/zero/1.0/
4  */
6 /* exported testGenerator */
7 var testGenerator = testSteps();
9 function* testSteps() {
10   function checkCursor(cursor, expectedKey) {
11     is(cursor.key, expectedKey, "Correct key");
12     is(cursor.primaryKey, expectedKey, "Correct primary key");
13     is(cursor.value, "foo", "Correct value");
14   }
16   const name = this.window ? window.location.pathname : "Splendid Test";
17   const keys = [1, -1, 0, 10, 2000, "q", "z", "two", "b", "a"];
18   const sortedKeys = [-1, 0, 1, 10, 2000, "a", "b", "q", "two", "z"];
20   is(keys.length, sortedKeys.length, "Good key setup");
22   let request = indexedDB.open(name, 1);
23   request.onerror = errorHandler;
24   request.onupgradeneeded = grabEventAndContinueHandler;
25   request.onsuccess = grabEventAndContinueHandler;
26   let event = yield undefined;
28   let db = event.target.result;
30   let objectStore = db.createObjectStore("autoIncrement", {
31     autoIncrement: true,
32   });
34   request = objectStore.openCursor();
35   request.onerror = errorHandler;
36   request.onsuccess = function(event) {
37     ok(!event.target.result, "No results");
38     testGenerator.next();
39   };
40   yield undefined;
42   objectStore = db.createObjectStore("autoIncrementKeyPath", {
43     keyPath: "foo",
44     autoIncrement: true,
45   });
47   request = objectStore.openCursor();
48   request.onerror = errorHandler;
49   request.onsuccess = function(event) {
50     ok(!event.target.result, "No results");
51     testGenerator.next();
52   };
53   yield undefined;
55   objectStore = db.createObjectStore("keyPath", { keyPath: "foo" });
57   request = objectStore.openCursor();
58   request.onerror = errorHandler;
59   request.onsuccess = function(event) {
60     ok(!event.target.result, "No results");
61     testGenerator.next();
62   };
63   yield undefined;
65   objectStore = db.createObjectStore("foo");
67   request = objectStore.openCursor();
68   request.onerror = errorHandler;
69   request.onsuccess = function(event) {
70     ok(!event.target.result, "No results");
71     testGenerator.next();
72   };
73   yield undefined;
75   let keyIndex = 0;
77   for (let i in keys) {
78     request = objectStore.add("foo", keys[i]);
79     request.onerror = errorHandler;
80     request.onsuccess = function(event) {
81       if (++keyIndex == keys.length) {
82         testGenerator.next();
83       }
84     };
85   }
86   yield undefined;
88   keyIndex = 0;
90   request = objectStore.openCursor();
91   request.onerror = errorHandler;
92   request.onsuccess = function(event) {
93     let cursor = event.target.result;
94     if (cursor) {
95       checkCursor(cursor, sortedKeys[keyIndex]);
97       cursor.continue();
99       try {
100         cursor.continue();
101         ok(false, "continue twice should throw");
102       } catch (e) {
103         ok(e instanceof DOMException, "got a database exception");
104         is(e.name, "InvalidStateError", "correct error");
105         is(e.code, DOMException.INVALID_STATE_ERR, "correct code");
106       }
108       checkCursor(cursor, sortedKeys[keyIndex]);
110       keyIndex++;
111     } else {
112       testGenerator.next();
113     }
114   };
115   yield undefined;
117   is(keyIndex, keys.length, "Saw all added items");
119   keyIndex = 4;
121   let range = IDBKeyRange.bound(2000, "q");
122   request = objectStore.openCursor(range);
123   request.onerror = errorHandler;
124   request.onsuccess = function(event) {
125     let cursor = event.target.result;
126     if (cursor) {
127       checkCursor(cursor, sortedKeys[keyIndex]);
129       cursor.continue();
131       checkCursor(cursor, sortedKeys[keyIndex]);
133       keyIndex++;
134     } else {
135       testGenerator.next();
136     }
137   };
138   yield undefined;
140   is(keyIndex, 8, "Saw all the expected keys");
142   keyIndex = 0;
144   request = objectStore.openCursor();
145   request.onerror = errorHandler;
146   request.onsuccess = function(event) {
147     let cursor = event.target.result;
148     if (cursor) {
149       checkCursor(cursor, sortedKeys[keyIndex]);
151       if (keyIndex) {
152         cursor.continue();
153       } else {
154         cursor.continue("b");
155       }
157       checkCursor(cursor, sortedKeys[keyIndex]);
159       keyIndex += keyIndex ? 1 : 6;
160     } else {
161       testGenerator.next();
162     }
163   };
164   yield undefined;
166   is(keyIndex, keys.length, "Saw all the expected keys");
168   keyIndex = 0;
170   request = objectStore.openCursor();
171   request.onerror = errorHandler;
172   request.onsuccess = function(event) {
173     let cursor = event.target.result;
174     if (cursor) {
175       checkCursor(cursor, sortedKeys[keyIndex]);
177       if (keyIndex) {
178         cursor.continue();
179       } else {
180         cursor.continue(10);
181       }
183       checkCursor(cursor, sortedKeys[keyIndex]);
185       keyIndex += keyIndex ? 1 : 3;
186     } else {
187       testGenerator.next();
188     }
189   };
190   yield undefined;
192   is(keyIndex, keys.length, "Saw all the expected keys");
194   keyIndex = 0;
196   request = objectStore.openCursor();
197   request.onerror = errorHandler;
198   request.onsuccess = function(event) {
199     let cursor = event.target.result;
200     if (cursor) {
201       checkCursor(cursor, sortedKeys[keyIndex]);
203       if (keyIndex) {
204         cursor.continue();
205       } else {
206         cursor.continue("c");
207       }
209       checkCursor(cursor, sortedKeys[keyIndex]);
211       keyIndex += keyIndex ? 1 : 7;
212     } else {
213       ok(cursor === null, "The request result should be null.");
214       testGenerator.next();
215     }
216   };
217   yield undefined;
219   is(keyIndex, keys.length, "Saw all the expected keys");
221   keyIndex = 0;
223   request = objectStore.openCursor();
224   request.onerror = errorHandler;
225   let storedCursor = null;
226   request.onsuccess = function(event) {
227     let cursor = event.target.result;
228     if (cursor) {
229       storedCursor = cursor;
231       checkCursor(cursor, sortedKeys[keyIndex]);
233       if (keyIndex == 4) {
234         request = cursor.update("bar");
235         request.onerror = errorHandler;
236         request.onsuccess = function(event) {
237           keyIndex++;
238           cursor.continue();
239         };
240       } else {
241         keyIndex++;
242         cursor.continue();
243       }
244     } else {
245       ok(cursor === null, "The request result should be null.");
246       ok(
247         storedCursor.value === undefined,
248         "The cursor's value should be undefined."
249       );
250       testGenerator.next();
251     }
252   };
253   yield undefined;
255   is(keyIndex, keys.length, "Saw all the expected keys");
257   request = objectStore.get(sortedKeys[4]);
258   request.onerror = errorHandler;
259   request.onsuccess = grabEventAndContinueHandler;
260   event = yield undefined;
262   is(event.target.result, "bar", "Update succeeded");
264   request = objectStore.put("foo", sortedKeys[4]);
265   request.onerror = errorHandler;
266   request.onsuccess = grabEventAndContinueHandler;
267   event = yield undefined;
269   keyIndex = 0;
271   let gotRemoveEvent = false;
273   request = objectStore.openCursor(null, "next");
274   request.onerror = errorHandler;
275   storedCursor = null;
276   request.onsuccess = function(event) {
277     let cursor = event.target.result;
278     if (cursor) {
279       storedCursor = cursor;
281       checkCursor(cursor, sortedKeys[keyIndex]);
283       if (keyIndex == 4) {
284         request = cursor.delete();
285         request.onerror = errorHandler;
286         request.onsuccess = function(event) {
287           ok(event.target.result === undefined, "Should be undefined");
288           is(keyIndex, 5, "Got result of delete before next continue");
289           gotRemoveEvent = true;
290         };
291       }
293       keyIndex++;
294       cursor.continue();
295     } else {
296       ok(cursor === null, "The request result should be null.");
297       ok(
298         storedCursor.value === undefined,
299         "The cursor's value should be undefined."
300       );
301       testGenerator.next();
302     }
303   };
304   yield undefined;
306   is(keyIndex, keys.length, "Saw all the expected keys");
307   is(gotRemoveEvent, true, "Saw the remove event");
309   request = objectStore.get(sortedKeys[4]);
310   request.onerror = errorHandler;
311   request.onsuccess = grabEventAndContinueHandler;
312   event = yield undefined;
314   is(event.target.result, undefined, "Entry was deleted");
316   request = objectStore.add("foo", sortedKeys[4]);
317   request.onerror = errorHandler;
318   request.onsuccess = grabEventAndContinueHandler;
319   event = yield undefined;
321   keyIndex = sortedKeys.length - 1;
323   request = objectStore.openCursor(null, "prev");
324   request.onerror = errorHandler;
325   storedCursor = null;
326   request.onsuccess = function(event) {
327     let cursor = event.target.result;
328     if (cursor) {
329       storedCursor = cursor;
331       checkCursor(cursor, sortedKeys[keyIndex]);
333       cursor.continue();
335       checkCursor(cursor, sortedKeys[keyIndex]);
337       keyIndex--;
338     } else {
339       ok(cursor === null, "The request result should be null.");
340       ok(
341         storedCursor.value === undefined,
342         "The cursor's value should be undefined."
343       );
344       testGenerator.next();
345     }
346   };
347   yield undefined;
349   is(keyIndex, -1, "Saw all added items");
351   // Wait for success
352   yield undefined;
354   db.close();
356   finishTest();