Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
/**
* Tests whether the suggestion count telemetry is correctly divided
* into {successful, aborted, failed}, and whether it is only recorded
* for app-provided search engines.
*/
"use strict";
const { SearchSuggestionController } = ChromeUtils.importESModule(
"resource://gre/modules/SearchSuggestionController.sys.mjs"
);
let openSearchEngine, workingAppEngine, failingAppEngine;
add_setup(async function () {
// Initialize Glean.
do_get_profile();
Services.fog.initializeFOG();
// Initialize sjs server early so we have access to gHttpURL.
let server = useHttpServer();
server.registerContentType("sjs", "sjs");
consoleAllowList = consoleAllowList.concat([
"SearchSuggestionController found an unexpected string value",
]);
SearchTestUtils.setRemoteSettingsConfig([
{
identifier: "workingAppEngine",
base: {
urls: {
suggestions: {
base: `${gHttpURL}/sjs/searchSuggestions.sjs`,
searchTermParamName: "q",
},
},
},
},
{
identifier: "failingAppEngine",
base: {
urls: {
suggestions: {
searchTermParamName: "q",
},
},
},
},
]);
await Services.search.init();
let openSearchEngineData = {
baseURL: `${gHttpURL}/sjs/`,
name: "GET suggestion engine",
method: "GET",
};
openSearchEngine = await SearchTestUtils.installOpenSearchEngine({
url: `${gHttpURL}/sjs/engineMaker.sjs?${JSON.stringify(openSearchEngineData)}`,
});
workingAppEngine = Services.search.getEngineById("workingAppEngine");
failingAppEngine = Services.search.getEngineById("failingAppEngine");
});
add_task(async function test_success() {
for (let i = 0; i < 5; i++) {
let controller = new SearchSuggestionController();
let result = await controller.fetch("mo", false, workingAppEngine);
Assert.equal(result.remote.length, 3);
}
Assert.equal(
Glean.searchSuggestions.successfulRequests.workingAppEngine.testGetValue(),
5,
"Successful request counter is correctly updated"
);
});
add_task(async function test_abort() {
let controller = new SearchSuggestionController();
// Don't await the result to trigger the abort handler.
controller.fetch("mo", false, workingAppEngine);
controller.fetch("mo", false, workingAppEngine);
controller.fetch("mo", false, workingAppEngine);
controller.fetch("mo", false, workingAppEngine);
await controller.fetch("mo", false, workingAppEngine);
Assert.equal(
Glean.searchSuggestions.successfulRequests.workingAppEngine.testGetValue(),
6, // 1 new + 5 from the previous test.
"Successful request counter is correctly updated"
);
Assert.equal(
Glean.searchSuggestions.abortedRequests.workingAppEngine.testGetValue(),
4,
"Aborted request counter is correctly updated"
);
});
add_task(async function test_error() {
let controller = new SearchSuggestionController();
await controller.fetch("mo", false, failingAppEngine);
await controller.fetch("mo", false, failingAppEngine);
await controller.fetch("mo", false, failingAppEngine);
Assert.equal(
Glean.searchSuggestions.failedRequests.failingAppEngine.testGetValue(),
3,
"Failed request counter is correctly updated"
);
});
add_task(async function test_nonAppProvided() {
let controller = new SearchSuggestionController();
let result = await controller.fetch("mo", false, openSearchEngine);
Assert.equal(result.remote.length, 3);
Assert.equal(
Glean.searchSuggestions.successfulRequests.openSearchEngine.testGetValue(),
null,
"No telemetry is recorded for non-app-provided-engine"
);
});