OLD | NEW |
(Empty) | |
| 1 <!DOCTYPE html> |
| 2 <meta charset=utf-8> |
| 3 <title>Writer starvation</title> |
| 4 <link rel="author" href="mailto:odinho@opera.com" title="Odin Hørthe Omdal"> |
| 5 <meta name=timeout content=long> |
| 6 <script src=../../../resources/testharness.js></script> |
| 7 <script src=../../../resources/testharnessreport.js></script> |
| 8 <script src=support.js></script> |
| 9 |
| 10 <script> |
| 11 var db, read_request_count = 0, read_success_count = 0; |
| 12 var write_request_count = 0, write_success_count = 0; |
| 13 var RQ_COUNT = 25; |
| 14 |
| 15 var open_rq = createdb(async_test(undefined, {timeout: 20000})); |
| 16 open_rq.onupgradeneeded = function(e) { |
| 17 db = e.target.result; |
| 18 db.createObjectStore("s") |
| 19 .add("1", 1); |
| 20 } |
| 21 |
| 22 open_rq.onsuccess = function(e) { |
| 23 var i = 0, continue_reading = true; |
| 24 |
| 25 /* Pre-fill some read requests */ |
| 26 for (i = 0; i < RQ_COUNT; i++) |
| 27 { |
| 28 read_request_count++; |
| 29 |
| 30 db.transaction("s") |
| 31 .objectStore("s") |
| 32 .get(1) |
| 33 .onsuccess = this.step_func(function(e) { |
| 34 read_success_count++; |
| 35 assert_equals(e.target.transaction.mode, "readonly"); |
| 36 }); |
| 37 } |
| 38 |
| 39 this.step(loop); |
| 40 |
| 41 function loop() { |
| 42 read_request_count++; |
| 43 |
| 44 db.transaction("s") |
| 45 .objectStore("s") |
| 46 .get(1) |
| 47 .onsuccess = this.step_func(function(e) |
| 48 { |
| 49 read_success_count++; |
| 50 assert_equals(e.target.transaction.mode, "readonly"); |
| 51 |
| 52 if (read_success_count >= RQ_COUNT && write_request_count == 0) |
| 53 { |
| 54 write_request_count++; |
| 55 |
| 56 db.transaction("s", "readwrite") |
| 57 .objectStore("s") |
| 58 .add("written", read_request_count) |
| 59 .onsuccess = this.step_func(function(e) |
| 60 { |
| 61 write_success_count++; |
| 62 assert_equals(e.target.transaction.mode, "readwrite"); |
| 63 assert_equals(e.target.result, read_success_count, |
| 64 "write cb came before later read cb's") |
| 65 }); |
| 66 |
| 67 /* Reads done after the write */ |
| 68 for (i = 0; i < 5; i++) |
| 69 { |
| 70 read_request_count++; |
| 71 |
| 72 db.transaction("s") |
| 73 .objectStore("s") |
| 74 .get(1) |
| 75 .onsuccess = this.step_func(function(e) |
| 76 { |
| 77 read_success_count++; |
| 78 }); |
| 79 } |
| 80 } |
| 81 }); |
| 82 |
| 83 if (read_success_count < RQ_COUNT + 5) |
| 84 setTimeout(this.step_func(loop), write_request_count ? 1000 : 10
0); |
| 85 else |
| 86 // This is merely a "nice" hack to run finish after the last req
uest is done |
| 87 db.transaction("s") |
| 88 .objectStore("s") |
| 89 .count() |
| 90 .onsuccess = this.step_func(function() |
| 91 { |
| 92 setTimeout(this.step_func(finish), 100); |
| 93 }); |
| 94 } |
| 95 } |
| 96 |
| 97 |
| 98 function finish() { |
| 99 assert_equals(read_request_count, read_success_count, "read counts"); |
| 100 assert_equals(write_request_count, write_success_count, "write counts"); |
| 101 this.done(); |
| 102 } |
| 103 </script> |
| 104 |
| 105 <div id=log></div> |
OLD | NEW |