| # -*- coding: utf-8 -*- |
| # Copyright 2018 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Tests for tarfile_utils.""" |
| |
| from __future__ import absolute_import |
| from __future__ import division |
| from __future__ import print_function |
| |
| import os |
| import StringIO |
| import subprocess |
| import tarfile |
| import unittest |
| |
| import tarfile_utils |
| |
| |
| class TarfileUtilsTest(unittest.TestCase): |
| """Tests of tarfile_utils.""" |
| |
| def test_list_tar_members_empty_file(self): |
| """Test listing file member of an empty tar.""" |
| tar_tvR = StringIO.StringIO('block 0: ** Block of NULs **\n') |
| self.assertFalse(list(tarfile_utils.list_tar_members(tar_tvR))) |
| |
| def test_list_tar_members_non_empty_file(self): |
| """Test listing file member of an non-empty tar.""" |
| tar_tvR = StringIO.StringIO( |
| 'block 0: mode owner 1 date hour:min\tfilename\n' |
| 'block 2: mode owner 123 date hour:min\tfile name with spaces\n' |
| 'block 4: mode owner 0 date hour:min\tdirectory/\n' |
| 'block 5: mode owner 0 date hour:min\tdirectory/symbol link -> filename' |
| '\n' |
| 'block 6: ** Block of NULs **\n' |
| ) |
| result = list(tarfile_utils.list_tar_members(tar_tvR)) |
| self.assertEqual(result, [ |
| ('filename', 0, 1024, 512, 1), |
| ('file name with spaces', 512 * 2, 1024, 512 * 3, 123), |
| ('directory/', 512 * 4, 512, 512 * 5, 0), |
| ('directory/symbol link -> filename', 512 * 5, 512, 512 * 6, 0) |
| ]) |
| |
| def test_list_tar_member_with_real_tar_file(self): |
| """Using a real tar file to test listing tar member.""" |
| tar_name = os.path.join(os.path.dirname(__file__), |
| 'index_tar_member_testing.tgz') |
| tar_tvR = StringIO.StringIO( |
| subprocess.check_output(['tar', 'tvRzf', tar_name])) |
| members = tarfile_utils.list_tar_members(tar_tvR) |
| with tarfile.open(tar_name, 'r:gz') as tar: |
| for tar_info, result in zip(tar, members): |
| if tar_info.isreg(): |
| name = tar_info.name |
| |
| if tar_info.isdir(): |
| name = '%s/' % tar_info.name |
| |
| if tar_info.issym(): |
| name = '%s -> %s' % (tar_info.name, tar_info.linkname) |
| |
| self.assertEqual(name, result.filename) |
| self.assertEqual(tar_info.offset_data, result.content_start) |
| self.assertEqual(tar_info.size, result.size) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |