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

// test for exposure events

"use strict";

// Avoid timeouts in verify mode, especially on "OS X 10.15 WebRender opt" in
// verify mode on Treeherder. This test has taken up to 275231ms on try runs in
// verify mode on that machine.
requestLongerTimeout(15);

add_setup(async function () {
  await initExposureTest();
});

add_task(async function engagement() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
      },
    ],
    trigger: doClick,
    expectedEvents: [
      { results: "adm_sponsored", terminal: "true", sap: "urlbar_newtab" },
    ],
  });
});

add_task(async function abandonment() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
      },
    ],
    trigger: doBlur,
    expectedEvents: [
      { results: "adm_sponsored", terminal: "true", sap: "urlbar_newtab" },
    ],
  });
});

add_task(async function sapUrlbarHandoff() {
  // Simulate handoff session.
  gURLBar._isHandoffSession = true;
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [
      { results: "adm_sponsored", terminal: "true", sap: "handoff" },
    ],
  });
});

add_task(async function oneExposureResult_shown_matched() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "true" }],
  });
});

add_task(async function oneExposureResult_shown_notMatched() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "wikipedia",
        expectedNotVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [],
  });
});

add_task(async function oneExposureResult_hidden_matched() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "amp",
        expectedNotVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "true" }],
  });
});

add_task(async function oneExposureResult_hidden_notMatched() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "wikipedia",
        expectedNotVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [],
  });
});

add_task(async function manyExposureResults_shown_oneMatched_1() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "true" }],
  });
});

add_task(async function manyExposureResults_shown_oneMatched_2() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "wikipedia",
        expectedVisible: ["adm_nonsponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_nonsponsored", terminal: "true" }],
  });
});

add_task(async function manyExposureResults_shown_manyMatched() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp and wikipedia",
        // Only the sponsored result should be visible and recorded since this
        // task shows exposures, at most one Suggest result should be shown, and
        // sponsored has the higher score.
        expectedVisible: ["adm_sponsored"],
        expectedNotVisible: ["adm_nonsponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "true" }],
  });
});

add_task(async function manyExposureResults_hidden_oneMatched_1() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "amp",
        expectedNotVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "true" }],
  });
});

add_task(async function manyExposureResults_hidden_oneMatched_2() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "wikipedia",
        expectedNotVisible: ["adm_nonsponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_nonsponsored", terminal: "true" }],
  });
});

add_task(async function manyExposureResults_hidden_manyMatched() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "amp and wikipedia",
        expectedNotVisible: ["adm_sponsored", "adm_nonsponsored"],
      },
    ],
    // Both results should be recorded since this task hides exposures and
    // there's no limit on the number of hidden-exposure Suggest results.
    expectedEvents: [
      { results: "adm_nonsponsored,adm_sponsored", terminal: "true,true" },
    ],
  });
});

add_task(async function manyQueries_oneExposureResult_shown_terminal_1() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "wikipedia",
        expectedVisible: ["adm_nonsponsored"],
      },
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
        expectedNotVisible: ["adm_nonsponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "true" }],
  });
});

add_task(async function manyQueries_oneExposureResult_shown_terminal_2() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
      },
      {
        query: "wikipedia",
        expectedVisible: ["adm_nonsponsored"],
        expectedNotVisible: ["adm_sponsored"],
      },
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
        expectedNotVisible: ["adm_nonsponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "true" }],
  });
});

add_task(async function manyQueries_oneExposureResult_shown_nonTerminal() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
      },
      {
        query: "wikipedia",
        expectedVisible: ["adm_nonsponsored"],
        expectedNotVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "false" }],
  });
});

add_task(async function manyQueries_oneExposureResult_hidden_terminal_1() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "wikipedia",
        expectedVisible: ["adm_nonsponsored"],
      },
      {
        query: "amp",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "true" }],
  });
});

add_task(async function manyQueries_oneExposureResult_hidden_terminal_2() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "amp",
        expectedNotVisible: ["adm_sponsored"],
      },
      {
        query: "wikipedia",
        expectedVisible: ["adm_nonsponsored"],
        expectedNotVisible: ["adm_sponsored"],
      },
      {
        query: "amp",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "true" }],
  });
});

add_task(async function manyQueries_oneExposureResult_hidden_nonTerminal() {
  await doExposureTest({
    prefs: [
      ["exposureResults", suggestResultType("adm_sponsored")],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "amp",
        expectedNotVisible: ["adm_sponsored"],
      },
      {
        query: "wikipedia",
        expectedVisible: ["adm_nonsponsored"],
        expectedNotVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "false" }],
  });
});

add_task(async function manyQueries_manyExposureResults_shown_1() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "wikipedia",
        expectedVisible: ["adm_nonsponsored"],
      },
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
        expectedNotVisible: ["adm_nonsponsored"],
      },
    ],
    expectedEvents: [
      { results: "adm_nonsponsored,adm_sponsored", terminal: "false,true" },
    ],
  });
});

