Changeset 1832:d82623ded860


Ignore:
Timestamp:
Jul 9, 2019, 11:49:02 PM (3 months ago)
Author:
Stefan Schwarzer <sschwarzer@…>
Branch:
default
Message:
Use `ScriptedSession` in `TestPath`
File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/test_path.py

    r1721 r1832  
    1 # Copyright (C) 2003-2018, Stefan Schwarzer <sschwarzer@sschwarzer.net>
     1# Copyright (C) 2003-2019, Stefan Schwarzer <sschwarzer@sschwarzer.net>
    22# and ftputil contributors (see `doc/contributors.txt`)
    33# See the file LICENSE for licensing terms.
    44
     5import datetime
    56import ftplib
    67import time
     
    1415from test import mock_ftplib
    1516from test import test_base
    16 
    17 
    18 class FailingFTPHost(ftputil.FTPHost):
    19 
    20     def _dir(self, path):
    21         raise ftputil.error.FTPOSError("simulate a failure, e. g. timeout")
    22 
    23 
    24 # Mock session, used for testing an inaccessible login directory
    25 class SessionWithInaccessibleLoginDirectory(mock_ftplib.MockSession):
    26 
    27     def cwd(self, dir):
    28         # Assume that `dir` is the inaccessible login directory.
    29         raise ftplib.error_perm("can't change into this directory")
     17from test import scripted_session
     18
     19
     20Call = scripted_session.Call
    3021
    3122
     
    3728    def test_regular_isdir_isfile_islink(self):
    3829        """Test regular `FTPHost._Path.isdir/isfile/islink`."""
    39         host = test_base.ftp_host_factory()
    40         testdir = "/home/sschwarzer"
    41         host.chdir(testdir)
    4230        # Test a path which isn't there.
    43         assert not host.path.isdir("notthere")
    44         assert not host.path.isfile("notthere")
    45         assert not host.path.islink("notthere")
    46         #  This checks additional code (see ticket #66).
    47         assert not host.path.isdir("/notthere/notthere")
    48         assert not host.path.isfile("/notthere/notthere")
    49         assert not host.path.islink("/notthere/notthere")
     31        script = [
     32          Call("__init__"),
     33          Call("pwd", result="/"),
     34          # `isdir` call
     35          Call("cwd", args=("/",)),
     36          Call("cwd", args=("/",)),
     37          Call("dir", args=("",), result=""),
     38          Call("cwd", args=("/",)),
     39          # `isfile` call
     40          Call("cwd", args=("/",)),
     41          Call("cwd", args=("/",)),
     42          Call("dir", args=("",), result=""),
     43          Call("cwd", args=("/",)),
     44          # `islink` call
     45          Call("cwd", args=("/",)),
     46          Call("cwd", args=("/",)),
     47          Call("dir", args=("",), result=""),
     48          Call("cwd", args=("/",)),
     49          Call("close")
     50        ]
     51        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     52            host.stat_cache.disable()
     53            assert not host.path.isdir("notthere")
     54            assert not host.path.isfile("notthere")
     55            assert not host.path.islink("notthere")
     56        # This checks additional code (see ticket #66).
     57        script = [
     58          Call("__init__"),
     59          Call("pwd", result="/"),
     60          # `isdir` call
     61          Call("cwd", args=("/",)),
     62          Call("cwd", args=("/",)),
     63          Call("dir", args=("",), result=""),
     64          Call("cwd", args=("/",)),
     65          # `isfile` call
     66          Call("cwd", args=("/",)),
     67          Call("cwd", args=("/",)),
     68          Call("dir", args=("",), result=""),
     69          Call("cwd", args=("/",)),
     70          # `islink` call
     71          Call("cwd", args=("/",)),
     72          Call("cwd", args=("/",)),
     73          Call("dir", args=("",), result=""),
     74          Call("cwd", args=("/",)),
     75          Call("close")
     76        ]
     77        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     78            host.stat_cache.disable()
     79            assert not host.path.isdir("/notthere/notthere")
     80            assert not host.path.isfile("/notthere/notthere")
     81            assert not host.path.islink("/notthere/notthere")
    5082        # Test a directory.
    51         assert host.path.isdir(testdir)
    52         assert not host.path.isfile(testdir)
    53         assert not host.path.islink(testdir)
     83        test_dir = "/some_dir"
     84        dir_line = test_base.dir_line(mode_string="dr-xr-xr-x",
     85                                      datetime_=datetime.datetime.now(),
     86                                      name=test_dir.lstrip("/"))
     87        script = [
     88          Call("__init__"),
     89          Call("pwd", result="/"),
     90          # `isdir` call
     91          Call("cwd", args=("/",)),
     92          Call("cwd", args=("/",)),
     93          Call("dir", args=("",), result=dir_line),
     94          Call("cwd", args=("/",)),
     95          # `isfile` call
     96          Call("cwd", args=("/",)),
     97          Call("cwd", args=("/",)),
     98          Call("dir", args=("",), result=dir_line),
     99          Call("cwd", args=("/",)),
     100          # `islink` call
     101          Call("cwd", args=("/",)),
     102          Call("cwd", args=("/",)),
     103          Call("dir", args=("",), result=dir_line),
     104          Call("cwd", args=("/",)),
     105          Call("close")
     106        ]
     107        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     108            host.stat_cache.disable()
     109            assert host.path.isdir(test_dir)
     110            assert not host.path.isfile(test_dir)
     111            assert not host.path.islink(test_dir)
    54112        # Test a file.
    55         testfile = "/home/sschwarzer/index.html"
    56         assert not host.path.isdir(testfile)
    57         assert host.path.isfile(testfile)
    58         assert not host.path.islink(testfile)
    59         # Test a link. Since the link target of `osup` doesn't exist,
    60         # neither `isdir` nor `isfile` return `True`.
    61         testlink = "/home/sschwarzer/osup"
    62         assert not host.path.isdir(testlink)
    63         assert not host.path.isfile(testlink)
    64         assert host.path.islink(testlink)
     113        test_file = "/some_file"
     114        dir_line = test_base.dir_line(datetime_=datetime.datetime.now(),
     115                                      name=test_file.lstrip("/"))
     116        script = [
     117          Call("__init__"),
     118          Call("pwd", result="/"),
     119          # `isdir` call
     120          Call("cwd", args=("/",)),
     121          Call("cwd", args=("/",)),
     122          Call("dir", args=("",), result=dir_line),
     123          Call("cwd", args=("/",)),
     124          # `isfile` call
     125          Call("cwd", args=("/",)),
     126          Call("cwd", args=("/",)),
     127          Call("dir", args=("",), result=dir_line),
     128          Call("cwd", args=("/",)),
     129          # `islink` call
     130          Call("cwd", args=("/",)),
     131          Call("cwd", args=("/",)),
     132          Call("dir", args=("",), result=dir_line),
     133          Call("cwd", args=("/",)),
     134          Call("close")
     135        ]
     136        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     137            host.stat_cache.disable()
     138            assert not host.path.isdir(test_file)
     139            assert host.path.isfile(test_file)
     140            assert not host.path.islink(test_file)
     141        # Test a link. Since the link target doesn't exist, neither
     142        # `isdir` nor `isfile` return `True`.
     143        test_link = "/some_link"
     144        dir_line = test_base.dir_line(mode_string="lrwxrwxrwx",
     145                                      datetime_=datetime.datetime.now(),
     146                                      name=test_link.lstrip("/"),
     147                                      link_target="nonexistent")
     148        script = [
     149          Call("__init__"),
     150          Call("pwd", result="/"),
     151          # `isdir` call
     152          Call("cwd", args=("/",)),
     153          Call("cwd", args=("/",)),
     154          #  Look for `/some_link`
     155          Call("dir", args=("",), result=dir_line),
     156          Call("cwd", args=("/",)),
     157          Call("cwd", args=("/",)),
     158          Call("cwd", args=("/",)),
     159          #  Look for `/nonexistent`
     160          Call("dir", args=("",), result=dir_line),
     161          Call("cwd", args=("/",)),
     162          # `isfile` call
     163          Call("cwd", args=("/",)),
     164          Call("cwd", args=("/",)),
     165          #  Look for `/some_link`
     166          Call("dir", args=("",), result=dir_line),
     167          Call("cwd", args=("/",)),
     168          Call("cwd", args=("/",)),
     169          Call("cwd", args=("/",)),
     170          #  Look for `/nonexistent`
     171          Call("dir", args=("",), result=dir_line),
     172          Call("cwd", args=("/",)),
     173          # `islink` call
     174          Call("cwd", args=("/",)),
     175          Call("cwd", args=("/",)),
     176          #  Look for `/some_link`. `islink` doesn't try to dereference
     177          #  the link.
     178          Call("dir", args=("",), result=dir_line),
     179          Call("cwd", args=("/",)),
     180          Call("close")
     181        ]
     182        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     183            host.stat_cache.disable()
     184            assert not host.path.isdir(test_link)
     185            assert not host.path.isfile(test_link)
     186            assert host.path.islink(test_link)
    65187
    66188    def test_workaround_for_spaces(self):
    67189        """Test whether the workaround for space-containing paths is used."""
    68         host = test_base.ftp_host_factory()
    69         testdir = "/home/sschwarzer"
    70         host.chdir(testdir)
    71190        # Test a file name containing spaces.
    72         testfile = "/home/dir with spaces/file with spaces"
    73         assert not host.path.isdir(testfile)
    74         assert host.path.isfile(testfile)
    75         assert not host.path.islink(testfile)
     191        test_file = "/home/dir with spaces/file with spaces"
     192        dir_line1 = test_base.dir_line(mode_string="dr-xr-xr-x",
     193                                       datetime_=datetime.datetime.now(),
     194                                       name="home")
     195        dir_line2 = test_base.dir_line(mode_string="dr-xr-xr-x",
     196                                       datetime_=datetime.datetime.now(),
     197                                       name="dir with spaces")
     198        dir_line3 = test_base.dir_line(mode_string="-r--r--r--",
     199                                       datetime_=datetime.datetime.now(),
     200                                       name="file with spaces")
     201        script = [
     202          Call("__init__"),
     203          Call("pwd", result="/"),
     204          # `isdir` call
     205          Call("cwd", args=("/",)),
     206          Call("cwd", args=("/",)),
     207          Call("dir", args=("",), result=dir_line1),
     208          Call("cwd", args=("/",)),
     209
     210          Call("cwd", args=("/",)),
     211          Call("cwd", args=("/home",)),
     212          Call("dir", args=("",), result=dir_line2),
     213          Call("cwd", args=("/",)),
     214          Call("cwd", args=("/",)),
     215          Call("cwd", args=("/home/dir with spaces",)),
     216          Call("dir", args=("",), result=dir_line3),
     217          Call("cwd", args=("/",)),
     218          # `isfile` call
     219          Call("cwd", args=("/",)),
     220          Call("cwd", args=("/",)),
     221          Call("dir", args=("",), result=dir_line1),
     222          Call("cwd", args=("/",)),
     223          Call("cwd", args=("/",)),
     224          Call("cwd", args=("/home",)),
     225          Call("dir", args=("",), result=dir_line2),
     226          Call("cwd", args=("/",)),
     227          Call("cwd", args=("/",)),
     228          Call("cwd", args=("/home/dir with spaces",)),
     229          Call("dir", args=("",), result=dir_line3),
     230          Call("cwd", args=("/",)),
     231          # `islink` call
     232          Call("cwd", args=("/",)),
     233          Call("cwd", args=("/",)),
     234          Call("dir", args=("",), result=dir_line1),
     235          Call("cwd", args=("/",)),
     236          Call("cwd", args=("/",)),
     237          Call("cwd", args=("/home",)),
     238          Call("dir", args=("",), result=dir_line2),
     239          Call("cwd", args=("/",)),
     240          Call("cwd", args=("/",)),
     241          Call("cwd", args=("/home/dir with spaces",)),
     242          Call("dir", args=("",), result=dir_line3),
     243          Call("cwd", args=("/",)),
     244          Call("close"),
     245        ]
     246        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     247            host.stat_cache.disable()
     248            assert not host.path.isdir(test_file)
     249            assert host.path.isfile(test_file)
     250            assert not host.path.islink(test_file)
    76251
    77252    def test_inaccessible_home_directory_and_whitespace_workaround(self):
    78253        "Test combination of inaccessible home directory + whitespace in path."
    79         host = test_base.ftp_host_factory(
    80                session_factory=SessionWithInaccessibleLoginDirectory)
    81         with pytest.raises(ftputil.error.InaccessibleLoginDirError):
    82             host._dir("/home dir")
     254        script = [
     255          Call("__init__"),
     256          Call("pwd", result="/"),
     257          Call("cwd", result=ftplib.error_perm),
     258          Call("close")
     259        ]
     260        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     261            with pytest.raises(ftputil.error.InaccessibleLoginDirError):
     262                host._dir("/home dir")
    83263
    84264    def test_isdir_isfile_islink_with_dir_failure(self):
     
    87267        failing `_dir` call.
    88268        """
    89         host = test_base.ftp_host_factory(ftp_host_class=FailingFTPHost)
    90         testdir = "/home/sschwarzer"
    91         host.chdir(testdir)
     269        script = [
     270          Call("__init__"),
     271          Call("pwd", result="/"),
     272          Call("cwd", args=("/",)),
     273          Call("cwd", args=("/",)),
     274          Call("dir", args=("",), result=ftplib.error_perm),
     275          Call("cwd", args=("/",)),
     276          Call("close")
     277        ]
     278        FTPOSError = ftputil.error.FTPOSError
    92279        # Test if exceptions are propagated.
    93         FTPOSError = ftputil.error.FTPOSError
    94         with pytest.raises(FTPOSError):
    95             host.path.isdir("index.html")
    96         with pytest.raises(FTPOSError):
    97             host.path.isfile("index.html")
    98         with pytest.raises(FTPOSError):
    99             host.path.islink("index.html")
     280        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     281            with pytest.raises(FTPOSError):
     282                host.path.isdir("index.html")
     283        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     284            with pytest.raises(FTPOSError):
     285                host.path.isfile("index.html")
     286        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     287            with pytest.raises(FTPOSError):
     288                host.path.islink("index.html")
    100289
    101290    def test_isdir_isfile_with_infinite_link_chain(self):
     
    104293        an infinite link chain.
    105294        """
    106         host = test_base.ftp_host_factory()
    107         assert host.path.isdir("/home/bad_link") is False
    108         assert host.path.isfile("/home/bad_link") is False
     295        # `/home/bad_link` links to `/home/subdir/bad_link`, which
     296        # links back to `/home/bad_link` etc.
     297        dir_line1 = test_base.dir_line(mode_string="dr-xr-xr-x",
     298                                       datetime_=datetime.datetime.now(),
     299                                       name="home")
     300        dir_line2 = test_base.dir_line(mode_string="lrwxrwxrwx",
     301                                       datetime_=datetime.datetime.now(),
     302                                       name="bad_link",
     303                                       link_target="subdir/bad_link")
     304        dir_line3 = test_base.dir_line(mode_string="dr-xr-xr-x",
     305                                       datetime_=datetime.datetime.now(),
     306                                       name="subdir")
     307        dir_line4 = test_base.dir_line(mode_string="lrwxrwxrwx",
     308                                       datetime_=datetime.datetime.now(),
     309                                       name="bad_link",
     310                                       link_target="/home/bad_link")
     311        script = [
     312          Call("__init__"),
     313          Call("pwd", result="/"),
     314          Call("cwd", args=("/",)),
     315          Call("cwd", args=("/",)),
     316          Call("dir", args=("",), result=dir_line1),
     317          Call("cwd", args=("/",)),
     318          Call("cwd", args=("/",)),
     319          Call("cwd", args=("/home",)),
     320          Call("dir", args=("",), result=dir_line2+"\n"+dir_line3),
     321          Call("cwd", args=("/",)),
     322          Call("cwd", args=("/",)),
     323          Call("cwd", args=("/home/subdir",)),
     324          Call("dir", args=("",), result=dir_line4),
     325          Call("cwd", args=("/",)),
     326          Call("close")
     327        ]
     328        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     329            assert host.path.isdir("/home/bad_link") is False
     330        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     331            assert host.path.isfile("/home/bad_link") is False
    109332
    110333    def test_exists(self):
    111334        """Test `FTPHost.path.exists`."""
    112335        # Regular use of `exists`
    113         host = test_base.ftp_host_factory()
    114         testdir = "/home/sschwarzer"
    115         host.chdir(testdir)
    116         assert host.path.exists("index.html")
    117         assert not host.path.exists("notthere")
    118         # Test if exceptions are propagated.
    119         host = test_base.ftp_host_factory(ftp_host_class=FailingFTPHost)
    120         with pytest.raises(ftputil.error.FTPOSError):
    121             host.path.exists("index.html")
     336        dir_line1 = test_base.dir_line(datetime_=datetime.datetime.now(),
     337                                       name="some_file")
     338        script = [
     339          Call("__init__"),
     340          Call("pwd", result="/"),
     341          # `exists("some_file")`
     342          Call("cwd", args=("/",)),
     343          Call("cwd", args=("/",)),
     344          Call("dir", args=("",), result=dir_line1),
     345          Call("cwd", args=("/",)),
     346          # `exists("notthere")`
     347          Call("cwd", args=("/",)),
     348          Call("cwd", args=("/",)),
     349          Call("dir", args=("",), result=dir_line1),
     350          Call("cwd", args=("/",)),
     351          # `exists` with failing `dir` call
     352          Call("cwd", args=("/",)),
     353          Call("cwd", args=("/",)),
     354          Call("dir", args=("",), result=ftplib.error_perm),
     355          Call("cwd", args=("/",)),
     356          Call("close")
     357        ]
     358        with test_base.ftp_host_factory(scripted_session.factory(script)) as host:
     359            host.stat_cache.disable()
     360            assert host.path.exists("some_file")
     361            assert not host.path.exists("notthere")
     362            # Test if exceptions are propagated.
     363            with pytest.raises(ftputil.error.FTPOSError):
     364                host.path.exists("some_file")
    122365
    123366
Note: See TracChangeset for help on using the changeset viewer.