tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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)