| Index: chrome/content/tests/filterStorage_readwrite.js |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/chrome/content/tests/filterStorage_readwrite.js |
| @@ -0,0 +1,141 @@ |
| +(function() |
| +{ |
| + module("Filter storage read/write", { |
| + setup: function() |
| + { |
| + prepareFilterComponents.call(this); |
| + preparePrefs.call(this); |
| + }, |
| + teardown: function() |
| + { |
| + restoreFilterComponents.call(this); |
| + restorePrefs.call(this); |
| + } |
| + }); |
| + |
| + let {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm", null); |
| + let {NetUtil} = Cu.import("resource://gre/modules/NetUtil.jsm", null); |
| + |
| + let filtersData = (function() |
| + { |
| + let lines = ["# Adblock Plus preferences", "version=4"]; |
| + for (let i = 0; i < 40000; i++) |
| + { |
| + lines.push("[Filter]", `text=foobar${i}`, `hitCount=${i+10}`, |
| + `lastHit=${i+1400000000000}`); |
| + } |
| + |
| + lines.push("[Subscription]", "url=http://foo.example.com/", |
| + "title=Test subscription"); |
| + lines.push("[Subscription filters]"); |
| + for (let i = 0; i < 40000; i++) |
| + lines.push(`foobar${i}`); |
| + return lines.join("\n") + "\n"; |
| + })(); |
| + |
| + function writeToFile(file, data) |
| + { |
| + let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"] |
| + .createInstance(Ci.nsIScriptableUnicodeConverter); |
| + converter.charset = "utf-8"; |
| + data = converter.ConvertFromUnicode(data); |
| + |
| + let stream = FileUtils.openFileOutputStream(file); |
| + stream.write(data, data.length); |
| + stream.close(); |
| + } |
| + |
| + function readFromFile(file) |
| + { |
| + return new Promise((resolve, reject) => |
| + { |
| + let stream = Cc["@mozilla.org/network/file-input-stream;1"] |
| + .createInstance(Ci.nsIFileInputStream); |
| + stream.init(file, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, |
| + Ci.nsIFileInputStream.DEFER_OPEN); |
| + |
| + NetUtil.asyncFetch(stream, (inputStream, nsresult) => |
| + { |
| + resolve(NetUtil.readInputStreamToString(inputStream, |
| + inputStream.available(), {charset: "utf-8"})); |
| + }); |
| + }); |
| + } |
| + |
| + function canonicalizeFiltersData(data) |
| + { |
| + let curSection = null; |
| + let sections = []; |
| + for (let line of (data + "\n[end]").split(/[\r\n]+/)) |
| + { |
| + if (/^\[.*\]$/.test(line)) |
| + { |
| + if (curSection) |
| + sections.push(curSection); |
| + |
| + curSection = {header: line, data: []}; |
| + } |
| + else if (curSection && /\S/.test(line)) |
| + curSection.data.push(line); |
| + } |
| + for (let section of sections) |
| + { |
| + section.key = section.header + " " + section.data[0]; |
| + section.data.sort(); |
| + } |
| + sections.sort((a, b) => |
| + { |
| + if (a.key < b.key) |
| + return -1; |
| + else if (a.key > b.key) |
| + return 1; |
| + else |
| + return 0; |
| + }); |
| + return sections.map(section => |
| + { |
| + return [section.header].concat(section.data).join("\n"); |
| + }).join("\n"); |
| + } |
| + |
| + function testReadWrite() |
| + { |
| + let tempFile = FileUtils.getFile("TmpD", ["temp_patterns.ini"]); |
| + tempFile.createUnique(tempFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE); |
| + writeToFile(tempFile, filtersData); |
| + |
| + Promise.resolve().then(() => |
| + { |
| + FilterStorage.loadFromDisk(tempFile); |
| + return FilterNotifier.once("load"); |
| + }).then(() => |
| + { |
| + tempFile.remove(false); |
| + FilterStorage.saveToDisk(tempFile); |
| + return FilterNotifier.once("save"); |
| + }).then(() => |
| + { |
| + return readFromFile(tempFile); |
| + }).then(fileData => |
| + { |
| + tempFile.remove(false); |
| + |
| + equal(canonicalizeFiltersData(fileData), |
| + canonicalizeFiltersData(filtersData), |
| + "Read/write result"); |
| + start(); |
| + }).catch(error => |
| + { |
| + Cu.reportError(error); |
| + ok(false, "Caught error: " + error); |
| + start(); |
| + }); |
| + } |
| + |
| + asyncTest("Read and save to file", testReadWrite); |
| + asyncTest("Read and save with please_kill_startup_performance set", () => |
| + { |
| + Prefs.please_kill_startup_performance = true; |
| + testReadWrite(); |
| + }); |
| +})(); |