| # Copyright 2019 The Bazel Authors. All rights reserved. |
| # |
| # 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 |
| # |
| # http://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. |
| |
| """Test that the rules_pkg distribution is usable.""" |
| |
| import os |
| import re |
| import subprocess |
| import unittest |
| |
| from python.runfiles import runfiles |
| from pkg.releasing import release_tools |
| from distro import release_version |
| |
| _VERBOSE = True |
| |
| |
| class PackagingTest(unittest.TestCase): |
| """Test the distribution packaging.""" |
| |
| def setUp(self): |
| self.data_files = runfiles.Create() |
| self.source_repo = 'rules_pkg' |
| self.dest_repo = 'not_named_rules_pkg' |
| self.version = release_version.RELEASE_VERSION |
| |
| def testVersionsMatch(self): |
| """version.bzl must match MODULE.bazel""" |
| module_bazel_path = self.data_files.Rlocation( |
| 'rules_pkg/MODULE.bazel') |
| with open(module_bazel_path, encoding="utf-8") as inp: |
| want = 'version = "%s"' % self.version |
| content = inp.read() |
| if _VERBOSE: |
| print('=== Expect', want) |
| m = re.search( |
| r"""module\([^)]+\)""", |
| content, |
| flags=re.MULTILINE|re.DOTALL) |
| self.assertTrue(m) |
| got = m.group() |
| self.assertIn(want, got, 'Expected <%s>, got <%s>' % (want, got)) |
| |
| def testBuild(self): |
| # Set up a fresh Bazel workspace using the currently build repo. |
| tempdir = os.path.join(os.environ['TEST_TMPDIR'], 'build') |
| if not os.path.exists(tempdir): |
| os.makedirs(tempdir) |
| with open(os.path.join(tempdir, 'WORKSPACE'), 'w') as workspace: |
| file_name = release_tools.package_basename(self.source_repo, self.version) |
| # The code looks wrong, but here is why it is correct. |
| # - Rlocation requires '/' as path separators, not os.path.sep. |
| # - When we read the file, the path must use os.path.sep |
| local_path = self.data_files.Rlocation( |
| 'rules_pkg/distro/' + file_name).replace('/', os.path.sep) |
| sha256 = release_tools.get_package_sha256(local_path) |
| workspace_content = '\n'.join(( |
| 'workspace(name = "test_rules_pkg_packaging")', |
| release_tools.workspace_content( |
| 'file://%s' % local_path, self.source_repo, sha256, |
| rename_repo=self.dest_repo, |
| deps_method='rules_pkg_dependencies' |
| ) |
| )) |
| workspace.write(workspace_content) |
| if _VERBOSE: |
| print('=== WORKSPACE ===') |
| print(workspace_content) |
| |
| # We do a little dance of renaming *.tpl to *, mostly so that we do not |
| # have a BUILD file in testdata, which would create a package boundary. |
| def CopyTestFile(source_name, dest_name): |
| source_path = self.data_files.Rlocation( |
| 'rules_pkg/distro/testdata/' + source_name) |
| with open(source_path) as inp: |
| with open(os.path.join(tempdir, dest_name), 'w') as out: |
| content = inp.read() |
| out.write(content) |
| |
| CopyTestFile('BUILD.tpl', 'BUILD') |
| |
| os.chdir(tempdir) |
| build_result = subprocess.check_output(['bazel', 'build', '--enable_workspace', ':dummy_tar']) |
| if _VERBOSE: |
| print('=== Build Result ===') |
| print(build_result) |
| |
| # TODO(aiuto): Find tar in a disciplined way |
| content = subprocess.check_output( |
| ['tar', 'tzf', 'bazel-bin/dummy_tar.tar.gz']) |
| self.assertEqual(b'etc/\netc/BUILD\n', content) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |