toolkit/components/places/tests/unit/test_bookmarks_json.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/toolkit/components/places/tests/unit/test_bookmarks_json.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,214 @@
     1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.7 +
     1.8 +Cu.import("resource://gre/modules/BookmarkJSONUtils.jsm");
     1.9 +
    1.10 +function run_test() {
    1.11 +  run_next_test();
    1.12 +}
    1.13 +
    1.14 +const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
    1.15 +const DESCRIPTION_ANNO = "bookmarkProperties/description";
    1.16 +
    1.17 +// An object representing the contents of bookmarks.json.
    1.18 +let test_bookmarks = {
    1.19 +  menu: [
    1.20 +    { title: "Mozilla Firefox",
    1.21 +      children: [
    1.22 +        { title: "Help and Tutorials",
    1.23 +          url: "http://en-us.www.mozilla.com/en-US/firefox/help/",
    1.24 +          icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg=="
    1.25 +        },
    1.26 +        { title: "Customize Firefox",
    1.27 +          url: "http://en-us.www.mozilla.com/en-US/firefox/customize/",
    1.28 +          icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg=="
    1.29 +        },
    1.30 +        { title: "Get Involved",
    1.31 +          url: "http://en-us.www.mozilla.com/en-US/firefox/community/",
    1.32 +          icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg=="
    1.33 +        },
    1.34 +        { title: "About Us",
    1.35 +          url: "http://en-us.www.mozilla.com/en-US/about/",
    1.36 +          icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg=="
    1.37 +        }
    1.38 +      ]
    1.39 +    },
    1.40 +    {
    1.41 +      type: Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR
    1.42 +    },
    1.43 +    { title: "test",
    1.44 +      description: "folder test comment",
    1.45 +      dateAdded: 1177541020000000,
    1.46 +      //lastModified: 1177541050000000,
    1.47 +      children: [
    1.48 +        { title: "test post keyword",
    1.49 +          description: "item description",
    1.50 +          dateAdded: 1177375336000000,
    1.51 +          //lastModified: 1177375423000000,
    1.52 +          keyword: "test",
    1.53 +          sidebar: true,
    1.54 +          postData: "hidden1%3Dbar&text1%3D%25s",
    1.55 +          charset: "ISO-8859-1"
    1.56 +        }
    1.57 +      ]
    1.58 +    }
    1.59 +  ],
    1.60 +  toolbar: [
    1.61 +    { title: "Getting Started",
    1.62 +      url: "http://en-us.www.mozilla.com/en-US/firefox/central/",
    1.63 +      icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg=="
    1.64 +    },
    1.65 +    { title: "Latest Headlines",
    1.66 +      url: "http://en-us.fxfeeds.mozilla.com/en-US/firefox/livebookmarks/",
    1.67 +      feedUrl: "http://en-us.fxfeeds.mozilla.com/en-US/firefox/headlines.xml"
    1.68 +    }
    1.69 +  ],
    1.70 +  unfiled: [
    1.71 +    { title: "Example.tld",
    1.72 +      url: "http://example.tld/"
    1.73 +    }
    1.74 +  ]
    1.75 +};
    1.76 +
    1.77 +// Exported bookmarks file pointer.
    1.78 +let bookmarksExportedFile;
    1.79 +
    1.80 +add_task(function test_import_bookmarks() {
    1.81 +  let bookmarksFile = OS.Path.join(do_get_cwd().path, "bookmarks.json");
    1.82 +
    1.83 +  yield BookmarkJSONUtils.importFromFile(bookmarksFile, true);
    1.84 +  yield testImportedBookmarks();
    1.85 +});
    1.86 +
    1.87 +add_task(function test_export_bookmarks() {
    1.88 +  bookmarksExportedFile = OS.Path.join(OS.Constants.Path.profileDir,
    1.89 +                                       "bookmarks.exported.json");
    1.90 +  yield BookmarkJSONUtils.exportToFile(bookmarksExportedFile);
    1.91 +});
    1.92 +
    1.93 +add_task(function test_import_exported_bookmarks() {
    1.94 +  remove_all_bookmarks();
    1.95 +  yield BookmarkJSONUtils.importFromFile(bookmarksExportedFile, true);
    1.96 +  yield testImportedBookmarks();
    1.97 +});
    1.98 +
    1.99 +add_task(function test_import_ontop() {
   1.100 +  remove_all_bookmarks();
   1.101 +  yield BookmarkJSONUtils.importFromFile(bookmarksExportedFile, true);
   1.102 +  yield BookmarkJSONUtils.exportToFile(bookmarksExportedFile);
   1.103 +  yield BookmarkJSONUtils.importFromFile(bookmarksExportedFile, true);
   1.104 +  yield testImportedBookmarks();
   1.105 +});
   1.106 +
   1.107 +add_task(function test_clean() {
   1.108 +  remove_all_bookmarks();
   1.109 +});
   1.110 +
   1.111 +function testImportedBookmarks() {
   1.112 +  for (let group in test_bookmarks) {
   1.113 +    do_print("[testImportedBookmarks()] Checking group '" + group + "'");
   1.114 +
   1.115 +    let root;
   1.116 +    switch (group) {
   1.117 +      case "menu":
   1.118 +        root =
   1.119 +          PlacesUtils.getFolderContents(PlacesUtils.bookmarksMenuFolderId).root;
   1.120 +        break;
   1.121 +      case "toolbar":
   1.122 +        root =
   1.123 +          PlacesUtils.getFolderContents(PlacesUtils.toolbarFolderId).root;
   1.124 +        break;
   1.125 +      case "unfiled":
   1.126 +        root =
   1.127 +          PlacesUtils.getFolderContents(PlacesUtils.unfiledBookmarksFolderId).root;
   1.128 +        break;
   1.129 +    }
   1.130 +
   1.131 +    let items = test_bookmarks[group];
   1.132 +    do_check_eq(root.childCount, items.length);
   1.133 +
   1.134 +    for (let key in items) {
   1.135 +      yield checkItem(items[key], root.getChild(key));
   1.136 +    }
   1.137 +
   1.138 +    root.containerOpen = false;
   1.139 +  }
   1.140 +}
   1.141 +
   1.142 +function checkItem(aExpected, aNode) {
   1.143 +  let id = aNode.itemId;
   1.144 +
   1.145 +  return Task.spawn(function() {
   1.146 +    for (prop in aExpected) {
   1.147 +      switch (prop) {
   1.148 +        case "type":
   1.149 +          do_check_eq(aNode.type, aExpected.type);
   1.150 +          break;
   1.151 +        case "title":
   1.152 +          do_check_eq(aNode.title, aExpected.title);
   1.153 +          break;
   1.154 +        case "description":
   1.155 +          do_check_eq(PlacesUtils.annotations.getItemAnnotation(
   1.156 +                      id, DESCRIPTION_ANNO), aExpected.description);
   1.157 +          break;
   1.158 +        case "dateAdded":
   1.159 +          do_check_eq(PlacesUtils.bookmarks.getItemDateAdded(id),
   1.160 +                      aExpected.dateAdded);
   1.161 +          break;
   1.162 +        case "lastModified":
   1.163 +          do_check_eq(PlacesUtils.bookmarks.getItemLastModified(id),
   1.164 +                      aExpected.lastModified);
   1.165 +          break;
   1.166 +        case "url":
   1.167 +          if (!("feedUrl" in aExpected))
   1.168 +            do_check_eq(aNode.uri, aExpected.url);
   1.169 +          break;
   1.170 +        case "icon":
   1.171 +          let (deferred = Promise.defer(), data) {
   1.172 +            PlacesUtils.favicons.getFaviconDataForPage(
   1.173 +              NetUtil.newURI(aExpected.url),
   1.174 +              function (aURI, aDataLen, aData, aMimeType) {
   1.175 +                deferred.resolve(aData);
   1.176 +              });
   1.177 +            data = yield deferred.promise;
   1.178 +            let base64Icon = "data:image/png;base64," +
   1.179 +                             base64EncodeString(String.fromCharCode.apply(String, data));
   1.180 +            do_check_true(base64Icon == aExpected.icon);
   1.181 +          }
   1.182 +          break;
   1.183 +        case "keyword":
   1.184 +          break;
   1.185 +        case "sidebar":
   1.186 +          do_check_eq(PlacesUtils.annotations.itemHasAnnotation(
   1.187 +                      id, LOAD_IN_SIDEBAR_ANNO), aExpected.sidebar);
   1.188 +          break;
   1.189 +        case "postData":
   1.190 +          do_check_eq(PlacesUtils.annotations.getItemAnnotation(
   1.191 +                      id, PlacesUtils.POST_DATA_ANNO), aExpected.postData);
   1.192 +          break;
   1.193 +        case "charset":
   1.194 +          let testURI = NetUtil.newURI(aNode.uri);
   1.195 +          do_check_eq((yield PlacesUtils.getCharsetForURI(testURI)), aExpected.charset);
   1.196 +          break;
   1.197 +        case "feedUrl":
   1.198 +          let livemark = yield PlacesUtils.livemarks.getLivemark({ id: id });
   1.199 +          do_check_eq(livemark.siteURI.spec, aExpected.url);
   1.200 +          do_check_eq(livemark.feedURI.spec, aExpected.feedUrl);
   1.201 +          break;
   1.202 +        case "children":
   1.203 +          let folder = aNode.QueryInterface(Ci.nsINavHistoryContainerResultNode);
   1.204 +          do_check_eq(folder.hasChildren, aExpected.children.length > 0);
   1.205 +          folder.containerOpen = true;
   1.206 +          do_check_eq(folder.childCount, aExpected.children.length);
   1.207 +
   1.208 +          aExpected.children.forEach(function (item, index) checkItem(item, folder.getChild(index)));
   1.209 +
   1.210 +          folder.containerOpen = false;
   1.211 +          break;
   1.212 +        default:
   1.213 +          throw new Error("Unknown property");
   1.214 +      }
   1.215 +    }
   1.216 +  });
   1.217 +}

mercurial