summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/test/backend/test_partialconfigenvironment.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/test/backend/test_partialconfigenvironment.py')
-rw-r--r--python/mozbuild/mozbuild/test/backend/test_partialconfigenvironment.py173
1 files changed, 173 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/test/backend/test_partialconfigenvironment.py b/python/mozbuild/mozbuild/test/backend/test_partialconfigenvironment.py
new file mode 100644
index 0000000000..13b1656981
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/backend/test_partialconfigenvironment.py
@@ -0,0 +1,173 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import os
+import unittest
+from shutil import rmtree
+from tempfile import mkdtemp
+
+import buildconfig
+import mozpack.path as mozpath
+from mozunit import main
+
+from mozbuild.backend.configenvironment import PartialConfigEnvironment
+
+config = {
+ "defines": {
+ "MOZ_FOO": "1",
+ "MOZ_BAR": "2",
+ },
+ "substs": {
+ "MOZ_SUBST_1": "1",
+ "MOZ_SUBST_2": "2",
+ "CPP": "cpp",
+ },
+}
+
+
+class TestPartial(unittest.TestCase):
+ def setUp(self):
+ self._old_env = dict(os.environ)
+
+ def tearDown(self):
+ os.environ.clear()
+ os.environ.update(self._old_env)
+
+ def _objdir(self):
+ objdir = mkdtemp(dir=buildconfig.topsrcdir)
+ self.addCleanup(rmtree, objdir)
+ return objdir
+
+ def test_auto_substs(self):
+ """Test the automatically set values of ACDEFINES, and ALLDEFINES"""
+ env = PartialConfigEnvironment(self._objdir())
+ env.write_vars(config)
+ self.assertEqual(env.substs["ACDEFINES"], "-DMOZ_BAR=2 -DMOZ_FOO=1")
+ self.assertEqual(
+ env.defines["ALLDEFINES"],
+ {
+ "MOZ_BAR": "2",
+ "MOZ_FOO": "1",
+ },
+ )
+
+ def test_remove_subst(self):
+ """Test removing a subst from the config. The file should be overwritten with 'None'"""
+ env = PartialConfigEnvironment(self._objdir())
+ path = mozpath.join(env.topobjdir, "config.statusd", "substs", "MYSUBST")
+ myconfig = config.copy()
+ env.write_vars(myconfig)
+ with self.assertRaises(KeyError):
+ _ = env.substs["MYSUBST"]
+ self.assertFalse(os.path.exists(path))
+
+ myconfig["substs"]["MYSUBST"] = "new"
+ env.write_vars(myconfig)
+
+ self.assertEqual(env.substs["MYSUBST"], "new")
+ self.assertTrue(os.path.exists(path))
+
+ del myconfig["substs"]["MYSUBST"]
+ env.write_vars(myconfig)
+ with self.assertRaises(KeyError):
+ _ = env.substs["MYSUBST"]
+ # Now that the subst is gone, the file still needs to be present so that
+ # make can update dependencies correctly. Overwriting the file with
+ # 'None' is the same as deleting it as far as the
+ # PartialConfigEnvironment is concerned, but make can't track a
+ # dependency on a file that doesn't exist.
+ self.assertTrue(os.path.exists(path))
+
+ def _assert_deps(self, env, deps):
+ deps = sorted(
+ [
+ "$(wildcard %s)" % (mozpath.join(env.topobjdir, "config.statusd", d))
+ for d in deps
+ ]
+ )
+ self.assertEqual(sorted(env.get_dependencies()), deps)
+
+ def test_dependencies(self):
+ """Test getting dependencies on defines and substs."""
+ env = PartialConfigEnvironment(self._objdir())
+ env.write_vars(config)
+ self._assert_deps(env, [])
+
+ self.assertEqual(env.defines["MOZ_FOO"], "1")
+ self._assert_deps(env, ["defines/MOZ_FOO"])
+
+ self.assertEqual(env.defines["MOZ_BAR"], "2")
+ self._assert_deps(env, ["defines/MOZ_FOO", "defines/MOZ_BAR"])
+
+ # Getting a define again shouldn't add a redundant dependency
+ self.assertEqual(env.defines["MOZ_FOO"], "1")
+ self._assert_deps(env, ["defines/MOZ_FOO", "defines/MOZ_BAR"])
+
+ self.assertEqual(env.substs["MOZ_SUBST_1"], "1")
+ self._assert_deps(
+ env, ["defines/MOZ_FOO", "defines/MOZ_BAR", "substs/MOZ_SUBST_1"]
+ )
+
+ with self.assertRaises(KeyError):
+ _ = env.substs["NON_EXISTENT"]
+ self._assert_deps(
+ env,
+ [
+ "defines/MOZ_FOO",
+ "defines/MOZ_BAR",
+ "substs/MOZ_SUBST_1",
+ "substs/NON_EXISTENT",
+ ],
+ )
+ self.assertEqual(env.substs.get("NON_EXISTENT"), None)
+
+ def test_set_subst(self):
+ """Test setting a subst"""
+ env = PartialConfigEnvironment(self._objdir())
+ env.write_vars(config)
+
+ self.assertEqual(env.substs["MOZ_SUBST_1"], "1")
+ env.substs["MOZ_SUBST_1"] = "updated"
+ self.assertEqual(env.substs["MOZ_SUBST_1"], "updated")
+
+ # A new environment should pull the result from the file again.
+ newenv = PartialConfigEnvironment(env.topobjdir)
+ self.assertEqual(newenv.substs["MOZ_SUBST_1"], "1")
+
+ def test_env_override(self):
+ """Test overriding a subst with an environment variable"""
+ env = PartialConfigEnvironment(self._objdir())
+ env.write_vars(config)
+
+ self.assertEqual(env.substs["MOZ_SUBST_1"], "1")
+ self.assertEqual(env.substs["CPP"], "cpp")
+
+ # Reset the environment and set some environment variables.
+ env = PartialConfigEnvironment(env.topobjdir)
+ os.environ["MOZ_SUBST_1"] = "subst 1 environ"
+ os.environ["CPP"] = "cpp environ"
+
+ # The MOZ_SUBST_1 should be overridden by the environment, while CPP is
+ # a special variable and should not.
+ self.assertEqual(env.substs["MOZ_SUBST_1"], "subst 1 environ")
+ self.assertEqual(env.substs["CPP"], "cpp")
+
+ def test_update(self):
+ """Test calling update on the substs or defines pseudo dicts"""
+ env = PartialConfigEnvironment(self._objdir())
+ env.write_vars(config)
+
+ mysubsts = {"NEW": "new"}
+ mysubsts.update(env.substs.iteritems())
+ self.assertEqual(mysubsts["NEW"], "new")
+ self.assertEqual(mysubsts["CPP"], "cpp")
+
+ mydefines = {"DEBUG": "1"}
+ mydefines.update(env.defines.iteritems())
+ self.assertEqual(mydefines["DEBUG"], "1")
+ self.assertEqual(mydefines["MOZ_FOO"], "1")
+
+
+if __name__ == "__main__":
+ main()