subversion_file_system_test.py revision 2385ea399aae016c0806a4f9ef3c9cfe3d2a39df
1#!/usr/bin/env python 2# Copyright (c) 2012 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6import json 7import os 8import sys 9import unittest 10 11from fake_url_fetcher import FakeUrlFetcher 12from file_system import FileNotFoundError, StatInfo 13from future import Future 14from subversion_file_system import SubversionFileSystem 15import test_util 16 17_SHARED_FILE_SYSTEM_TEST_DATA = os.path.join( 18 sys.path[0], 'test_data', 'file_system') 19_SUBVERSION_FILE_SYSTEM_TEST_DATA = os.path.join( 20 sys.path[0], 'test_data', 'subversion_file_system') 21 22def _CreateSubversionFileSystem(path): 23 fetcher = FakeUrlFetcher(path) 24 return SubversionFileSystem(fetcher, fetcher, path) 25 26class SubversionFileSystemTest(unittest.TestCase): 27 def testReadFiles(self): 28 expected = { 29 'test1.txt': 'test1\n', 30 'test2.txt': 'test2\n', 31 'test3.txt': 'test3\n', 32 } 33 file_system = _CreateSubversionFileSystem(_SHARED_FILE_SYSTEM_TEST_DATA) 34 self.assertEqual( 35 expected, 36 file_system.Read(['test1.txt', 'test2.txt', 'test3.txt']).Get()) 37 38 def testListDir(self): 39 expected = ['dir/'] + ['file%d.html' % i for i in range(7)] 40 file_system = _CreateSubversionFileSystem(_SHARED_FILE_SYSTEM_TEST_DATA) 41 self.assertEqual(expected, sorted(file_system.ReadSingle('list/'))) 42 43 def testListSubDir(self): 44 expected = ['empty.txt'] + ['file%d.html' % i for i in range(3)] 45 file_system = _CreateSubversionFileSystem(_SHARED_FILE_SYSTEM_TEST_DATA) 46 self.assertEqual(expected, sorted(file_system.ReadSingle('list/dir/'))) 47 48 def testDirStat(self): 49 file_system = _CreateSubversionFileSystem(_SHARED_FILE_SYSTEM_TEST_DATA) 50 stat_info = file_system.Stat('stat/') 51 expected = StatInfo( 52 '151113', 53 child_versions=json.loads(test_util.ReadFile('%s/stat_result.json' % 54 _SHARED_FILE_SYSTEM_TEST_DATA))) 55 self.assertEqual(expected, stat_info) 56 57 def testFileStat(self): 58 file_system = _CreateSubversionFileSystem(_SHARED_FILE_SYSTEM_TEST_DATA) 59 stat_info = file_system.Stat('stat/extension_api.h') 60 self.assertEqual(StatInfo('146163'), stat_info) 61 62 def testRevisions(self): 63 # This is a super hacky test. Record the path that was fetched then exit the 64 # test. Compare. 65 class ValueErrorFetcher(object): 66 def __init__(self): 67 self.last_fetched = None 68 69 def FetchAsync(self, path): 70 class ThrowsValueError(object): 71 def Get(): raise ValueError() 72 self.last_fetched = path 73 return ThrowsValueError() 74 75 def Fetch(self, path, **kwargs): 76 self.last_fetched = path 77 raise ValueError() 78 79 file_fetcher = ValueErrorFetcher() 80 stat_fetcher = ValueErrorFetcher() 81 svn_path = 'svn:' 82 83 svn_file_system = SubversionFileSystem(file_fetcher, 84 stat_fetcher, 85 svn_path, 86 revision=42) 87 88 self.assertRaises(FileNotFoundError, svn_file_system.ReadSingle, 'dir/file') 89 self.assertEqual('dir/file?p=42', file_fetcher.last_fetched) 90 # Stat() will always stat directories. 91 self.assertRaises(FileNotFoundError, svn_file_system.Stat, 'dir/file') 92 self.assertEqual('dir/?pathrev=42', stat_fetcher.last_fetched) 93 94 self.assertRaises(FileNotFoundError, svn_file_system.ReadSingle, 'dir/') 95 self.assertEqual('dir/?p=42', file_fetcher.last_fetched) 96 self.assertRaises(FileNotFoundError, svn_file_system.Stat, 'dir/') 97 self.assertEqual('dir/?pathrev=42', stat_fetcher.last_fetched) 98 99 def testDirectoryVersionOnDeletion(self): 100 '''Tests the case when the most recent operation on a directory is the 101 deletion of a file. Here it is not enough to take the maximum version of all 102 files in the directory, as we used to, for obvious reasons. 103 ''' 104 file_system = _CreateSubversionFileSystem(_SUBVERSION_FILE_SYSTEM_TEST_DATA) 105 dir_stat = file_system.Stat('docs_public_extensions_214898/') 106 self.assertEqual('214692', dir_stat.version) 107 108 def testEmptyDirectory(self): 109 file_system = _CreateSubversionFileSystem(_SUBVERSION_FILE_SYSTEM_TEST_DATA) 110 dir_stat = file_system.Stat('api_icons_214898/') 111 self.assertEqual('193838', dir_stat.version) 112 self.assertEqual({}, dir_stat.child_versions) 113 114if __name__ == '__main__': 115 unittest.main() 116