1176
1176
# (It would be ok if it happened earlier but at the moment it
1178
1178
e = self.assertRaises(OSError, list, osutils._walkdirs_utf8("."))
1179
self.assertEqual('./test-unreadable', e.filename)
1179
self.assertEqual(b'./test-unreadable', e.filename)
1180
1180
self.assertEqual(errno.EACCES, e.errno)
1181
1181
# Ensure the message contains the file name
1182
1182
self.assertContainsRe(str(e), "\\./test-unreadable")
1185
1184
def test_walkdirs_encoding_error(self):
1186
1185
# <https://bugs.launchpad.net/bzr/+bug/488519>
1187
1186
# walkdirs didn't raise a useful message when the filenames
1274
1274
self.overrideAttr(osutils, '_fs_enc')
1275
1275
self.overrideAttr(osutils, '_selected_dir_reader')
1277
def assertDirReaderIs(self, expected):
1277
def assertDirReaderIs(self, expected, top):
1278
1278
"""Assert the right implementation for _walkdirs_utf8 is chosen."""
1279
1279
# Force it to redetect
1280
1280
osutils._selected_dir_reader = None
1281
1281
# Nothing to list, but should still trigger the selection logic
1282
self.assertEqual([((b'', '.'), [])], list(osutils._walkdirs_utf8('.')))
1282
self.assertEqual([((b'', top), [])], list(osutils._walkdirs_utf8('.')))
1283
1283
self.assertIsInstance(osutils._selected_dir_reader, expected)
1285
1285
def test_force_walkdirs_utf8_fs_utf8(self):
1286
1286
self.requireFeature(UTF8DirReaderFeature)
1287
1287
self._save_platform_info()
1288
1288
osutils._fs_enc = 'utf-8'
1289
self.assertDirReaderIs(
1290
UTF8DirReaderFeature.module.UTF8DirReader)
1289
self.assertDirReaderIs(UTF8DirReaderFeature.module.UTF8DirReader, b".")
1292
1291
def test_force_walkdirs_utf8_fs_ascii(self):
1293
1292
self.requireFeature(UTF8DirReaderFeature)
1294
1293
self._save_platform_info()
1295
1294
osutils._fs_enc = 'ascii'
1296
1295
self.assertDirReaderIs(
1297
UTF8DirReaderFeature.module.UTF8DirReader)
1296
UTF8DirReaderFeature.module.UTF8DirReader, b".")
1299
1298
def test_force_walkdirs_utf8_fs_latin1(self):
1300
1299
self._save_platform_info()
1301
1300
osutils._fs_enc = 'iso-8859-1'
1302
self.assertDirReaderIs(osutils.UnicodeDirReader)
1301
self.assertDirReaderIs(osutils.UnicodeDirReader, ".")
1304
1303
def test_force_walkdirs_utf8_nt(self):
1305
1304
# Disabled because the thunk of the whole walkdirs api is disabled.
1306
1305
self.requireFeature(test__walkdirs_win32.win32_readdir_feature)
1307
1306
self._save_platform_info()
1308
1307
from .._walkdirs_win32 import Win32ReadDir
1309
self.assertDirReaderIs(Win32ReadDir)
1308
self.assertDirReaderIs(Win32ReadDir, ".")
1311
1310
def test_unicode_walkdirs(self):
1312
1311
"""Walkdirs should always return unicode paths."""
1807
1806
expected_dirblocks = [
1809
[(b'0file', b'0file', 'file'),
1810
(b'1dir', b'1dir', 'directory'),
1811
(b'2file', b'2file', 'file'),
1808
[(b'0file', b'0file', 'file', './0file'),
1809
(b'1dir', b'1dir', 'directory', './1dir'),
1810
(b'2file', b'2file', 'file', './2file'),
1814
1813
((b'1dir', './1dir'),
1815
[(b'1dir/0file', b'0file', 'file'),
1816
(b'1dir/1dir', b'1dir', 'directory'),
1814
[(b'1dir/0file', b'0file', 'file', './1dir/0file'),
1815
(b'1dir/1dir', b'1dir', 'directory', './1dir/1dir'),
1819
1818
((b'1dir/1dir', './1dir/1dir'),
1829
1828
result = list(osutils._walkdirs_utf8('.'))
1830
1829
# Filter out stat and abspath
1831
1830
self.assertEqual(expected_dirblocks,
1832
[(dirinfo, [line[0:3] for line in block])
1833
for dirinfo, block in result])
1831
self._filter_out(result))
1835
1833
def test_walk_sub_dir(self):
1836
1834
tree, expected_dirblocks = self._get_ascii_tree()
1837
1835
self.build_tree(tree)
1838
1836
# you can search a subdir only, with a supplied prefix.
1839
result = list(osutils._walkdirs_utf8('./1dir', '1dir'))
1837
result = list(osutils._walkdirs_utf8(b'./1dir', b'1dir'))
1840
1838
# Filter out stat and abspath
1841
1839
self.assertEqual(expected_dirblocks[1:],
1842
[(dirinfo, [line[0:3] for line in block])
1843
for dirinfo, block in result])
1840
self._filter_out(result))
1845
1842
def _get_unicode_tree(self):
1846
1843
name0u = u'0file-\xb6'