Files
palemoon27/toolkit/components/search/tests/xpcshell/test_location_sync.js
T

102 lines
3.4 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
function getCountryCodePref() {
try {
return Services.prefs.getCharPref("browser.search.countryCode");
} catch (_) {
return undefined;
}
}
function getIsUSPref() {
try {
return Services.prefs.getBoolPref("browser.search.isUS");
} catch (_) {
return undefined;
}
}
// A console listener so we can listen for a log message from nsSearchService.
function promiseTimezoneMessage() {
return new Promise(resolve => {
let listener = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIConsoleListener]),
observe : function (msg) {
if (msg.message.startsWith("getIsUS() fell back to a timezone check with the result=")) {
Services.console.unregisterListener(listener);
resolve(msg);
}
}
};
Services.console.registerListener(listener);
});
}
function run_test() {
installTestEngine();
run_next_test();
}
// Force a sync init and ensure the right thing happens (ie, that no xhr
// request is made and we fall back to the timezone-only trick)
add_task(function* test_simple() {
deepEqual(getCountryCodePref(), undefined, "no countryCode pref");
deepEqual(getIsUSPref(), undefined, "no isUS pref");
// Still set a geoip pref so we can (indirectly) check it wasn't used.
Services.prefs.setCharPref("browser.search.geoip.url", 'data:application/json,{"country_code": "AU"}');
ok(!Services.search.isInitialized);
// setup a console listener for the timezone fallback message.
let promiseTzMessage = promiseTimezoneMessage();
// fetching the engines forces a sync init, and should have caused us to
// check the timezone.
let engines = Services.search.getEngines();
ok(Services.search.isInitialized);
// a little wait to check we didn't do the xhr thang.
yield new Promise(resolve => {
do_timeout(500, resolve);
});
let msg = yield promiseTzMessage;
print("Timezone message:", msg.message);
ok(msg.message.endsWith(isUSTimezone().toString()), "fell back to timezone and it matches our timezone");
deepEqual(getCountryCodePref(), undefined, "didn't do the geoip xhr");
// and no telemetry evidence of geoip.
for (let hid of [
"SEARCH_SERVICE_COUNTRY_FETCH_RESULT",
"SEARCH_SERVICE_COUNTRY_FETCH_TIME_MS",
"SEARCH_SERVICE_COUNTRY_TIMEOUT",
"SEARCH_SERVICE_US_COUNTRY_MISMATCHED_TIMEZONE",
"SEARCH_SERVICE_US_TIMEZONE_MISMATCHED_COUNTRY",
"SEARCH_SERVICE_COUNTRY_FETCH_CAUSED_SYNC_INIT",
]) {
let histogram = Services.telemetry.getHistogramById(hid);
let snapshot = histogram.snapshot();
equal(snapshot.sum, 0, hid);
switch (snapshot.histogram_type) {
case Ci.nsITelemetry.HISTOGRAM_FLAG:
// flags are a special case in that they are initialized with a default
// of one |0|.
deepEqual(snapshot.counts, [1,0,0], hid);
break;
case Ci.nsITelemetry.HISTOGRAM_BOOLEAN:
// booleans aren't initialized at all, so should have all zeros.
deepEqual(snapshot.counts, [0,0,0], hid);
break;
case Ci.nsITelemetry.HISTOGRAM_EXPONENTIAL:
case Ci.nsITelemetry.HISTOGRAM_LINEAR:
equal(snapshot.counts.reduce((a, b) => a+b), 0, hid);
break;
default:
ok(false, "unknown histogram type " + snapshot.histogram_type + " for " + hid);
}
}
});