subversion_file_system_test.py revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 unittest 9 10from extensions_paths import SERVER2 11from fake_url_fetcher import FakeUrlFetcher 12from file_system import FileSystemError, StatInfo 13from subversion_file_system import SubversionFileSystem 14from test_util import ReadFile, Server2Path 15 16 17_SHARED_FILE_SYSTEM_TEST_DATA = Server2Path('test_data', 'file_system') 18_SUBVERSION_FILE_SYSTEM_TEST_DATA = Server2Path( 19 'test_data', 'subversion_file_system') 20 21 22def _CreateSubversionFileSystem(path): 23 fetcher = FakeUrlFetcher(path) 24 return SubversionFileSystem(fetcher, fetcher, path), fetcher 25 26 27class SubversionFileSystemTest(unittest.TestCase): 28 def testReadFiles(self): 29 expected = { 30 'test1.txt': 'test1\n', 31 'test2.txt': 'test2\n', 32 'test3.txt': 'test3\n', 33 } 34 file_system, fetcher = _CreateSubversionFileSystem( 35 _SHARED_FILE_SYSTEM_TEST_DATA) 36 read_future = file_system.Read(['test1.txt', 'test2.txt', 'test3.txt']) 37 self.assertTrue(*fetcher.CheckAndReset(async_count=3)) 38 self.assertEqual(expected, read_future.Get()) 39 self.assertTrue(*fetcher.CheckAndReset(async_resolve_count=3)) 40 41 def testListDir(self): 42 expected = ['dir/'] + ['file%d.html' % i for i in range(7)] 43 file_system, fetcher = _CreateSubversionFileSystem( 44 _SHARED_FILE_SYSTEM_TEST_DATA) 45 list_future = file_system.ReadSingle('list/') 46 self.assertTrue(*fetcher.CheckAndReset(async_count=1)) 47 self.assertEqual(expected, sorted(list_future.Get())) 48 self.assertTrue(*fetcher.CheckAndReset(async_resolve_count=1)) 49 50 def testListSubDir(self): 51 expected = ['empty.txt'] + ['file%d.html' % i for i in range(3)] 52 file_system, fetcher = _CreateSubversionFileSystem( 53 _SHARED_FILE_SYSTEM_TEST_DATA) 54 list_future = file_system.ReadSingle('list/dir/') 55 self.assertTrue(*fetcher.CheckAndReset(async_count=1)) 56 self.assertEqual(expected, sorted(list_future.Get())) 57 self.assertTrue(*fetcher.CheckAndReset(async_resolve_count=1)) 58 59 def testDirStat(self): 60 file_system, fetcher = _CreateSubversionFileSystem( 61 _SHARED_FILE_SYSTEM_TEST_DATA) 62 stat_info = file_system.Stat('stat/') 63 self.assertTrue(*fetcher.CheckAndReset(sync_count=1)) 64 expected = StatInfo( 65 '151113', 66 child_versions=json.loads(ReadFile( 67 SERVER2, 'test_data', 'file_system', 'stat_result.json'))) 68 self.assertEqual(expected, stat_info) 69 70 def testFileStat(self): 71 file_system, fetcher = _CreateSubversionFileSystem( 72 _SHARED_FILE_SYSTEM_TEST_DATA) 73 stat_info = file_system.Stat('stat/extension_api.h') 74 self.assertTrue(*fetcher.CheckAndReset(sync_count=1)) 75 self.assertEqual(StatInfo('146163'), stat_info) 76 77 def testRevisions(self): 78 # This is a super hacky test. Record the path that was fetched then exit the 79 # test. Compare. 80 class ValueErrorFetcher(object): 81 def __init__(self): 82 self.last_fetched = None 83 84 def FetchAsync(self, path): 85 class ThrowsValueError(object): 86 def Get(self): raise ValueError() 87 self.last_fetched = path 88 return ThrowsValueError() 89 90 def Fetch(self, path, **kwargs): 91 self.last_fetched = path 92 raise ValueError() 93 94 file_fetcher = ValueErrorFetcher() 95 stat_fetcher = ValueErrorFetcher() 96 svn_path = 'svn:' 97 98 svn_file_system = SubversionFileSystem(file_fetcher, 99 stat_fetcher, 100 svn_path, 101 revision=42) 102 103 self.assertRaises(FileSystemError, 104 svn_file_system.ReadSingle('dir/file').Get) 105 self.assertEqual('dir/file?p=42', file_fetcher.last_fetched) 106 # Stat() will always stat directories. 107 self.assertRaises(FileSystemError, svn_file_system.Stat, 'dir/file') 108 self.assertEqual('dir?pathrev=42', stat_fetcher.last_fetched) 109 110 self.assertRaises(FileSystemError, 111 svn_file_system.ReadSingle('dir/').Get) 112 self.assertEqual('dir/?p=42', file_fetcher.last_fetched) 113 self.assertRaises(FileSystemError, svn_file_system.Stat, 'dir/') 114 self.assertEqual('dir?pathrev=42', stat_fetcher.last_fetched) 115 116 def testDirectoryVersionOnDeletion(self): 117 '''Tests the case when the most recent operation on a directory is the 118 deletion of a file. Here it is not enough to take the maximum version of all 119 files in the directory, as we used to, for obvious reasons. 120 ''' 121 file_system, _ = _CreateSubversionFileSystem( 122 _SUBVERSION_FILE_SYSTEM_TEST_DATA) 123 dir_stat = file_system.Stat('docs_public_extensions_214898/') 124 self.assertEqual('214692', dir_stat.version) 125 126 def testEmptyDirectory(self): 127 file_system, _ = _CreateSubversionFileSystem( 128 _SUBVERSION_FILE_SYSTEM_TEST_DATA) 129 dir_stat = file_system.Stat('api_icons_214898/') 130 self.assertEqual('193838', dir_stat.version) 131 self.assertEqual({}, dir_stat.child_versions) 132 133if __name__ == '__main__': 134 unittest.main() 135