summaryrefslogtreecommitdiffstats
path: root/toolkit/modules/tests/xpcshell/test_ProfileAge.js
blob: e717b0dcd0392bacf6e2a4c9d20094dbee033b2c (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
const { ProfileAge } = ChromeUtils.importESModule(
  "resource://gre/modules/ProfileAge.sys.mjs"
);

const gProfD = do_get_profile();
let ID = 0;

// Creates a unique profile directory to use for a test.
function withDummyProfile(task) {
  return async () => {
    let profile = PathUtils.join(gProfD.path, "" + ID++);
    await IOUtils.makeDirectory(profile);
    await task(profile);
    await IOUtils.remove(profile, { recursive: true });
  };
}

add_task(
  withDummyProfile(async profile => {
    let times = await ProfileAge(profile);
    Assert.ok(
      (await times.created) > 0,
      "We can't really say what this will be, just assume if it is a number it's ok."
    );
    Assert.equal(
      await times.reset,
      undefined,
      "Reset time is undefined in a new profile"
    );
    Assert.ok(
      (await times.firstUse) <= Date.now(),
      "Should have initialised a first use time."
    );
  })
);

add_task(
  withDummyProfile(async profile => {
    const CREATED_TIME = Date.now() - 2000;
    const RESET_TIME = Date.now() - 1000;
    const RECOVERY_TIME = Date.now() - 500;

    await IOUtils.writeJSON(PathUtils.join(profile, "times.json"), {
      created: CREATED_TIME,
    });

    let times = await ProfileAge(profile);
    Assert.equal(
      await times.created,
      CREATED_TIME,
      "Should have seen the right profile time."
    );
    Assert.equal(
      await times.firstUse,
      undefined,
      "Should be no first use time."
    );

    let times2 = await ProfileAge(profile);
    Assert.equal(times, times2, "Should have got the same instance.");

    let promise = times.recordProfileReset(RESET_TIME);
    Assert.equal(
      await times2.reset,
      RESET_TIME,
      "Should have seen the right reset time in the second instance immediately."
    );
    await promise;

    let recoveryPromise = times.recordRecoveredFromBackup(RECOVERY_TIME);
    Assert.equal(
      await times2.recoveredFromBackup,
      RECOVERY_TIME,
      "Should have seen the right backup recovery time in the second instance immediately."
    );
    await recoveryPromise;

    let results = await IOUtils.readJSON(PathUtils.join(profile, "times.json"));
    Assert.deepEqual(
      results,
      {
        created: CREATED_TIME,
        reset: RESET_TIME,
        recoveredFromBackup: RECOVERY_TIME,
      },
      "Should have seen the right results."
    );
  })
);

add_task(
  withDummyProfile(async profile => {
    const RESET_TIME = Date.now() - 1000;
    const RESET_TIME2 = Date.now() - 2000;

    // The last call to recordProfileReset should always win.
    let times = await ProfileAge(profile);
    await Promise.all([
      times.recordProfileReset(RESET_TIME),
      times.recordProfileReset(RESET_TIME2),
    ]);

    let results = await IOUtils.readJSON(PathUtils.join(profile, "times.json"));
    delete results.firstUse;
    Assert.deepEqual(
      results,
      {
        reset: RESET_TIME2,
      },
      "Should have seen the right results."
    );
  })
);

add_task(
  withDummyProfile(async profile => {
    const CREATED_TIME = Date.now() - 1000;

    await IOUtils.writeJSON(PathUtils.join(profile, "times.json"), {
      created: CREATED_TIME,
      firstUse: null,
    });

    let times = await ProfileAge(profile);
    Assert.ok(
      (await times.firstUse) <= Date.now(),
      "Should have initialised a first use time."
    );
  })
);

add_task(
  withDummyProfile(async profile => {
    const RECOVERY_TIME = Date.now() - 1000;
    const RECOVERY_TIME2 = Date.now() - 2000;

    // The last call to recordRecoveredFromBackup should always win.
    let times = await ProfileAge(profile);
    await Promise.all([
      times.recordRecoveredFromBackup(RECOVERY_TIME),
      times.recordRecoveredFromBackup(RECOVERY_TIME2),
    ]);

    let results = await IOUtils.readJSON(PathUtils.join(profile, "times.json"));
    Assert.equal(
      results.recoveredFromBackup,
      RECOVERY_TIME2,
      "Should have seen the right results."
    );
  })
);