summaryrefslogtreecommitdiffstats
path: root/toolkit/components/utils/test/unit/test_ClientEnvironment.js
blob: 72ca6d970ffbbaffd4da2799f1b8a0519160e2f3 (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";

ChromeUtils.defineESModuleGetters(this, {
  AppConstants: "resource://gre/modules/AppConstants.sys.mjs",
  ClientEnvironmentBase:
    "resource://gre/modules/components-utils/ClientEnvironment.sys.mjs",
  NormandyTestUtils: "resource://testing-common/NormandyTestUtils.sys.mjs",
  TelemetryController: "resource://gre/modules/TelemetryController.sys.mjs",
  updateAppInfo: "resource://testing-common/AppInfo.sys.mjs",
});

add_setup(() => {
  updateAppInfo();
});

add_task(async function test_OS_data() {
  const os = ClientEnvironmentBase.os;
  Assert.notStrictEqual(
    os,
    undefined,
    "OS data should be available in the context"
  );

  let osCount = 0;
  if (os.isWindows) {
    osCount += 1;
  }
  if (os.isMac) {
    osCount += 1;
  }
  if (os.isLinux) {
    osCount += 1;
  }
  Assert.lessOrEqual(osCount, 1, "At most one OS should match");

  // if on Windows, Windows versions should be set, and Mac versions should not be
  if (os.isWindows) {
    equal(
      typeof os.windowsVersion,
      "number",
      "Windows version should be a number"
    );
    equal(
      typeof os.windowsBuildNumber,
      "number",
      "Windows build number should be a number"
    );
    equal(os.macVersion, null, "Mac version should not be set");
    equal(os.darwinVersion, null, "Darwin version should not be set");
  }

  // if on Mac, Mac versions should be set, and Windows versions should not be
  if (os.isMac) {
    equal(typeof os.macVersion, "number", "Mac version should be a number");
    equal(
      typeof os.darwinVersion,
      "number",
      "Darwin version should be a number"
    );
    equal(os.windowsVersion, null, "Windows version should not be set");
    equal(
      os.windowsBuildNumber,
      null,
      "Windows build number version should not be set"
    );
  }

  // if on Linux, no versions should be set
  if (os.isLinux) {
    equal(os.macVersion, null, "Mac version should not be set");
    equal(os.darwinVersion, null, "Darwin version should not be set");
    equal(os.windowsVersion, null, "Windows version should not be set");
    equal(
      os.windowsBuildNumber,
      null,
      "Windows build number version should not be set"
    );
  }
});

add_task(async function test_attributionData() {
  try {
    await ClientEnvironmentBase.attribution;
  } catch (ex) {
    equal(
      ex.result,
      Cr.NS_ERROR_FILE_NOT_FOUND,
      "Test environment does not have attribution data"
    );
  }
});

add_task(async function testLiveTelemetry() {
  // Setup telemetry so we can read from it
  do_get_profile(true);
  await TelemetryController.testSetup();

  equal(
    ClientEnvironmentBase.liveTelemetry.main.environment.build.displayVersion,
    AppConstants.MOZ_APP_VERSION_DISPLAY,
    "Telemetry data is available"
  );

  Assert.throws(
    () => ClientEnvironmentBase.liveTelemetry.anotherPingType,
    /Live telemetry.*anotherPingType/,
    "Non-main pings should raise an error if accessed"
  );

  // Put things back the way we found them
  await TelemetryController.testShutdown();
});

add_task(function testBuildId() {
  Assert.notStrictEqual(
    ClientEnvironmentBase.appinfo,
    undefined,
    "appinfo should be available in the context"
  );
  Assert.strictEqual(
    typeof ClientEnvironmentBase.appinfo,
    "object",
    "appinfo should be an object"
  );
  Assert.strictEqual(
    typeof ClientEnvironmentBase.appinfo.appBuildID,
    "string",
    "buildId should be a string"
  );
});

add_task(
  {
    skip_if: () => AppConstants.MOZ_BUILD_APP != "browser",
  },
  async function testRandomizationId() {
    // Should generate an id if none is set
    await Services.prefs.clearUserPref("app.normandy.user_id");
    Assert.ok(
      NormandyTestUtils.isUuid(ClientEnvironmentBase.randomizationId),
      "randomizationId should be available"
    );

    // Should read the right preference
    await Services.prefs.setStringPref("app.normandy.user_id", "fake id");
    Assert.equal(
      ClientEnvironmentBase.randomizationId,
      "fake id",
      "randomizationId should read from preferences"
    );
  }
);