commit 8b1de3fc4be14fe3cfc3ff81ff3d02e4211decad
parent d6de1bd2e6909956193c393b834319a66de1f9fb
Author: Kui-Feng Lee <thinker.li@gmail.com>
Date: Mon, 8 Dec 2025 19:05:19 +0000
Bug 1918293 - run local HTTP for test_download_folder_change. r=gerard-majax
Even having a reliable remote resource to download, the host is
occasionally not reachable. Running a local server is still the best
option.
Differential Revision: https://phabricator.services.mozilla.com/D275037
Diffstat:
1 file changed, 84 insertions(+), 13 deletions(-)
diff --git a/taskcluster/docker/snap-coreXX-build/snap-tests/qa_tests.py b/taskcluster/docker/snap-coreXX-build/snap-tests/qa_tests.py
@@ -6,6 +6,7 @@
import os
import random
+import subprocess
import tempfile
import time
@@ -21,6 +22,8 @@ from selenium.webdriver.support.select import Select
class QATests(SnapTestsBase):
def __init__(self):
self._dir = "qa_tests"
+ self._http_server = None
+ self._http_tmpdir = None
super().__init__(
exp=os.path.join(
@@ -38,6 +41,57 @@ class QATests(SnapTestsBase):
)
return f[0].split("=")[1].replace(".", "")
+ def _start_local_http_server(self, port=45678):
+ """Start a local HTTP server with a 1MB random file for download tests."""
+ # Create temporary directory
+ tmpdir = tempfile.mkdtemp(prefix="snap-test-http-")
+
+ # Generate 1MB random file
+ random_file = os.path.join(tmpdir, "testfile.iso")
+ with open(random_file, "wb") as f:
+ f.write(os.urandom(1024 * 1024)) # 1MB of random bytes
+
+ # Create simple HTML page with download link
+ html_file = os.path.join(tmpdir, "index.html")
+ with open(html_file, "w") as f:
+ f.write(
+ """<!DOCTYPE html>
+<html>
+<head><title>Test Download Page</title></head>
+<body>
+<h1>Download Test</h1>
+<a href="testfile.iso" id="download-link" download="testfile.iso">Download 1MB File</a>
+</body>
+</html>"""
+ )
+
+ # Start http.server as background process
+ server_process = subprocess.Popen(
+ ["python3", "-m", "http.server", str(port)],
+ cwd=tmpdir,
+ stdout=subprocess.DEVNULL,
+ stderr=subprocess.DEVNULL,
+ )
+
+ # Give server time to start
+ time.sleep(0.5)
+
+ self._logger.info(f"Started local HTTP server on port {port} in {tmpdir}")
+ return server_process, tmpdir
+
+ def _stop_local_http_server(self, server_process, tmpdir):
+ """Stop the local HTTP server and clean up."""
+ if server_process:
+ server_process.terminate()
+ server_process.wait()
+ self._logger.info("Stopped local HTTP server")
+
+ # Clean up temporary directory
+ if tmpdir and os.path.exists(tmpdir):
+ import shutil
+
+ shutil.rmtree(tmpdir)
+
def _test_audio_playback(
self, url, iframe_selector=None, click_to_play=False, video_selector=None
):
@@ -684,13 +738,13 @@ class QATests(SnapTestsBase):
download_button.click()
time.sleep(1)
- blocked_item = self._wait.until(
+ download_item = self._wait.until(
EC.visibility_of_element_located(
(By.CSS_SELECTOR, ".download-state .downloadTarget")
)
)
- blocked_item.click()
- download_name = blocked_item.get_property("value")
+ download_item.click()
+ download_name = download_item.get_property("value")
download_allow = self._wait.until(
EC.presence_of_element_located(
@@ -719,6 +773,7 @@ class QATests(SnapTestsBase):
)
)
download_name = download_item.get_property("value")
+ self._logger.info(f"Waiting for download: {download_name}")
download_progress = self._wait.until(
EC.presence_of_element_located(
@@ -726,7 +781,7 @@ class QATests(SnapTestsBase):
)
)
self._logger.info(
- "Download process {}".format(download_progress.get_property("value"))
+ "Download progress {}%".format(download_progress.get_property("value"))
)
try:
@@ -782,17 +837,23 @@ class QATests(SnapTestsBase):
)
self._driver.set_context("content")
- def open_lafibre(self):
+ def open_local(self):
self.enable_downloads_debug()
- download_site = self.open_tab("https://ip.lafibre.info/connectivite.php")
+ # Start local HTTP server with test file
+ server_process, tmpdir = self._start_local_http_server(port=45678)
+ # Store server info for cleanup
+ self._http_server = server_process
+ self._http_tmpdir = tmpdir
+ # Open local test page
+ download_site = self.open_tab("http://localhost:45678/")
return download_site
- def get_lafibre_1M(self):
+ def get_local_1M(self):
return self._wait.until(
EC.presence_of_element_located(
(
- By.CSS_SELECTOR,
- ".tableau tbody tr td a",
+ By.ID,
+ "download-link",
)
)
)
@@ -802,8 +863,8 @@ class QATests(SnapTestsBase):
C1756713
"""
- download_site = self.open_lafibre()
- extra_small = self.get_lafibre_1M()
+ download_site = self.open_local()
+ extra_small = self.get_local_1M()
self._driver.execute_script("arguments[0].click();", extra_small)
download_name = self.accept_download()
@@ -846,6 +907,11 @@ class QATests(SnapTestsBase):
self._logger.info(f"Download 2 assert: {download_2}")
assert os.path.isfile(download_2), "downloaded file #2 should exists"
+ # Cleanup local HTTP server
+ self._stop_local_http_server(self._http_server, self._http_tmpdir)
+ self._http_server = None
+ self._http_tmpdir = None
+
return True
def test_download_folder_removal(self, exp):
@@ -853,8 +919,8 @@ class QATests(SnapTestsBase):
C1756715
"""
- download_site = self.open_lafibre()
- extra_small = self.get_lafibre_1M()
+ download_site = self.open_local()
+ extra_small = self.get_local_1M()
with tempfile.TemporaryDirectory(
dir=os.environ.get("HOME"), prefix="snap-test-download-rm"
@@ -926,6 +992,11 @@ class QATests(SnapTestsBase):
self._driver.set_context("content")
+ # Cleanup local HTTP server
+ self._stop_local_http_server(self._http_server, self._http_tmpdir)
+ self._http_server = None
+ self._http_tmpdir = None
+
return True