blob: 051a938a4be30212d30e11af90c8aa345185f7ba [file] [log] [blame]
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
import shutil
import tempfile
import unittest
import chrome_cache
LOADING_DIR = os.path.dirname(os.path.abspath(__file__))
THIS_BASEMAME = os.path.basename(__file__)
class CacheDirectoryTest(unittest.TestCase):
def setUp(self):
self._temp_dir = tempfile.mkdtemp()
def tearDown(self):
shutil.rmtree(self._temp_dir)
def GetTempPath(self, temp_name):
return os.path.join(self._temp_dir, temp_name)
def CreateNewGarbageFile(self, file_path):
assert not os.path.exists(file_path)
with open(file_path, 'w') as f:
f.write('garbage content')
assert os.path.isfile(file_path)
@classmethod
def CompareDirectories(cls, reference_path, generated_path):
def CompareNode(relative_path):
reference_stat = os.stat(os.path.join(reference_path, relative_path))
generated_stat = os.stat(os.path.join(generated_path, relative_path))
assert int(reference_stat.st_mtime) == int(generated_stat.st_mtime), \
"{}: invalid mtime.".format(relative_path)
for reference_parent_path, dir_names, file_names in os.walk(reference_path):
parent_path = os.path.relpath(reference_parent_path, reference_path)
reference_nodes = sorted(dir_names + file_names)
generated_nodes = sorted(os.listdir(
os.path.join(generated_path, parent_path)))
assert reference_nodes == generated_nodes, \
'{}: directory entries don\'t match.'.format(parent_path)
for node in file_names:
CompareNode(os.path.join(parent_path, node))
CompareNode(parent_path)
def testCompareDirectories(self):
generated_path = self.GetTempPath('dir0')
shutil.copytree(LOADING_DIR, generated_path)
self.CompareDirectories(LOADING_DIR, generated_path)
generated_path = self.GetTempPath('dir1')
shutil.copytree(LOADING_DIR, generated_path)
self.CreateNewGarbageFile(os.path.join(generated_path, 'garbage'))
assert 'garbage' in os.listdir(generated_path)
with self.assertRaisesRegexp(AssertionError, r'^.* match\.$'):
self.CompareDirectories(LOADING_DIR, generated_path)
generated_path = self.GetTempPath('dir2')
shutil.copytree(LOADING_DIR, generated_path)
self.CreateNewGarbageFile(os.path.join(generated_path, 'testdata/garbage'))
with self.assertRaisesRegexp(AssertionError, r'^.* match\.$'):
self.CompareDirectories(LOADING_DIR, generated_path)
generated_path = self.GetTempPath('dir3')
shutil.copytree(LOADING_DIR, generated_path)
os.remove(os.path.join(generated_path, THIS_BASEMAME))
with self.assertRaisesRegexp(AssertionError, r'^.* match\.$'):
self.CompareDirectories(LOADING_DIR, generated_path)
self.CreateNewGarbageFile(os.path.join(generated_path, 'garbage'))
with self.assertRaisesRegexp(AssertionError, r'^.* match\.$'):
self.CompareDirectories(LOADING_DIR, generated_path)
def TouchHelper(temp_name, relative_name, timestamps):
generated_path = self.GetTempPath(temp_name)
shutil.copytree(LOADING_DIR, generated_path)
os.utime(os.path.join(generated_path, relative_name), timestamps)
with self.assertRaisesRegexp(AssertionError, r'^.* invalid mtime\.$'):
self.CompareDirectories(LOADING_DIR, generated_path)
TouchHelper('dir4', THIS_BASEMAME, (1256925858, 1256463122))
TouchHelper('dir5', 'testdata', (1256918318, 1256568641))
TouchHelper('dir6', 'trace_test/test_server.py', (1255116211, 1256156632))
TouchHelper('dir7', './', (1255115332, 1256251864))
def testCacheArchive(self):
zip_dest = self.GetTempPath('cache.zip')
chrome_cache.ZipDirectoryContent(LOADING_DIR, zip_dest)
unzip_dest = self.GetTempPath('cache')
chrome_cache.UnzipDirectoryContent(zip_dest, unzip_dest)
self.CompareDirectories(LOADING_DIR, unzip_dest)
self.CreateNewGarbageFile(os.path.join(unzip_dest, 'garbage'))
chrome_cache.UnzipDirectoryContent(zip_dest, unzip_dest)
self.CompareDirectories(LOADING_DIR, unzip_dest)
unzip_dest = self.GetTempPath('foo/bar/cache')
chrome_cache.UnzipDirectoryContent(zip_dest, unzip_dest)
self.CompareDirectories(LOADING_DIR, unzip_dest)
def testCopyCacheDirectory(self):
copy_dest = self.GetTempPath('cache')
chrome_cache.CopyCacheDirectory(LOADING_DIR, copy_dest)
self.CompareDirectories(LOADING_DIR, copy_dest)
self.CreateNewGarbageFile(os.path.join(copy_dest, 'garbage'))
chrome_cache.CopyCacheDirectory(LOADING_DIR, copy_dest)
self.CompareDirectories(LOADING_DIR, copy_dest)
copy_dest = self.GetTempPath('foo/bar/cache')
chrome_cache.CopyCacheDirectory(LOADING_DIR, copy_dest)
self.CompareDirectories(LOADING_DIR, copy_dest)
if __name__ == '__main__':
unittest.main()