|
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 |