services/healthreport/tests/xpcshell/test_profile.js

branch
TOR_BUG_3246
changeset 5
4ab42b5ab56c
equal deleted inserted replaced
-1:000000000000 0:79547d696313
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/ */
3
4 "use strict";
5
6 const {utils: Cu} = Components;
7
8 const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;
9
10 // Create profile directory before use.
11 // It can be no older than a day ago….
12 let profile_creation_lower = Date.now() - MILLISECONDS_PER_DAY;
13 do_get_profile();
14
15 Cu.import("resource://gre/modules/Promise.jsm");
16 Cu.import("resource://gre/modules/Metrics.jsm");
17 Cu.import("resource://gre/modules/services/healthreport/profile.jsm");
18 Cu.import("resource://gre/modules/Task.jsm");
19
20
21 function MockProfileMetadataProvider(name="MockProfileMetadataProvider") {
22 this.name = name;
23 ProfileMetadataProvider.call(this);
24 }
25 MockProfileMetadataProvider.prototype = {
26 __proto__: ProfileMetadataProvider.prototype,
27
28 getProfileCreationDays: function getProfileCreationDays() {
29 return Promise.resolve(1234);
30 },
31 };
32
33
34 function run_test() {
35 run_next_test();
36 }
37
38 /**
39 * Ensure that OS.File works in our environment.
40 * This test can go once there are xpcshell tests for OS.File.
41 */
42 add_test(function use_os_file() {
43 Cu.import("resource://gre/modules/osfile.jsm")
44
45 // Ensure that we get constants, too.
46 do_check_neq(OS.Constants.Path.profileDir, null);
47
48 let iterator = new OS.File.DirectoryIterator(".");
49 iterator.forEach(function onEntry(entry) {
50 print("Got " + entry.path);
51 }).then(function onSuccess() {
52 iterator.close();
53 print("Done.");
54 run_next_test();
55 }, function onFail() {
56 iterator.close();
57 do_throw("Iterating over current directory failed.");
58 });
59 });
60
61 function getAccessor() {
62 let acc = new ProfileCreationTimeAccessor();
63 print("Profile is " + acc.profilePath);
64 return acc;
65 }
66
67 add_test(function test_time_accessor_no_file() {
68 let acc = getAccessor();
69
70 // There should be no file yet.
71 acc.readTimes()
72 .then(function onSuccess(json) {
73 do_throw("File existed!");
74 },
75 function onFailure() {
76 run_next_test();
77 });
78 });
79
80 add_task(function test_time_accessor_named_file() {
81 let acc = getAccessor();
82
83 // There should be no file yet.
84 yield acc.writeTimes({created: 12345}, "test.json");
85 let json = yield acc.readTimes("test.json")
86 print("Read: " + JSON.stringify(json));
87 do_check_eq(12345, json.created);
88 });
89
90 add_task(function test_time_accessor_creates_file() {
91 let lower = profile_creation_lower;
92
93 // Ensure that provided contents are merged, and existing
94 // files can be overwritten. These two things occur if we
95 // read and then decide that we have to write.
96 let acc = getAccessor();
97 let existing = {abc: "123", easy: "abc"};
98 let expected;
99
100 let created = yield acc.computeAndPersistTimes(existing, "test2.json")
101 let upper = Date.now() + 1000;
102 print(lower + " < " + created + " <= " + upper);
103 do_check_true(lower < created);
104 do_check_true(upper >= created);
105 expected = created;
106
107 let json = yield acc.readTimes("test2.json")
108 print("Read: " + JSON.stringify(json));
109 do_check_eq("123", json.abc);
110 do_check_eq("abc", json.easy);
111 do_check_eq(expected, json.created);
112 });
113
114 add_task(function test_time_accessor_all() {
115 let lower = profile_creation_lower;
116 let acc = getAccessor();
117 let expected;
118 let created = yield acc.created
119 let upper = Date.now() + 1000;
120 do_check_true(lower < created);
121 do_check_true(upper >= created);
122 expected = created;
123
124 let again = yield acc.created
125 do_check_eq(expected, again);
126 });
127
128 add_test(function test_constructor() {
129 let provider = new ProfileMetadataProvider("named");
130 run_next_test();
131 });
132
133 add_test(function test_profile_files() {
134 let provider = new ProfileMetadataProvider();
135
136 function onSuccess(answer) {
137 let now = Date.now() / MILLISECONDS_PER_DAY;
138 print("Got " + answer + ", versus now = " + now);
139 do_check_true(answer < now);
140 run_next_test();
141 }
142
143 function onFailure(ex) {
144 do_throw("Directory iteration failed: " + ex);
145 }
146
147 provider.getProfileCreationDays().then(onSuccess, onFailure);
148 });
149
150 // A generic test helper. We use this with both real
151 // and mock providers in these tests.
152 function test_collect_constant(provider) {
153 return Task.spawn(function () {
154 yield provider.collectConstantData();
155
156 let m = provider.getMeasurement("age", 1);
157 do_check_neq(m, null);
158 let values = yield m.getValues();
159 do_check_eq(values.singular.size, 1);
160 do_check_true(values.singular.has("profileCreation"));
161
162 throw new Task.Result(values.singular.get("profileCreation")[1]);
163 });
164 }
165
166 add_task(function test_collect_constant_mock() {
167 let storage = yield Metrics.Storage("collect_constant_mock");
168 let provider = new MockProfileMetadataProvider();
169 yield provider.init(storage);
170
171 let v = yield test_collect_constant(provider);
172 do_check_eq(v, 1234);
173
174 yield storage.close();
175 });
176
177 add_task(function test_collect_constant_real() {
178 let provider = new ProfileMetadataProvider();
179 let storage = yield Metrics.Storage("collect_constant_real");
180 yield provider.init(storage);
181
182 let v = yield test_collect_constant(provider);
183
184 let ms = v * MILLISECONDS_PER_DAY;
185 let lower = profile_creation_lower;
186 let upper = Date.now() + 1000;
187 print("Day: " + v);
188 print("msec: " + ms);
189 print("Lower: " + lower);
190 print("Upper: " + upper);
191 do_check_true(lower <= ms);
192 do_check_true(upper >= ms);
193
194 yield storage.close();
195 });
196

mercurial