Source code
Revision control
Copy as Markdown
Other Tools
import os
import subprocess
import tempfile
import mozfile
from marionette_driver.marionette import Marionette
from marionette_harness import MarionetteTestCase
class XdgConfigHomeTestCase(MarionetteTestCase):
about_support = "about:support"
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._created_dirs = []
self.tmproot = tempfile.mkdtemp(prefix="mozrunner-xdg_config-test")
self.bin = None
self.tmphome = os.path.join(self.tmproot, "DEFAULT")
self.homedir = self.get_home_root()
self._env = os.environ.copy()
self._env.update({"HOME": self.homedir})
self.process_handler = None
def setUp(self):
super().setUp()
if not self.bin:
self.bin = self.marionette.instance.binary
self._cmd = [
self.bin,
"--headless",
"-marionette",
"-remote-allow-system-access",
]
self.marionette.quit(in_app=False)
self.client = Marionette(host="127.0.0.1", port=2828)
self.start()
self.client.start_session()
def tearDown(self):
self.process_handler.kill()
self.process_handler.wait()
self.process_handler = None
self.client = None
super().tearDown()
self.cleanup()
def start(self):
self.assert_safe_homedir()
_env = self._env.copy()
self.process_handler = subprocess.Popen(self._cmd, env=self._env)
def assert_safe_homedir(self):
assert (
"mozrunner-xdg_config-test" in self.homedir
), f"HOME is not real user's home: {self.homedir}"
def get_home_root(self):
rv = tempfile.mkdtemp(prefix="{}.".format("run"), dir=self.tmproot)
self._created_dirs.append(rv)
return rv
def make_product_root(self, subpath):
product_root = os.path.join(self.homedir, subpath)
assert not os.path.exists(product_root), f"no {product_root}"
os.makedirs(product_root)
profiles_ini_path = os.path.join(product_root, "profiles.ini")
assert not os.path.exists(profiles_ini_path)
with open(profiles_ini_path, "w") as profiles_ini:
profiles_ini.write(
"""
[General]
StartWithLastProfile=1
Version=2
"""
)
return product_root
def find_one_existing_test_run_directory(self):
dirs = os.listdir(self.tmproot)
test_dir = list(filter(lambda e: e.startswith("run."), dirs))
assert len(test_dir) == 1
return os.path.join(self.tmproot, test_dir[0])
def find_one_profile_run_dir(self):
test_dir_walk = list(os.walk(self.homedir))
maybe_profile = list(
filter(lambda e: "compatibility.ini" in e[2], test_dir_walk)
)
assert len(maybe_profile) == 1
(profile_dir, _, _) = maybe_profile[0]
return profile_dir
def cleanup(self):
for d in self._created_dirs:
mozfile.remove(d)
assert not os.path.exists(d)
if self.tmproot:
mozfile.remove(self.tmproot)
assert not os.path.exists(self.tmproot)
def get_process_env_value(self, name):
with self.client.using_context(self.client.CONTEXT_CHROME):
rv = self.client.execute_script(
f"""
return Services.env.get("{name}");
"""
)
return rv
def get_profile_dir(self):
with self.client.using_context(self.client.CONTEXT_CHROME):
rv = self.client.execute_script(
"""
return Services.dirsvc.get("ProfD", Ci.nsIFile).path;
"""
)
return rv
def get_asserted_profile_subdir(self):
profile_dir = self.get_profile_dir()
common = os.path.commonpath((self.homedir, profile_dir))
self.assertTrue(
len(common) > 0,
f"Profile dir {profile_dir} is a subdir of homedir: {self.homedir}",
)
return os.path.relpath(profile_dir, self.homedir)