blob: fa2df27906ee95a6b2b43ebc13bc5ae5d64afe7d [file] [log] [blame]
#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import json
import os
import sys
import unittest
from fake_url_fetcher import FakeUrlFetcher
from file_system import FileNotFoundError, StatInfo
from future import Future
from subversion_file_system import SubversionFileSystem
import test_util
_SHARED_FILE_SYSTEM_TEST_DATA = os.path.join(
sys.path[0], 'test_data', 'file_system')
_SUBVERSION_FILE_SYSTEM_TEST_DATA = os.path.join(
sys.path[0], 'test_data', 'subversion_file_system')
def _CreateSubversionFileSystem(path):
fetcher = FakeUrlFetcher(path)
return SubversionFileSystem(fetcher, fetcher, path)
class SubversionFileSystemTest(unittest.TestCase):
def testReadFiles(self):
expected = {
'test1.txt': 'test1\n',
'test2.txt': 'test2\n',
'test3.txt': 'test3\n',
}
file_system = _CreateSubversionFileSystem(_SHARED_FILE_SYSTEM_TEST_DATA)
self.assertEqual(
expected,
file_system.Read(['test1.txt', 'test2.txt', 'test3.txt']).Get())
def testListDir(self):
expected = ['dir/'] + ['file%d.html' % i for i in range(7)]
file_system = _CreateSubversionFileSystem(_SHARED_FILE_SYSTEM_TEST_DATA)
self.assertEqual(expected, sorted(file_system.ReadSingle('list/')))
def testListSubDir(self):
expected = ['empty.txt'] + ['file%d.html' % i for i in range(3)]
file_system = _CreateSubversionFileSystem(_SHARED_FILE_SYSTEM_TEST_DATA)
self.assertEqual(expected, sorted(file_system.ReadSingle('list/dir/')))
def testDirStat(self):
file_system = _CreateSubversionFileSystem(_SHARED_FILE_SYSTEM_TEST_DATA)
stat_info = file_system.Stat('stat/')
expected = StatInfo(
'151113',
child_versions=json.loads(test_util.ReadFile('%s/stat_result.json' %
_SHARED_FILE_SYSTEM_TEST_DATA)))
self.assertEqual(expected, stat_info)
def testFileStat(self):
file_system = _CreateSubversionFileSystem(_SHARED_FILE_SYSTEM_TEST_DATA)
stat_info = file_system.Stat('stat/extension_api.h')
self.assertEqual(StatInfo('146163'), stat_info)
def testRevisions(self):
# This is a super hacky test. Record the path that was fetched then exit the
# test. Compare.
class ValueErrorFetcher(object):
def __init__(self):
self.last_fetched = None
def FetchAsync(self, path):
class ThrowsValueError(object):
def Get(): raise ValueError()
self.last_fetched = path
return ThrowsValueError()
def Fetch(self, path, **kwargs):
self.last_fetched = path
raise ValueError()
file_fetcher = ValueErrorFetcher()
stat_fetcher = ValueErrorFetcher()
svn_path = 'svn:'
svn_file_system = SubversionFileSystem(file_fetcher,
stat_fetcher,
svn_path,
revision=42)
self.assertRaises(FileNotFoundError, svn_file_system.ReadSingle, 'dir/file')
self.assertEqual('dir/file?p=42', file_fetcher.last_fetched)
# Stat() will always stat directories.
self.assertRaises(FileNotFoundError, svn_file_system.Stat, 'dir/file')
self.assertEqual('dir/?pathrev=42', stat_fetcher.last_fetched)
self.assertRaises(FileNotFoundError, svn_file_system.ReadSingle, 'dir/')
self.assertEqual('dir/?p=42', file_fetcher.last_fetched)
self.assertRaises(FileNotFoundError, svn_file_system.Stat, 'dir/')
self.assertEqual('dir/?pathrev=42', stat_fetcher.last_fetched)
def testDirectoryVersionOnDeletion(self):
'''Tests the case when the most recent operation on a directory is the
deletion of a file. Here it is not enough to take the maximum version of all
files in the directory, as we used to, for obvious reasons.
'''
file_system = _CreateSubversionFileSystem(_SUBVERSION_FILE_SYSTEM_TEST_DATA)
dir_stat = file_system.Stat('docs_public_extensions_214898/')
self.assertEqual('214692', dir_stat.version)
def testEmptyDirectory(self):
file_system = _CreateSubversionFileSystem(_SUBVERSION_FILE_SYSTEM_TEST_DATA)
dir_stat = file_system.Stat('api_icons_214898/')
self.assertEqual('193838', dir_stat.version)
self.assertEqual({}, dir_stat.child_versions)
if __name__ == '__main__':
unittest.main()