54
53
from bzrlib.tests.file_utils import (
57
from bzrlib.tests.test__walkdirs_win32 import WalkdirsWin32Feature
60
def load_tests(standard_tests, module, loader):
61
"""Parameterize readdir tests."""
62
to_adapt, result = split_suite_by_re(standard_tests, "readdir")
63
adapter = TestScenarioApplier()
64
from bzrlib import _readdir_py
65
adapter.scenarios = [('python', {'read_dir': _readdir_py.read_dir})]
66
if ReadDirFeature.available():
67
adapter.scenarios.append(('pyrex',
68
{'read_dir': ReadDirFeature.read_dir}))
69
adapt_tests(to_adapt, adapter, result)
73
class _ReadDirFeature(Feature):
56
from bzrlib.tests.test__walkdirs_win32 import Win32ReadDirFeature
59
class _UTF8DirReaderFeature(Feature):
77
63
from bzrlib import _readdir_pyx
78
self.read_dir = _readdir_pyx.read_dir
64
self.reader = _readdir_pyx.UTF8DirReader
80
66
except ImportError:
780
772
class TestWalkDirs(TestCaseInTempDir):
782
def test_readdir(self):
791
self.build_tree(tree)
792
expected_names = ['.bzr', '0file', '1dir', '2file']
793
# read_dir returns pairs, which form a table with either None in all
794
# the first columns, or a sort key to get best on-disk-read order,
795
# and the disk path name in utf-8 encoding in the second column.
796
read_result = self.read_dir('.')
797
# The second column is always the names, and every name except "." and
798
# ".." should be present.
799
names = sorted([row[1] for row in read_result])
800
self.assertEqual(expected_names, names)
801
expected_sort_key = None
802
if read_result[0][0] is None:
803
# No sort key returned - all keys must None
804
operator = self.assertEqual
806
# A sort key in the first row implies sort keys in the other rows.
807
operator = self.assertNotEqual
808
for row in read_result:
809
operator(None, row[0])
811
def test_compiled_extension_exists(self):
812
self.requireFeature(ReadDirFeature)
814
774
def test_walkdirs(self):
912
872
new_dirblock.append((info[0], info[1], info[2], info[4]))
913
873
dirblock[:] = new_dirblock
915
def test__walkdirs_utf8_selection(self):
916
# Just trigger the function once, to make sure it has selected a real
918
list(osutils._walkdirs_utf8('.'))
919
if WalkdirsWin32Feature.available():
920
# If the compiled form is available, make sure it is used
921
from bzrlib._walkdirs_win32 import _walkdirs_utf8_win32_find_file
922
self.assertIs(_walkdirs_utf8_win32_find_file,
923
osutils._real_walkdirs_utf8)
924
elif sys.platform == 'win32':
925
self.assertIs(osutils._walkdirs_unicode_to_utf8,
926
osutils._real_walkdirs_utf8)
927
elif osutils._fs_enc.upper() in ('UTF-8', 'ASCII', 'ANSI_X3.4-1968'): # ascii
928
self.assertIs(osutils._walkdirs_fs_utf8,
929
osutils._real_walkdirs_utf8)
931
self.assertIs(osutils._walkdirs_unicode_to_utf8,
932
osutils._real_walkdirs_utf8)
934
875
def _save_platform_info(self):
935
876
cur_winver = win32utils.winver
936
877
cur_fs_enc = osutils._fs_enc
937
cur_real_walkdirs_utf8 = osutils._real_walkdirs_utf8
878
cur_dir_reader = osutils._selected_dir_reader
939
880
win32utils.winver = cur_winver
940
881
osutils._fs_enc = cur_fs_enc
941
osutils._real_walkdirs_utf8 = cur_real_walkdirs_utf8
882
osutils._selected_dir_reader = cur_dir_reader
942
883
self.addCleanup(restore)
944
def assertWalkdirsUtf8Is(self, expected):
885
def assertReadFSDirIs(self, expected):
945
886
"""Assert the right implementation for _walkdirs_utf8 is chosen."""
946
887
# Force it to redetect
947
osutils._real_walkdirs_utf8 = None
888
osutils._selected_dir_reader = None
948
889
# Nothing to list, but should still trigger the selection logic
949
890
self.assertEqual([(('', '.'), [])], list(osutils._walkdirs_utf8('.')))
950
self.assertIs(expected, osutils._real_walkdirs_utf8)
891
self.assertIsInstance(osutils._selected_dir_reader, expected)
952
893
def test_force_walkdirs_utf8_fs_utf8(self):
894
self.requireFeature(UTF8DirReaderFeature)
953
895
self._save_platform_info()
954
896
win32utils.winver = None # Avoid the win32 detection code
955
897
osutils._fs_enc = 'UTF-8'
956
self.assertWalkdirsUtf8Is(osutils._walkdirs_fs_utf8)
898
self.assertReadFSDirIs(UTF8DirReaderFeature.reader)
958
900
def test_force_walkdirs_utf8_fs_ascii(self):
901
self.requireFeature(UTF8DirReaderFeature)
959
902
self._save_platform_info()
960
903
win32utils.winver = None # Avoid the win32 detection code
961
904
osutils._fs_enc = 'US-ASCII'
962
self.assertWalkdirsUtf8Is(osutils._walkdirs_fs_utf8)
905
self.assertReadFSDirIs(UTF8DirReaderFeature.reader)
964
907
def test_force_walkdirs_utf8_fs_ANSI(self):
908
self.requireFeature(UTF8DirReaderFeature)
965
909
self._save_platform_info()
966
910
win32utils.winver = None # Avoid the win32 detection code
967
911
osutils._fs_enc = 'ANSI_X3.4-1968'
968
self.assertWalkdirsUtf8Is(osutils._walkdirs_fs_utf8)
912
self.assertReadFSDirIs(UTF8DirReaderFeature.reader)
970
914
def test_force_walkdirs_utf8_fs_latin1(self):
971
915
self._save_platform_info()
972
916
win32utils.winver = None # Avoid the win32 detection code
973
917
osutils._fs_enc = 'latin1'
974
self.assertWalkdirsUtf8Is(osutils._walkdirs_unicode_to_utf8)
918
self.assertReadFSDirIs(osutils.UnicodeDirReader)
976
920
def test_force_walkdirs_utf8_nt(self):
977
self.requireFeature(WalkdirsWin32Feature)
921
# Disabled because the thunk of the whole walkdirs api is disabled.
922
self.requireFeature(Win32ReadDirFeature)
978
923
self._save_platform_info()
979
924
win32utils.winver = 'Windows NT'
980
from bzrlib._walkdirs_win32 import _walkdirs_utf8_win32_find_file
981
self.assertWalkdirsUtf8Is(_walkdirs_utf8_win32_find_file)
925
from bzrlib._walkdirs_win32 import Win32ReadDir
926
self.assertReadFSDirIs(Win32ReadDir)
983
def test_force_walkdirs_utf8_nt(self):
984
self.requireFeature(WalkdirsWin32Feature)
928
def test_force_walkdirs_utf8_98(self):
929
self.requireFeature(Win32ReadDirFeature)
985
930
self._save_platform_info()
986
931
win32utils.winver = 'Windows 98'
987
self.assertWalkdirsUtf8Is(osutils._walkdirs_unicode_to_utf8)
932
self.assertReadFSDirIs(osutils.UnicodeDirReader)
989
934
def test_unicode_walkdirs(self):
990
935
"""Walkdirs should always return unicode paths."""
1223
1174
def test__walkdirs_utf_win32_find_file_stat_directory(self):
1224
1175
"""make sure our Stat values are valid"""
1225
self.requireFeature(WalkdirsWin32Feature)
1176
self.requireFeature(Win32ReadDirFeature)
1226
1177
self.requireFeature(tests.UnicodeFilenameFeature)
1227
from bzrlib._walkdirs_win32 import _walkdirs_utf8_win32_find_file
1178
from bzrlib._walkdirs_win32 import Win32ReadDir
1228
1179
name0u = u'0dir-\u062c\u0648'
1229
1180
name0 = name0u.encode('utf8')
1230
1181
self.build_tree([name0u + '/'])
1232
result = list(_walkdirs_utf8_win32_find_file(u'.'))
1233
entry = result[0][1][0]
1183
result = Win32ReadDir().read_dir('', u'.')
1234
1185
self.assertEqual((name0, name0, 'directory'), entry[:3])
1235
1186
self.assertEqual(u'./' + name0u, entry[4])
1236
1187
self.assertStatIsCorrect(entry[4], entry[3])