| OLD | NEW | 
| (Empty) |  | 
 |    1 "use strict"; | 
 |    2  | 
 |    3 { | 
 |    4   const {IO} = require("io"); | 
 |    5  | 
 |    6   const testFileNames = { | 
 |    7     testData: "testData", | 
 |    8     simpleCheck: "simpleCheck", | 
 |    9     write: "writeCheck", | 
 |   10     read: "readCheck", | 
 |   11     rename: "renameCheck" | 
 |   12   }; | 
 |   13   const testData = { | 
 |   14     fileName: "file:" + testFileNames.testData, | 
 |   15     content: [1, 2, 3], | 
 |   16     lastModified: Date.now() | 
 |   17   }; | 
 |   18  | 
 |   19   QUnit.module("IO tests", { | 
 |   20     beforeEach() | 
 |   21     { | 
 |   22       return prePopulateStorage(); | 
 |   23     }, | 
 |   24     afterEach() | 
 |   25     { | 
 |   26       return clearStorage(); | 
 |   27     } | 
 |   28   }); | 
 |   29  | 
 |   30   test("statFile", assert => | 
 |   31   { | 
 |   32     const noFileMsg = "returns correct value if file doesn't exist"; | 
 |   33     const fileExistsMsg = "returns correct value if file exists"; | 
 |   34  | 
 |   35     ok(IO.statFile(testFileNames.simpleCheck) instanceof Promise, | 
 |   36       "returns a promise"); | 
 |   37  | 
 |   38     asyncReadHelper( | 
 |   39       IO.statFile, | 
 |   40       testFileNames.testData, | 
 |   41       {exists: true, lastModified: testData.lastModified}, | 
 |   42       fileExistsMsg, | 
 |   43       assert); | 
 |   44  | 
 |   45     asyncReadHelper( | 
 |   46       IO.statFile, | 
 |   47       testFileNames.simpleCheck, | 
 |   48       {exists: false}, | 
 |   49       noFileMsg, | 
 |   50       assert); | 
 |   51   }); | 
 |   52  | 
 |   53   test("writeToFile", assert => | 
 |   54   { | 
 |   55     ok(IO.writeToFile(testFileNames.simpleCheck, ["test"]) instanceof Promise, | 
 |   56       "returns a promise"); | 
 |   57  | 
 |   58     writesCorrectValue(assert); | 
 |   59   }); | 
 |   60  | 
 |   61   function writesCorrectValue(assert) | 
 |   62   { | 
 |   63     const writeCheck = { | 
 |   64       fileName: "file:writeCheck", | 
 |   65       content: [1, 2, 3], | 
 |   66       lastModified: Date.now() | 
 |   67     }; | 
 |   68     let done = assert.async(); | 
 |   69  | 
 |   70     IO.writeToFile(testFileNames.write, writeCheck.content) | 
 |   71       .then(() => readFromStorage(writeCheck.fileName)) | 
 |   72       .then(result => | 
 |   73       { | 
 |   74         deepEqual( | 
 |   75           Object.keys(writeCheck), | 
 |   76           Object.keys(result), | 
 |   77           "data is written in the correct format"); | 
 |   78  | 
 |   79         deepEqual( | 
 |   80           writeCheck.content, | 
 |   81           result.content, | 
 |   82           "data has the correct content"); | 
 |   83         done(); | 
 |   84       }); | 
 |   85   } | 
 |   86  | 
 |   87   test("readFromFile", assert => | 
 |   88   { | 
 |   89     const noFileMsg = "returns correct value if file doesn't exist"; | 
 |   90  | 
 |   91     ok(IO.readFromFile(testFileNames.simpleCheck) instanceof Promise, | 
 |   92     "returns a promise"); | 
 |   93  | 
 |   94     asyncReadHelper( | 
 |   95       IO.readFromFile, | 
 |   96       testFileNames.read, | 
 |   97       {type: "NoSuchFile"}, | 
 |   98       noFileMsg, | 
 |   99       assert | 
 |  100     ); | 
 |  101  | 
 |  102     callsListeners(assert); | 
 |  103   }); | 
 |  104  | 
 |  105   function callsListeners(assert) | 
 |  106   { | 
 |  107     let done = assert.async(); | 
 |  108     let called = []; | 
 |  109  | 
 |  110     IO.readFromFile(testFileNames.testData, (entry) => called.push(entry)) | 
 |  111       .then(() => | 
 |  112       { | 
 |  113         deepEqual( | 
 |  114           called, | 
 |  115           testData.content, | 
 |  116           "calls listeners with the correct values"); | 
 |  117         done(); | 
 |  118       }); | 
 |  119   } | 
 |  120  | 
 |  121   test("renameFile", assert => | 
 |  122   { | 
 |  123     ok(IO.renameFile(testFileNames.simpleCheck) instanceof Promise, | 
 |  124       "returns a promise"); | 
 |  125  | 
 |  126     checkRename(assert); | 
 |  127   }); | 
 |  128  | 
 |  129   function checkRename(assert) | 
 |  130   { | 
 |  131     let done = assert.async(); | 
 |  132     const expected = { | 
 |  133       fileName: "file:" + testFileNames.rename, | 
 |  134       content: testData.content, | 
 |  135       lastModified: testData.lastModified | 
 |  136     }; | 
 |  137  | 
 |  138     IO.renameFile(testFileNames.testData, testFileNames.rename) | 
 |  139       .then(() => readFromStorage("file:" + testFileNames.rename)) | 
 |  140       .then(result => | 
 |  141       { | 
 |  142         deepEqual(result, expected, "overrites file"); | 
 |  143         done(); | 
 |  144       }); | 
 |  145   } | 
 |  146  | 
 |  147   function asyncReadHelper(method, fileName, expectedValue, description, assert) | 
 |  148   { | 
 |  149     let done = assert.async(); | 
 |  150     method(fileName) | 
 |  151     .then(result => | 
 |  152     { | 
 |  153       deepEqual(result, expectedValue, description); | 
 |  154       done(); | 
 |  155     }) | 
 |  156     .catch(error => | 
 |  157     { | 
 |  158       deepEqual(error, expectedValue, description); | 
 |  159       done(); | 
 |  160     }); | 
 |  161   } | 
 |  162  | 
 |  163   function readFromStorage(fileName) | 
 |  164   { | 
 |  165     return new Promise(resolve => | 
 |  166     { | 
 |  167       let db; | 
 |  168       let req = indexedDB.open("adblockplus", 1); | 
 |  169       req.onsuccess = (event) => | 
 |  170       { | 
 |  171         db = event.currentTarget.result; | 
 |  172         let store = db | 
 |  173           .transaction(["file"], "readwrite") | 
 |  174           .objectStore("file"); | 
 |  175  | 
 |  176         store.get(fileName).onsuccess = (evt => | 
 |  177           resolve(evt.currentTarget.result) | 
 |  178         ); | 
 |  179       }; | 
 |  180     }); | 
 |  181   } | 
 |  182  | 
 |  183   function prePopulateStorage() | 
 |  184   { | 
 |  185     return new Promise(resolve => | 
 |  186     { | 
 |  187       let db; | 
 |  188       let req = indexedDB.open("adblockplus", 1); | 
 |  189  | 
 |  190       req.onsuccess = (event) => | 
 |  191       { | 
 |  192         db = event.currentTarget.result; | 
 |  193         let store = db | 
 |  194           .transaction(["file"], "readwrite") | 
 |  195           .objectStore("file"); | 
 |  196  | 
 |  197         store.put(testData).onsuccess = resolve; | 
 |  198       }; | 
 |  199     }); | 
 |  200   } | 
 |  201  | 
 |  202   function clearStorage() | 
 |  203   { | 
 |  204     return new Promise(resolve => | 
 |  205       { | 
 |  206       let db; | 
 |  207       let req = indexedDB.open("adblockplus", 1); | 
 |  208  | 
 |  209       req.onsuccess = (event) => | 
 |  210       { | 
 |  211         db = event.currentTarget.result; | 
 |  212         let files = Object.keys(testFileNames) | 
 |  213           .map(fileName => new Promise((resolveFile, reject) => | 
 |  214           { | 
 |  215             let store = db | 
 |  216               .transaction(["file"], "readwrite") | 
 |  217               .objectStore("file"); | 
 |  218  | 
 |  219             store.delete("file:" + fileName).onsuccess = resolveFile; | 
 |  220           })); | 
 |  221  | 
 |  222         Promise.all(files).then(resolve); | 
 |  223       }; | 
 |  224     }); | 
 |  225   } | 
 |  226 } | 
 |  227  | 
| OLD | NEW |