| Index: qunit/tests/ioIndexedDB.js | 
| diff --git a/qunit/tests/ioIndexedDB.js b/qunit/tests/ioIndexedDB.js | 
| index 5e259a43b58c478c8735c146e083ef275018e4f6..0df2ad0d4be420be6bf55704b1d411765ca01f19 100644 | 
| --- a/qunit/tests/ioIndexedDB.js | 
| +++ b/qunit/tests/ioIndexedDB.js | 
| @@ -3,12 +3,15 @@ | 
| { | 
| const {IO} = require("io"); | 
| const info = require("info"); | 
| +  const {IndexedDBBackup} = require("../../lib/indexedDBBackup"); | 
|  | 
| const testFileNames = { | 
| testData: "testData", | 
| +    stat: "stat", | 
| simpleCheck: "simpleCheck", | 
| write: "writeCheck", | 
| read: "readCheck", | 
| +    readBackup: "readBackup", | 
| rename: "renameCheck" | 
| }; | 
| const testData = { | 
| @@ -17,23 +20,41 @@ | 
| lastModified: Date.now() | 
| }; | 
|  | 
| +  let _backupName = "test"; | 
| +  let _storageData = new Map(); | 
| + | 
| +  IndexedDBBackup.getBackupData = () => | 
| +  { | 
| +    return new Promise((resolve, reject) => | 
| +    { | 
| +      if (_storageData.size) | 
| +      { | 
| +        resolve(_storageData.get(_backupName)); | 
| +      } | 
| +      else | 
| +        reject({type: "NoSuchFile"}); | 
| +    }); | 
| +  }; | 
| + | 
| let testEdge = info.platform == "edgehtml" ? QUnit.test : QUnit.skip; | 
|  | 
| QUnit.module("Microsoft Edge filter storage", { | 
| -    beforeEach() | 
| +    beforeEach(assert) | 
| { | 
| -      return prePopulateStorage(); | 
| +      prePopulateStorage(assert); | 
| }, | 
| -    afterEach() | 
| +    afterEach(assert) | 
| { | 
| -      return clearStorage(); | 
| +      _storageData.clear(); | 
| +      clearStorage(assert); | 
| } | 
| }); | 
|  | 
| testEdge("statFile", assert => | 
| { | 
| -    const noFileMsg = "returns correct value if file doesn't exist"; | 
| -    const fileExistsMsg = "returns correct value if file exists"; | 
| +    const noFileMsg = "returns correct value if file doesn't exist" + | 
| +      " and there is no backup"; | 
| +    const fileExistsMsg = "returns correct value if file exists in indexedDB"; | 
|  | 
| ok(IO.statFile(testFileNames.simpleCheck) instanceof Promise, | 
| "returns a promise"); | 
| @@ -53,6 +74,29 @@ | 
| assert); | 
| }); | 
|  | 
| +  testEdge("restore backup", assert => | 
| +  { | 
| +    let backupData = { | 
| +      content: ["backup data"], | 
| +      lastModified: Date.now() | 
| +    }; | 
| +    let readFromFileMessage = "readFromFile return correct value," + | 
| +      " if a data restore is performed"; | 
| +    _storageData.set(_backupName, backupData); | 
| + | 
| +    asyncReadHelper( | 
| +      IO.statFile, | 
| +      testFileNames.stat, | 
| +      {exists: true, lastModified: backupData.lastModified}, | 
| +      "statFile return correct value, if a data restore is performed", | 
| +      assert); | 
| + | 
| +    callsListeners( | 
| +      testFileNames.readBackup, | 
| +      assert, backupData.content, | 
| +      readFromFileMessage); | 
| +  }); | 
| + | 
| testEdge("writeToFile", assert => | 
| { | 
| ok(IO.writeToFile(testFileNames.simpleCheck, ["test"]) instanceof Promise, | 
| @@ -89,7 +133,9 @@ | 
|  | 
| testEdge("readFromFile", assert => | 
| { | 
| -    const noFileMsg = "returns correct value if file doesn't exist"; | 
| +    const noFileMsg = "returns correct value if file doesn't exist" + | 
| +      " and there is no backup"; | 
| +    const fileExistsMsg = "calls listeners with the correct values"; | 
|  | 
| ok(IO.readFromFile(testFileNames.simpleCheck) instanceof Promise, | 
| "returns a promise"); | 
| @@ -102,21 +148,22 @@ | 
| assert | 
| ); | 
|  | 
| -    callsListeners(assert); | 
| +    callsListeners( | 
| +      testFileNames.testData, | 
| +      assert, | 
| +      testData.content, | 
| +      fileExistsMsg); | 
| }); | 
|  | 
| -  function callsListeners(assert) | 
| +  function callsListeners(fileName, assert, expected, message) | 
| { | 
| let done = assert.async(); | 
| let called = []; | 
|  | 
| -    IO.readFromFile(testFileNames.testData, (entry) => called.push(entry)) | 
| +    IO.readFromFile(fileName, (entry) => called.push(entry)) | 
| .then(() => | 
| { | 
| -        deepEqual( | 
| -          called, | 
| -          testData.content, | 
| -          "calls listeners with the correct values"); | 
| +        deepEqual(called, expected, message); | 
| done(); | 
| }); | 
| } | 
| @@ -176,55 +223,48 @@ | 
| .transaction(["file"], "readwrite") | 
| .objectStore("file"); | 
|  | 
| -        store.get(fileName).onsuccess = (evt => | 
| -          resolve(evt.currentTarget.result) | 
| -        ); | 
| +        store.get(fileName).onsuccess = evt => | 
| +          resolve(evt.currentTarget.result); | 
| }; | 
| }); | 
| } | 
|  | 
| -  function prePopulateStorage() | 
| +  function prePopulateStorage(assert) | 
| { | 
| -    return new Promise(resolve => | 
| -    { | 
| -      let db; | 
| -      let req = indexedDB.open("adblockplus", 1); | 
| +    let done = assert.async(); | 
| +    let db; | 
| +    let req = indexedDB.open("adblockplus", 1); | 
|  | 
| -      req.onsuccess = (event) => | 
| -      { | 
| -        db = event.currentTarget.result; | 
| -        let store = db | 
| -          .transaction(["file"], "readwrite") | 
| -          .objectStore("file"); | 
| +    req.onsuccess = (event) => | 
| +    { | 
| +      db = event.currentTarget.result; | 
| +      let store = db | 
| +        .transaction(["file"], "readwrite") | 
| +        .objectStore("file"); | 
|  | 
| -        store.put(testData).onsuccess = resolve; | 
| -      }; | 
| -    }); | 
| +      store.put(testData).onsuccess = done; | 
| +    }; | 
| } | 
|  | 
| -  function clearStorage() | 
| +  function clearStorage(assert) | 
| { | 
| -    return new Promise(resolve => | 
| -      { | 
| -      let db; | 
| -      let req = indexedDB.open("adblockplus", 1); | 
| - | 
| -      req.onsuccess = (event) => | 
| +    let done = assert.async(); | 
| +    let db; | 
| +    let req = indexedDB.open("adblockplus", 1); | 
| +    req.onsuccess = event => | 
| +    { | 
| +      db = event.currentTarget.result; | 
| +      Promise.all(Object.values(testFileNames) | 
| +      .map(fileName => new Promise(resolveFile => | 
| { | 
| -        db = event.currentTarget.result; | 
| -        let files = Object.keys(testFileNames) | 
| -          .map(fileName => new Promise((resolveFile, reject) => | 
| -          { | 
| -            let store = db | 
| -              .transaction(["file"], "readwrite") | 
| -              .objectStore("file"); | 
| - | 
| -            store.delete("file:" + fileName).onsuccess = resolveFile; | 
| -          })); | 
| +        let store = db | 
| +          .transaction(["file"], "readwrite") | 
| +          .objectStore("file"); | 
|  | 
| -        Promise.all(files).then(resolve); | 
| -      }; | 
| -    }); | 
| +        store.delete("file:" + fileName).onsuccess = resolveFile; | 
| +      }))) | 
| +      .then(() => done()); | 
| +    }; | 
| } | 
| } | 
|  | 
|  |