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])