summaryrefslogtreecommitdiffstats
path: root/toolkit/components/thumbnails/test/browser_thumbnails_storage_migrate3.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/thumbnails/test/browser_thumbnails_storage_migrate3.js')
-rw-r--r--toolkit/components/thumbnails/test/browser_thumbnails_storage_migrate3.js103
1 files changed, 103 insertions, 0 deletions
diff --git a/toolkit/components/thumbnails/test/browser_thumbnails_storage_migrate3.js b/toolkit/components/thumbnails/test/browser_thumbnails_storage_migrate3.js
new file mode 100644
index 0000000000..2ef6c006d8
--- /dev/null
+++ b/toolkit/components/thumbnails/test/browser_thumbnails_storage_migrate3.js
@@ -0,0 +1,103 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const URL = "http://mochi.test:8888/migration3";
+const URL2 = URL + "#2";
+const URL3 = URL + "#3";
+const THUMBNAIL_DIRECTORY = "thumbnails";
+const PREF_STORAGE_VERSION = "browser.pagethumbnails.storage_version";
+
+var tmp = Cu.Sandbox(window, { wantGlobalProperties: ["ChromeUtils"] });
+Services.scriptloader.loadSubScript(
+ "resource://gre/modules/PageThumbs.jsm",
+ tmp
+);
+var { PageThumbsStorageMigrator } = tmp;
+
+/**
+ * This test makes sure we correctly migrate to thumbnail storage version 3.
+ * This means copying existing thumbnails from the roaming to the local profile
+ * directory and should just apply to Linux.
+ */
+async function runTests() {
+ // Prepare a local profile directory.
+ let localProfile = await IOUtils.getDirectory(
+ PathUtils.join(PathUtils.profileDir, "local-test")
+ );
+ changeLocation("ProfLD", localProfile);
+
+ let roaming = await IOUtils.getDirectory(
+ PathUtils.join(PathUtils.profileDir, THUMBNAIL_DIRECTORY)
+ );
+
+ // Set up some data in the roaming profile.
+ let name = PageThumbsStorageService.getLeafNameForURL(URL);
+ let file = await IOUtils.getFile(
+ PathUtils.profileDir,
+ THUMBNAIL_DIRECTORY,
+ name
+ );
+ writeDummyFile(file);
+
+ name = PageThumbsStorageService.getLeafNameForURL(URL2);
+ file = await IOUtils.getFile(PathUtils.profileDir, THUMBNAIL_DIRECTORY, name);
+ writeDummyFile(file);
+
+ name = PageThumbsStorageService.getLeafNameForURL(URL3);
+ file = await IOUtils.getFile(PathUtils.profileDir, THUMBNAIL_DIRECTORY, name);
+ writeDummyFile(file);
+
+ // Pretend to have one of the thumbnails
+ // already in place at the new storage site.
+ name = PageThumbsStorageService.getLeafNameForURL(URL3);
+ file = await IOUtils.getFile(PathUtils.profileDir, THUMBNAIL_DIRECTORY, name);
+ writeDummyFile(file, "no-overwrite-plz");
+
+ // Kick off thumbnail storage migration.
+ PageThumbsStorageMigrator.migrateToVersion3(localProfile.path);
+ ok(true, "migration finished");
+
+ // Wait until the first thumbnail was moved to its new location.
+ await whenFileExists(URL);
+ ok(true, "first thumbnail moved");
+
+ // Wait for the second thumbnail to be moved as well.
+ await whenFileExists(URL2);
+ ok(true, "second thumbnail moved");
+
+ await whenFileRemoved(roaming);
+ ok(true, "roaming thumbnail directory removed");
+
+ // Check that our existing thumbnail wasn't overwritten.
+ is(
+ getFileContents(file),
+ "no-overwrite-plz",
+ "existing thumbnail was not overwritten"
+ );
+}
+
+function changeLocation(aLocation, aNewDir) {
+ let oldDir = Services.dirsvc.get(aLocation, Ci.nsIFile);
+ Services.dirsvc.undefine(aLocation);
+ Services.dirsvc.set(aLocation, aNewDir);
+
+ registerCleanupFunction(function () {
+ Services.dirsvc.undefine(aLocation);
+ Services.dirsvc.set(aLocation, oldDir);
+ });
+}
+
+function writeDummyFile(aFile, aContents) {
+ let fos = FileUtils.openSafeFileOutputStream(aFile);
+ let data = aContents || "dummy";
+ fos.write(data, data.length);
+ FileUtils.closeSafeFileOutputStream(fos);
+}
+
+function getFileContents(aFile) {
+ let istream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
+ Ci.nsIFileInputStream
+ );
+ istream.init(aFile, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, 0);
+ return NetUtil.readInputStreamToString(istream, istream.available());
+}