| Index: chrome/content/tests/filterStorage_readwrite.js | 
| =================================================================== | 
| deleted file mode 100644 | 
| --- a/chrome/content/tests/filterStorage_readwrite.js | 
| +++ /dev/null | 
| @@ -1,358 +0,0 @@ | 
| -(function() | 
| -{ | 
| -  module("Filter storage read/write", { | 
| -    setup: function() | 
| -    { | 
| -      prepareFilterComponents.call(this); | 
| -      preparePrefs.call(this); | 
| - | 
| -      FilterStorage.addSubscription(Subscription.fromURL("~fl~")); | 
| -    }, | 
| -    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); | 
| - | 
| -  function loadFilters(file, callback) | 
| -  { | 
| -    let listener = function(action) | 
| -    { | 
| -      if (action == "load") | 
| -      { | 
| -        FilterNotifier.removeListener(listener); | 
| -        callback(); | 
| -      } | 
| -    }; | 
| -    FilterNotifier.addListener(listener); | 
| - | 
| -    FilterStorage.loadFromDisk(file); | 
| -  } | 
| - | 
| -  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 saveFilters(file, callback) | 
| -  { | 
| -    let listener = function(action) | 
| -    { | 
| -      if (action == "save") | 
| -      { | 
| -        FilterNotifier.removeListener(listener); | 
| -        callback(); | 
| -      } | 
| -    }; | 
| -    FilterNotifier.addListener(listener); | 
| - | 
| -    FilterStorage.saveToDisk(file); | 
| -  } | 
| - | 
| -  function testReadWrite(withExternal) | 
| -  { | 
| -    let tempFile = FileUtils.getFile("TmpD", ["temp_patterns1.ini"]); | 
| -    let tempFile2 = FileUtils.getFile("TmpD", ["temp_patterns2.ini"]); | 
| -    tempFile.createUnique(tempFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE); | 
| -    createTempFile(); | 
| - | 
| -    function canonize(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(function(a, b) | 
| -      { | 
| -        if (a.key < b.key) | 
| -          return -1; | 
| -        else if (a.key > b.key) | 
| -          return 1; | 
| -        else | 
| -          return 0; | 
| -      }); | 
| -      return sections.map(function(section) { | 
| -        return [section.header].concat(section.data).join("\n"); | 
| -      }).join("\n"); | 
| -    } | 
| - | 
| -    function createTempFile() | 
| -    { | 
| -      let request = new XMLHttpRequest(); | 
| -      request.open("GET", "data/patterns.ini"); | 
| -      request.overrideMimeType("text/plain; charset=utf-8"); | 
| -      request.addEventListener("load", function() | 
| -      { | 
| -        writeToFile(tempFile, request.responseText); | 
| -        loadFilters(tempFile, saveFile); | 
| -      }, false); | 
| -      request.send(null); | 
| -    } | 
| - | 
| -    function saveFile() | 
| -    { | 
| -      equal(FilterStorage.fileProperties.version, FilterStorage.formatVersion, "File format version"); | 
| - | 
| -      if (withExternal) | 
| -      { | 
| -        let {AdblockPlus} = Cu.import(Cc["@adblockplus.org/abp/public;1"].getService(Ci.nsIURI).spec, null); | 
| -        AdblockPlus.updateExternalSubscription("~external~external subscription ID", "External subscription", ["foo", "bar"]); | 
| - | 
| -        let externalSubscriptions = FilterStorage.subscriptions.filter(function (subscription) subscription instanceof ExternalSubscription); | 
| -        equal(externalSubscriptions.length, 1, "Number of external subscriptions after updateExternalSubscription"); | 
| - | 
| -        if (externalSubscriptions.length == 1) | 
| -        { | 
| -          equal(externalSubscriptions[0].url, "~external~external subscription ID", "ID of external subscription"); | 
| -          equal(externalSubscriptions[0].filters.length, 2, "Number of filters in external subscription"); | 
| -        } | 
| -      } | 
| - | 
| -      saveFilters(tempFile2, compareFile); | 
| -    } | 
| - | 
| -    function compareFile() | 
| -    { | 
| -      let stream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); | 
| -      stream.init(tempFile2, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, Ci.nsIFileInputStream.DEFER_OPEN); | 
| - | 
| -      NetUtil.asyncFetch(stream, function(inputStream, nsresult) | 
| -      { | 
| -        let result = NetUtil.readInputStreamToString(inputStream, inputStream.available(), {charset: "utf-8"}); | 
| - | 
| -        let request = new XMLHttpRequest(); | 
| -        request.open("GET", "data/patterns.ini"); | 
| -        request.overrideMimeType("text/plain"); | 
| -        request.addEventListener("load", function() | 
| -        { | 
| -          let expected = request.responseText; | 
| -          equal(canonize(result), canonize(expected), "Read/write result"); | 
| - | 
| -          tempFile.remove(false); | 
| -          tempFile2.remove(false); | 
| -          start(); | 
| -        }, false); | 
| -        request.send(null); | 
| -      }); | 
| -    } | 
| -  } | 
| - | 
| -  asyncTest("Read and save to file", testReadWrite.bind(false)); | 
| -  asyncTest("Read, add external subscription and save to file", testReadWrite.bind(true)); | 
| - | 
| -  let groupTests = [ | 
| -    ["~wl~", "whitelist"], | 
| -    ["~fl~", "blocking"], | 
| -    ["~eh~", "elemhide"] | 
| -  ]; | 
| -  for (let i = 0; i < groupTests.length; i++) | 
| -  { | 
| -    let [url, defaults] = groupTests[i]; | 
| -    asyncTest("Read empty legacy user-defined group (" + url + ")", function() | 
| -    { | 
| -      let data = "[Subscription]\nurl=" + url; | 
| -      let tempFile = FileUtils.getFile("TmpD", ["temp_patterns1.ini"]); | 
| -      writeToFile(tempFile, data); | 
| - | 
| -      loadFilters(tempFile, function() | 
| -      { | 
| -        tempFile.remove(false); | 
| -        equal(FilterStorage.subscriptions.length, 0, "Number of filter subscriptions"); | 
| -        start(); | 
| -      }); | 
| -    }); | 
| -    asyncTest("Read non-empty legacy user-defined group (" + url + ")", function() | 
| -    { | 
| -      let data = "[Subscription]\nurl=" + url + "\n[Subscription filters]\nfoo"; | 
| -      let tempFile = FileUtils.getFile("TmpD", ["temp_patterns1.ini"]); | 
| -      writeToFile(tempFile, data); | 
| - | 
| -      loadFilters(tempFile, function() | 
| -      { | 
| -        tempFile.remove(false); | 
| -        equal(FilterStorage.subscriptions.length, 1, "Number of filter subscriptions"); | 
| -        if (FilterStorage.subscriptions.length == 1) | 
| -        { | 
| -          let subscription = FilterStorage.subscriptions[0]; | 
| -          equal(subscription.url, url, "Subscription ID"); | 
| -          equal(subscription.title, Utils.getString(defaults + "Group_title"), "Subscription title"); | 
| -          deepEqual(subscription.defaults, [defaults], "Default types"); | 
| -          equal(subscription.filters.length, 1, "Number of subscription filters"); | 
| -          if (subscription.filters.length == 1) | 
| -            equal(subscription.filters[0].text, "foo", "First filter"); | 
| -        } | 
| -        start(); | 
| -      }); | 
| -    }); | 
| -  } | 
| - | 
| -  asyncTest("Read legacy user-defined filters", function() | 
| -  { | 
| -    let data = "[Subscription]\nurl=~user~1234\ntitle=Foo\n[Subscription filters]\n[User patterns]\nfoo\n\\[bar]\nfoo#bar"; | 
| -    let tempFile = FileUtils.getFile("TmpD", ["temp_patterns1.ini"]); | 
| -    writeToFile(tempFile, data); | 
| - | 
| -    loadFilters(tempFile, function() | 
| -    { | 
| -      tempFile.remove(false); | 
| -      equal(FilterStorage.subscriptions.length, 1, "Number of filter subscriptions"); | 
| -      if (FilterStorage.subscriptions.length == 1) | 
| -      { | 
| -        let subscription = FilterStorage.subscriptions[0]; | 
| -        equal(subscription.filters.length, 3, "Number of subscription filters"); | 
| -        if (subscription.filters.length == 3) | 
| -        { | 
| -          equal(subscription.filters[0].text, "foo", "First filter"); | 
| -          equal(subscription.filters[1].text, "[bar]", "Second filter"); | 
| -          equal(subscription.filters[2].text, "foo#bar", "Third filter"); | 
| -        } | 
| -      } | 
| -      start(); | 
| -    }); | 
| -  }); | 
| - | 
| -  asyncTest("Saving without backups", function() | 
| -  { | 
| -    Prefs.patternsbackups = 0; | 
| -    Prefs.patternsbackupinterval = 24; | 
| - | 
| -    let tempFile = FileUtils.getFile("TmpD", ["temp_patterns.ini"]); | 
| -    tempFile.createUnique(tempFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE); | 
| -    FilterStorage.__defineGetter__("sourceFile", () => tempFile.clone()); | 
| - | 
| -    saveFilters(null, function() | 
| -    { | 
| -      saveFilters(null, function() | 
| -      { | 
| -        let backupFile = tempFile.clone(); | 
| -        backupFile.leafName = backupFile.leafName.replace(/\.ini$/, "-backup1.ini"); | 
| -        ok(!backupFile.exists(), "Backup shouldn't be created"); | 
| -        start(); | 
| -      }); | 
| -    }); | 
| -  }); | 
| - | 
| -  asyncTest("Saving with backups", function() | 
| -  { | 
| -    Prefs.patternsbackups = 2; | 
| -    Prefs.patternsbackupinterval = 24; | 
| - | 
| -    let tempFile = FileUtils.getFile("TmpD", ["temp_patterns.ini"]); | 
| -    tempFile.createUnique(tempFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE); | 
| -    FilterStorage.__defineGetter__("sourceFile", () => tempFile.clone()); | 
| - | 
| -    let backupFile = tempFile.clone(); | 
| -    backupFile.leafName = backupFile.leafName.replace(/\.ini$/, "-backup1.ini"); | 
| - | 
| -    let backupFile2 = tempFile.clone(); | 
| -    backupFile2.leafName = backupFile2.leafName.replace(/\.ini$/, "-backup2.ini"); | 
| - | 
| -    let backupFile3 = tempFile.clone(); | 
| -    backupFile3.leafName = backupFile3.leafName.replace(/\.ini$/, "-backup3.ini"); | 
| - | 
| -    let oldModifiedTime; | 
| - | 
| -    saveFilters(null, callback1); | 
| - | 
| -    function callback1() | 
| -    { | 
| -      // Save again immediately | 
| -      saveFilters(null, callback2); | 
| -    } | 
| - | 
| -    function callback2() | 
| -    { | 
| -      backupFile = backupFile.clone();  // File parameters are cached, clone to prevent this | 
| -      ok(backupFile.exists(), "First backup created"); | 
| - | 
| -      backupFile.lastModifiedTime -= 10000; | 
| -      oldModifiedTime = backupFile.lastModifiedTime; | 
| -      saveFilters(null, callback3); | 
| -    } | 
| - | 
| -    function callback3() | 
| -    { | 
| -      backupFile = backupFile.clone();  // File parameters are cached, clone to prevent this | 
| -      equal(backupFile.lastModifiedTime, oldModifiedTime, "Backup not overwritten if it is only 10 seconds old"); | 
| - | 
| -      backupFile.lastModifiedTime -= 40*60*60*1000; | 
| -      oldModifiedTime = backupFile.lastModifiedTime; | 
| -      saveFilters(null, callback4); | 
| -    } | 
| - | 
| -    function callback4() | 
| -    { | 
| -      backupFile = backupFile.clone();  // File parameters are cached, clone to prevent this | 
| -      notEqual(backupFile.lastModifiedTime, oldModifiedTime, "Backup overwritten if it is 40 hours old"); | 
| - | 
| -      backupFile2 = backupFile2.clone();  // File parameters are cached, clone to prevent this | 
| -      ok(backupFile2.exists(), "Second backup created when first backup is overwritten"); | 
| - | 
| -      backupFile.lastModifiedTime -= 20000; | 
| -      oldModifiedTime = backupFile2.lastModifiedTime; | 
| -      saveFilters(null, callback5); | 
| -    } | 
| - | 
| -    function callback5() | 
| -    { | 
| -      backupFile2 = backupFile2.clone();  // File parameters are cached, clone to prevent this | 
| -      equal(backupFile2.lastModifiedTime, oldModifiedTime, "Second backup not overwritten if first one is only 20 seconds old"); | 
| - | 
| -      backupFile.lastModifiedTime -= 25*60*60*1000; | 
| -      oldModifiedTime = backupFile2.lastModifiedTime; | 
| -      saveFilters(null, callback6); | 
| -    } | 
| - | 
| -    function callback6() | 
| -    { | 
| -      backupFile2 = backupFile2.clone();  // File parameters are cached, clone to prevent this | 
| -      notEqual(backupFile2.lastModifiedTime, oldModifiedTime, "Second backup overwritten if first one is 25 hours old"); | 
| - | 
| -      ok(!backupFile3.exists(), "Third backup not created with patternsbackups = 2"); | 
| - | 
| -      try | 
| -      { | 
| -        tempFile.remove(false); | 
| -      } catch (e) {} | 
| -      try | 
| -      { | 
| -        backupFile.remove(false); | 
| -      } catch (e) {} | 
| -      try | 
| -      { | 
| -        backupFile2.remove(false); | 
| -      } catch (e) {} | 
| -      try | 
| -      { | 
| -        backupFile3.remove(false); | 
| -      } catch (e) {} | 
| - | 
| -      start(); | 
| -    } | 
| -  }); | 
| -})(); | 
|  |