# Copyright 2018 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 from pyfakefs import fake_filesystem_unittest import dependency_manager def _CreateFile(path): """Create file at specific |path|, with specific |content|.""" with open(path, 'wb') as f: f.write('x') def _ChangeFileTime(path, time0, days): new_time = time0 + (days * 24 * 60 * 60) os.utime(path, (new_time, new_time)) class LocalPathInfoTest(fake_filesystem_unittest.TestCase): def setUp(self): self.setUpPyfakefs() def tearDown(self): self.tearDownPyfakefs() def testEmptyInstance(self): path_info = dependency_manager.LocalPathInfo(None) self.assertIsNone(path_info.GetLocalPath()) self.assertFalse(path_info.IsPathInLocalPaths('file.txt')) def testSimpleGroupWithOnePath(self): path_info = dependency_manager.LocalPathInfo(['file.txt']) self.assertTrue(path_info.IsPathInLocalPaths('file.txt')) self.assertFalse(path_info.IsPathInLocalPaths('other.txt')) # GetLocalPath returns None if the file doesn't exist. # Otherwise it will return the file path. self.assertIsNone(path_info.GetLocalPath()) _CreateFile('file.txt') self.assertEqual('file.txt', path_info.GetLocalPath()) def testSimpleGroupsWithMultiplePaths(self): path_info = dependency_manager.LocalPathInfo( [['file1', 'file2', 'file3']]) self.assertTrue(path_info.IsPathInLocalPaths('file1')) self.assertTrue(path_info.IsPathInLocalPaths('file2')) self.assertTrue(path_info.IsPathInLocalPaths('file3')) _CreateFile('file1') _CreateFile('file2') _CreateFile('file3') s = os.stat('file1') time0 = s.st_mtime _ChangeFileTime('file1', time0, 4) _ChangeFileTime('file2', time0, 2) _ChangeFileTime('file3', time0, 0) self.assertEqual('file1', path_info.GetLocalPath()) _ChangeFileTime('file1', time0, 0) _ChangeFileTime('file2', time0, 4) _ChangeFileTime('file3', time0, 2) self.assertEqual('file2', path_info.GetLocalPath()) _ChangeFileTime('file1', time0, 2) _ChangeFileTime('file2', time0, 0) _ChangeFileTime('file3', time0, 4) self.assertEqual('file3', path_info.GetLocalPath()) def testMultipleGroupsWithSinglePaths(self): path_info = dependency_manager.LocalPathInfo( ['file1', 'file2', 'file3']) self.assertTrue(path_info.IsPathInLocalPaths('file1')) self.assertTrue(path_info.IsPathInLocalPaths('file2')) self.assertTrue(path_info.IsPathInLocalPaths('file3')) self.assertIsNone(path_info.GetLocalPath()) _CreateFile('file3') self.assertEqual('file3', path_info.GetLocalPath()) _CreateFile('file2') self.assertEqual('file2', path_info.GetLocalPath()) _CreateFile('file1') self.assertEqual('file1', path_info.GetLocalPath()) def testMultipleGroupsWithMultiplePaths(self): path_info = dependency_manager.LocalPathInfo([ ['file1', 'file2'], ['file3', 'file4']]) self.assertTrue(path_info.IsPathInLocalPaths('file1')) self.assertTrue(path_info.IsPathInLocalPaths('file2')) self.assertTrue(path_info.IsPathInLocalPaths('file3')) self.assertTrue(path_info.IsPathInLocalPaths('file4')) _CreateFile('file1') _CreateFile('file3') s = os.stat('file1') time0 = s.st_mtime # Check that file1 is always returned, even if it is not the most recent # file, because it is part of the first group and exists. _ChangeFileTime('file1', time0, 2) _ChangeFileTime('file3', time0, 0) self.assertEqual('file1', path_info.GetLocalPath()) _ChangeFileTime('file1', time0, 0) _ChangeFileTime('file3', time0, 2) self.assertEqual('file1', path_info.GetLocalPath()) def testUpdate(self): path_info1 = dependency_manager.LocalPathInfo( [['file1', 'file2']]) # One group with two files. path_info2 = dependency_manager.LocalPathInfo( ['file1', 'file2', 'file3']) # Three groups self.assertTrue(path_info1.IsPathInLocalPaths('file1')) self.assertTrue(path_info1.IsPathInLocalPaths('file2')) self.assertFalse(path_info1.IsPathInLocalPaths('file3')) _CreateFile('file3') self.assertIsNone(path_info1.GetLocalPath()) path_info1.Update(path_info2) self.assertTrue(path_info1.IsPathInLocalPaths('file1')) self.assertTrue(path_info1.IsPathInLocalPaths('file2')) self.assertTrue(path_info1.IsPathInLocalPaths('file3')) self.assertEqual('file3', path_info1.GetLocalPath()) _CreateFile('file1') time0 = os.stat('file1').st_mtime _ChangeFileTime('file3', time0, 2) # Make file3 more recent. # Check that file3 is in a later group. self.assertEqual('file1', path_info1.GetLocalPath())