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