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