summaryrefslogtreecommitdiffstats
path: root/browser/components/attribution/test/xpcshell/test_MacAttribution.js
blob: 10bbe6c965a0055171079e88fcb1fdf8547b89fa (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
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

"use strict";

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

let extendedAttributeTestCases = [
  {
    raw: "__MOZCUSTOM__dlsource%3D=mozci",
    expected: "dlsource%3D=mozci",
    error: false,
  },
  {
    raw: "__MOZCUSTOM__dlsource%3D=mozci\0\0\0\0\0",
    expected: "dlsource%3D=mozci",
    error: false,
  },
  {
    raw: "__MOZCUSTOM__dlsource%3D=mozci\t\t\t\t\t",
    expected: "dlsource%3D=mozci",
    error: false,
  },
  {
    raw: "__MOZCUSTOM__dlsource%3D=mozci\0\0\0\t\t",
    expected: "dlsource%3D=mozci",
    error: false,
  },
  {
    raw: "__MOZCUSTOM__dlsource%3D=mozci\t\t\0\0",
    expected: "dlsource%3D=mozci",
    error: false,
  },
  {
    raw: "__MOZCUSTOM__dlsource%3D=mozci\0\t\0\t\0\t",
    expected: "dlsource%3D=mozci",
    error: false,
  },
  {
    raw: "",
    expected: "",
    error: true,
  },
  {
    raw: "dlsource%3D=mozci\0\t\0\t\0\t",
    expected: "",
    error: true,
  },
];

add_task(async () => {
  await setupStubs();
});

// Tests to ensure that MacAttribution.getAttributionString
// strips away the parts of the extended attribute that it should,
// and that invalid extended attribute values result in no attribution
// data.
add_task(async function testExtendedAttributeProcessing() {
  for (let entry of extendedAttributeTestCases) {
    // We use setMacXAttr directly here rather than setAttributionString because
    // we need the ability to set invalid attribution strings.
    await IOUtils.setMacXAttr(
      MacAttribution.applicationPath,
      "com.apple.application-instance",
      new TextEncoder().encode(entry.raw)
    );
    try {
      let got = await MacAttribution.getAttributionString();
      if (entry.error === true) {
        Assert.ok(false, "Expected error, raw code was: " + entry.raw);
      }
      Assert.equal(
        got,
        entry.expected,
        "Returned code should match expected value, raw code was: " + entry.raw
      );
    } catch (err) {
      if (entry.error === false) {
        Assert.ok(
          false,
          "Unexpected error, raw code was: " + entry.raw + " error is: " + err
        );
      }
    }
  }
});

add_task(async function testValidAttrCodes() {
  for (let entry of validAttrCodes) {
    if (entry.platforms && !entry.platforms.includes("mac")) {
      continue;
    }

    await MacAttribution.setAttributionString(entry.code);

    // Read attribution code from xattr.
    AttributionCode._clearCache();
    let result = await AttributionCode.getAttrDataAsync();
    Assert.deepEqual(
      result,
      entry.parsed,
      "Parsed code should match expected value, code was: " + entry.code
    );

    // Read attribution code from cache.
    result = await AttributionCode.getAttrDataAsync();
    Assert.deepEqual(
      result,
      entry.parsed,
      "Parsed code should match expected value, code was: " + entry.code
    );

    // Does not overwrite cached existing attribution code.
    await MacAttribution.setAttributionString("__MOZCUSTOM__testcode");
    result = await AttributionCode.getAttrDataAsync();
    Assert.deepEqual(
      result,
      entry.parsed,
      "Parsed code should match expected value, code was: " + entry.code
    );
  }
});

add_task(async function testInvalidAttrCodes() {
  for (let code of invalidAttrCodes) {
    await MacAttribution.setAttributionString("__MOZCUSTOM__" + code);

    // Read attribution code from xattr
    AttributionCode._clearCache();
    let result = await AttributionCode.getAttrDataAsync();
    Assert.deepEqual(result, {}, "Code should have failed to parse: " + code);
  }
});