98
def load_tests(basic_tests, module, loader):
99
suite = loader.suiteClass()
100
dir_reader_tests, remaining_tests = tests.split_suite_by_condition(
101
basic_tests, tests.condition_isinstance(TestDirReader))
102
tests.multiply_tests(dir_reader_tests, dir_reader_scenarios(), suite)
103
suite.addTest(remaining_tests)
101
load_tests = load_tests_apply_scenarios
107
104
class TestContainsWhitespace(tests.TestCase):
109
106
def test_contains_whitespace(self):
110
self.failUnless(osutils.contains_whitespace(u' '))
111
self.failUnless(osutils.contains_whitespace(u'hello there'))
112
self.failUnless(osutils.contains_whitespace(u'hellothere\n'))
113
self.failUnless(osutils.contains_whitespace(u'hello\nthere'))
114
self.failUnless(osutils.contains_whitespace(u'hello\rthere'))
115
self.failUnless(osutils.contains_whitespace(u'hello\tthere'))
107
self.assertTrue(osutils.contains_whitespace(u' '))
108
self.assertTrue(osutils.contains_whitespace(u'hello there'))
109
self.assertTrue(osutils.contains_whitespace(u'hellothere\n'))
110
self.assertTrue(osutils.contains_whitespace(u'hello\nthere'))
111
self.assertTrue(osutils.contains_whitespace(u'hello\rthere'))
112
self.assertTrue(osutils.contains_whitespace(u'hello\tthere'))
117
114
# \xa0 is "Non-breaking-space" which on some python locales thinks it
118
115
# is whitespace, but we do not.
119
self.failIf(osutils.contains_whitespace(u''))
120
self.failIf(osutils.contains_whitespace(u'hellothere'))
121
self.failIf(osutils.contains_whitespace(u'hello\xa0there'))
116
self.assertFalse(osutils.contains_whitespace(u''))
117
self.assertFalse(osutils.contains_whitespace(u'hellothere'))
118
self.assertFalse(osutils.contains_whitespace(u'hello\xa0there'))
124
121
class TestRename(tests.TestCaseInTempDir):
1161
1226
self.requireFeature(UTF8DirReaderFeature)
1162
1227
self._save_platform_info()
1163
1228
win32utils.winver = None # Avoid the win32 detection code
1164
osutils._fs_enc = 'UTF-8'
1165
self.assertDirReaderIs(UTF8DirReaderFeature.reader)
1229
osutils._fs_enc = 'utf-8'
1230
self.assertDirReaderIs(
1231
UTF8DirReaderFeature.module.UTF8DirReader)
1167
1233
def test_force_walkdirs_utf8_fs_ascii(self):
1168
1234
self.requireFeature(UTF8DirReaderFeature)
1169
1235
self._save_platform_info()
1170
1236
win32utils.winver = None # Avoid the win32 detection code
1171
osutils._fs_enc = 'US-ASCII'
1172
self.assertDirReaderIs(UTF8DirReaderFeature.reader)
1174
def test_force_walkdirs_utf8_fs_ANSI(self):
1175
self.requireFeature(UTF8DirReaderFeature)
1176
self._save_platform_info()
1177
win32utils.winver = None # Avoid the win32 detection code
1178
osutils._fs_enc = 'ANSI_X3.4-1968'
1179
self.assertDirReaderIs(UTF8DirReaderFeature.reader)
1237
osutils._fs_enc = 'ascii'
1238
self.assertDirReaderIs(
1239
UTF8DirReaderFeature.module.UTF8DirReader)
1181
1241
def test_force_walkdirs_utf8_fs_latin1(self):
1182
1242
self._save_platform_info()
1183
1243
win32utils.winver = None # Avoid the win32 detection code
1184
osutils._fs_enc = 'latin1'
1244
osutils._fs_enc = 'iso-8859-1'
1185
1245
self.assertDirReaderIs(osutils.UnicodeDirReader)
1187
1247
def test_force_walkdirs_utf8_nt(self):
1679
1739
class TestReCompile(tests.TestCase):
1741
def _deprecated_re_compile_checked(self, *args, **kwargs):
1742
return self.applyDeprecated(symbol_versioning.deprecated_in((2, 2, 0)),
1743
osutils.re_compile_checked, *args, **kwargs)
1681
1745
def test_re_compile_checked(self):
1682
r = osutils.re_compile_checked(r'A*', re.IGNORECASE)
1746
r = self._deprecated_re_compile_checked(r'A*', re.IGNORECASE)
1683
1747
self.assertTrue(r.match('aaaa'))
1684
1748
self.assertTrue(r.match('aAaA'))
1686
1750
def test_re_compile_checked_error(self):
1687
1751
# like https://bugs.launchpad.net/bzr/+bug/251352
1753
# Due to possible test isolation error, re.compile is not lazy at
1754
# this point. We re-install lazy compile.
1755
lazy_regex.install_lazy_compile()
1688
1756
err = self.assertRaises(
1689
1757
errors.BzrCommandError,
1690
osutils.re_compile_checked, '*', re.IGNORECASE, 'test case')
1758
self._deprecated_re_compile_checked, '*', re.IGNORECASE, 'test case')
1691
1759
self.assertEqual(
1692
"Invalid regular expression in test case: '*': "
1693
"nothing to repeat",
1760
'Invalid regular expression in test case: '
1761
'"*" nothing to repeat',
1697
1765
class TestDirReader(tests.TestCaseInTempDir):
1767
scenarios = dir_reader_scenarios()
1699
1769
# Set by load_tests
1700
1770
_dir_reader_class = None
1701
1771
_native_to_unicode = None
2018
2102
self.assertEquals(self.path, 'test_file')
2019
2103
self.assertEquals(self.uid, s.st_uid)
2020
2104
self.assertEquals(self.gid, s.st_gid)
2107
class TestPathFromEnviron(tests.TestCase):
2109
def test_is_unicode(self):
2110
self.overrideEnv('BZR_TEST_PATH', './anywhere at all/')
2111
path = osutils.path_from_environ('BZR_TEST_PATH')
2112
self.assertIsInstance(path, unicode)
2113
self.assertEqual(u'./anywhere at all/', path)
2115
def test_posix_path_env_ascii(self):
2116
self.overrideEnv('BZR_TEST_PATH', '/tmp')
2117
home = osutils._posix_path_from_environ('BZR_TEST_PATH')
2118
self.assertIsInstance(home, unicode)
2119
self.assertEqual(u'/tmp', home)
2121
def test_posix_path_env_unicode(self):
2122
self.requireFeature(features.ByteStringNamedFilesystem)
2123
self.overrideEnv('BZR_TEST_PATH', '/home/\xa7test')
2124
self.overrideAttr(osutils, "_fs_enc", "iso8859-1")
2125
self.assertEqual(u'/home/\xa7test',
2126
osutils._posix_path_from_environ('BZR_TEST_PATH'))
2127
osutils._fs_enc = "iso8859-5"
2128
self.assertEqual(u'/home/\u0407test',
2129
osutils._posix_path_from_environ('BZR_TEST_PATH'))
2130
osutils._fs_enc = "utf-8"
2131
self.assertRaises(errors.BadFilenameEncoding,
2132
osutils._posix_path_from_environ, 'BZR_TEST_PATH')
2135
class TestGetHomeDir(tests.TestCase):
2137
def test_is_unicode(self):
2138
home = osutils._get_home_dir()
2139
self.assertIsInstance(home, unicode)
2141
def test_posix_homeless(self):
2142
self.overrideEnv('HOME', None)
2143
home = osutils._get_home_dir()
2144
self.assertIsInstance(home, unicode)
2146
def test_posix_home_ascii(self):
2147
self.overrideEnv('HOME', '/home/test')
2148
home = osutils._posix_get_home_dir()
2149
self.assertIsInstance(home, unicode)
2150
self.assertEqual(u'/home/test', home)
2152
def test_posix_home_unicode(self):
2153
self.requireFeature(features.ByteStringNamedFilesystem)
2154
self.overrideEnv('HOME', '/home/\xa7test')
2155
self.overrideAttr(osutils, "_fs_enc", "iso8859-1")
2156
self.assertEqual(u'/home/\xa7test', osutils._posix_get_home_dir())
2157
osutils._fs_enc = "iso8859-5"
2158
self.assertEqual(u'/home/\u0407test', osutils._posix_get_home_dir())
2159
osutils._fs_enc = "utf-8"
2160
self.assertRaises(errors.BadFilenameEncoding,
2161
osutils._posix_get_home_dir)
2164
class TestGetuserUnicode(tests.TestCase):
2166
def test_is_unicode(self):
2167
user = osutils.getuser_unicode()
2168
self.assertIsInstance(user, unicode)
2170
def envvar_to_override(self):
2171
if sys.platform == "win32":
2172
# Disable use of platform calls on windows so envvar is used
2173
self.overrideAttr(win32utils, 'has_ctypes', False)
2174
return 'USERNAME' # only variable used on windows
2175
return 'LOGNAME' # first variable checked by getpass.getuser()
2177
def test_ascii_user(self):
2178
self.overrideEnv(self.envvar_to_override(), 'jrandom')
2179
self.assertEqual(u'jrandom', osutils.getuser_unicode())
2181
def test_unicode_user(self):
2182
ue = osutils.get_user_encoding()
2183
uni_val, env_val = tests.probe_unicode_in_user_encoding()
2185
raise tests.TestSkipped(
2186
'Cannot find a unicode character that works in encoding %s'
2187
% (osutils.get_user_encoding(),))
2188
uni_username = u'jrandom' + uni_val
2189
encoded_username = uni_username.encode(ue)
2190
self.overrideEnv(self.envvar_to_override(), encoded_username)
2191
self.assertEqual(uni_username, osutils.getuser_unicode())
2194
class TestBackupNames(tests.TestCase):
2197
super(TestBackupNames, self).setUp()
2200
def backup_exists(self, name):
2201
return name in self.backups
2203
def available_backup_name(self, name):
2204
backup_name = osutils.available_backup_name(name, self.backup_exists)
2205
self.backups.append(backup_name)
2208
def assertBackupName(self, expected, name):
2209
self.assertEqual(expected, self.available_backup_name(name))
2211
def test_empty(self):
2212
self.assertBackupName('file.~1~', 'file')
2214
def test_existing(self):
2215
self.available_backup_name('file')
2216
self.available_backup_name('file')
2217
self.assertBackupName('file.~3~', 'file')
2218
# Empty slots are found, this is not a strict requirement and may be
2219
# revisited if we test against all implementations.
2220
self.backups.remove('file.~2~')
2221
self.assertBackupName('file.~2~', 'file')
2224
class TestFindExecutableInPath(tests.TestCase):
2226
def test_windows(self):
2227
if sys.platform != 'win32':
2228
raise tests.TestSkipped('test requires win32')
2229
self.assertTrue(osutils.find_executable_on_path('explorer') is not None)
2231
osutils.find_executable_on_path('explorer.exe') is not None)
2233
osutils.find_executable_on_path('EXPLORER.EXE') is not None)
2235
osutils.find_executable_on_path('THIS SHOULD NOT EXIST') is None)
2236
self.assertTrue(osutils.find_executable_on_path('file.txt') is None)
2238
def test_windows_app_path(self):
2239
if sys.platform != 'win32':
2240
raise tests.TestSkipped('test requires win32')
2241
# Override PATH env var so that exe can only be found on App Path
2242
self.overrideEnv('PATH', '')
2243
# Internt Explorer is always registered in the App Path
2244
self.assertTrue(osutils.find_executable_on_path('iexplore') is not None)
2246
def test_other(self):
2247
if sys.platform == 'win32':
2248
raise tests.TestSkipped('test requires non-win32')
2249
self.assertTrue(osutils.find_executable_on_path('sh') is not None)
2251
osutils.find_executable_on_path('THIS SHOULD NOT EXIST') is None)
2254
class TestEnvironmentErrors(tests.TestCase):
2255
"""Test handling of environmental errors"""
2257
def test_is_oserror(self):
2258
self.assertTrue(osutils.is_environment_error(
2259
OSError(errno.EINVAL, "Invalid parameter")))
2261
def test_is_ioerror(self):
2262
self.assertTrue(osutils.is_environment_error(
2263
IOError(errno.EINVAL, "Invalid parameter")))
2265
def test_is_socket_error(self):
2266
self.assertTrue(osutils.is_environment_error(
2267
socket.error(errno.EINVAL, "Invalid parameter")))
2269
def test_is_select_error(self):
2270
self.assertTrue(osutils.is_environment_error(
2271
select.error(errno.EINVAL, "Invalid parameter")))
2273
def test_is_pywintypes_error(self):
2274
self.requireFeature(features.pywintypes)
2276
self.assertTrue(osutils.is_environment_error(
2277
pywintypes.error(errno.EINVAL, "Invalid parameter", "Caller")))