mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-04 16:15:25 +00:00
6d01f694ab
We want the ability to read data from any moz.build file without needing a full build configuration (running configure). This will enable tools to consume metadata by merely having a copy of the source code and nothing more. This commit creates the EmptyConfig object. It is a config object that - as its name implies - is empty. It will be used for reading moz.build files in "no config" mode. Many moz.build files make assumptions that variables in CONFIG are defined and that they are strings. We create the EmptyValue type that behaves like an empty unicode string. Since moz.build files also do some type checking, we carve an exemption for EmptyValue, just like we do for None. We add a test to verify that reading moz.build files in "no config" mode works. This required some minor changes to existing moz.build files to make them work in the new execution mode. --HG-- extra : rebase_source : f701417f83dfa4e196e39182f8d0a6fea46c6fbb extra : source : af07351bf2d6e85293ae3edf0fe4ae6cbc0ce246
71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
# 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 unittest
|
|
|
|
from mozunit import main
|
|
|
|
from mozbuild.base import MozbuildObject
|
|
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))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|