/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

ignoreAllUncaughtExceptions();

add_task(async function () {
  info(
    "Check that performing a search fires a search event and records to Telemetry."
  );

  await SpecialPowers.pushPrefEnv({
    set: [
      [
        "browser.newtabpage.activity-stream.improvesearch.handoffToAwesomebar",
        false,
      ],
    ],
  });

  await BrowserTestUtils.withNewTab(
    { gBrowser, url: "about:home" },
    async function (browser) {
      let engine;
      await promiseContentSearchChange(browser, async () => {
        engine = await SearchTestUtils.promiseNewSearchEngine({
          url: getRootDirectory(gTestPath) + "searchSuggestionEngine.xml",
          setAsDefault: true,
        });
        return engine.name;
      });

      await SpecialPowers.spawn(
        browser,
        [{ expectedName: engine.name }],
        async function (args) {
          let engineName =
            content.wrappedJSObject.gContentSearchController.defaultEngine.name;
          is(
            engineName,
            args.expectedName,
            "Engine name in DOM should match engine we just added"
          );
        }
      );

      let numSearchesBefore = 0;
      // Get the current number of recorded searches.
      let histogramKey = `other-${engine.name}.abouthome`;
      try {
        let hs = Services.telemetry
          .getKeyedHistogramById("SEARCH_COUNTS")
          .snapshot();
        if (histogramKey in hs) {
          numSearchesBefore = hs[histogramKey].sum;
        }
      } catch (ex) {
        // No searches performed yet, not a problem, |numSearchesBefore| is 0.
      }

      let searchStr = "a search";

      let expectedURL = (await Services.search.getDefault()).getSubmission(
        searchStr,
        null,
        "homepage"
      ).uri.spec;
      let promise = BrowserTestUtils.waitForDocLoadAndStopIt(
        expectedURL,
        browser
      );

      // Perform a search to increase the SEARCH_COUNT histogram.
      await SpecialPowers.spawn(
        browser,
        [{ searchStr }],
        async function (args) {
          let doc = content.document;
          info("Perform a search.");
          let el = doc.querySelector(["#searchText", "#newtab-search-text"]);
          el.value = args.searchStr;
          doc.getElementById("searchSubmit").click();
        }
      );

      await promise;

      // Make sure the SEARCH_COUNTS histogram has the right key and count.
      let hs = Services.telemetry
        .getKeyedHistogramById("SEARCH_COUNTS")
        .snapshot();
      Assert.ok(histogramKey in hs, "histogram with key should be recorded");
      Assert.equal(
        hs[histogramKey].sum,
        numSearchesBefore + 1,
        "histogram sum should be incremented"
      );
    }
  );
  await SpecialPowers.popPrefEnv();
});
