440
466
message = "Data not equal. Expected %d bytes, received %d."
441
467
self.fail(message % (len(response_data), self.test_data_len))
470
class TestPumpStringFile(TestCase):
472
def test_empty(self):
474
pump_string_file("", output)
475
self.assertEqual("", output.getvalue())
477
def test_more_than_segment_size(self):
479
pump_string_file("123456789", output, 2)
480
self.assertEqual("123456789", output.getvalue())
482
def test_segment_size(self):
484
pump_string_file("12", output, 2)
485
self.assertEqual("12", output.getvalue())
487
def test_segment_size_multiple(self):
489
pump_string_file("1234", output, 2)
490
self.assertEqual("1234", output.getvalue())
443
493
class TestSafeUnicode(TestCase):
445
495
def test_from_ascii_string(self):
706
756
self.assertEndsWith(osutils._mac_getcwd(), u'B\xe5gfors')
759
class TestChunksToLines(TestCase):
761
def test_smoketest(self):
762
self.assertEqual(['foo\n', 'bar\n', 'baz\n'],
763
osutils.chunks_to_lines(['foo\nbar', '\nbaz\n']))
764
self.assertEqual(['foo\n', 'bar\n', 'baz\n'],
765
osutils.chunks_to_lines(['foo\n', 'bar\n', 'baz\n']))
767
def test_is_compiled(self):
768
from bzrlib.tests.test__chunks_to_lines import CompiledChunksToLinesFeature
769
if CompiledChunksToLinesFeature:
770
from bzrlib._chunks_to_lines_pyx import chunks_to_lines
772
from bzrlib._chunks_to_lines_py import chunks_to_lines
773
self.assertIs(chunks_to_lines, osutils.chunks_to_lines)
709
776
class TestSplitLines(TestCase):
711
778
def test_split_unicode(self):
822
889
new_dirblock.append((info[0], info[1], info[2], info[4]))
823
890
dirblock[:] = new_dirblock
825
def test__walkdirs_utf8_selection(self):
826
# Just trigger the function once, to make sure it has selected a real
828
list(osutils._walkdirs_utf8('.'))
829
if WalkdirsWin32Feature.available():
830
# If the compiled form is available, make sure it is used
831
from bzrlib._walkdirs_win32 import _walkdirs_utf8_win32_find_file
832
self.assertIs(_walkdirs_utf8_win32_find_file,
833
osutils._real_walkdirs_utf8)
834
elif sys.platform == 'win32':
835
self.assertIs(osutils._walkdirs_unicode_to_utf8,
836
osutils._real_walkdirs_utf8)
837
elif osutils._fs_enc.upper() in ('UTF-8', 'ASCII', 'ANSI_X3.4-1968'): # ascii
838
self.assertIs(osutils._walkdirs_fs_utf8,
839
osutils._real_walkdirs_utf8)
841
self.assertIs(osutils._walkdirs_unicode_to_utf8,
842
osutils._real_walkdirs_utf8)
844
892
def _save_platform_info(self):
845
893
cur_winver = win32utils.winver
846
894
cur_fs_enc = osutils._fs_enc
847
cur_real_walkdirs_utf8 = osutils._real_walkdirs_utf8
895
cur_dir_reader = osutils._selected_dir_reader
849
897
win32utils.winver = cur_winver
850
898
osutils._fs_enc = cur_fs_enc
851
osutils._real_walkdirs_utf8 = cur_real_walkdirs_utf8
899
osutils._selected_dir_reader = cur_dir_reader
852
900
self.addCleanup(restore)
854
def assertWalkdirsUtf8Is(self, expected):
902
def assertReadFSDirIs(self, expected):
855
903
"""Assert the right implementation for _walkdirs_utf8 is chosen."""
856
904
# Force it to redetect
857
osutils._real_walkdirs_utf8 = None
905
osutils._selected_dir_reader = None
858
906
# Nothing to list, but should still trigger the selection logic
859
907
self.assertEqual([(('', '.'), [])], list(osutils._walkdirs_utf8('.')))
860
self.assertIs(expected, osutils._real_walkdirs_utf8)
908
self.assertIsInstance(osutils._selected_dir_reader, expected)
862
910
def test_force_walkdirs_utf8_fs_utf8(self):
911
self.requireFeature(UTF8DirReaderFeature)
863
912
self._save_platform_info()
864
913
win32utils.winver = None # Avoid the win32 detection code
865
914
osutils._fs_enc = 'UTF-8'
866
self.assertWalkdirsUtf8Is(osutils._walkdirs_fs_utf8)
915
self.assertReadFSDirIs(UTF8DirReaderFeature.reader)
868
917
def test_force_walkdirs_utf8_fs_ascii(self):
918
self.requireFeature(UTF8DirReaderFeature)
869
919
self._save_platform_info()
870
920
win32utils.winver = None # Avoid the win32 detection code
871
921
osutils._fs_enc = 'US-ASCII'
872
self.assertWalkdirsUtf8Is(osutils._walkdirs_fs_utf8)
922
self.assertReadFSDirIs(UTF8DirReaderFeature.reader)
874
924
def test_force_walkdirs_utf8_fs_ANSI(self):
925
self.requireFeature(UTF8DirReaderFeature)
875
926
self._save_platform_info()
876
927
win32utils.winver = None # Avoid the win32 detection code
877
928
osutils._fs_enc = 'ANSI_X3.4-1968'
878
self.assertWalkdirsUtf8Is(osutils._walkdirs_fs_utf8)
929
self.assertReadFSDirIs(UTF8DirReaderFeature.reader)
880
931
def test_force_walkdirs_utf8_fs_latin1(self):
881
932
self._save_platform_info()
882
933
win32utils.winver = None # Avoid the win32 detection code
883
934
osutils._fs_enc = 'latin1'
884
self.assertWalkdirsUtf8Is(osutils._walkdirs_unicode_to_utf8)
935
self.assertReadFSDirIs(osutils.UnicodeDirReader)
886
937
def test_force_walkdirs_utf8_nt(self):
887
self.requireFeature(WalkdirsWin32Feature)
938
# Disabled because the thunk of the whole walkdirs api is disabled.
939
self.requireFeature(Win32ReadDirFeature)
888
940
self._save_platform_info()
889
941
win32utils.winver = 'Windows NT'
890
from bzrlib._walkdirs_win32 import _walkdirs_utf8_win32_find_file
891
self.assertWalkdirsUtf8Is(_walkdirs_utf8_win32_find_file)
942
from bzrlib._walkdirs_win32 import Win32ReadDir
943
self.assertReadFSDirIs(Win32ReadDir)
893
def test_force_walkdirs_utf8_nt(self):
894
self.requireFeature(WalkdirsWin32Feature)
945
def test_force_walkdirs_utf8_98(self):
946
self.requireFeature(Win32ReadDirFeature)
895
947
self._save_platform_info()
896
948
win32utils.winver = 'Windows 98'
897
self.assertWalkdirsUtf8Is(osutils._walkdirs_unicode_to_utf8)
949
self.assertReadFSDirIs(osutils.UnicodeDirReader)
899
951
def test_unicode_walkdirs(self):
900
952
"""Walkdirs should always return unicode paths."""
1133
1191
def test__walkdirs_utf_win32_find_file_stat_directory(self):
1134
1192
"""make sure our Stat values are valid"""
1135
self.requireFeature(WalkdirsWin32Feature)
1193
self.requireFeature(Win32ReadDirFeature)
1136
1194
self.requireFeature(tests.UnicodeFilenameFeature)
1137
from bzrlib._walkdirs_win32 import _walkdirs_utf8_win32_find_file
1195
from bzrlib._walkdirs_win32 import Win32ReadDir
1138
1196
name0u = u'0dir-\u062c\u0648'
1139
1197
name0 = name0u.encode('utf8')
1140
1198
self.build_tree([name0u + '/'])
1142
result = list(_walkdirs_utf8_win32_find_file(u'.'))
1143
entry = result[0][1][0]
1200
result = Win32ReadDir().read_dir('', u'.')
1144
1202
self.assertEqual((name0, name0, 'directory'), entry[:3])
1145
1203
self.assertEqual(u'./' + name0u, entry[4])
1146
1204
self.assertStatIsCorrect(entry[4], entry[3])