Home | History | Annotate | Download | only in server2
      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 
      6 import json
      7 import os
      8 import unittest
      9 
     10 from extensions_paths import SERVER2
     11 from fake_url_fetcher import FakeUrlFetcher
     12 from file_system import FileSystemError, StatInfo
     13 from subversion_file_system import SubversionFileSystem
     14 from 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 
     22 def _CreateSubversionFileSystem(path):
     23   fetcher = FakeUrlFetcher(path)
     24   return SubversionFileSystem(fetcher, fetcher, path), fetcher
     25 
     26 
     27 class 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(async_count=1,
     64                                            async_resolve_count=1))
     65     expected = StatInfo(
     66       '151113',
     67       child_versions=json.loads(ReadFile(
     68           SERVER2, 'test_data', 'file_system', 'stat_result.json')))
     69     self.assertEqual(expected, stat_info)
     70 
     71   def testFileStat(self):
     72     file_system, fetcher = _CreateSubversionFileSystem(
     73         _SHARED_FILE_SYSTEM_TEST_DATA)
     74     stat_info = file_system.Stat('stat/extension_api.h')
     75     self.assertTrue(*fetcher.CheckAndReset(async_count=1,
     76                                            async_resolve_count=1))
     77     self.assertEqual(StatInfo('146163'), stat_info)
     78 
     79   def testRevisions(self):
     80     # This is a super hacky test. Record the path that was fetched then exit the
     81     # test. Compare.
     82     class ValueErrorFetcher(object):
     83       def __init__(self):
     84         self.last_fetched = None
     85 
     86       def FetchAsync(self, path):
     87         class ThrowsValueError(object):
     88           def Get(self): raise ValueError()
     89         self.last_fetched = path
     90         return ThrowsValueError()
     91 
     92       def Fetch(self, path, **kwargs):
     93         self.last_fetched = path
     94         raise ValueError()
     95 
     96     file_fetcher = ValueErrorFetcher()
     97     stat_fetcher = ValueErrorFetcher()
     98     svn_path = 'svn:'
     99 
    100     svn_file_system = SubversionFileSystem(file_fetcher,
    101                                            stat_fetcher,
    102                                            svn_path,
    103                                            revision=42)
    104 
    105     self.assertRaises(FileSystemError,
    106                       svn_file_system.ReadSingle('dir/file').Get)
    107     self.assertEqual('dir/file?p=42', file_fetcher.last_fetched)
    108     # Stat() will always stat directories.
    109     self.assertRaises(FileSystemError, svn_file_system.Stat, 'dir/file')
    110     self.assertEqual('dir?pathrev=42', stat_fetcher.last_fetched)
    111 
    112     self.assertRaises(FileSystemError,
    113                       svn_file_system.ReadSingle('dir/').Get)
    114     self.assertEqual('dir/?p=42', file_fetcher.last_fetched)
    115     self.assertRaises(FileSystemError, svn_file_system.Stat, 'dir/')
    116     self.assertEqual('dir?pathrev=42', stat_fetcher.last_fetched)
    117 
    118   def testDirectoryVersionOnDeletion(self):
    119     '''Tests the case when the most recent operation on a directory is the
    120     deletion of a file. Here it is not enough to take the maximum version of all
    121     files in the directory, as we used to, for obvious reasons.
    122     '''
    123     file_system, _ = _CreateSubversionFileSystem(
    124         _SUBVERSION_FILE_SYSTEM_TEST_DATA)
    125     dir_stat = file_system.Stat('docs_public_extensions_214898/')
    126     self.assertEqual('214692', dir_stat.version)
    127 
    128   def testEmptyDirectory(self):
    129     file_system, _ = _CreateSubversionFileSystem(
    130         _SUBVERSION_FILE_SYSTEM_TEST_DATA)
    131     dir_stat = file_system.Stat('api_icons_214898/')
    132     self.assertEqual('193838', dir_stat.version)
    133     self.assertEqual({}, dir_stat.child_versions)
    134 
    135     def testSkipNotFound(self):
    136       file_system, _ = _CreateSubversionFileSystem(
    137           _SUBVERSION_FILE_SYSTEM_TEST_DATA)
    138       self.assertEqual({}, file_system.Read(('fakefile',),
    139                                             skip_not_found=True).Get())
    140 
    141 
    142 if __name__ == '__main__':
    143   unittest.main()
    144