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
1217
self.requireFeature(UTF8DirReaderFeature)
1162
1218
self._save_platform_info()
1163
1219
win32utils.winver = None # Avoid the win32 detection code
1164
osutils._fs_enc = 'UTF-8'
1165
self.assertDirReaderIs(UTF8DirReaderFeature.reader)
1220
osutils._fs_enc = 'utf-8'
1221
self.assertDirReaderIs(
1222
UTF8DirReaderFeature.module.UTF8DirReader)
1167
1224
def test_force_walkdirs_utf8_fs_ascii(self):
1168
1225
self.requireFeature(UTF8DirReaderFeature)
1169
1226
self._save_platform_info()
1170
1227
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)
1228
osutils._fs_enc = 'ascii'
1229
self.assertDirReaderIs(
1230
UTF8DirReaderFeature.module.UTF8DirReader)
1181
1232
def test_force_walkdirs_utf8_fs_latin1(self):
1182
1233
self._save_platform_info()
1183
1234
win32utils.winver = None # Avoid the win32 detection code
1184
osutils._fs_enc = 'latin1'
1235
osutils._fs_enc = 'iso-8859-1'
1185
1236
self.assertDirReaderIs(osutils.UnicodeDirReader)
1187
1238
def test_force_walkdirs_utf8_nt(self):
1679
1730
class TestReCompile(tests.TestCase):
1732
def _deprecated_re_compile_checked(self, *args, **kwargs):
1733
return self.applyDeprecated(symbol_versioning.deprecated_in((2, 2, 0)),
1734
osutils.re_compile_checked, *args, **kwargs)
1681
1736
def test_re_compile_checked(self):
1682
r = osutils.re_compile_checked(r'A*', re.IGNORECASE)
1737
r = self._deprecated_re_compile_checked(r'A*', re.IGNORECASE)
1683
1738
self.assertTrue(r.match('aaaa'))
1684
1739
self.assertTrue(r.match('aAaA'))
1686
1741
def test_re_compile_checked_error(self):
1687
1742
# like https://bugs.launchpad.net/bzr/+bug/251352
1744
# Due to possible test isolation error, re.compile is not lazy at
1745
# this point. We re-install lazy compile.
1746
lazy_regex.install_lazy_compile()
1688
1747
err = self.assertRaises(
1689
1748
errors.BzrCommandError,
1690
osutils.re_compile_checked, '*', re.IGNORECASE, 'test case')
1749
self._deprecated_re_compile_checked, '*', re.IGNORECASE, 'test case')
1691
1750
self.assertEqual(
1692
"Invalid regular expression in test case: '*': "
1693
"nothing to repeat",
1751
'Invalid regular expression in test case: '
1752
'"*" nothing to repeat',
1697
1756
class TestDirReader(tests.TestCaseInTempDir):
1758
scenarios = dir_reader_scenarios()
1699
1760
# Set by load_tests
1700
1761
_dir_reader_class = None
1701
1762
_native_to_unicode = None
2018
2093
self.assertEquals(self.path, 'test_file')
2019
2094
self.assertEquals(self.uid, s.st_uid)
2020
2095
self.assertEquals(self.gid, s.st_gid)
2098
class TestPathFromEnviron(tests.TestCase):
2100
def test_is_unicode(self):
2101
self.overrideEnv('BZR_TEST_PATH', './anywhere at all/')
2102
path = osutils.path_from_environ('BZR_TEST_PATH')
2103
self.assertIsInstance(path, unicode)
2104
self.assertEqual(u'./anywhere at all/', path)
2106
def test_posix_path_env_ascii(self):
2107
self.overrideEnv('BZR_TEST_PATH', '/tmp')
2108
home = osutils._posix_path_from_environ('BZR_TEST_PATH')
2109
self.assertIsInstance(home, unicode)
2110
self.assertEqual(u'/tmp', home)
2112
def test_posix_path_env_unicode(self):
2113
self.requireFeature(features.ByteStringNamedFilesystem)
2114
self.overrideEnv('BZR_TEST_PATH', '/home/\xa7test')
2115
self.overrideAttr(osutils, "_fs_enc", "iso8859-1")
2116
self.assertEqual(u'/home/\xa7test',
2117
osutils._posix_path_from_environ('BZR_TEST_PATH'))
2118
osutils._fs_enc = "iso8859-5"
2119
self.assertEqual(u'/home/\u0407test',
2120
osutils._posix_path_from_environ('BZR_TEST_PATH'))
2121
osutils._fs_enc = "utf-8"
2122
self.assertRaises(errors.BadFilenameEncoding,
2123
osutils._posix_path_from_environ, 'BZR_TEST_PATH')
2126
class TestGetHomeDir(tests.TestCase):
2128
def test_is_unicode(self):
2129
home = osutils._get_home_dir()
2130
self.assertIsInstance(home, unicode)
2132
def test_posix_homeless(self):
2133
self.overrideEnv('HOME', None)
2134
home = osutils._get_home_dir()
2135
self.assertIsInstance(home, unicode)
2137
def test_posix_home_ascii(self):
2138
self.overrideEnv('HOME', '/home/test')
2139
home = osutils._posix_get_home_dir()
2140
self.assertIsInstance(home, unicode)
2141
self.assertEqual(u'/home/test', home)
2143
def test_posix_home_unicode(self):
2144
self.requireFeature(features.ByteStringNamedFilesystem)
2145
self.overrideEnv('HOME', '/home/\xa7test')
2146
self.overrideAttr(osutils, "_fs_enc", "iso8859-1")
2147
self.assertEqual(u'/home/\xa7test', osutils._posix_get_home_dir())
2148
osutils._fs_enc = "iso8859-5"
2149
self.assertEqual(u'/home/\u0407test', osutils._posix_get_home_dir())
2150
osutils._fs_enc = "utf-8"
2151
self.assertRaises(errors.BadFilenameEncoding,
2152
osutils._posix_get_home_dir)
2155
class TestGetuserUnicode(tests.TestCase):
2157
def test_is_unicode(self):
2158
user = osutils.getuser_unicode()
2159
self.assertIsInstance(user, unicode)
2161
def envvar_to_override(self):
2162
if sys.platform == "win32":
2163
# Disable use of platform calls on windows so envvar is used
2164
self.overrideAttr(win32utils, 'has_ctypes', False)
2165
return 'USERNAME' # only variable used on windows
2166
return 'LOGNAME' # first variable checked by getpass.getuser()
2168
def test_ascii_user(self):
2169
self.overrideEnv(self.envvar_to_override(), 'jrandom')
2170
self.assertEqual(u'jrandom', osutils.getuser_unicode())
2172
def test_unicode_user(self):
2173
ue = osutils.get_user_encoding()
2174
uni_val, env_val = tests.probe_unicode_in_user_encoding()
2176
raise tests.TestSkipped(
2177
'Cannot find a unicode character that works in encoding %s'
2178
% (osutils.get_user_encoding(),))
2179
uni_username = u'jrandom' + uni_val
2180
encoded_username = uni_username.encode(ue)
2181
self.overrideEnv(self.envvar_to_override(), encoded_username)
2182
self.assertEqual(uni_username, osutils.getuser_unicode())
2185
class TestBackupNames(tests.TestCase):
2188
super(TestBackupNames, self).setUp()
2191
def backup_exists(self, name):
2192
return name in self.backups
2194
def available_backup_name(self, name):
2195
backup_name = osutils.available_backup_name(name, self.backup_exists)
2196
self.backups.append(backup_name)
2199
def assertBackupName(self, expected, name):
2200
self.assertEqual(expected, self.available_backup_name(name))
2202
def test_empty(self):
2203
self.assertBackupName('file.~1~', 'file')
2205
def test_existing(self):
2206
self.available_backup_name('file')
2207
self.available_backup_name('file')
2208
self.assertBackupName('file.~3~', 'file')
2209
# Empty slots are found, this is not a strict requirement and may be
2210
# revisited if we test against all implementations.
2211
self.backups.remove('file.~2~')
2212
self.assertBackupName('file.~2~', 'file')
2215
class TestFindExecutableInPath(tests.TestCase):
2217
def test_windows(self):
2218
if sys.platform != 'win32':
2219
raise tests.TestSkipped('test requires win32')
2220
self.assertTrue(osutils.find_executable_on_path('explorer') is not None)
2222
osutils.find_executable_on_path('explorer.exe') is not None)
2224
osutils.find_executable_on_path('EXPLORER.EXE') is not None)
2226
osutils.find_executable_on_path('THIS SHOULD NOT EXIST') is None)
2227
self.assertTrue(osutils.find_executable_on_path('file.txt') is None)
2229
def test_windows_app_path(self):
2230
if sys.platform != 'win32':
2231
raise tests.TestSkipped('test requires win32')
2232
# Override PATH env var so that exe can only be found on App Path
2233
self.overrideEnv('PATH', '')
2234
# Internt Explorer is always registered in the App Path
2235
self.assertTrue(osutils.find_executable_on_path('iexplore') is not None)
2237
def test_other(self):
2238
if sys.platform == 'win32':
2239
raise tests.TestSkipped('test requires non-win32')
2240
self.assertTrue(osutils.find_executable_on_path('sh') is not None)
2242
osutils.find_executable_on_path('THIS SHOULD NOT EXIST') is None)
2245
class TestEnvironmentErrors(tests.TestCase):
2246
"""Test handling of environmental errors"""
2248
def test_is_oserror(self):
2249
self.assertTrue(osutils.is_environment_error(
2250
OSError(errno.EINVAL, "Invalid parameter")))
2252
def test_is_ioerror(self):
2253
self.assertTrue(osutils.is_environment_error(
2254
IOError(errno.EINVAL, "Invalid parameter")))
2256
def test_is_socket_error(self):
2257
self.assertTrue(osutils.is_environment_error(
2258
socket.error(errno.EINVAL, "Invalid parameter")))
2260
def test_is_select_error(self):
2261
self.assertTrue(osutils.is_environment_error(
2262
select.error(errno.EINVAL, "Invalid parameter")))
2264
def test_is_pywintypes_error(self):
2265
self.requireFeature(features.pywintypes)
2267
self.assertTrue(osutils.is_environment_error(
2268
pywintypes.error(errno.EINVAL, "Invalid parameter", "Caller")))