test_apply_update.py (4228B)
1 import xml.etree.ElementTree as ET 2 from os import environ 3 from pathlib import Path 4 5 import requests 6 from marionette_driver import expected 7 from marionette_driver.by import By 8 from marionette_driver.wait import Wait 9 from marionette_harness import MarionetteTestCase 10 11 12 class TestApplyUpdate(MarionetteTestCase): 13 def setUp(self): 14 MarionetteTestCase.setUp(self) 15 self.about_fx_url = "chrome://browser/content/aboutDialog.xhtml" 16 17 def test_update_is_applied(self): 18 self.marionette.set_pref("app.update.disabledForTesting", False) 19 self.marionette.set_pref("app.update.log", True) 20 self.marionette.set_pref("remote.log.level", "Trace") 21 self.marionette.set_pref("remote.system-access-check.enabled", False) 22 self.marionette.navigate(self.about_fx_url) 23 24 self.marionette.set_context(self.marionette.CONTEXT_CHROME) 25 update_url = self.marionette.execute_async_script( 26 """ 27 (async function() { 28 const checker = Cc["@mozilla.org/updates/update-checker;1"].getService(Ci.nsIUpdateChecker); 29 let url = await checker.wrappedJSObject.getUpdateURL(checker.BACKGROUND_CHECK); 30 return url; 31 })().then(arguments[0]); 32 """ 33 ) 34 35 response = requests.get(f"{update_url}?force=1") 36 response.raise_for_status() 37 38 # Get the target version 39 root = ET.fromstring(response.text) 40 target_ver = root[0].get("appVersion") 41 42 if environ.get("UPLOAD_DIR"): 43 version_info_log = Path( 44 environ.get("UPLOAD_DIR"), environ.get("VERSION_LOG_FILENAME") 45 ) 46 if version_info_log.is_file(): 47 with version_info_log.open("a") as fh: 48 fh.write(f"Target version: {target_ver}\n") 49 50 self.marionette.set_context(self.marionette.CONTEXT_CONTENT) 51 initial_ver = self.marionette.find_element(By.ID, "version").text 52 53 # Try runs build unsigned updates, releases can't update on unsigned MARs 54 # ...so we're just going to check that balrog gives a reasonably-named file that exists 55 if environ.get("BALROG_STAGING"): 56 print("staging") 57 patch_url = root[0][0].get("URL") 58 assert f"{target_ver}" in patch_url, ( 59 f"{target_ver} not in patch url: {patch_url}" 60 ) 61 patch_response = requests.get(patch_url) 62 patch_response.raise_for_status() 63 return True 64 65 Wait(self.marionette, timeout=10).until( 66 expected.element_displayed(By.ID, "downloadAndInstallButton") 67 ) 68 self.marionette.find_element(By.ID, "downloadAndInstallButton").click() 69 70 # Long timeouts are a known issue - Bug 2000040 71 Wait(self.marionette, timeout=240).until( 72 expected.element_displayed(By.ID, "updateButton") 73 ) 74 75 self.marionette.restart( 76 callback=lambda: self.marionette.find_element(By.ID, "updateButton").click() 77 ) 78 79 self.marionette.set_pref("app.update.disabledForTesting", False) 80 self.marionette.set_pref("app.update.log", True) 81 self.marionette.set_pref("remote.log.level", "Trace") 82 self.marionette.set_pref("remote.system-access-check.enabled", False) 83 self.marionette.navigate(self.about_fx_url) 84 85 Wait(self.marionette, timeout=240).until( 86 expected.element_displayed(By.ID, "noUpdatesFound") 87 ) 88 89 # Mini smoke test 90 try: 91 print(f"Updated from {initial_ver} to {target_ver}") 92 except UnicodeEncodeError: 93 print(f"Updated to {target_ver}") 94 version_text = self.marionette.find_element(By.ID, "version").text 95 assert target_ver in version_text 96 assert len(self.marionette.window_handles) == 1 97 self.marionette.open("tab") 98 Wait(self.marionette, timeout=20).until( 99 lambda _: len(self.marionette.window_handles) == 2 100 ) 101 self.marionette.close() 102 Wait(self.marionette, timeout=20).until( 103 lambda _: len(self.marionette.window_handles) == 1 104 ) 105 106 def tearDown(self): 107 MarionetteTestCase.tearDown(self)