1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/search/tests/xpcshell/head_search.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,140 @@ 1.4 +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim:set ts=2 sw=2 sts=2 et: */ 1.6 + 1.7 +Components.utils.import("resource://gre/modules/Services.jsm"); 1.8 +Components.utils.import("resource://gre/modules/NetUtil.jsm"); 1.9 +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); 1.10 +Components.utils.import("resource://gre/modules/FileUtils.jsm"); 1.11 +Components.utils.import("resource://gre/modules/Promise.jsm"); 1.12 +Components.utils.import("resource://testing-common/AppInfo.jsm"); 1.13 + 1.14 +const BROWSER_SEARCH_PREF = "browser.search."; 1.15 +const NS_APP_SEARCH_DIR = "SrchPlugns"; 1.16 + 1.17 +const MODE_RDONLY = FileUtils.MODE_RDONLY; 1.18 +const MODE_WRONLY = FileUtils.MODE_WRONLY; 1.19 +const MODE_CREATE = FileUtils.MODE_CREATE; 1.20 +const MODE_TRUNCATE = FileUtils.MODE_TRUNCATE; 1.21 + 1.22 +// Need to create and register a profile folder. 1.23 +var gProfD = do_get_profile(); 1.24 + 1.25 +function dumpn(text) 1.26 +{ 1.27 + dump("search test: " + text + "\n"); 1.28 +} 1.29 + 1.30 +/** 1.31 + * Clean the profile of any metadata files left from a previous run. 1.32 + */ 1.33 +function removeMetadata() 1.34 +{ 1.35 + let file = gProfD.clone(); 1.36 + file.append("search-metadata.json"); 1.37 + if (file.exists()) { 1.38 + file.remove(false); 1.39 + } 1.40 + 1.41 + file = gProfD.clone(); 1.42 + file.append("search.sqlite"); 1.43 + if (file.exists()) { 1.44 + file.remove(false); 1.45 + } 1.46 +} 1.47 + 1.48 +function removeCacheFile() 1.49 +{ 1.50 + let file = gProfD.clone(); 1.51 + file.append("search.json"); 1.52 + if (file.exists()) { 1.53 + file.remove(false); 1.54 + } 1.55 +} 1.56 + 1.57 +/** 1.58 + * Clean the profile of any cache file left from a previous run. 1.59 + */ 1.60 +function removeCache() 1.61 +{ 1.62 + let file = gProfD.clone(); 1.63 + file.append("search.json"); 1.64 + if (file.exists()) { 1.65 + file.remove(false); 1.66 + } 1.67 + 1.68 +} 1.69 + 1.70 +/** 1.71 + * Run some callback once metadata has been committed to disk. 1.72 + */ 1.73 +function afterCommit(callback) 1.74 +{ 1.75 + let obs = function(result, topic, verb) { 1.76 + if (verb == "write-metadata-to-disk-complete") { 1.77 + Services.obs.removeObserver(obs, topic); 1.78 + callback(result); 1.79 + } else { 1.80 + dump("TOPIC: " + topic+ "\n"); 1.81 + } 1.82 + } 1.83 + Services.obs.addObserver(obs, "browser-search-service", false); 1.84 +} 1.85 + 1.86 +/** 1.87 + * Run some callback once cache has been built. 1.88 + */ 1.89 +function afterCache(callback) 1.90 +{ 1.91 + let obs = function(result, topic, verb) { 1.92 + do_print("afterCache: " + verb); 1.93 + if (verb == "write-cache-to-disk-complete") { 1.94 + Services.obs.removeObserver(obs, topic); 1.95 + callback(result); 1.96 + } else { 1.97 + dump("TOPIC: " + topic+ "\n"); 1.98 + } 1.99 + } 1.100 + Services.obs.addObserver(obs, "browser-search-service", false); 1.101 +} 1.102 + 1.103 +function parseJsonFromStream(aInputStream) { 1.104 + const json = Cc["@mozilla.org/dom/json;1"].createInstance(Components.interfaces.nsIJSON); 1.105 + const data = json.decodeFromStream(aInputStream, aInputStream.available()); 1.106 + return data; 1.107 +} 1.108 + 1.109 +/** 1.110 + * Read a JSON file and return the JS object 1.111 + */ 1.112 +function readJSONFile(aFile) { 1.113 + let stream = Cc["@mozilla.org/network/file-input-stream;1"]. 1.114 + createInstance(Ci.nsIFileInputStream); 1.115 + try { 1.116 + stream.init(aFile, MODE_RDONLY, FileUtils.PERMS_FILE, 0); 1.117 + return parseJsonFromStream(stream, stream.available()); 1.118 + } catch(ex) { 1.119 + dumpn("readJSONFile: Error reading JSON file: " + ex); 1.120 + } finally { 1.121 + stream.close(); 1.122 + } 1.123 + return false; 1.124 +} 1.125 + 1.126 +/** 1.127 + * Recursively compare two objects and check that every property of expectedObj has the same value 1.128 + * on actualObj. 1.129 + */ 1.130 +function isSubObjectOf(expectedObj, actualObj) { 1.131 + for (let prop in expectedObj) { 1.132 + if (expectedObj[prop] instanceof Object) { 1.133 + do_check_eq(expectedObj[prop].length, actualObj[prop].length); 1.134 + isSubObjectOf(expectedObj[prop], actualObj[prop]); 1.135 + } else { 1.136 + do_check_eq(expectedObj[prop], actualObj[prop]); 1.137 + } 1.138 + } 1.139 +} 1.140 + 1.141 +// Expand the amount of information available in error logs 1.142 +Services.prefs.setBoolPref("browser.search.log", true); 1.143 +