Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: qunit/tests/indexedDBBackup.js

Issue 29860578: Issue 6775 - Work around filter data stored in IndexedDB getting lost on Microsoft Edge (Closed)
Left Patch Set: Created Aug. 21, 2018, 4:40 p.m.
Right Patch Set: Created Sept. 5, 2018, 3:53 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « metadata.edge ('k') | qunit/tests/ioIndexedDB.js » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 "use strict"; 1 "use strict";
2 2
3 { 3 {
4 const {IndexedDBBackup} = require("../../lib/indexedDBBackup"); 4 const {IndexedDBBackup} = require("../../lib/indexedDBBackup");
5 const info = require("info"); 5 const info = require("info");
6 const {FilterStorage} = require("../../adblockpluscore/lib/filterStorage");
6 const {Filter} = require("../../adblockpluscore/lib/filterClasses"); 7 const {Filter} = require("../../adblockpluscore/lib/filterClasses");
7 const {Subscription, SpecialSubscription} = 8 const {Subscription, SpecialSubscription} =
8 require("../../adblockpluscore/lib/subscriptionClasses"); 9 require("../../adblockpluscore/lib/subscriptionClasses");
9 10
10 let writeTime = 0; 11 let backupDelay = 100;
11 let writeInterval = 100; 12 let subscription = Subscription.fromObject({
13 title: "test",
14 url: "test.com",
15 homepage: "example.com",
16 lastSuccess: 8,
17 disabled: false,
18 lastDownload: 12,
19 lastCheck: 16,
20 softExpiration: 18,
21 expires: 20,
22 downloadStatus: "done",
23 errors: 3,
24 version: 24,
25 downloadCount: 1,
26 requiredVersion: "0.6"
27 });
28 let filter = Filter.fromText("example.com");
29 let specialSubscription = SpecialSubscription.createForFilter(filter);
12 30
13 let testEdge = info.platform == "edgehtml" ? QUnit.test : QUnit.skip; 31 let testEdge = info.platform == "edgehtml" ? QUnit.test : QUnit.skip;
14 32
15 QUnit.module("Microsoft Edge indexedDB backup", { 33 QUnit.module("Microsoft Edge indexedDB backup", {
34 beforeEach()
35 {
36 this._storageLocalSet = browser.storage.local.set;
37 IndexedDBBackup.setBackupInterval(backupDelay);
38 },
16 afterEach() 39 afterEach()
17 { 40 {
18 IndexedDBBackup.init(); 41 Object.defineProperty(
42 browser.storage.local, "set",
43 {value: this._storageLocalSet, enumerable: true}
44 );
45 IndexedDBBackup.setBackupInterval();
19 } 46 }
20 }); 47 });
21 48
22 testEdge("Data serialization", () => 49 testEdge("Backup creation", assert =>
23 { 50 {
24 let subscription = Subscription.fromObject({
25 title: "test",
26 url: "test.com",
27 homepage: "example.com",
28 disabled: false,
29 lastSuccess: 8,
30 lastDownload: 12,
31 lastCheck: 16,
32 softExpiration: 18,
33 expires: 20,
34 downloadStatus: "done",
35 errors: 3,
36 version: 24,
37 downloadCount: 1,
38 requiredVersion: "0.6"
39 });
40 let filter = Filter.fromText("example.com");
41 let specialSubscription = SpecialSubscription.createForFilter(filter);
42
43 let expectedFormat = [
44 "",
45 "[Subscription]",
46 `homepage=${subscription.homepage}`,
47 `title=${subscription.title}`,
48 `url=${subscription.url}`,
49 `disabled=${subscription.disabled}`,
50 "",
51 "[Subscription]",
52 `url=${specialSubscription.url}`,
53 "defaults=blocking",
54 "",
55 "[Subscription filters]",
56 "example.com"
57 ];
58 let actualFormat = IndexedDBBackup.serialize([
59 subscription,
60 specialSubscription
61 ]);
62 deepEqual(actualFormat, expectedFormat, "formates the data correctly");
Sebastian Noack 2018/08/21 20:26:25 Maybe we should test the serialization as part of
geo 2018/08/31 15:49:25 Done.
63 });
64
65 testEdge("Write time smaller than backup interval", assert =>
66 {
67 writeTime = 10;
68 testSaveSteps(assert);
69 });
70
71 testEdge("Write time greater than backup interval", assert =>
72 {
73 writeTime = 150;
74 testSaveSteps(assert); 51 testSaveSteps(assert);
75 }); 52 });
76 53
77 function testSaveSteps(assert) 54 function testSaveSteps(assert)
78 { 55 {
79 let start = performance.now(); 56 let start = performance.now();
80 let saveTimes = []; 57 let saveTimes = [];
58
81 let steps = [ 59 let steps = [
82 { 60 {
83 done: assert.async(), 61 done: assert.async(),
84 check() 62 check(data)
85 { 63 {
86 ok(start - saveTimes[0].start < writeInterval, 64 let expectedFormat = [
87 "first change is proccessed imediatelly"); 65 "[Subscription]",
66 `url=${specialSubscription.url}`,
67 "defaults=blocking",
68 "[Subscription filters]",
69 "example.com",
70 "[Subscription]",
71 "homepage=example.com",
72 "title=test",
73 "url=test.com",
74 "disabled=false"
75 ];
76
77 ok(
78 saveTimes[0] - start >= backupDelay,
79 "first write is deferred"
80 );
81 deepEqual(
82 data.content,
83 expectedFormat,
84 "saved data has the correct information"
85 );
86
87 FilterStorage.removeSubscription(subscription);
88 FilterStorage.removeSubscription(specialSubscription);
88 } 89 }
89 }, 90 },
90 { 91 {
91 done: assert.async(), 92 done: assert.async(),
92 check() 93 check(data)
93 { 94 {
94 ok(saveTimes[1].start - saveTimes[0].end >= writeInterval, 95 ok(
95 "next change is after the time limit"); 96 saveTimes[1] - saveTimes[0] >= backupDelay,
97 "next changes are saved after the write delay"
98 );
99 deepEqual(
100 data.content, [], "saved data has the correct information"
101 );
96 } 102 }
97 } 103 }
98 ]; 104 ];
99 let mockSave = () => 105 let mockSave = data =>
100 { 106 {
101 saveTimes.push({start: performance.now()}); 107 let step = steps.shift();
102 return new Promise(resolve => 108
109 saveTimes.push(performance.now());
110
111 setTimeout(() =>
geo 2018/09/05 15:59:08 I've reintroduced this timeout because without it,
103 { 112 {
104 setTimeout(() => 113 step.check(data["file:indexedDB-backup"]);
105 { 114 step.done();
106 saveTimes[saveTimes.length - 1].end = performance.now(); 115 }, 0);
107 let step = steps.shift();
108 step.check();
109 step.done();
110 resolve();
111 }, writeTime);
112 });
113 }; 116 };
114 117
115 IndexedDBBackup.init(writeInterval, mockSave); 118 Object.defineProperty(
116 IndexedDBBackup.scheduleBackup(); 119 browser.storage.local, "set",
117 setTimeout(IndexedDBBackup.scheduleBackup, writeTime / 2); 120 {value: mockSave, enumerable: true}
118 setTimeout(IndexedDBBackup.scheduleBackup, writeInterval); 121 );
122
123 FilterStorage.addSubscription(specialSubscription);
124 FilterStorage.addSubscription(subscription);
119 } 125 }
120 } 126 }
LEFTRIGHT

Powered by Google App Engine
This is Rietveld