1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/healthreport/tests/xpcshell/test_provider_searches.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,184 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +"use strict"; 1.8 + 1.9 +const {utils: Cu} = Components; 1.10 + 1.11 +Cu.import("resource://gre/modules/Metrics.jsm"); 1.12 +Cu.import("resource://gre/modules/Services.jsm"); 1.13 +let bsp = Cu.import("resource://gre/modules/services/healthreport/providers.jsm"); 1.14 + 1.15 +const DEFAULT_ENGINES = [ 1.16 + {name: "Amazon.com", identifier: "amazondotcom"}, 1.17 + {name: "Bing", identifier: "bing"}, 1.18 + {name: "Google", identifier: "google"}, 1.19 + {name: "Yahoo", identifier: "yahoo"}, 1.20 + {name: "Foobar Search", identifier: "foobar"}, 1.21 +]; 1.22 + 1.23 +function MockSearchCountMeasurement() { 1.24 + bsp.SearchCountMeasurement3.call(this); 1.25 +} 1.26 +MockSearchCountMeasurement.prototype = { 1.27 + __proto__: bsp.SearchCountMeasurement3.prototype, 1.28 +}; 1.29 + 1.30 +function MockSearchesProvider() { 1.31 + SearchesProvider.call(this); 1.32 +} 1.33 +MockSearchesProvider.prototype = { 1.34 + __proto__: SearchesProvider.prototype, 1.35 + measurementTypes: [MockSearchCountMeasurement], 1.36 +}; 1.37 + 1.38 +function run_test() { 1.39 + run_next_test(); 1.40 +} 1.41 + 1.42 +add_test(function test_constructor() { 1.43 + let provider = new SearchesProvider(); 1.44 + 1.45 + run_next_test(); 1.46 +}); 1.47 + 1.48 +add_task(function* test_record() { 1.49 + let storage = yield Metrics.Storage("record"); 1.50 + let provider = new MockSearchesProvider(); 1.51 + 1.52 + yield provider.init(storage); 1.53 + 1.54 + let now = new Date(); 1.55 + 1.56 + // Record searches for all but one of our defaults, and one engine that's 1.57 + // not a default. 1.58 + for (let engine of DEFAULT_ENGINES.concat([{name: "Not Default", identifier: "notdef"}])) { 1.59 + if (engine.identifier == "yahoo") { 1.60 + continue; 1.61 + } 1.62 + yield provider.recordSearch(engine, "abouthome"); 1.63 + yield provider.recordSearch(engine, "contextmenu"); 1.64 + yield provider.recordSearch(engine, "newtab"); 1.65 + yield provider.recordSearch(engine, "searchbar"); 1.66 + yield provider.recordSearch(engine, "urlbar"); 1.67 + } 1.68 + 1.69 + // Invalid sources should throw. 1.70 + let errored = false; 1.71 + try { 1.72 + yield provider.recordSearch(DEFAULT_ENGINES[0], "bad source"); 1.73 + } catch (ex) { 1.74 + errored = true; 1.75 + } finally { 1.76 + do_check_true(errored); 1.77 + } 1.78 + 1.79 + let m = provider.getMeasurement("counts", 3); 1.80 + let data = yield m.getValues(); 1.81 + do_check_eq(data.days.size, 1); 1.82 + do_check_true(data.days.hasDay(now)); 1.83 + 1.84 + let day = data.days.getDay(now); 1.85 + for (let engine of DEFAULT_ENGINES) { 1.86 + let identifier = engine.identifier; 1.87 + let expected = identifier != "yahoo"; 1.88 + 1.89 + for (let source of ["abouthome", "contextmenu", "searchbar", "urlbar"]) { 1.90 + let field = identifier + "." + source; 1.91 + if (expected) { 1.92 + do_check_true(day.has(field)); 1.93 + do_check_eq(day.get(field), 1); 1.94 + } else { 1.95 + do_check_false(day.has(field)); 1.96 + } 1.97 + } 1.98 + } 1.99 + 1.100 + // Also, check that our non-default engine contributed, with a computed 1.101 + // identifier. 1.102 + let identifier = "notdef"; 1.103 + for (let source of ["abouthome", "contextmenu", "searchbar", "urlbar"]) { 1.104 + let field = identifier + "." + source; 1.105 + do_check_true(day.has(field)); 1.106 + } 1.107 + 1.108 + yield storage.close(); 1.109 +}); 1.110 + 1.111 +add_task(function* test_includes_other_fields() { 1.112 + let storage = yield Metrics.Storage("includes_other_fields"); 1.113 + let provider = new MockSearchesProvider(); 1.114 + 1.115 + yield provider.init(storage); 1.116 + let m = provider.getMeasurement("counts", 3); 1.117 + 1.118 + // Register a search against a provider that isn't live in this session. 1.119 + let id = yield m.storage.registerField(m.id, "test.searchbar", 1.120 + Metrics.Storage.FIELD_DAILY_COUNTER); 1.121 + 1.122 + let testField = "test.searchbar"; 1.123 + let now = new Date(); 1.124 + yield m.storage.incrementDailyCounterFromFieldID(id, now); 1.125 + 1.126 + // Make sure we don't know about it. 1.127 + do_check_false(testField in m.fields); 1.128 + 1.129 + // But we want to include it in payloads. 1.130 + do_check_true(m.shouldIncludeField(testField)); 1.131 + 1.132 + // And we do so. 1.133 + let data = yield provider.storage.getMeasurementValues(m.id); 1.134 + let serializer = m.serializer(m.SERIALIZE_JSON); 1.135 + let formatted = serializer.daily(data.days.getDay(now)); 1.136 + do_check_true(testField in formatted); 1.137 + do_check_eq(formatted[testField], 1); 1.138 + 1.139 + yield storage.close(); 1.140 +}); 1.141 + 1.142 +add_task(function* test_default_search_engine() { 1.143 + let storage = yield Metrics.Storage("default_search_engine"); 1.144 + let provider = new SearchesProvider(); 1.145 + yield provider.init(storage); 1.146 + 1.147 + let m = provider.getMeasurement("engines", 1); 1.148 + 1.149 + // Ensure no collection if Telemetry not enabled. 1.150 + Services.prefs.setBoolPref("toolkit.telemetry.enabled", false); 1.151 + 1.152 + let now = new Date(); 1.153 + yield provider.collectDailyData(); 1.154 + 1.155 + let data = yield m.getValues(); 1.156 + Assert.equal(data.days.hasDay(now), false); 1.157 + 1.158 + // Now enable telemetry and ensure we populate. 1.159 + Services.prefs.setBoolPref("toolkit.telemetry.enabled", true); 1.160 + 1.161 + yield provider.collectDailyData(); 1.162 + data = yield m.getValues(); 1.163 + Assert.ok(data.days.hasDay(now)); 1.164 + 1.165 + let day = data.days.getDay(now); 1.166 + Assert.equal(day.size, 1); 1.167 + Assert.ok(day.has("default")); 1.168 + 1.169 + // test environment doesn't have a default engine. 1.170 + Assert.equal(day.get("default"), "NONE"); 1.171 + 1.172 + Services.search.addEngineWithDetails("testdefault", 1.173 + "http://localhost/icon.png", 1.174 + null, 1.175 + "test description", 1.176 + "GET", 1.177 + "http://localhost/search/%s"); 1.178 + let engine1 = Services.search.getEngineByName("testdefault"); 1.179 + Assert.ok(engine1); 1.180 + Services.search.defaultEngine = engine1; 1.181 + 1.182 + yield provider.collectDailyData(); 1.183 + data = yield m.getValues(); 1.184 + Assert.equal(data.days.getDay(now).get("default"), "other-testdefault"); 1.185 + 1.186 + yield storage.close(); 1.187 +});