~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_osutils.py

(vila) Fix bzrlib.tests.test_gpg.TestVerify.test_verify_revoked_signature
 with recent versions of gpg. (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2015 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
23
23
import select
24
24
import socket
25
25
import sys
 
26
import tempfile
26
27
import time
27
28
 
28
29
from bzrlib import (
181
182
        shape = sorted(os.listdir('.'))
182
183
        self.assertEquals(['A', 'B'], shape)
183
184
 
 
185
    def test_rename_exception(self):
 
186
        try:
 
187
            osutils.rename('nonexistent_path', 'different_nonexistent_path')
 
188
        except OSError, e:
 
189
            self.assertEqual(e.old_filename, 'nonexistent_path')
 
190
            self.assertEqual(e.new_filename, 'different_nonexistent_path')
 
191
            self.assertTrue('nonexistent_path' in e.strerror)
 
192
            self.assertTrue('different_nonexistent_path' in e.strerror)
 
193
 
184
194
 
185
195
class TestRandChars(tests.TestCase):
186
196
 
427
437
        self.assertTrue(-eighteen_hours < offset < eighteen_hours)
428
438
 
429
439
 
 
440
class TestFdatasync(tests.TestCaseInTempDir):
 
441
 
 
442
    def do_fdatasync(self):
 
443
        f = tempfile.NamedTemporaryFile()
 
444
        osutils.fdatasync(f.fileno())
 
445
        f.close()
 
446
 
 
447
    @staticmethod
 
448
    def raise_eopnotsupp(*args, **kwargs):
 
449
        raise IOError(errno.EOPNOTSUPP, os.strerror(errno.EOPNOTSUPP))
 
450
 
 
451
    @staticmethod
 
452
    def raise_enotsup(*args, **kwargs):
 
453
        raise IOError(errno.ENOTSUP, os.strerror(errno.ENOTSUP))
 
454
 
 
455
    def test_fdatasync_handles_system_function(self):
 
456
        self.overrideAttr(os, "fdatasync")
 
457
        self.do_fdatasync()
 
458
 
 
459
    def test_fdatasync_handles_no_fdatasync_no_fsync(self):
 
460
        self.overrideAttr(os, "fdatasync")
 
461
        self.overrideAttr(os, "fsync")
 
462
        self.do_fdatasync()
 
463
 
 
464
    def test_fdatasync_handles_no_EOPNOTSUPP(self):
 
465
        self.overrideAttr(errno, "EOPNOTSUPP")
 
466
        self.do_fdatasync()
 
467
 
 
468
    def test_fdatasync_catches_ENOTSUP(self):
 
469
        enotsup = getattr(errno, "ENOTSUP", None)
 
470
        if enotsup is None:
 
471
            raise tests.TestNotApplicable("No ENOTSUP on this platform")
 
472
        self.overrideAttr(os, "fdatasync", self.raise_enotsup)
 
473
        self.do_fdatasync()
 
474
 
 
475
    def test_fdatasync_catches_EOPNOTSUPP(self):
 
476
        enotsup = getattr(errno, "EOPNOTSUPP", None)
 
477
        if enotsup is None:
 
478
            raise tests.TestNotApplicable("No EOPNOTSUPP on this platform")
 
479
        self.overrideAttr(os, "fdatasync", self.raise_eopnotsupp)
 
480
        self.do_fdatasync()
 
481
 
 
482
 
430
483
class TestLinks(tests.TestCaseInTempDir):
431
484
 
432
485
    def test_dereference_path(self):
545
598
    """Test pumpfile method."""
546
599
 
547
600
    def setUp(self):
548
 
        tests.TestCase.setUp(self)
 
601
        super(TestPumpFile, self).setUp()
549
602
        # create a test datablock
550
603
        self.block_size = 512
551
604
        pattern = '0123456789ABCDEF'
819
872
        self.assertEqual(None, osutils.safe_file_id(None))
820
873
 
821
874
 
 
875
class TestSendAll(tests.TestCase):
 
876
 
 
877
    def test_send_with_disconnected_socket(self):
 
878
        class DisconnectedSocket(object):
 
879
            def __init__(self, err):
 
880
                self.err = err
 
881
            def send(self, content):
 
882
                raise self.err
 
883
            def close(self):
 
884
                pass
 
885
        # All of these should be treated as ConnectionReset
 
886
        errs = []
 
887
        for err_cls in (IOError, socket.error):
 
888
            for errnum in osutils._end_of_stream_errors:
 
889
                errs.append(err_cls(errnum))
 
890
        for err in errs:
 
891
            sock = DisconnectedSocket(err)
 
892
            self.assertRaises(errors.ConnectionReset,
 
893
                osutils.send_all, sock, 'some more content')
 
894
 
 
895
    def test_send_with_no_progress(self):
 
896
        # See https://bugs.launchpad.net/bzr/+bug/1047309
 
897
        # It seems that paramiko can get into a state where it doesn't error,
 
898
        # but it returns 0 bytes sent for requests over and over again.
 
899
        class NoSendingSocket(object):
 
900
            def __init__(self):
 
901
                self.call_count = 0
 
902
            def send(self, bytes):
 
903
                self.call_count += 1
 
904
                if self.call_count > 100:
 
905
                    # Prevent the test suite from hanging
 
906
                    raise RuntimeError('too many calls')
 
907
                return 0
 
908
        sock = NoSendingSocket()
 
909
        self.assertRaises(errors.ConnectionReset,
 
910
                          osutils.send_all, sock, 'content')
 
911
        self.assertEqual(1, sock.call_count)
 
912
 
 
913
 
822
914
class TestPosixFuncs(tests.TestCase):
823
915
    """Test that the posix version of normpath returns an appropriate path
824
916
       when used with 2 leading slashes."""
833
925
    """Test that _win32 versions of os utilities return appropriate paths."""
834
926
 
835
927
    def test_abspath(self):
 
928
        self.requireFeature(features.win32_feature)
836
929
        self.assertEqual('C:/foo', osutils._win32_abspath('C:\\foo'))
837
930
        self.assertEqual('C:/foo', osutils._win32_abspath('C:/foo'))
838
931
        self.assertEqual('//HOST/path', osutils._win32_abspath(r'\\HOST\path'))
851
944
                         osutils._win32_pathjoin('path/to', 'C:/foo'))
852
945
        self.assertEqual('path/to/foo',
853
946
                         osutils._win32_pathjoin('path/to/', 'foo'))
854
 
        self.assertEqual('/foo',
 
947
 
 
948
    def test_pathjoin_late_bugfix(self):
 
949
        if sys.version_info < (2, 7, 6):
 
950
            expected = '/foo'
 
951
        else:
 
952
            expected = 'C:/foo'
 
953
        self.assertEqual(expected,
855
954
                         osutils._win32_pathjoin('C:/path/to/', '/foo'))
856
 
        self.assertEqual('/foo',
 
955
        self.assertEqual(expected,
857
956
                         osutils._win32_pathjoin('C:\\path\\to\\', '\\foo'))
858
957
 
859
958
    def test_normpath(self):
879
978
        self.assertEqual('C:\\foo', osutils._win32_fixdrive('c:\\foo'))
880
979
 
881
980
    def test_win98_abspath(self):
 
981
        self.requireFeature(features.win32_feature)
882
982
        # absolute path
883
983
        self.assertEqual('C:/foo', osutils._win98_abspath('C:\\foo'))
884
984
        self.assertEqual('C:/foo', osutils._win98_abspath('C:/foo'))
1762
1862
    _native_to_unicode = None
1763
1863
 
1764
1864
    def setUp(self):
1765
 
        tests.TestCaseInTempDir.setUp(self)
 
1865
        super(TestDirReader, self).setUp()
1766
1866
        self.overrideAttr(osutils,
1767
1867
                          '_selected_dir_reader', self._dir_reader_class())
1768
1868
 
1976
2076
class TestTerminalWidth(tests.TestCase):
1977
2077
 
1978
2078
    def setUp(self):
1979
 
        tests.TestCase.setUp(self)
 
2079
        super(TestTerminalWidth, self).setUp()
1980
2080
        self._orig_terminal_size_state = osutils._terminal_size_state
1981
2081
        self._orig_first_terminal_size = osutils._first_terminal_size
1982
2082
        self.addCleanup(self.restore_osutils_globals)
2063
2163
    _test_needs_features = [features.chown_feature]
2064
2164
 
2065
2165
    def setUp(self):
2066
 
        tests.TestCaseInTempDir.setUp(self)
 
2166
        super(TestCreationOps, self).setUp()
2067
2167
        self.overrideAttr(os, 'chown', self._dummy_chown)
2068
2168
 
2069
2169
        # params set by call to _dummy_chown
2225
2325
        self.assertTrue(
2226
2326
            osutils.find_executable_on_path('THIS SHOULD NOT EXIST') is None)
2227
2327
        self.assertTrue(osutils.find_executable_on_path('file.txt') is None)
 
2328
        
 
2329
    def test_windows_app_path(self):
 
2330
        if sys.platform != 'win32':
 
2331
            raise tests.TestSkipped('test requires win32')
 
2332
        # Override PATH env var so that exe can only be found on App Path
 
2333
        self.overrideEnv('PATH', '')
 
2334
        # Internt Explorer is always registered in the App Path
 
2335
        self.assertTrue(osutils.find_executable_on_path('iexplore') is not None)
2228
2336
 
2229
2337
    def test_other(self):
2230
2338
        if sys.platform == 'win32':