add_task(async function manyQueries_manyExposureResults_shown_2() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
      },
      {
        query: "wikipedia",
        expectedVisible: ["adm_nonsponsored"],
        expectedNotVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [
      { results: "adm_nonsponsored,adm_sponsored", terminal: "true,false" },
    ],
  });
});

add_task(async function manyQueries_manyExposureResults_shown_3() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
      },
      {
        query: "wikipedia",
        expectedVisible: ["adm_nonsponsored"],
        expectedNotVisible: ["adm_sponsored"],
      },
      {
        query: "amp",
        expectedVisible: ["adm_sponsored"],
        expectedNotVisible: ["adm_nonsponsored"],
      },
    ],
    expectedEvents: [
      { results: "adm_nonsponsored,adm_sponsored", terminal: "false,true" },
    ],
  });
});

add_task(async function manyQueries_manyExposureResults_shown_4() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "doesn't match",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
      {
        query: "amp and wikipedia",
        // Only the sponsored result should be visible and recorded since this
        // task shows exposures, at most one Suggest result should be shown, and
        // sponsored has the higher score.
        expectedVisible: ["adm_sponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "true" }],
  });
});

add_task(async function manyQueries_manyExposureResults_shown_5() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "amp and wikipedia",
        // Only the sponsored result should be visible and recorded since this
        // task shows exposures, at most one Suggest result should be shown, and
        // sponsored has the higher score.
        expectedVisible: ["adm_sponsored"],
      },
      {
        query: "doesn't match",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
    ],
    expectedEvents: [{ results: "adm_sponsored", terminal: "false" }],
  });
});

add_task(async function manyQueries_manyExposureResults_hidden_1() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "wikipedia",
        expectedNotVisible: ["adm_nonsponsored"],
      },
      {
        query: "amp",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
    ],
    expectedEvents: [
      { results: "adm_nonsponsored,adm_sponsored", terminal: "false,true" },
    ],
  });
});

add_task(async function manyQueries_manyExposureResults_hidden_2() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "amp",
        expectedNotVisible: ["adm_sponsored"],
      },
      {
        query: "wikipedia",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
    ],
    expectedEvents: [
      { results: "adm_nonsponsored,adm_sponsored", terminal: "true,false" },
    ],
  });
});

add_task(async function manyQueries_manyExposureResults_hidden_3() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "amp",
        expectedNotVisible: ["adm_sponsored"],
      },
      {
        query: "wikipedia",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
      {
        query: "amp",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
    ],
    expectedEvents: [
      { results: "adm_nonsponsored,adm_sponsored", terminal: "false,true" },
    ],
  });
});

add_task(async function manyQueries_manyExposureResults_hidden_4() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "doesn't match",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
      {
        query: "amp and wikipedia",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
    ],
    expectedEvents: [
      { results: "adm_nonsponsored,adm_sponsored", terminal: "true,true" },
    ],
  });
});

add_task(async function manyQueries_manyExposureResults_hidden_5() {
  await doExposureTest({
    prefs: [
      [
        "exposureResults",
        [
          suggestResultType("adm_sponsored"),
          suggestResultType("adm_nonsponsored"),
        ].join(","),
      ],
      ["showExposureResults", false],
    ],
    queries: [
      {
        query: "amp and wikipedia",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
      {
        query: "doesn't match",
        expectedNotVisible: ["adm_nonsponsored", "adm_sponsored"],
      },
    ],
    expectedEvents: [
      { results: "adm_nonsponsored,adm_sponsored", terminal: "false,false" },
    ],
  });
});

add_task(async function suggestExposure_matched() {
  await doExposureTest({
    prefs: [["quicksuggest.dynamicSuggestionTypes", "test-exposure-aaa"]],
    queries: [
      {
        query: "aaa keyword",
        expectedNotVisible: ["exposure"],
      },
    ],
    expectedEvents: [{ results: "exposure", terminal: "true" }],
  });
});

add_task(async function suggestExposure_notMatched() {
  await doExposureTest({
    prefs: [["quicksuggest.dynamicSuggestionTypes", "test-exposure-aaa"]],
    queries: [
      {
        query: "bbb keyword",
        expectedNotVisible: ["exposure"],
      },
    ],
    expectedEvents: [],
  });
});

add_task(async function suggestExposure_showExposureResults() {
  await doExposureTest({
    prefs: [
      ["quicksuggest.dynamicSuggestionTypes", "test-exposure-aaa"],
      ["showExposureResults", true],
    ],
    queries: [
      {
        query: "aaa keyword",
        expectedNotVisible: ["exposure"],
      },
    ],
    expectedEvents: [{ results: "exposure", terminal: "true" }],
  });
});
