You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
5.2 KiB
145 lines
5.2 KiB
# Copyright 2019 The Pigweed Authors
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
# use this file except in compliance with the License. You may obtain a copy of
|
|
# the License at
|
|
#
|
|
# https://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations under
|
|
# the License.
|
|
"""Tests for pw_module.check."""
|
|
|
|
import logging
|
|
import pathlib
|
|
import shutil
|
|
import tempfile
|
|
import unittest
|
|
|
|
import pw_module.check
|
|
|
|
_LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class TestWithTempDirectory(unittest.TestCase):
|
|
"""Tests for pw_module.check."""
|
|
def setUp(self):
|
|
# Create a temporary directory for the test.
|
|
self.test_dir = tempfile.mkdtemp()
|
|
|
|
def tearDown(self):
|
|
# Remove it after the test.
|
|
shutil.rmtree(self.test_dir)
|
|
|
|
def create_file(self, path, contents=''):
|
|
"""Create a file and any directories assuming '/' path separator"""
|
|
full_file_path = pathlib.Path(self.test_dir, path)
|
|
if full_file_path.exists():
|
|
raise Exception(f'File exists already: {path}')
|
|
|
|
# Make parent directories if they don't exsit.
|
|
full_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
|
|
with open(full_file_path, 'w') as fd:
|
|
fd.write(contents)
|
|
|
|
return full_file_path
|
|
|
|
def assert_no_issues(self, checker, directory=None):
|
|
if directory is not None:
|
|
directory = str(pathlib.Path(self.test_dir, directory))
|
|
else:
|
|
directory = self.test_dir
|
|
return self.assertFalse(list(checker(directory)))
|
|
|
|
def assert_issue(self, checker, match, directory=None):
|
|
if directory is not None:
|
|
directory = str(pathlib.Path(self.test_dir, directory))
|
|
else:
|
|
directory = self.test_dir
|
|
issues = list(checker(directory))
|
|
self.assertTrue(any((match in issue.message) for issue in issues))
|
|
|
|
# Have Python code --> have setup.py.
|
|
def test_pwck001_have_setup_py(self):
|
|
# Python files; no setup --> error.
|
|
self.create_file('pw_foo/py/pw_foo/__init__.py')
|
|
self.create_file('pw_foo/py/pw_foo/bar.py')
|
|
self.assert_issue(pw_module.check.check_python_proper_module,
|
|
'setup.py')
|
|
|
|
# Python files; have setup.py --> ok.
|
|
self.create_file('pw_foo/py/setup.py')
|
|
self.assert_no_issues(pw_module.check.check_python_proper_module)
|
|
|
|
# Have C++ code --> have C++ tests.
|
|
def test_pwck002_have_python_tests(self):
|
|
self.create_file('pw_foo/public/foo.h')
|
|
self.create_file('pw_foo/foo.cc')
|
|
self.assert_issue(pw_module.check.check_have_cc_tests, 'tests')
|
|
|
|
self.create_file('pw_foo/foo_test.cc')
|
|
self.assert_no_issues(pw_module.check.check_have_cc_tests)
|
|
|
|
# Have Python code --> have Python tests.
|
|
def test_pwck003_have_python_tests(self):
|
|
self.create_file('pw_foo/py/pw_foo/__init__.py')
|
|
self.create_file('pw_foo/py/setup.py')
|
|
self.assert_issue(pw_module.check.check_have_python_tests, 'tests')
|
|
|
|
self.create_file('pw_foo/py/foo_test.py')
|
|
self.assert_no_issues(pw_module.check.check_have_python_tests)
|
|
|
|
# Have README.md
|
|
def test_pwck004_have_readme(self):
|
|
self.assert_issue(pw_module.check.check_has_readme, 'README')
|
|
self.create_file('README.md')
|
|
self.assert_no_issues(pw_module.check.check_has_readme)
|
|
|
|
# Have ReST docs of some kind
|
|
def test_pwck005_have_rst_docs(self):
|
|
checker = pw_module.check.check_has_rst_docs
|
|
self.assert_issue(checker, 'ReST')
|
|
self.create_file('pw_foo/docs.rst')
|
|
self.assert_no_issues(checker)
|
|
|
|
# Have ReST docs of some kind
|
|
def test_pwck006_have_public_or_override_headers(self):
|
|
checker = pw_module.check.check_has_public_or_override_headers
|
|
module_name = 'pw_foo'
|
|
|
|
# Only have a doc? Great.
|
|
self.create_file('pw_foo/docs.rst')
|
|
self.assert_no_issues(checker, directory=module_name)
|
|
|
|
# CC files with no public header --> error.
|
|
self.create_file('pw_foo/implementation.cc')
|
|
self.create_file('pw_foo/implementation_test.cc')
|
|
self.assert_issue(checker, 'public/pw_foo', directory=module_name)
|
|
|
|
# CC files with public header in unmatched module folder --> error.
|
|
bad_header = self.create_file('pw_foo/public/wrong/foo.h')
|
|
self.assert_issue(checker, 'public/pw_foo', directory=module_name)
|
|
|
|
# Remove the "bad" header.
|
|
bad_header_parent = bad_header.parent
|
|
bad_header.unlink()
|
|
bad_header_parent.rmdir()
|
|
|
|
# Finally create the correct header.
|
|
self.create_file('pw_foo/public/pw_foo/baz.h')
|
|
self.assert_no_issues(checker, directory=module_name)
|
|
|
|
# Reject if there are multiple directories in public/...
|
|
self.create_file('pw_foo/public/fake/fake.h')
|
|
self.assert_issue(checker, 'multiple', directory=module_name)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
|
|
unittest.main()
|