| Index: tools/checkteamtags/extract_components_test.py
|
| diff --git a/tools/checkteamtags/extract_components_test.py b/tools/checkteamtags/extract_components_test.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b9111659f4f1a1a7ed630e6ec7b503045de2e66a
|
| --- /dev/null
|
| +++ b/tools/checkteamtags/extract_components_test.py
|
| @@ -0,0 +1,126 @@
|
| +# Copyright 2017 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import json
|
| +import os
|
| +import sys
|
| +import unittest
|
| +
|
| +from StringIO import StringIO
|
| +
|
| +import extract_components
|
| +
|
| +SRC = os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir)
|
| +sys.path.append(os.path.join(SRC, 'third_party', 'pymock'))
|
| +
|
| +import mock
|
| +
|
| +def mock_file_tree(tree):
|
| + os_walk_mocks = []
|
| + file_mocks = {}
|
| + for path in tree:
|
| + os_walk_mocks.append((path, ('ignored'), ('OWNERS', 'dummy.cc')))
|
| + file_mocks[os.path.join(path, 'OWNERS')] = tree[path]
|
| +
|
| + def custom_mock_open(files_data):
|
| + def inner_open(path, mode='r'):
|
| + ret_val = mock.MagicMock()
|
| + if path in files_data and mode == 'r':
|
| +
|
| + class mock_opened_file(object):
|
| + def __enter__(self, *args, **kwargs):
|
| + return self
|
| +
|
| + def __iter__(self, *args, **kwargs):
|
| + return iter(files_data[path].splitlines())
|
| +
|
| + def __exit__(self, *args, **kwargs):
|
| + pass
|
| +
|
| + ret_val = mock_opened_file()
|
| + return ret_val
|
| + return inner_open
|
| +
|
| + def wrapper(func):
|
| + @mock.patch('owners_file_tags.open', custom_mock_open(file_mocks),
|
| + create=True)
|
| + @mock.patch('os.walk', mock.MagicMock(return_value=os_walk_mocks))
|
| + def inner(*args, **kwargs):
|
| + return func(*args, **kwargs)
|
| + return inner
|
| + return wrapper
|
| +
|
| +
|
| +
|
| +class ExtractComponentsTest(unittest.TestCase):
|
| +
|
| + @mock_file_tree({
|
| + 'src': 'boss@chromium.org\n',
|
| + 'src/dummydir1': 'dummy@chromium.org\n'
|
| + '# TEAM: dummy-team@chromium.org\n'
|
| + '# COMPONENT: Dummy>Component',
|
| + 'src/dummydir2': 'dummy2@chromium.org\n'
|
| + '# TEAM: other-dummy-team@chromium.org\n'
|
| + '# COMPONENT: Components>Component2',
|
| + 'src/dummydir1/innerdir1': 'dummy@chromium.org\n'
|
| + '# TEAM: dummy-specialist-team@chromium.org\n'
|
| + '# COMPONENT: Dummy>Component>Subcomponent'})
|
| + def testBaseCase(self):
|
| + saved_output = StringIO()
|
| + with mock.patch('sys.stdout', saved_output):
|
| + error_code = extract_components.main(['%prog'])
|
| + self.assertEqual(0, error_code)
|
| + result_minus_readme = json.loads(saved_output.getvalue())
|
| + del result_minus_readme['AAA-README']
|
| + self.assertEqual(result_minus_readme, {
|
| + 'component-to-team': {
|
| + 'Components>Component2': 'other-dummy-team@chromium.org',
|
| + 'Dummy>Component': 'dummy-team@chromium.org',
|
| + 'Dummy>Component>Subcomponent': 'dummy-specialist-team@chromium.org'
|
| + },
|
| + 'dir-to-component': {
|
| + 'tools/checkteamtags/src/dummydir1': 'Dummy>Component',
|
| + 'tools/checkteamtags/src/dummydir1/innerdir1':
|
| + 'Dummy>Component>Subcomponent',
|
| + 'tools/checkteamtags/src/dummydir2': 'Components>Component2'
|
| + }})
|
| +
|
| + @mock_file_tree({
|
| + 'src': 'boss@chromium.org\n',
|
| + 'src/dummydir1': 'dummy@chromium.org\n'
|
| + '# TEAM: dummy-team@chromium.org\n'
|
| + '# COMPONENT: Dummy>Component',
|
| + 'src/dummydir2': 'dummy2@chromium.org\n'
|
| + '# TEAM: other-dummy-team@chromium.org\n'
|
| + '# COMPONENT: Dummy>Component',
|
| + 'src/dummydir1/innerdir1': 'dummy@chromium.org\n'
|
| + '# TEAM: dummy-specialist-team@chromium.org\n'
|
| + '# COMPONENT: Dummy>Component>Subcomponent'})
|
| + def testMultipleTeamsOneComponent(self):
|
| + saved_output = StringIO()
|
| + with mock.patch('sys.stdout', saved_output):
|
| + error_code = extract_components.main(['%prog', '-w'])
|
| + self.assertNotEqual(0, error_code)
|
| + output = saved_output.getvalue()
|
| + self.assertIn('has more than one team assigned to it', output)
|
| + self.assertIn('Not writing to file', output)
|
| +
|
| + @mock_file_tree({
|
| + 'src': 'boss@chromium.org\n',
|
| + 'src/dummydir1': 'dummy@chromium.org\n'
|
| + '# TEAM: dummy-team@chromium.org\n'
|
| + '# COMPONENT: Dummy>Component',
|
| + 'src/dummydir2': 'dummy2@chromium.org\n'
|
| + '# TEAM: other-dummy-team@chromium.org\n'
|
| + '# COMPONENT: Dummy>Component',
|
| + 'src/dummydir1/innerdir1': 'dummy@chromium.org\n'
|
| + '# TEAM: dummy-specialist-team@chromium.org\n'
|
| + '# COMPONENT: Dummy>Component>Subcomponent'})
|
| + def testVerbose(self):
|
| + saved_output = StringIO()
|
| + with mock.patch('sys.stdout', saved_output):
|
| + extract_components.main(['%prog', '-v'])
|
| + output = saved_output.getvalue()
|
| + self.assertIn('src/OWNERS has no COMPONENT tag', output)
|
| +
|
|
|