test_LaterRun.js (7646B)
1 "use strict"; 2 3 const kEnabledPref = "browser.laterrun.enabled"; 4 const kPagePrefRoot = "browser.laterrun.pages."; 5 const kSessionCountPref = "browser.laterrun.bookkeeping.sessionCount"; 6 const kProfileCreationTime = "browser.laterrun.bookkeeping.profileCreationTime"; 7 8 const { LaterRun } = ChromeUtils.importESModule( 9 "resource:///modules/LaterRun.sys.mjs" 10 ); 11 12 Services.prefs.setBoolPref(kEnabledPref, true); 13 const { updateAppInfo } = ChromeUtils.importESModule( 14 "resource://testing-common/AppInfo.sys.mjs" 15 ); 16 updateAppInfo(); 17 18 add_task(async function test_page_applies() { 19 Services.prefs.setCharPref( 20 kPagePrefRoot + "test_LaterRun_unittest.url", 21 "https://www.mozilla.org/%VENDOR%/%NAME%/%ID%/%VERSION%/" 22 ); 23 Services.prefs.setIntPref( 24 kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 25 10 26 ); 27 Services.prefs.setIntPref( 28 kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 29 3 30 ); 31 32 let pages = LaterRun.readPages(); 33 // We have to filter the pages because it's possible Firefox ships with other URLs 34 // that get included in this test. 35 pages = pages.filter( 36 page => page.pref == kPagePrefRoot + "test_LaterRun_unittest." 37 ); 38 Assert.equal(pages.length, 1, "Got 1 page"); 39 let page = pages[0]; 40 Assert.equal( 41 page.pref, 42 kPagePrefRoot + "test_LaterRun_unittest.", 43 "Should know its own pref" 44 ); 45 Assert.equal( 46 page.minimumHoursSinceInstall, 47 10, 48 "Needs to have 10 hours since install" 49 ); 50 Assert.equal(page.minimumSessionCount, 3, "Needs to have 3 sessions"); 51 Assert.equal(page.requireBoth, false, "Either requirement is enough"); 52 let expectedURL = 53 "https://www.mozilla.org/" + 54 Services.appinfo.vendor + 55 "/" + 56 Services.appinfo.name + 57 "/" + 58 Services.appinfo.ID + 59 "/" + 60 Services.appinfo.version + 61 "/"; 62 Assert.equal(page.url, expectedURL, "URL is stored correctly"); 63 64 Assert.ok( 65 page.applies({ hoursSinceInstall: 1, sessionCount: 3 }), 66 "Applies when session count has been met." 67 ); 68 Assert.ok( 69 page.applies({ hoursSinceInstall: 1, sessionCount: 4 }), 70 "Applies when session count has been exceeded." 71 ); 72 Assert.ok( 73 page.applies({ hoursSinceInstall: 10, sessionCount: 2 }), 74 "Applies when total session time has been met." 75 ); 76 Assert.ok( 77 page.applies({ hoursSinceInstall: 20, sessionCount: 2 }), 78 "Applies when total session time has been exceeded." 79 ); 80 Assert.ok( 81 page.applies({ hoursSinceInstall: 10, sessionCount: 3 }), 82 "Applies when both time and session count have been met." 83 ); 84 Assert.ok( 85 !page.applies({ hoursSinceInstall: 1, sessionCount: 1 }), 86 "Does not apply when neither time and session count have been met." 87 ); 88 89 page.requireBoth = true; 90 91 Assert.ok( 92 !page.applies({ hoursSinceInstall: 1, sessionCount: 3 }), 93 "Does not apply when only session count has been met." 94 ); 95 Assert.ok( 96 !page.applies({ hoursSinceInstall: 1, sessionCount: 4 }), 97 "Does not apply when only session count has been exceeded." 98 ); 99 Assert.ok( 100 !page.applies({ hoursSinceInstall: 10, sessionCount: 2 }), 101 "Does not apply when only total session time has been met." 102 ); 103 Assert.ok( 104 !page.applies({ hoursSinceInstall: 20, sessionCount: 2 }), 105 "Does not apply when only total session time has been exceeded." 106 ); 107 Assert.ok( 108 page.applies({ hoursSinceInstall: 10, sessionCount: 3 }), 109 "Applies when both time and session count have been met." 110 ); 111 Assert.ok( 112 !page.applies({ hoursSinceInstall: 1, sessionCount: 1 }), 113 "Does not apply when neither time and session count have been met." 114 ); 115 116 // Check that pages that have run never apply: 117 Services.prefs.setBoolPref( 118 kPagePrefRoot + "test_LaterRun_unittest.hasRun", 119 true 120 ); 121 page.requireBoth = false; 122 123 Assert.ok( 124 !page.applies({ hoursSinceInstall: 1, sessionCount: 3 }), 125 "Does not apply when page has already run (sessionCount equal)." 126 ); 127 Assert.ok( 128 !page.applies({ hoursSinceInstall: 1, sessionCount: 4 }), 129 "Does not apply when page has already run (sessionCount exceeding)." 130 ); 131 Assert.ok( 132 !page.applies({ hoursSinceInstall: 10, sessionCount: 2 }), 133 "Does not apply when page has already run (hoursSinceInstall equal)." 134 ); 135 Assert.ok( 136 !page.applies({ hoursSinceInstall: 20, sessionCount: 2 }), 137 "Does not apply when page has already run (hoursSinceInstall exceeding)." 138 ); 139 Assert.ok( 140 !page.applies({ hoursSinceInstall: 10, sessionCount: 3 }), 141 "Does not apply when page has already run (both criteria equal)." 142 ); 143 Assert.ok( 144 !page.applies({ hoursSinceInstall: 1, sessionCount: 1 }), 145 "Does not apply when page has already run (both criteria insufficient anyway)." 146 ); 147 148 clearAllPagePrefs(); 149 }); 150 151 add_task(async function test_get_URL() { 152 Services.prefs.setIntPref( 153 kProfileCreationTime, 154 Math.floor((Date.now() - 11 * 60 * 60 * 1000) / 1000) 155 ); 156 Services.prefs.setCharPref( 157 kPagePrefRoot + "test_LaterRun_unittest.url", 158 "https://www.mozilla.org/" 159 ); 160 Services.prefs.setIntPref( 161 kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 162 10 163 ); 164 Services.prefs.setIntPref( 165 kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 166 3 167 ); 168 let pages = LaterRun.readPages(); 169 // We have to filter the pages because it's possible Firefox ships with other URLs 170 // that get included in this test. 171 pages = pages.filter( 172 page => page.pref == kPagePrefRoot + "test_LaterRun_unittest." 173 ); 174 Assert.equal(pages.length, 1, "Should only be 1 matching page"); 175 let page = pages[0]; 176 let url; 177 do { 178 url = LaterRun.getURL(); 179 // We have to loop because it's possible Firefox ships with other URLs that get triggered by 180 // this test. 181 } while (url && url != "https://www.mozilla.org/"); 182 Assert.equal( 183 url, 184 "https://www.mozilla.org/", 185 "URL should be as expected when prefs are set." 186 ); 187 Assert.ok( 188 Services.prefs.prefHasUserValue( 189 kPagePrefRoot + "test_LaterRun_unittest.hasRun" 190 ), 191 "Should have set pref" 192 ); 193 Assert.ok( 194 Services.prefs.getBoolPref(kPagePrefRoot + "test_LaterRun_unittest.hasRun"), 195 "Should have set pref to true" 196 ); 197 Assert.ok(page.hasRun, "Other page objects should know it has run, too."); 198 199 clearAllPagePrefs(); 200 }); 201 202 add_task(async function test_insecure_urls() { 203 Services.prefs.setCharPref( 204 kPagePrefRoot + "test_LaterRun_unittest.url", 205 "http://www.mozilla.org/" 206 ); 207 Services.prefs.setIntPref( 208 kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 209 10 210 ); 211 Services.prefs.setIntPref( 212 kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 213 3 214 ); 215 let pages = LaterRun.readPages(); 216 // We have to filter the pages because it's possible Firefox ships with other URLs 217 // that get triggered in this test. 218 pages = pages.filter( 219 page => page.pref == kPagePrefRoot + "test_LaterRun_unittest." 220 ); 221 Assert.equal(pages.length, 0, "URL with non-https scheme should get ignored"); 222 clearAllPagePrefs(); 223 }); 224 225 add_task(async function test_dynamic_pref_getter_setter() { 226 delete LaterRun._sessionCount; 227 Services.prefs.setIntPref(kSessionCountPref, 0); 228 Assert.equal(LaterRun.sessionCount, 0, "Should start at 0"); 229 230 LaterRun.sessionCount++; 231 Assert.equal(LaterRun.sessionCount, 1, "Should increment."); 232 Assert.equal( 233 Services.prefs.getIntPref(kSessionCountPref), 234 1, 235 "Should update pref" 236 ); 237 }); 238 239 function clearAllPagePrefs() { 240 let allChangedPrefs = Services.prefs.getChildList(kPagePrefRoot); 241 for (let pref of allChangedPrefs) { 242 Services.prefs.clearUserPref(pref); 243 } 244 }