1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/sync/tests/unit/test_bookmark_livemarks.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,143 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +Cu.import("resource://gre/modules/Log.jsm"); 1.8 +Cu.import("resource://services-sync/record.js"); 1.9 +Cu.import("resource://services-sync/engines.js"); 1.10 +Cu.import("resource://services-sync/engines/bookmarks.js"); 1.11 +Cu.import("resource://services-sync/util.js"); 1.12 +Cu.import("resource://services-sync/service.js"); 1.13 +Cu.import("resource://gre/modules/PlacesUtils.jsm"); 1.14 +Cu.import("resource://testing-common/services-common/utils.js"); 1.15 + 1.16 +const DESCRIPTION_ANNO = "bookmarkProperties/description"; 1.17 + 1.18 +let engine = Service.engineManager.get("bookmarks"); 1.19 +let store = engine._store; 1.20 + 1.21 +// Record borrowed from Bug 631361. 1.22 +let record631361 = { 1.23 + id: "M5bwUKK8hPyF", 1.24 + index: 150, 1.25 + modified: 1296768176.49, 1.26 + payload: 1.27 + {"id":"M5bwUKK8hPyF", 1.28 + "type":"livemark", 1.29 + "siteUri":"http://www.bbc.co.uk/go/rss/int/news/-/news/", 1.30 + "feedUri":"http://fxfeeds.mozilla.com/en-US/firefox/headlines.xml", 1.31 + "parentName":"Bookmarks Toolbar", 1.32 + "parentid":"toolbar", 1.33 + "title":"Latest Headlines", 1.34 + "description":"", 1.35 + "children": 1.36 + ["7oBdEZB-8BMO", "SUd1wktMNCTB", "eZe4QWzo1BcY", "YNBhGwhVnQsN", 1.37 + "92Aw2SMEkFg0", "uw0uKqrVFwd-", "x7mx2P3--8FJ", "d-jVF8UuC9Ye", 1.38 + "DV1XVtKLEiZ5", "g4mTaTjr837Z", "1Zi5W3lwBw8T", "FEYqlUHtbBWS", 1.39 + "qQd2u7LjosCB", "VUs2djqYfbvn", "KuhYnHocu7eg", "u2gcg9ILRg-3", 1.40 + "hfK_RP-EC7Ol", "Aq5qsa4E5msH", "6pZIbxuJTn-K", "k_fp0iN3yYMR", 1.41 + "59YD3iNOYO8O", "01afpSdAk2iz", "Cq-kjXDEPIoP", "HtNTjt9UwWWg", 1.42 + "IOU8QRSrTR--", "HJ5lSlBx6d1D", "j2dz5R5U6Khc", "5GvEjrNR0yJl", 1.43 + "67ozIBF5pNVP", "r5YB0cUx6C_w", "FtmFDBNxDQ6J", "BTACeZq9eEtw", 1.44 + "ll4ozQ-_VNJe", "HpImsA4_XuW7", "nJvCUQPLSXwA", "94LG-lh6TUYe", 1.45 + "WHn_QoOL94Os", "l-RvjgsZYlej", "LipQ8abcRstN", "74TiLvarE3n_", 1.46 + "8fCiLQpQGK1P", "Z6h4WkbwfQFa", "GgAzhqakoS6g", "qyt92T8vpMsK", 1.47 + "RyOgVCe2EAOE", "bgSEhW3w6kk5", "hWODjHKGD7Ph", "Cky673aqOHbT", 1.48 + "gZCYT7nx3Nwu", "iJzaJxxrM58L", "rUHCRv68aY5L", "6Jc1hNJiVrV9", 1.49 + "lmNgoayZ-ym8", "R1lyXsDzlfOd", "pinrXwDnRk6g", "Sn7TmZV01vMM", 1.50 + "qoXyU6tcS1dd", "TRLanED-QfBK", "xHbhMeX_FYEA", "aPqacdRlAtaW", 1.51 + "E3H04Wn2RfSi", "eaSIMI6kSrcz", "rtkRxFoG5Vqi", "dectkUglV0Dz", 1.52 + "B4vUE0BE15No", "qgQFW5AQrgB0", "SxAXvwOhu8Zi", "0S6cRPOg-5Z2", 1.53 + "zcZZBGeLnaWW", "B0at8hkQqVZQ", "sgPtgGulbP66", "lwtwGHSCPYaQ", 1.54 + "mNTdpgoRZMbW", "-L8Vci6CbkJY", "bVzudKSQERc1", "Gxl9lb4DXsmL", 1.55 + "3Qr13GucOtEh"]}, 1.56 + collection: "bookmarks" 1.57 +}; 1.58 + 1.59 +// Clean up after other tests. Only necessary in XULRunner. 1.60 +store.wipe(); 1.61 + 1.62 +function makeLivemark(p, mintGUID) { 1.63 + let b = new Livemark("bookmarks", p.id); 1.64 + // Copy here, because tests mutate the contents. 1.65 + b.cleartext = TestingUtils.deepCopy(p); 1.66 + 1.67 + if (mintGUID) 1.68 + b.id = Utils.makeGUID(); 1.69 + 1.70 + return b; 1.71 +} 1.72 + 1.73 + 1.74 +function run_test() { 1.75 + initTestLogging("Trace"); 1.76 + Log.repository.getLogger("Sync.Engine.Bookmarks").level = Log.Level.Trace; 1.77 + Log.repository.getLogger("Sync.Store.Bookmarks").level = Log.Level.Trace; 1.78 + 1.79 + run_next_test(); 1.80 +} 1.81 + 1.82 +add_test(function test_livemark_descriptions() { 1.83 + let record = record631361.payload; 1.84 + 1.85 + function doRecord(r) { 1.86 + store._childrenToOrder = {}; 1.87 + store.applyIncoming(r); 1.88 + store._orderChildren(); 1.89 + delete store._childrenToOrder; 1.90 + } 1.91 + 1.92 + // Attempt to provoke an error by messing around with the description. 1.93 + record.description = null; 1.94 + doRecord(makeLivemark(record)); 1.95 + record.description = ""; 1.96 + doRecord(makeLivemark(record)); 1.97 + 1.98 + // Attempt to provoke an error by adding a bad description anno. 1.99 + let id = store.idForGUID(record.id); 1.100 + PlacesUtils.annotations.setItemAnnotation(id, DESCRIPTION_ANNO, "", 0, 1.101 + PlacesUtils.annotations.EXPIRE_NEVER); 1.102 + 1.103 + run_next_test(); 1.104 +}); 1.105 + 1.106 +add_test(function test_livemark_invalid() { 1.107 + _("Livemarks considered invalid by nsLivemarkService are skipped."); 1.108 + 1.109 + _("Parent is 0, which is invalid. Will be set to unfiled."); 1.110 + let noParentRec = makeLivemark(record631361.payload, true); 1.111 + noParentRec._parent = 0; 1.112 + store.create(noParentRec); 1.113 + let recID = store.idForGUID(noParentRec.id, true); 1.114 + do_check_true(recID > 0); 1.115 + do_check_eq(PlacesUtils.bookmarks.getFolderIdForItem(recID), PlacesUtils.bookmarks.unfiledBookmarksFolder); 1.116 + 1.117 + _("Parent is unknown. Will be set to unfiled."); 1.118 + let lateParentRec = makeLivemark(record631361.payload, true); 1.119 + let parentGUID = Utils.makeGUID(); 1.120 + lateParentRec.parentid = parentGUID; 1.121 + lateParentRec._parent = store.idForGUID(parentGUID); // Usually done by applyIncoming. 1.122 + do_check_eq(-1, lateParentRec._parent); 1.123 + 1.124 + store.create(lateParentRec); 1.125 + recID = store.idForGUID(lateParentRec.id, true); 1.126 + do_check_true(recID > 0); 1.127 + do_check_eq(PlacesUtils.bookmarks.getFolderIdForItem(recID), 1.128 + PlacesUtils.bookmarks.unfiledBookmarksFolder); 1.129 + 1.130 + _("No feed URI, which is invalid. Will be skipped."); 1.131 + let noFeedURIRec = makeLivemark(record631361.payload, true); 1.132 + delete noFeedURIRec.cleartext.feedUri; 1.133 + store.create(noFeedURIRec); 1.134 + // No exception, but no creation occurs. 1.135 + do_check_eq(-1, store.idForGUID(noFeedURIRec.id, true)); 1.136 + 1.137 + _("Parent is a Livemark. Will be skipped."); 1.138 + let lmParentRec = makeLivemark(record631361.payload, true); 1.139 + lmParentRec._parent = recID; 1.140 + store.create(lmParentRec); 1.141 + // No exception, but no creation occurs. 1.142 + do_check_eq(-1, store.idForGUID(lmParentRec.id, true)); 1.143 + 1.144 + // Clear event loop. 1.145 + Utils.nextTick(run_next_test); 1.146 +});