|
1 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim:set ts=2 sw=2 sts=2 et: */ |
|
3 |
|
4 Components.utils.import("resource://gre/modules/Services.jsm"); |
|
5 Components.utils.import("resource://gre/modules/NetUtil.jsm"); |
|
6 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); |
|
7 Components.utils.import("resource://gre/modules/FileUtils.jsm"); |
|
8 Components.utils.import("resource://gre/modules/Promise.jsm"); |
|
9 Components.utils.import("resource://testing-common/AppInfo.jsm"); |
|
10 |
|
11 const BROWSER_SEARCH_PREF = "browser.search."; |
|
12 const NS_APP_SEARCH_DIR = "SrchPlugns"; |
|
13 |
|
14 const MODE_RDONLY = FileUtils.MODE_RDONLY; |
|
15 const MODE_WRONLY = FileUtils.MODE_WRONLY; |
|
16 const MODE_CREATE = FileUtils.MODE_CREATE; |
|
17 const MODE_TRUNCATE = FileUtils.MODE_TRUNCATE; |
|
18 |
|
19 // Need to create and register a profile folder. |
|
20 var gProfD = do_get_profile(); |
|
21 |
|
22 function dumpn(text) |
|
23 { |
|
24 dump("search test: " + text + "\n"); |
|
25 } |
|
26 |
|
27 /** |
|
28 * Clean the profile of any metadata files left from a previous run. |
|
29 */ |
|
30 function removeMetadata() |
|
31 { |
|
32 let file = gProfD.clone(); |
|
33 file.append("search-metadata.json"); |
|
34 if (file.exists()) { |
|
35 file.remove(false); |
|
36 } |
|
37 |
|
38 file = gProfD.clone(); |
|
39 file.append("search.sqlite"); |
|
40 if (file.exists()) { |
|
41 file.remove(false); |
|
42 } |
|
43 } |
|
44 |
|
45 function removeCacheFile() |
|
46 { |
|
47 let file = gProfD.clone(); |
|
48 file.append("search.json"); |
|
49 if (file.exists()) { |
|
50 file.remove(false); |
|
51 } |
|
52 } |
|
53 |
|
54 /** |
|
55 * Clean the profile of any cache file left from a previous run. |
|
56 */ |
|
57 function removeCache() |
|
58 { |
|
59 let file = gProfD.clone(); |
|
60 file.append("search.json"); |
|
61 if (file.exists()) { |
|
62 file.remove(false); |
|
63 } |
|
64 |
|
65 } |
|
66 |
|
67 /** |
|
68 * Run some callback once metadata has been committed to disk. |
|
69 */ |
|
70 function afterCommit(callback) |
|
71 { |
|
72 let obs = function(result, topic, verb) { |
|
73 if (verb == "write-metadata-to-disk-complete") { |
|
74 Services.obs.removeObserver(obs, topic); |
|
75 callback(result); |
|
76 } else { |
|
77 dump("TOPIC: " + topic+ "\n"); |
|
78 } |
|
79 } |
|
80 Services.obs.addObserver(obs, "browser-search-service", false); |
|
81 } |
|
82 |
|
83 /** |
|
84 * Run some callback once cache has been built. |
|
85 */ |
|
86 function afterCache(callback) |
|
87 { |
|
88 let obs = function(result, topic, verb) { |
|
89 do_print("afterCache: " + verb); |
|
90 if (verb == "write-cache-to-disk-complete") { |
|
91 Services.obs.removeObserver(obs, topic); |
|
92 callback(result); |
|
93 } else { |
|
94 dump("TOPIC: " + topic+ "\n"); |
|
95 } |
|
96 } |
|
97 Services.obs.addObserver(obs, "browser-search-service", false); |
|
98 } |
|
99 |
|
100 function parseJsonFromStream(aInputStream) { |
|
101 const json = Cc["@mozilla.org/dom/json;1"].createInstance(Components.interfaces.nsIJSON); |
|
102 const data = json.decodeFromStream(aInputStream, aInputStream.available()); |
|
103 return data; |
|
104 } |
|
105 |
|
106 /** |
|
107 * Read a JSON file and return the JS object |
|
108 */ |
|
109 function readJSONFile(aFile) { |
|
110 let stream = Cc["@mozilla.org/network/file-input-stream;1"]. |
|
111 createInstance(Ci.nsIFileInputStream); |
|
112 try { |
|
113 stream.init(aFile, MODE_RDONLY, FileUtils.PERMS_FILE, 0); |
|
114 return parseJsonFromStream(stream, stream.available()); |
|
115 } catch(ex) { |
|
116 dumpn("readJSONFile: Error reading JSON file: " + ex); |
|
117 } finally { |
|
118 stream.close(); |
|
119 } |
|
120 return false; |
|
121 } |
|
122 |
|
123 /** |
|
124 * Recursively compare two objects and check that every property of expectedObj has the same value |
|
125 * on actualObj. |
|
126 */ |
|
127 function isSubObjectOf(expectedObj, actualObj) { |
|
128 for (let prop in expectedObj) { |
|
129 if (expectedObj[prop] instanceof Object) { |
|
130 do_check_eq(expectedObj[prop].length, actualObj[prop].length); |
|
131 isSubObjectOf(expectedObj[prop], actualObj[prop]); |
|
132 } else { |
|
133 do_check_eq(expectedObj[prop], actualObj[prop]); |
|
134 } |
|
135 } |
|
136 } |
|
137 |
|
138 // Expand the amount of information available in error logs |
|
139 Services.prefs.setBoolPref("browser.search.log", true); |
|
140 |