summaryrefslogtreecommitdiffstats
path: root/toolkit/mozapps/extensions/test/xpcshell/test_amo_stats_telemetry.js
blob: 8176c5881aad685b3ef9b28ef9519465ef5b5144 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

const { TelemetryController } = ChromeUtils.importESModule(
  "resource://gre/modules/TelemetryController.sys.mjs"
);

AddonTestUtils.init(this);
AddonTestUtils.overrideCertDB();
AddonTestUtils.createAppInfo(
  "xpcshell@tests.mozilla.org",
  "XPCShell",
  "1",
  "42"
);

add_task(async function setup() {
  // We need to set this pref to `true` in order to collect add-ons Telemetry
  // data (which is considered extended data and disabled in CI).
  const overridePreReleasePref = "toolkit.telemetry.testing.overridePreRelease";
  let oldOverrideValue = Services.prefs.getBoolPref(
    overridePreReleasePref,
    false
  );
  Services.prefs.setBoolPref(overridePreReleasePref, true);
  registerCleanupFunction(() => {
    Services.prefs.setBoolPref(overridePreReleasePref, oldOverrideValue);
  });

  await TelemetryController.testSetup();
  await AddonTestUtils.promiseStartupManager();
});

add_task(async function test_ping_payload_and_environment() {
  const extensions = [
    {
      id: "addons-telemetry@test-extension-1",
      name: "some extension 1",
      version: "1.2.3",
    },
    {
      id: "addons-telemetry@test-extension-2",
      name: "some extension 2",
      version: "0.1",
    },
  ];

  // Install some extensions.
  const installedExtensions = [];
  for (const { id, name, version } of extensions) {
    const extension = ExtensionTestUtils.loadExtension({
      manifest: {
        name,
        version,
        browser_specific_settings: { gecko: { id } },
      },
      useAddonManager: "permanent",
    });
    installedExtensions.push(extension);

    await extension.startup();
  }

  const { payload, environment } = TelemetryController.getCurrentPingData();

  // Important: `payload.info.addons` is being used for AMO usage stats.
  Assert.ok("addons" in payload.info, "payload.info.addons is defined");
  Assert.equal(
    payload.info.addons,
    extensions
      .map(({ id, version }) => `${encodeURIComponent(id)}:${version}`)
      .join(",")
  );
  Assert.ok(
    "XPI" in payload.addonDetails,
    "payload.addonDetails.XPI is defined"
  );
  for (const { id, name } of extensions) {
    Assert.ok(id in payload.addonDetails.XPI);
    Assert.equal(payload.addonDetails.XPI[id].name, name);
  }

  const { addons } = environment;
  Assert.ok(
    "activeAddons" in addons,
    "environment.addons.activeAddons is defined"
  );
  Assert.ok("theme" in addons, "environment.addons.theme is defined");
  for (const { id } of extensions) {
    Assert.ok(id in environment.addons.activeAddons);
  }

  for (const extension of installedExtensions) {
    await extension.unload();
  }
});

add_task(async function cleanup() {
  await TelemetryController.testShutdown();
});