Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(174)

Side by Side Diff: third_party/WebKit/LayoutTests/storage/indexeddb/resources/observer-tests.js

Issue 2449563002: [IndexedDB] Add Observer Tests (Closed)
Patch Set: Fixed errors in other tests, and marked observer tests as long Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 if (this.importScripts) {
2 importScripts('../../../resources/testharness.js');
3 importScripts('generic-idb-operations.js');
4 importScripts('observer-helpers.js');
5 importScripts('testharness-helpers.js');
6 }
7
8 setup({timeout: 20000});
9
10 var openDB = function(t, dbName, openFunc) {
11 var openRequest = indexedDB.open(dbName);
12 openRequest.onupgradeneeded = t.unreached_func('upgrade should not be needed') ;
13 openRequest.onsuccess = t.step_func(function() {
14 openFunc(openRequest.result);
15 });
16 openRequest.onerror = t.unreached_func('opening database should not fail');
17 };
18
19 indexeddb_observers_test(function(t, db1_name, db2_name, observers_added_callbac k) {
20 var expectedChanges = {
21 dbName: db1_name,
22 records: {
23 'store1': [{type: 'delete', key: {lower: 'a', upper: 'b'}},
24 {type: 'put', key: 'a'}],
25 'store2': [{type: 'add', key: 'z'}]
26 }
27 };
28 var connection = null;
29 var observeFunction = function(changes) {
30 compareChanges(changes, expectedChanges);
31 assert_true(connection != null);
32 obs.unobserve(connection);
33 t.done();
34 };
35
36 var obs = new IDBObserver(
37 t.step_func(observeFunction),
38 { operationTypes: ['clear', 'put', 'add', 'delete'] });
39
40 openDB(t, db1_name, t.step_func(function(db) {
41 connection = db;
42 var txn = db.transaction(['store1', 'store2'], 'readwrite');
43
44 // Verify initial state.
45 var os1 = txn.objectStore('store1');
46 var readReq1 = os1.get('a');
47 readReq1.onsuccess = t.step_func(function() {
48 assert_equals(readReq1.result, 'b', 'Initial state incorrect.');
49 });
50 var os2 = txn.objectStore('store2');
51 var readReq2 = os2.get('x');
52 readReq2.onsuccess = t.step_func(function() {
53 assert_equals(readReq2.result, 'y', 'Initial state incorrect.');
54 });
55
56 // Start observing!
57 obs.observe(db, txn);
58
59 txn.oncomplete = observers_added_callback;
60 txn.onerror = t.unreached_func('transaction should not fail');
61 }));
62 }, 'IDB Observers: Verify initial state and record all operations');
63
64 indexeddb_observers_test(function(t, db1_name, db2_name, observers_added_callbac k) {
65 var expectedChanges = {
66 dbName: db1_name,
67 records: {
68 'store2': [{type: 'add', key: 'z'}]
69 }
70 };
71
72 var connection = null;
73 var observeFunction = function(changes) {
74 compareChanges(changes, expectedChanges);
75 assert_true(connection != null);
76 obs.unobserve(connection);
77 t.done();
78 };
79
80 var obs = new IDBObserver(
81 t.step_func(observeFunction),
82 { operationTypes: ['add'] });
83
84 openDB(t, db1_name, t.step_func(function(db) {
85 connection = db;
86 var txn = db.transaction(['store2'], 'readonly');
87 obs.observe(db, txn);
88 txn.oncomplete = observers_added_callback;
89 txn.onerror = t.unreached_func('transaction should not fail')
90 }));
91 }, 'IDB Observers: Operation filtering');
92
93 indexeddb_observers_test(function(t, db1_name, db2_name, observers_added_callbac k) {
94 var expectedChanges = {
95 dbName: db1_name,
96 records: {
97 'store2': [{type: 'add', key: 'z'}]
98 }
99 };
100
101 var connection = null;
102 var observeFunction = function(changes) {
103 compareChanges(changes, expectedChanges);
104 assert_true(connection != null);
105 obs.unobserve(connection);
106 t.done();
107 };
108
109 var obs = new IDBObserver(
110 t.step_func(observeFunction),
111 { operationTypes: ['clear', 'put', 'add', 'delete'] });
112
113 openDB(t, db1_name, t.step_func(function(db) {
114 connection = db;
115 var txn = db.transaction(['store2'], 'readonly');
116 obs.observe(db, txn);
117 txn.oncomplete = observers_added_callback;
118 txn.onerror = t.unreached_func('transaction should not fail')
119 }));
120 }, 'IDB Observers: Object store filtering');
121
122 indexeddb_observers_test(function(t, db1_name, db2_name, observers_added_callbac k) {
123 var expectedChanges1 = {
124 dbName: db1_name,
125 records: {
126 'store1': [{type: 'delete', key: {lower: 'a', upper: 'b'}},
127 {type: 'put', key: 'a'}],
128 'store2': [{type: 'add', key: 'z'}]
129 }
130 };
131
132 var expectedChanges2 = {
133 dbName: db2_name,
134 records: {
135 'store3': [{type: 'put', key: 'c'}],
136 'store4': [{type: 'add', key: 'z'}]
137 }
138 };
139
140 var observers_added_barrier = create_barrier(observers_added_callback);
141
142 var connection1 = null;
143 var connection2 = null;
144 var pendingObserves = 2;
145 var observeFunction = function(changes) {
146 pendingObserves = pendingObserves - 1;
147 if (changes.database.name === db1_name) {
148 compareChanges(changes, expectedChanges1);
149 assert_true(connection1 != null);
150 obs.unobserve(connection1);
151 } else if (changes.database.name === db2_name) {
152 compareChanges(changes, expectedChanges2);
153 assert_true(connection2 != null);
154 obs.unobserve(connection2);
155 }
156 if (pendingObserves === 0) {
157 t.done();
158 } else if (pendingObserves < 0) {
159 assert_unreached("incorrect pendingObserves");
160 }
161 };
162
163 var obs = new IDBObserver(
164 t.step_func(observeFunction),
165 { operationTypes: ['clear', 'put', 'add', 'delete'] });
166
167 var cb1 = observers_added_barrier(t);
168 openDB(t, db1_name, t.step_func(function(db) {
169 connection1 = db;
170 var txn = db.transaction(['store1', 'store2'], 'readonly');
171 obs.observe(db, txn);
172 txn.oncomplete = cb1;
173 txn.onerror = t.unreached_func('transaction should not fail')
174 }));
175 var cb2 = observers_added_barrier(t);
176 openDB(t, db2_name, t.step_func(function(db) {
177 connection2 = db;
178 var txn = db.transaction(['store3', 'store4'], 'readonly');
179 obs.observe(db, txn);
180 txn.oncomplete = cb2;
181 txn.onerror = t.unreached_func('transaction should not fail')
182 }));
183 }, 'IDB Observers: Multiple connections');
184
185 indexeddb_observers_test(function(t, db1_name, db2_name, observers_added_callbac k) {
186 var expectedChanges = {
187 dbName: db1_name,
188 records: {
189 'store1': [{type: 'delete', key: {lower: 'a', upper: 'b'}},
190 {type: 'put', key: 'a'}],
191 'store2': [{type: 'add', key: 'z'}]
192 }
193 };
194
195 var connection = null;
196 var pendingObserves = 2;
197 var observeFunction = function(changes) {
198 compareChanges(changes, expectedChanges);
199 pendingObserves = pendingObserves - 1;
200 if (pendingObserves === 0) {
201 assert_true(connection != null);
202 obs.unobserve(connection);
203 t.done();
204 } else if (pendingObserves < 0) {
205 assert_unreached("incorrect pendingObserves");
206 }
207 };
208
209 var obs = new IDBObserver(
210 t.step_func(observeFunction),
211 { operationTypes: ['clear', 'put', 'add', 'delete'] });
212
213 openDB(t, db1_name, t.step_func(function(db) {
214 connection = db;
215 var txn = db.transaction(['store1', 'store2'], 'readonly');
216 obs.observe(db, txn);
217 obs.observe(db, txn);
218 txn.oncomplete = observers_added_callback;
219 txn.onerror = t.unreached_func('transaction should not fail');
220 }));
221 }, 'IDB Observers: Multiple observer calls');
222
223 indexeddb_observers_test(function(t, db1_name, db2_name, observers_added_callbac k) {
224 var partOneChanges1 = {
225 dbName: db1_name,
226 records: {
227 'store1': [{type: 'delete', key: {lower: 'a', upper: 'b'}},
228 {type: 'put', key: 'a'}]
229 }
230 };
231
232 var partOneChanges2 = {
233 dbName: db1_name,
234 records: {
235 'store2': [{type: 'add', key: 'z'}]
236 }
237 };
238
239 var partOneChanges3 = {
240 dbName: db2_name,
241 records: {
242 'store3': [{type: 'put', key: 'c'}],
243 'store4': [{type: 'add', key: 'z'}]
244 }
245 };
246
247 var partTwoChanges2 = {
248 dbName: db1_name,
249 records: {
250 'store2': [{type: 'put', key: 'z'}]
251 }
252 };
253
254 var connection1 = null;
255 var connection2 = null;
256 var connection3 = null;
257 var observers_added_barrier = create_barrier(observers_added_callback);
258
259 var pendingObserves = 4;
260 var observeFunction = function(changes) {
261 pendingObserves = pendingObserves - 1;
262 var firstRound = pendingObserves != 0;
263
264 if (changes.database === connection1) {
265 assert_true(firstRound, "connection 1 should have been unobserved");
266 compareChanges(changes, partOneChanges1);
267 obs.unobserve(connection1);
268 } else if (changes.database === connection2) {
269 if (firstRound)
270 compareChanges(changes, partOneChanges2);
271 else
272 compareChanges(changes, partTwoChanges2);
273 } else if (changes.database === connection3) {
274 assert_true(firstRound, "connection 3 should have been unobserved ");
275 compareChanges(changes, partOneChanges3);
276 obs.unobserve(connection3);
277 } else {
278 assert_unreached('Unknown connection supplied with changes.');
279 }
280 if (pendingObserves === 0) {
281 t.done();
282 } else if (pendingObserves < 0) {
283 assert_unreached("incorrect pendingObserves");
284 }
285 };
286
287 var obs = new IDBObserver(
288 t.step_func(observeFunction),
289 { operationTypes: ['clear', 'put', 'add', 'delete'] });
290
291 var cb1 = observers_added_barrier(t);
292 openDB(t, db1_name, t.step_func(function(db) {
293 connection1 = db;
294 var txn = db.transaction(['store1'], 'readonly');
295 obs.observe(db, txn);
296 txn.oncomplete = cb1;
297 txn.onerror = t.unreached_func('transaction should not fail');
298 }));
299 var cb2 = observers_added_barrier(t);
300 openDB(t, db1_name, t.step_func(function(db) {
301 connection2 = db;
302 var txn = db.transaction(['store2'], 'readonly');
303 obs.observe(db, txn);
304 txn.oncomplete = cb2;
305 txn.onerror = t.unreached_func('transaction should not fail');
306 }));
307 var cb3 = observers_added_barrier(t);
308 openDB(t, db2_name, t.step_func(function(db) {
309 connection3 = db;
310 var txn = db.transaction(['store3', 'store4'], 'readonly');
311 obs.observe(db, txn);
312 txn.oncomplete = cb3;
313 txn.onerror = t.unreached_func('transaction should not fail')
314 }));
315 }, 'IDB Observers: Three connections, unobserve two');
316
317 indexeddb_observers_test(function(t, db1_name, db2_name, observers_added_callbac k) {
318 var connection1 = null;
319 var connection2 = null;
320
321 var observeFunction = function(changes) {
322 assert_equals(changes.database, connection2);
323 obs.unobserve(connection2);
324 t.done();
325 };
326
327 var obs = new IDBObserver(
328 t.step_func(observeFunction),
329 { operationTypes: ['clear', 'put', 'add', 'delete'] });
330
331 openDB(t, db1_name, t.step_func(function(db) {
332 connection1 = db;
333 var txn = db.transaction(['store1'], 'readonly');
334 obs.observe(db, txn);
335 obs.unobserve(db);
336 txn.oncomplete = t.step_func(function() {
337 openDB(t, db1_name, t.step_func(function(db) {
338 connection2 = db;
339 var txn = db.transaction(['store2'], 'readonly');
340 obs.observe(db, txn);
341 txn.oncomplete = observers_added_callback;
342 txn.onerror = t.unreached_func('transaction should not fail');
343 }));
344 });
345 txn.onerror = t.unreached_func('transaction should not fail');
346 }));
347 }, 'IDB Observers: Unobserve immediately');
348
349 indexeddb_observers_test(function(t, db1_name, db2_name, observers_added_callbac k) {
350 var connection1 = null;
351 var connection2 = null;
352
353 var observeFunction = function(changes) {
354 assert_equals(changes.database, connection2);
355 obs.unobserve(connection2);
356 t.done();
357 };
358
359 var obs = new IDBObserver(
360 t.step_func(observeFunction),
361 { operationTypes: ['clear', 'put', 'add', 'delete'] });
362
363 openDB(t, db1_name, t.step_func(function(db) {
364 connection1 = db;
365 var txn = db.transaction(['store1'], 'readonly');
366 obs.observe(db, txn);
367 obs.observe(db, txn);
368 obs.observe(db, txn);
369 obs.unobserve(db);
370 txn.oncomplete = t.step_func(function() {
371 openDB(t, db1_name, t.step_func(function(db) {
372 connection2 = db;
373 var txn = db.transaction(['store2'], 'readonly');
374 obs.observe(db, txn);
375 txn.oncomplete = observers_added_callback;
376 txn.onerror = t.unreached_func('transaction should not fail');
377 }));
378 });
379 txn.onerror = t.unreached_func('transaction should not fail');
380 }));
381 }, 'IDB Observers: Unobserve immediately on multiple');
382
383 indexeddb_observers_test(function(t, db1_name, db2_name, observers_added_callbac k) {
384 var expectedChanges1 = {
385 dbName: db1_name,
386 records: {
387 'store1': [{type: 'delete', key: {lower: 'a', upper: 'b'}},
388 {type: 'put', key: 'a'}]
389 }
390 };
391 var expectedChanges2 = {
392 dbName: db1_name,
393 records: {
394 'store2': [{type: 'add', key: 'z'}]
395 }
396 };
397
398 var connection1 = null;
399 var connection2 = null;
400 var observers_added_barrier = create_barrier(observers_added_callback);
401
402 var connection1Observes = 0;
403 var connection2Observes = 0;
404 var observeFunction = function(changes) {
405 if (changes.database === connection1) {
406 connection1Observes = connection1Observes + 1;
407 assert_true(connection1Observes <= 2);
408 if (changes.records.has('store1')) {
409 compareChanges(changes, expectedChanges1);
410 } else if (changes.records.has('store2')) {
411 compareChanges(changes, expectedChanges2);
412 } else {
413 assert_unreached("unknown changes");
414 }
415 if (connection1Observes === 2) {
416 obs.unobserve(connection1);
417 }
418 } else if (changes.database === connection2) {
419 connection2Observes = connection2Observes + 1;
420 if (connection2Observes > 1) {
421 t.done();
422 }
423 } else {
424 assert_unreached("unknown changes");
425 }
426 };
427
428 var obs = new IDBObserver(
429 t.step_func(observeFunction),
430 { operationTypes: ['clear', 'put', 'add', 'delete'] });
431
432 var cb1 = observers_added_barrier(t);
433 var cb2 = observers_added_barrier(t);
434 openDB(t, db1_name, t.step_func(function(db) {
435 connection1 = db;
436 var txn1 = db.transaction(['store1'], 'readonly');
437 var txn2 = db.transaction(['store2'], 'readonly');
438 // Start observing!
439 obs.observe(db, txn1);
440 obs.observe(db, txn2);
441
442 txn1.oncomplete = cb1;
443 txn2.oncomplete = cb2;
444 txn1.onerror = t.unreached_func('transaction should not fail');
445 txn2.onerror = t.unreached_func('transaction should not fail');
446 }));
447 var cb3 = observers_added_barrier(t);
448 openDB(t, db2_name, t.step_func(function(db) {
449 connection2 = db;
450 var txn = db.transaction(['store3'], 'readonly');
451 obs.observe(db, txn);
452 txn.oncomplete = cb3;
453 txn.onerror = t.unreached_func('transaction should not fail');
454 }));
455 }, 'IDB Observers: Unobserve connection removes observers');
456
457 indexeddb_observers_test(function(t, db1_name, db2_name, observers_added_callbac k) {
458 var expectedChanges1 = {
459 dbName: db1_name,
460 records: {
461 'store1': [{type: 'delete', key: {lower: 'a', upper: 'b'}},
462 {type: 'put', key: 'a'}]
463 }
464 };
465 var expectedChanges2 = {
466 dbName: db1_name,
467 records: {
468 'store2': [{type: 'add', key: 'z'}]
469 }
470 };
471
472 var connection1 = null;
473 var connection2 = null;
474 var observers_added_barrier = create_barrier(observers_added_callback);
475
476 var connection1Observes = 0;
477 var connection2Observes = 0;
478 var observeFunction = function(changes) {
479 if (changes.database === connection1) {
480 connection1Observes = connection1Observes + 1;
481 assert_true(connection1Observes <= 2);
482 if (changes.records.has('store1')) {
483 compareChanges(changes, expectedChanges1);
484 } else if (changes.records.has('store2')) {
485 compareChanges(changes, expectedChanges2);
486 } else {
487 assert_unreached("unknown changes");
488 }
489 if (connection1Observes === 2) {
490 connection1.close();
491 }
492 } else if (changes.database === connection2) {
493 connection2Observes = connection2Observes + 1;
494 if (connection2Observes > 1) {
495 t.done();
496 }
497 } else {
498 assert_unreached("unknown changes");
499 }
500 };
501
502 var obs = new IDBObserver(
503 t.step_func(observeFunction),
504 { operationTypes: ['clear', 'put', 'add', 'delete'] });
505
506 var cb1 = observers_added_barrier(t);
507 var cb2 = observers_added_barrier(t);
508 openDB(t, db1_name, t.step_func(function(db) {
509 connection1 = db;
510 var txn1 = db.transaction(['store1'], 'readonly');
511 var txn2 = db.transaction(['store2'], 'readonly');
512 // Start observing!
513 obs.observe(db, txn1);
514 obs.observe(db, txn2);
515
516 txn1.oncomplete = cb1;
517 txn2.oncomplete = cb2;
518 txn1.onerror = t.unreached_func('transaction should not fail');
519 txn2.onerror = t.unreached_func('transaction should not fail');
520 }));
521 var cb3 = observers_added_barrier(t);
522 openDB(t, db2_name, t.step_func(function(db) {
523 connection2 = db;
524 var txn = db.transaction(['store3'], 'readonly');
525 obs.observe(db, txn);
526 txn.oncomplete = cb3;
527 txn.onerror = t.unreached_func('transaction should not fail');
528 }));
529 }, 'IDB Observers: Close connection removes observers');
530
531 done();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698