summaryrefslogtreecommitdiffstats
path: root/config/tests/test_mozbuild_reading.py
diff options
context:
space:
mode:
Diffstat (limited to 'config/tests/test_mozbuild_reading.py')
-rw-r--r--config/tests/test_mozbuild_reading.py116
1 files changed, 116 insertions, 0 deletions
diff --git a/config/tests/test_mozbuild_reading.py b/config/tests/test_mozbuild_reading.py
new file mode 100644
index 000000000..8bfcd9f4e
--- /dev/null
+++ b/config/tests/test_mozbuild_reading.py
@@ -0,0 +1,116 @@
+# 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/.
+
+from __future__ import unicode_literals
+
+import os
+import sys
+import unittest
+
+from mozunit import main
+
+from mozbuild.base import MozbuildObject
+from mozpack.files import FileFinder
+from mozbuild.frontend.context import Files
+from mozbuild.frontend.reader import (
+ BuildReader,
+ EmptyConfig,
+)
+
+
+class TestMozbuildReading(unittest.TestCase):
+ # This hack is needed to appease running in automation.
+ def setUp(self):
+ self._old_env = dict(os.environ)
+ os.environ.pop('MOZCONFIG', None)
+ os.environ.pop('MOZ_OBJDIR', None)
+
+ def tearDown(self):
+ os.environ.clear()
+ os.environ.update(self._old_env)
+
+ def _mozbuilds(self, reader):
+ if not hasattr(self, '_mozbuild_paths'):
+ self._mozbuild_paths = set(reader.all_mozbuild_paths())
+
+ return self._mozbuild_paths
+
+ @unittest.skip('failing in SpiderMonkey builds')
+ def test_filesystem_traversal_reading(self):
+ """Reading moz.build according to filesystem traversal works.
+
+ We attempt to read every known moz.build file via filesystem traversal.
+
+ If this test fails, it means that metadata extraction will fail.
+ """
+ mb = MozbuildObject.from_environment(detect_virtualenv_mozinfo=False)
+ config = mb.config_environment
+ reader = BuildReader(config)
+ all_paths = self._mozbuilds(reader)
+ paths, contexts = reader.read_relevant_mozbuilds(all_paths)
+ self.assertEqual(set(paths), all_paths)
+ self.assertGreaterEqual(len(contexts), len(paths))
+
+ def test_filesystem_traversal_no_config(self):
+ """Reading moz.build files via filesystem traversal mode with no build config.
+
+ This is similar to the above test except no build config is applied.
+ This will likely fail in more scenarios than the above test because a
+ lot of moz.build files assumes certain variables are present.
+ """
+ here = os.path.abspath(os.path.dirname(__file__))
+ root = os.path.normpath(os.path.join(here, '..', '..'))
+ config = EmptyConfig(root)
+ reader = BuildReader(config)
+ all_paths = self._mozbuilds(reader)
+ paths, contexts = reader.read_relevant_mozbuilds(all_paths)
+ self.assertEqual(set(paths.keys()), all_paths)
+ self.assertGreaterEqual(len(contexts), len(paths))
+
+
+ def test_orphan_file_patterns(self):
+ if sys.platform == 'win32':
+ raise unittest.SkipTest('failing on windows builds')
+
+ mb = MozbuildObject.from_environment(detect_virtualenv_mozinfo=False)
+
+ try:
+ config = mb.config_environment
+ except Exception as e:
+ if e.message == 'config.status not available. Run configure.':
+ raise unittest.SkipTest('failing without config.status')
+ raise
+
+ if config.substs['MOZ_BUILD_APP'] == 'js':
+ raise unittest.SkipTest('failing in Spidermonkey builds')
+
+ reader = BuildReader(config)
+ all_paths = self._mozbuilds(reader)
+ _, contexts = reader.read_relevant_mozbuilds(all_paths)
+
+ finder = FileFinder(config.topsrcdir, find_executables=False,
+ ignore=['obj*'])
+
+ def pattern_exists(pat):
+ return [p for p in finder.find(pat)] != []
+
+ for ctx in contexts:
+ if not isinstance(ctx, Files):
+ continue
+ relsrcdir = ctx.relsrcdir
+ if not pattern_exists(os.path.join(relsrcdir, ctx.pattern)):
+ self.fail("The pattern '%s' in a Files() entry in "
+ "'%s' corresponds to no files in the tree.\n"
+ "Please update this entry." %
+ (ctx.pattern, ctx.main_path))
+ test_files = ctx['IMPACTED_TESTS'].files
+ for p in test_files:
+ if not pattern_exists(os.path.relpath(p.full_path, config.topsrcdir)):
+ self.fail("The pattern '%s' in a dependent tests entry "
+ "in '%s' corresponds to no files in the tree.\n"
+ "Please update this entry." %
+ (p, ctx.main_path))
+
+if __name__ == '__main__':
+ main()