# Copyright 2017 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. """Tests for make_rpm.""" from __future__ import absolute_import from __future__ import division from __future__ import print_function import contextlib import os import unittest from tools.build_defs.pkg import make_rpm @contextlib.contextmanager def PrependPath(dirs): with ReplacePath(dirs + [os.environ['PATH']]): yield @contextlib.contextmanager def ReplacePath(dirs): original_path = os.environ['PATH'] try: os.environ['PATH'] = os.pathsep.join(dirs) yield finally: os.environ['PATH'] = original_path def WriteFile(filename, *contents): with open(filename, 'w') as text_file: text_file.write('\n'.join(contents)) def DirExists(dirname): return os.path.exists(dirname) and os.path.isdir(dirname) def FileExists(filename): return os.path.exists(filename) and not os.path.isdir(filename) def FileContents(filename): with open(filename, 'r') as text_file: return [s.strip() for s in text_file.readlines()] class MakeRpmTest(unittest.TestCase): # Python 2 alias if not hasattr(unittest.TestCase, 'assertCountEqual'): def assertCountEqual(self, *args): return self.assertItemsEqual(*args) def testFindOutputFile(self): log = """ Lots of data. Wrote: /path/to/file/here.rpm More data present. """ result = make_rpm.FindOutputFile(log) self.assertEqual('/path/to/file/here.rpm', result) def testFindOutputFile_missing(self): log = """ Lots of data. More data present. """ result = make_rpm.FindOutputFile(log) self.assertEqual(None, result) def testCopyAndRewrite(self): with make_rpm.Tempdir(): WriteFile('test.txt', 'Some: data1', 'Other: data2', 'More: data3') make_rpm.CopyAndRewrite('test.txt', 'out.txt', { 'Some:': 'data1a', 'More:': 'data3a', }) self.assertTrue(FileExists('out.txt')) self.assertCountEqual(['Some: data1a', 'Other: data2', 'More: data3a'], FileContents('out.txt')) def testFindRpmbuild_present(self): with make_rpm.Tempdir() as outer: dummy = os.sep.join([outer, 'rpmbuild']) WriteFile(dummy, 'dummy rpmbuild') os.chmod(dummy, 0o777) with PrependPath([outer]): path = make_rpm.FindRpmbuild() self.assertEqual(dummy, path) def testFindRpmbuild_missing(self): with make_rpm.Tempdir() as outer: with ReplacePath([outer]): with self.assertRaises(make_rpm.NoRpmbuildFound) as context: make_rpm.FindRpmbuild() self.assertIsNotNone(context) def testSetupWorkdir(self): with make_rpm.Tempdir() as outer: dummy = os.sep.join([outer, 'rpmbuild']) WriteFile(dummy, 'dummy rpmbuild') os.chmod(dummy, 0o777) with PrependPath([outer]): # Create the builder and exercise it. builder = make_rpm.RpmBuilder('test', '1.0', '0', 'x86', False) # Create spec_file, test files. WriteFile('test.spec', 'Name: test', 'Version: 0.1', 'Summary: test data') WriteFile('file1.txt', 'Hello') WriteFile('file2.txt', 'Goodbye') builder.AddFiles(['file1.txt', 'file2.txt']) with make_rpm.Tempdir(): # Call RpmBuilder. builder.SetupWorkdir('test.spec', outer) # Make sure files exist. self.assertTrue(DirExists('SOURCES')) self.assertTrue(DirExists('BUILD')) self.assertTrue(DirExists('TMP')) self.assertTrue(FileExists('test.spec')) self.assertCountEqual( ['Name: test', 'Version: 1.0', 'Summary: test data'], FileContents('test.spec')) self.assertTrue(FileExists('BUILD/file1.txt')) self.assertCountEqual(['Hello'], FileContents('BUILD/file1.txt')) self.assertTrue(FileExists('BUILD/file2.txt')) self.assertCountEqual(['Goodbye'], FileContents('BUILD/file2.txt')) if __name__ == '__main__': unittest.main()