1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/healthreport/tests/xpcshell/test_profile.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,196 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +"use strict"; 1.8 + 1.9 +const {utils: Cu} = Components; 1.10 + 1.11 +const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000; 1.12 + 1.13 +// Create profile directory before use. 1.14 +// It can be no older than a day ago…. 1.15 +let profile_creation_lower = Date.now() - MILLISECONDS_PER_DAY; 1.16 +do_get_profile(); 1.17 + 1.18 +Cu.import("resource://gre/modules/Promise.jsm"); 1.19 +Cu.import("resource://gre/modules/Metrics.jsm"); 1.20 +Cu.import("resource://gre/modules/services/healthreport/profile.jsm"); 1.21 +Cu.import("resource://gre/modules/Task.jsm"); 1.22 + 1.23 + 1.24 +function MockProfileMetadataProvider(name="MockProfileMetadataProvider") { 1.25 + this.name = name; 1.26 + ProfileMetadataProvider.call(this); 1.27 +} 1.28 +MockProfileMetadataProvider.prototype = { 1.29 + __proto__: ProfileMetadataProvider.prototype, 1.30 + 1.31 + getProfileCreationDays: function getProfileCreationDays() { 1.32 + return Promise.resolve(1234); 1.33 + }, 1.34 +}; 1.35 + 1.36 + 1.37 +function run_test() { 1.38 + run_next_test(); 1.39 +} 1.40 + 1.41 +/** 1.42 + * Ensure that OS.File works in our environment. 1.43 + * This test can go once there are xpcshell tests for OS.File. 1.44 + */ 1.45 +add_test(function use_os_file() { 1.46 + Cu.import("resource://gre/modules/osfile.jsm") 1.47 + 1.48 + // Ensure that we get constants, too. 1.49 + do_check_neq(OS.Constants.Path.profileDir, null); 1.50 + 1.51 + let iterator = new OS.File.DirectoryIterator("."); 1.52 + iterator.forEach(function onEntry(entry) { 1.53 + print("Got " + entry.path); 1.54 + }).then(function onSuccess() { 1.55 + iterator.close(); 1.56 + print("Done."); 1.57 + run_next_test(); 1.58 + }, function onFail() { 1.59 + iterator.close(); 1.60 + do_throw("Iterating over current directory failed."); 1.61 + }); 1.62 +}); 1.63 + 1.64 +function getAccessor() { 1.65 + let acc = new ProfileCreationTimeAccessor(); 1.66 + print("Profile is " + acc.profilePath); 1.67 + return acc; 1.68 +} 1.69 + 1.70 +add_test(function test_time_accessor_no_file() { 1.71 + let acc = getAccessor(); 1.72 + 1.73 + // There should be no file yet. 1.74 + acc.readTimes() 1.75 + .then(function onSuccess(json) { 1.76 + do_throw("File existed!"); 1.77 + }, 1.78 + function onFailure() { 1.79 + run_next_test(); 1.80 + }); 1.81 +}); 1.82 + 1.83 +add_task(function test_time_accessor_named_file() { 1.84 + let acc = getAccessor(); 1.85 + 1.86 + // There should be no file yet. 1.87 + yield acc.writeTimes({created: 12345}, "test.json"); 1.88 + let json = yield acc.readTimes("test.json") 1.89 + print("Read: " + JSON.stringify(json)); 1.90 + do_check_eq(12345, json.created); 1.91 +}); 1.92 + 1.93 +add_task(function test_time_accessor_creates_file() { 1.94 + let lower = profile_creation_lower; 1.95 + 1.96 + // Ensure that provided contents are merged, and existing 1.97 + // files can be overwritten. These two things occur if we 1.98 + // read and then decide that we have to write. 1.99 + let acc = getAccessor(); 1.100 + let existing = {abc: "123", easy: "abc"}; 1.101 + let expected; 1.102 + 1.103 + let created = yield acc.computeAndPersistTimes(existing, "test2.json") 1.104 + let upper = Date.now() + 1000; 1.105 + print(lower + " < " + created + " <= " + upper); 1.106 + do_check_true(lower < created); 1.107 + do_check_true(upper >= created); 1.108 + expected = created; 1.109 + 1.110 + let json = yield acc.readTimes("test2.json") 1.111 + print("Read: " + JSON.stringify(json)); 1.112 + do_check_eq("123", json.abc); 1.113 + do_check_eq("abc", json.easy); 1.114 + do_check_eq(expected, json.created); 1.115 +}); 1.116 + 1.117 +add_task(function test_time_accessor_all() { 1.118 + let lower = profile_creation_lower; 1.119 + let acc = getAccessor(); 1.120 + let expected; 1.121 + let created = yield acc.created 1.122 + let upper = Date.now() + 1000; 1.123 + do_check_true(lower < created); 1.124 + do_check_true(upper >= created); 1.125 + expected = created; 1.126 + 1.127 + let again = yield acc.created 1.128 + do_check_eq(expected, again); 1.129 +}); 1.130 + 1.131 +add_test(function test_constructor() { 1.132 + let provider = new ProfileMetadataProvider("named"); 1.133 + run_next_test(); 1.134 +}); 1.135 + 1.136 +add_test(function test_profile_files() { 1.137 + let provider = new ProfileMetadataProvider(); 1.138 + 1.139 + function onSuccess(answer) { 1.140 + let now = Date.now() / MILLISECONDS_PER_DAY; 1.141 + print("Got " + answer + ", versus now = " + now); 1.142 + do_check_true(answer < now); 1.143 + run_next_test(); 1.144 + } 1.145 + 1.146 + function onFailure(ex) { 1.147 + do_throw("Directory iteration failed: " + ex); 1.148 + } 1.149 + 1.150 + provider.getProfileCreationDays().then(onSuccess, onFailure); 1.151 +}); 1.152 + 1.153 +// A generic test helper. We use this with both real 1.154 +// and mock providers in these tests. 1.155 +function test_collect_constant(provider) { 1.156 + return Task.spawn(function () { 1.157 + yield provider.collectConstantData(); 1.158 + 1.159 + let m = provider.getMeasurement("age", 1); 1.160 + do_check_neq(m, null); 1.161 + let values = yield m.getValues(); 1.162 + do_check_eq(values.singular.size, 1); 1.163 + do_check_true(values.singular.has("profileCreation")); 1.164 + 1.165 + throw new Task.Result(values.singular.get("profileCreation")[1]); 1.166 + }); 1.167 +} 1.168 + 1.169 +add_task(function test_collect_constant_mock() { 1.170 + let storage = yield Metrics.Storage("collect_constant_mock"); 1.171 + let provider = new MockProfileMetadataProvider(); 1.172 + yield provider.init(storage); 1.173 + 1.174 + let v = yield test_collect_constant(provider); 1.175 + do_check_eq(v, 1234); 1.176 + 1.177 + yield storage.close(); 1.178 +}); 1.179 + 1.180 +add_task(function test_collect_constant_real() { 1.181 + let provider = new ProfileMetadataProvider(); 1.182 + let storage = yield Metrics.Storage("collect_constant_real"); 1.183 + yield provider.init(storage); 1.184 + 1.185 + let v = yield test_collect_constant(provider); 1.186 + 1.187 + let ms = v * MILLISECONDS_PER_DAY; 1.188 + let lower = profile_creation_lower; 1.189 + let upper = Date.now() + 1000; 1.190 + print("Day: " + v); 1.191 + print("msec: " + ms); 1.192 + print("Lower: " + lower); 1.193 + print("Upper: " + upper); 1.194 + do_check_true(lower <= ms); 1.195 + do_check_true(upper >= ms); 1.196 + 1.197 + yield storage.close(); 1.198 +}); 1.199 +