blob: fe06a728e27bc18af91b4abb2c7833f54967a8e2 [file] [log] [blame]
# -*- 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')