406
404
def test_format_date(self):
407
405
self.assertRaises(osutils.UnsupportedTimezoneFormat,
408
osutils.format_date, 0, timezone='foo')
406
osutils.format_date, 0, timezone='foo')
409
407
self.assertIsInstance(osutils.format_date(0), str)
410
408
self.assertIsInstance(osutils.format_local_date(0), text_type)
411
409
# Testing for the actual value of the local weekday without
416
414
def test_format_date_with_offset_in_original_timezone(self):
417
415
self.assertEqual("Thu 1970-01-01 00:00:00 +0000",
418
osutils.format_date_with_offset_in_original_timezone(0))
416
osutils.format_date_with_offset_in_original_timezone(0))
419
417
self.assertEqual("Fri 1970-01-02 03:46:40 +0000",
420
osutils.format_date_with_offset_in_original_timezone(100000))
418
osutils.format_date_with_offset_in_original_timezone(100000))
421
419
self.assertEqual("Fri 1970-01-02 05:46:40 +0200",
422
osutils.format_date_with_offset_in_original_timezone(100000, 7200))
420
osutils.format_date_with_offset_in_original_timezone(100000, 7200))
424
422
def test_local_time_offset(self):
425
423
"""Test that local_time_offset() returns a sane value."""
620
618
# read (max // 2) bytes and verify read size wasn't affected
621
619
num_bytes_to_read = self.block_size // 2
622
osutils.pumpfile(from_file, to_file, num_bytes_to_read, self.block_size)
620
osutils.pumpfile(from_file, to_file,
621
num_bytes_to_read, self.block_size)
623
622
self.assertEqual(from_file.get_max_read_size(), num_bytes_to_read)
624
623
self.assertEqual(from_file.get_read_count(), 1)
626
625
# read (max) bytes and verify read size wasn't affected
627
626
num_bytes_to_read = self.block_size
628
627
from_file.reset_read_count()
629
osutils.pumpfile(from_file, to_file, num_bytes_to_read, self.block_size)
628
osutils.pumpfile(from_file, to_file,
629
num_bytes_to_read, self.block_size)
630
630
self.assertEqual(from_file.get_max_read_size(), num_bytes_to_read)
631
631
self.assertEqual(from_file.get_read_count(), 1)
633
633
# read (max + 1) bytes and verify read size was limited
634
634
num_bytes_to_read = self.block_size + 1
635
635
from_file.reset_read_count()
636
osutils.pumpfile(from_file, to_file, num_bytes_to_read, self.block_size)
636
osutils.pumpfile(from_file, to_file,
637
num_bytes_to_read, self.block_size)
637
638
self.assertEqual(from_file.get_max_read_size(), self.block_size)
638
639
self.assertEqual(from_file.get_read_count(), 2)
640
641
# finish reading the rest of the data
641
642
num_bytes_to_read = self.test_data_len - to_file.tell()
642
osutils.pumpfile(from_file, to_file, num_bytes_to_read, self.block_size)
643
osutils.pumpfile(from_file, to_file,
644
num_bytes_to_read, self.block_size)
644
646
# report error if the data wasn't equal (we only report the size due
645
647
# to the length of the data)
736
739
osutils.pumpfile(from_file, to_file, buff_size=500, read_length=1028,
737
740
report_activity=log_activity, direction='read')
738
self.assertEqual([(500, 'read'), (500, 'read'), (28, 'read')], activity)
742
[(500, 'read'), (500, 'read'), (28, 'read')], activity)
742
745
class TestPumpStringFile(tests.TestCase):
834
837
def test_from_unicode_string_unicode_contents(self):
835
838
self.assertRaises(TypeError,
836
osutils.safe_revision_id, u'bargam\xae')
839
osutils.safe_revision_id, u'bargam\xae')
838
841
def test_from_utf8_string(self):
839
842
self.assertEqual(b'foo\xc2\xae',
884
889
sock = DisconnectedSocket(err)
885
890
self.assertRaises(errors.ConnectionReset,
886
osutils.send_all, sock, b'some more content')
891
osutils.send_all, sock, b'some more content')
888
893
def test_send_with_no_progress(self):
889
894
# See https://bugs.launchpad.net/bzr/+bug/1047309
911
917
def test_normpath(self):
912
918
self.assertEqual('/etc/shadow', osutils._posix_normpath('/etc/shadow'))
913
self.assertEqual('/etc/shadow', osutils._posix_normpath('//etc/shadow'))
914
self.assertEqual('/etc/shadow', osutils._posix_normpath('///etc/shadow'))
920
'/etc/shadow', osutils._posix_normpath('//etc/shadow'))
922
'/etc/shadow', osutils._posix_normpath('///etc/shadow'))
917
925
class TestWin32Funcs(tests.TestCase):
987
995
def test_minimum_path_selection(self):
988
996
self.assertEqual(set(),
989
osutils.minimum_path_selection([]))
997
osutils.minimum_path_selection([]))
990
998
self.assertEqual({'a'},
991
osutils.minimum_path_selection(['a']))
999
osutils.minimum_path_selection(['a']))
992
1000
self.assertEqual({'a', 'b'},
993
osutils.minimum_path_selection(['a', 'b']))
994
self.assertEqual({'a/', 'b'},
995
osutils.minimum_path_selection(['a/', 'b']))
996
self.assertEqual({'a/', 'b'},
997
osutils.minimum_path_selection(['a/c', 'a/', 'b']))
1001
osutils.minimum_path_selection(['a', 'b']))
1002
self.assertEqual({'a/', 'b'},
1003
osutils.minimum_path_selection(['a/', 'b']))
1004
self.assertEqual({'a/', 'b'},
1005
osutils.minimum_path_selection(['a/c', 'a/', 'b']))
998
1006
self.assertEqual({'a-b', 'a', 'a0b'},
999
osutils.minimum_path_selection(['a-b', 'a/b', 'a0b', 'a']))
1007
osutils.minimum_path_selection(['a-b', 'a/b', 'a0b', 'a']))
1001
1009
def test_mkdtemp(self):
1002
1010
tmpdir = osutils._win32_mkdtemp(dir='.')
1050
1058
check(['a', 'b'], 'a/b')
1051
1059
check(['a', 'b'], 'a/./b')
1052
1060
check(['a', '.b'], 'a/.b')
1053
check(['a', '.b'], 'a\\.b')
1061
if os.path.sep == '\\':
1062
check(['a', '.b'], 'a\\.b')
1064
check(['a\\.b'], 'a\\.b')
1055
1066
self.assertRaises(errors.BzrError, osutils.splitpath, 'a/../b')
1130
1141
self.build_tree(tree)
1131
1142
expected_dirblocks = [
1133
[('0file', '0file', 'file'),
1134
('1dir', '1dir', 'directory'),
1135
('2file', '2file', 'file'),
1138
(('1dir', './1dir'),
1139
[('1dir/0file', '0file', 'file'),
1140
('1dir/1dir', '1dir', 'directory'),
1143
(('1dir/1dir', './1dir/1dir'),
1144
[('0file', '0file', 'file'),
1145
('1dir', '1dir', 'directory'),
1146
('2file', '2file', 'file'),
1149
(('1dir', './1dir'),
1150
[('1dir/0file', '0file', 'file'),
1151
('1dir/1dir', '1dir', 'directory'),
1154
(('1dir/1dir', './1dir/1dir'),
1149
1160
found_bzrdir = False
1229
1240
self.build_tree(tree)
1230
1241
expected_dirblocks = [
1232
[('0file', '0file', 'file'),
1233
('1dir', '1dir', 'directory'),
1234
('2file', '2file', 'file'),
1237
(('1dir', './1dir'),
1238
[('1dir/0file', '0file', 'file'),
1239
('1dir/1dir', '1dir', 'directory'),
1242
(('1dir/1dir', './1dir/1dir'),
1243
[('0file', '0file', 'file'),
1244
('1dir', '1dir', 'directory'),
1245
('2file', '2file', 'file'),
1248
(('1dir', './1dir'),
1249
[('1dir/0file', '0file', 'file'),
1250
('1dir/1dir', '1dir', 'directory'),
1253
(('1dir/1dir', './1dir/1dir'),
1248
1259
found_bzrdir = False
1251
1262
# this tests the filtering of selected paths
1252
1263
found_bzrdir = True
1253
1264
del dirblock[0]
1254
dirdetail = (dirdetail[0].decode('utf-8'), osutils.safe_unicode(dirdetail[1]))
1265
dirdetail = (dirdetail[0].decode('utf-8'),
1266
osutils.safe_unicode(dirdetail[1]))
1256
(entry[0].decode('utf-8'), entry[1].decode('utf-8'), entry[2])
1257
for entry in dirblock]
1268
(entry[0].decode('utf-8'), entry[1].decode('utf-8'), entry[2])
1269
for entry in dirblock]
1258
1270
result.append((dirdetail, dirblock))
1260
1272
self.assertTrue(found_bzrdir)
1328
1340
self.build_tree(tree)
1329
1341
expected_dirblocks = [
1331
[(name0, name0, 'file', './' + name0),
1332
(name1, name1, 'directory', './' + name1),
1333
(name2, name2, 'file', './' + name2),
1336
((name1, './' + name1),
1337
[(name1 + '/' + name0, name0, 'file', './' + name1
1339
(name1 + '/' + name1, name1, 'directory', './' + name1
1343
((name1 + '/' + name1, './' + name1 + '/' + name1),
1343
[(name0, name0, 'file', './' + name0),
1344
(name1, name1, 'directory', './' + name1),
1345
(name2, name2, 'file', './' + name2),
1348
((name1, './' + name1),
1349
[(name1 + '/' + name0, name0, 'file', './' + name1
1351
(name1 + '/' + name1, name1, 'directory', './' + name1
1355
((name1 + '/' + name1, './' + name1 + '/' + name1),
1348
1360
result = list(osutils.walkdirs('.'))
1349
1361
self._filter_out_stat(result)
1350
1362
self.assertEqual(expected_dirblocks, result)
1351
result = list(osutils.walkdirs(u'./'+name1, name1))
1363
result = list(osutils.walkdirs(u'./' + name1, name1))
1352
1364
self._filter_out_stat(result)
1353
1365
self.assertEqual(expected_dirblocks[1:], result)
1374
1386
name2 = name2.encode('utf8')
1376
1388
expected_dirblocks = [
1378
[(name0, name0, 'file', b'./' + name0),
1379
(name1, name1, 'directory', b'./' + name1),
1380
(name2, name2, 'file', b'./' + name2),
1383
((name1, b'./' + name1),
1384
[(name1 + b'/' + name0, name0, 'file', b'./' + name1
1386
(name1 + b'/' + name1, name1, 'directory', b'./' + name1
1390
((name1 + b'/' + name1, b'./' + name1 + b'/' + name1),
1390
[(name0, name0, 'file', b'./' + name0),
1391
(name1, name1, 'directory', b'./' + name1),
1392
(name2, name2, 'file', b'./' + name2),
1395
((name1, b'./' + name1),
1396
[(name1 + b'/' + name0, name0, 'file', b'./' + name1
1398
(name1 + b'/' + name1, name1, 'directory', b'./' + name1
1402
((name1 + b'/' + name1, b'./' + name1 + b'/' + name1),
1396
1408
# For ease in testing, if walkdirs_utf8 returns Unicode, assert that
1441
1453
# All of the abspaths should be in unicode, all of the relative paths
1442
1454
# should be in utf8
1443
1455
expected_dirblocks = [
1445
[(name0, name0, 'file', './' + name0u),
1446
(name1, name1, 'directory', './' + name1u),
1447
(name2, name2, 'file', './' + name2u),
1450
((name1, './' + name1u),
1451
[(name1 + b'/' + name0, name0, 'file', './' + name1u
1453
(name1 + b'/' + name1, name1, 'directory', './' + name1u
1457
((name1 + b'/' + name1, './' + name1u + '/' + name1u),
1457
[(name0, name0, 'file', './' + name0u),
1458
(name1, name1, 'directory', './' + name1u),
1459
(name2, name2, 'file', './' + name2u),
1462
((name1, './' + name1u),
1463
[(name1 + b'/' + name0, name0, 'file', './' + name1u
1465
(name1 + b'/' + name1, name1, 'directory', './' + name1u
1469
((name1 + b'/' + name1, './' + name1u + '/' + name1u),
1462
1474
result = list(osutils._walkdirs_utf8('.'))
1463
1475
self._filter_out_stat(result)
1487
1499
# All of the abspaths should be in unicode, all of the relative paths
1488
1500
# should be in utf8
1489
1501
expected_dirblocks = [
1491
[(name0, name0, 'file', './' + name0u),
1492
(name1, name1, 'directory', './' + name1u),
1493
(name2, name2, 'file', './' + name2u),
1496
((name1, './' + name1u),
1497
[(name1 + '/' + name0, name0, 'file', './' + name1u
1499
(name1 + '/' + name1, name1, 'directory', './' + name1u
1503
((name1 + '/' + name1, './' + name1u + '/' + name1u),
1503
[(name0, name0, 'file', './' + name0u),
1504
(name1, name1, 'directory', './' + name1u),
1505
(name2, name2, 'file', './' + name2u),
1508
((name1, './' + name1u),
1509
[(name1 + '/' + name0, name0, 'file', './' + name1u
1511
(name1 + '/' + name1, name1, 'directory', './' + name1u
1515
((name1 + '/' + name1, './' + name1u + '/' + name1u),
1508
1520
result = list(osutils._walkdirs_utf8(u'.'))
1509
1521
self._filter_out_stat(result)
1659
1671
def test_copy_tree_handlers(self):
1660
1672
processed_files = []
1661
1673
processed_links = []
1662
1675
def file_handler(from_path, to_path):
1663
1676
processed_files.append(('f', from_path, to_path))
1664
1678
def dir_handler(from_path, to_path):
1665
1679
processed_files.append(('d', from_path, to_path))
1666
1681
def link_handler(from_path, to_path):
1667
1682
processed_links.append((from_path, to_path))
1668
1683
handlers = {'file': file_handler,
1669
1684
'directory': dir_handler,
1670
1685
'symlink': link_handler,
1673
1688
self.build_tree(['source/', 'source/a', 'source/b/', 'source/b/c'])
1674
1689
if osutils.has_symlinks():
1679
1694
('f', 'source/a', 'target/a'),
1680
1695
('d', 'source/b', 'target/b'),
1681
1696
('f', 'source/b/c', 'target/b/c'),
1683
1698
self.assertPathDoesNotExist('target')
1684
1699
if osutils.has_symlinks():
1685
1700
self.assertEqual([('source/lnk', 'target/lnk')], processed_links)
1694
1709
self.assertEqual(None, os.environ.get('BRZ_TEST_ENV_VAR'),
1695
1710
'Environment was not cleaned up properly.'
1696
1711
' Variable BRZ_TEST_ENV_VAR should not exist.')
1698
1714
if 'BRZ_TEST_ENV_VAR' in os.environ:
1699
1715
del os.environ['BRZ_TEST_ENV_VAR']
1723
1739
'Cannot find a unicode character that works in encoding %s'
1724
1740
% (osutils.get_user_encoding(),))
1726
old = osutils.set_or_unset_env('BRZ_TEST_ENV_VAR', uni_val)
1742
osutils.set_or_unset_env('BRZ_TEST_ENV_VAR', uni_val)
1728
1744
self.assertEqual(uni_val, os.environ.get('BRZ_TEST_ENV_VAR'))
1785
1801
self.assertContainsRe(text, "class TextUIFactory")
1786
1802
# test unsupported package
1787
1803
self.assertRaises(errors.BzrError, osutils.resource_string, 'zzzz',
1789
1805
# test unknown resource
1790
1806
self.assertRaises(IOError, osutils.resource_string, 'breezy', 'yyy.xx')
1814
1830
expected_dirblocks = [
1816
[(b'0file', b'0file', 'file', './0file'),
1817
(b'1dir', b'1dir', 'directory', './1dir'),
1818
(b'2file', b'2file', 'file', './2file'),
1821
((b'1dir', './1dir'),
1822
[(b'1dir/0file', b'0file', 'file', './1dir/0file'),
1823
(b'1dir/1dir', b'1dir', 'directory', './1dir/1dir'),
1826
((b'1dir/1dir', './1dir/1dir'),
1832
[(b'0file', b'0file', 'file', './0file'),
1833
(b'1dir', b'1dir', 'directory', './1dir'),
1834
(b'2file', b'2file', 'file', './2file'),
1837
((b'1dir', './1dir'),
1838
[(b'1dir/0file', b'0file', 'file', './1dir/0file'),
1839
(b'1dir/1dir', b'1dir', 'directory', './1dir/1dir'),
1842
((b'1dir/1dir', './1dir/1dir'),
1831
1847
return tree, expected_dirblocks
1836
1852
result = list(osutils._walkdirs_utf8('.'))
1837
1853
# Filter out stat and abspath
1838
1854
self.assertEqual(expected_dirblocks,
1839
self._filter_out(result))
1855
self._filter_out(result))
1841
1857
def test_walk_sub_dir(self):
1842
1858
tree, expected_dirblocks = self._get_ascii_tree()
1845
1861
result = list(osutils._walkdirs_utf8(b'./1dir', b'1dir'))
1846
1862
# Filter out stat and abspath
1847
1863
self.assertEqual(expected_dirblocks[1:],
1848
self._filter_out(result))
1864
self._filter_out(result))
1850
1866
def _get_unicode_tree(self):
1851
1867
name0u = u'0file-\xb6'
1862
1878
name1 = name1u.encode('UTF-8')
1863
1879
name2 = name2u.encode('UTF-8')
1864
1880
expected_dirblocks = [
1866
[(name0, name0, 'file', './' + name0u),
1867
(name1, name1, 'directory', './' + name1u),
1868
(name2, name2, 'file', './' + name2u),
1871
((name1, './' + name1u),
1872
[(name1 + b'/' + name0, name0, 'file', './' + name1u
1874
(name1 + b'/' + name1, name1, 'directory', './' + name1u
1878
((name1 + b'/' + name1, './' + name1u + '/' + name1u),
1882
[(name0, name0, 'file', './' + name0u),
1883
(name1, name1, 'directory', './' + name1u),
1884
(name2, name2, 'file', './' + name2u),
1887
((name1, './' + name1u),
1888
[(name1 + b'/' + name0, name0, 'file', './' + name1u
1890
(name1 + b'/' + name1, name1, 'directory', './' + name1u
1894
((name1 + b'/' + name1, './' + name1u + '/' + name1u),
1883
1899
return tree, expected_dirblocks
1892
1908
dirinfo = (dirinfo[0], self._native_to_unicode(dirinfo[1]))
1894
1910
for line in block:
1895
details.append(line[0:3] + (self._native_to_unicode(line[4]), ))
1912
line[0:3] + (self._native_to_unicode(line[4]), ))
1896
1913
filtered_dirblocks.append((dirinfo, details))
1897
1914
return filtered_dirblocks
1909
1926
target = u'target\N{Euro Sign}'
1910
1927
link_name = u'l\N{Euro Sign}nk'
1911
1928
os.symlink(target, link_name)
1912
target_utf8 = target.encode('UTF-8')
1913
1929
link_name_utf8 = link_name.encode('UTF-8')
1914
1930
expected_dirblocks = [
1916
[(link_name_utf8, link_name_utf8,
1917
'symlink', './' + link_name),],
1932
[(link_name_utf8, link_name_utf8,
1933
'symlink', './' + link_name), ],
1919
1935
result = list(osutils._walkdirs_utf8('.'))
1920
1936
self.assertEqual(expected_dirblocks, self._filter_out(result))
1929
1945
But prior python versions failed to properly encode the passed unicode
1932
_test_needs_features = [features.SymlinkFeature, features.UnicodeFilenameFeature]
1948
_test_needs_features = [features.SymlinkFeature,
1949
features.UnicodeFilenameFeature]
1934
1951
def setUp(self):
1935
1952
super(tests.TestCaseInTempDir, self).setUp()
1938
1955
os.symlink(self.target, self.link)
1940
1957
def test_os_readlink_link_encoding(self):
1941
self.assertEqual(self.target, os.readlink(self.link))
1958
self.assertEqual(self.target, os.readlink(self.link))
1943
1960
def test_os_readlink_link_decoding(self):
1944
1961
self.assertEqual(self.target.encode(osutils._fs_enc),
1945
os.readlink(self.link.encode(osutils._fs_enc)))
1962
os.readlink(self.link.encode(osutils._fs_enc)))
1948
1965
class TestConcurrency(tests.TestCase):
1988
2005
self._try_loading()
1989
2006
self.assertLength(1, osutils._extension_load_failures)
1991
self.assertEqual(osutils._extension_load_failures[0],
2009
osutils._extension_load_failures[0],
1992
2010
"No module named 'breezy._fictional_extension_py'")
1994
2012
self.assertEqual(osutils._extension_load_failures[0],
1995
"No module named _fictional_extension_py")
2013
"No module named _fictional_extension_py")
1997
2015
def test_report_extension_load_failures_no_warning(self):
1998
2016
self.assertTrue(self._try_loading())
1999
warnings, result = self.callCatchWarnings(osutils.report_extension_load_failures)
2017
warnings, result = self.callCatchWarnings(
2018
osutils.report_extension_load_failures)
2000
2019
# it used to give a Python warning; it no longer does
2001
2020
self.assertLength(0, warnings)
2114
2133
def test_copy_ownership_from_path(self):
2115
2134
"""copy_ownership_from_path test with specified src."""
2117
f = open('test_file', 'wt')
2136
open('test_file', 'wt').close()
2118
2137
osutils.copy_ownership_from_path('test_file', ownsrc)
2120
2139
s = os.stat(ownsrc)
2125
2144
def test_copy_ownership_nonesrc(self):
2126
2145
"""copy_ownership_from_path test with src=None."""
2127
f = open('test_file', 'wt')
2146
open('test_file', 'wt').close()
2128
2147
# should use parent dir for permissions
2129
2148
osutils.copy_ownership_from_path('test_file')
2153
2172
self.overrideEnv('BRZ_TEST_PATH', '/home/\xa7test')
2154
2173
self.overrideAttr(osutils, "_fs_enc", "iso8859-1")
2155
2174
self.assertEqual(u'/home/\xa7test',
2156
osutils._posix_path_from_environ('BRZ_TEST_PATH'))
2175
osutils._posix_path_from_environ('BRZ_TEST_PATH'))
2157
2176
osutils._fs_enc = "iso8859-5"
2159
2178
# In Python 3, os.environ returns unicode.
2160
2179
self.assertEqual(u'/home/\xa7test',
2161
osutils._posix_path_from_environ('BRZ_TEST_PATH'))
2180
osutils._posix_path_from_environ('BRZ_TEST_PATH'))
2163
2182
self.assertEqual(u'/home/\u0407test',
2164
osutils._posix_path_from_environ('BRZ_TEST_PATH'))
2183
osutils._posix_path_from_environ('BRZ_TEST_PATH'))
2165
2184
osutils._fs_enc = "utf-8"
2166
self.assertRaises(errors.BadFilenameEncoding,
2186
errors.BadFilenameEncoding,
2167
2187
osutils._posix_path_from_environ, 'BRZ_TEST_PATH')
2194
2214
# In python 3, os.environ returns unicode
2195
2215
self.assertEqual(u'/home/\xa7test', osutils._posix_get_home_dir())
2197
self.assertEqual(u'/home/\u0407test', osutils._posix_get_home_dir())
2217
self.assertEqual(u'/home/\u0407test',
2218
osutils._posix_get_home_dir())
2198
2219
osutils._fs_enc = "utf-8"
2199
2220
self.assertRaises(errors.BadFilenameEncoding,
2200
osutils._posix_get_home_dir)
2221
osutils._posix_get_home_dir)
2203
2224
class TestGetuserUnicode(tests.TestCase):
2210
2231
if sys.platform == "win32":
2211
2232
# Disable use of platform calls on windows so envvar is used
2212
2233
self.overrideAttr(win32utils, 'has_ctypes', False)
2213
return 'USERNAME' # only variable used on windows
2214
return 'LOGNAME' # first variable checked by getpass.getuser()
2234
return 'USERNAME' # only variable used on windows
2235
return 'LOGNAME' # first variable checked by getpass.getuser()
2216
2237
def test_ascii_user(self):
2217
2238
self.overrideEnv(self.envvar_to_override(), 'jrandom')
2276
2298
self.assertTrue(
2277
2299
osutils.find_executable_on_path('THIS SHOULD NOT EXIST') is None)
2278
2300
self.assertTrue(osutils.find_executable_on_path('file.txt') is None)
2280
2302
def test_windows_app_path(self):
2281
2303
if sys.platform != 'win32':
2282
2304
raise tests.TestSkipped('test requires win32')
2283
2305
# Override PATH env var so that exe can only be found on App Path
2284
2306
self.overrideEnv('PATH', '')
2285
2307
# Internt Explorer is always registered in the App Path
2286
self.assertTrue(osutils.find_executable_on_path('iexplore') is not None)
2308
self.assertTrue(osutils.find_executable_on_path(
2309
'iexplore') is not None)
2288
2311
def test_other(self):
2289
2312
if sys.platform == 'win32':