| # -*- coding: utf-8 -*- |
| # Copyright (c) 2012 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. |
| |
| """Test the filelib module.""" |
| |
| from __future__ import print_function |
| |
| import base64 |
| import os |
| |
| from chromite.lib import cros_build_lib |
| from chromite.lib import cros_test_lib |
| from chromite.lib import osutils |
| from chromite.lib.paygen import filelib |
| |
| |
| class TestFileLib(cros_test_lib.TempDirTestCase): |
| """Test filelib module. |
| |
| Note: We use tools for hashes to avoid relying on hashlib since that's what |
| the filelib module uses. We want to verify things rather than have a single |
| hashlib bug break both the code and the tests. |
| """ |
| |
| @staticmethod |
| def _ShaSum(util, file_path): |
| """Use external shasum utility to get hash of a file. |
| |
| We use the external utility rather than hashlib as our filelib module is |
| based on hashlib, and we'd like to have an independent implementation to |
| compare against (rather than the two modules be bug-for-bug compatible). |
| """ |
| # The shasum utility returns hashes in base 16 encoding. We need base 64. |
| hash16 = cros_build_lib.run( |
| [util, file_path], stdout=True).output.split(b' ')[0] |
| hashbytes = base64.b16decode(hash16, True) |
| hash64 = base64.b64encode(hashbytes) |
| return hash64.rstrip().decode('utf-8') |
| |
| def testShaSums(self): |
| file_path = os.path.abspath(__file__) |
| expected_sha1 = self._ShaSum('sha1sum', file_path) |
| expected_sha256 = self._ShaSum('sha256sum', file_path) |
| sha1, sha256 = filelib.ShaSums(file_path) |
| self.assertEqual(expected_sha1, sha1) |
| self.assertEqual(expected_sha256, sha256) |
| |
| def testCopyIntoExistingDir(self): |
| """Copy a file into a dir that exists.""" |
| path1 = os.path.join(self.tempdir, 'path1') |
| subdir = os.path.join(self.tempdir, 'subdir') |
| path2 = os.path.join(subdir, 'path2') |
| |
| osutils.Touch(path1) |
| osutils.SafeMakedirs(subdir) |
| |
| filelib.Copy(path1, path2) |
| self.assertExists(path2) |
| |
| def testCopyIntoNewDir(self): |
| """Copy a file into a dir that does not yet exist.""" |
| path1 = os.path.join(self.tempdir, 'path1') |
| subdir = os.path.join(self.tempdir, 'subdir') |
| path2 = os.path.join(subdir, 'path2') |
| |
| osutils.Touch(path1) |
| |
| filelib.Copy(path1, path2) |
| self.assertExists(path2) |
| |
| def testCopyRelative(self): |
| """Copy a file using relative destination.""" |
| path1 = os.path.join(self.tempdir, 'path1') |
| path2 = os.path.join(self.tempdir, 'path2') |
| relative_path = os.path.basename(path2) |
| |
| os.chdir(self.tempdir) |
| osutils.Touch(path1) |
| |
| filelib.Copy(path1, relative_path) |
| self.assertExists(path2) |
| |
| def testCopyFileSegment(self): |
| """Test copying on a simple file segment.""" |
| a = os.path.join(self.tempdir, 'a.txt') |
| osutils.WriteFile(a, b'7\xee9', mode='wb') |
| b = os.path.join(self.tempdir, 'b.txt') |
| osutils.WriteFile(b, b'0123\xff', mode='wb') |
| filelib.CopyFileSegment(a, 'rb', 2, b, 'r+b', in_seek=1) |
| self.assertEqual(osutils.ReadFile(b, mode='rb'), b'\xee923\xff') |