pyfilesystem
pyfilesystem copied to clipboard
some paramiko dependant tests fail reproducible
Hi,
FYI: all current versions of paramiko (I tested 1.15.1, 1.16.0, and 2.0.0) with Python 2.7 trigger failures in the fs testsuite:
[ 72s] ____________________ TestSFTPFS.test_cases_in_separate_dir____________________
[ 72s]
[ 72s] self = <fs.tests.test_expose.TestSFTPFS testMethod=test_cases_in_separate_dirs>
[ 72s]
[ 72s] def test_cases_in_separate_dirs(self):
[ 72s] class TestCases_in_subdir(self.__class__, unittest.TestCase):
[ 72s] """Run all testcases against a subdir of self.fs"""
[ 72s] def __init__(this, subdir):
[ 72s] super(TestCases_in_subdir, this).__init__("test_listdir")
[ 72s] this.subdir = subdir
[ 72s] for meth in dir(this):
[ 72s] if not meth.startswith("test_"):
[ 72s] continue
[ 72s] if meth in self._dont_retest:
[ 72s] continue
[ 72s] if not hasattr(FSTestCases, meth):
[ 72s] continue
[ 72s] if self.fs.exists(subdir):
[ 72s] self.fs.removedir(subdir, force=True)
[ 72s] self.assertFalse(self.fs.isdir(subdir))
[ 72s] self.assertTrue(self.fs.isdir("/"))
[ 72s] self.fs.makedir(subdir)
[ 72s] self._yield()
[ 72s] getattr(this, meth)()
[ 72s]
[ 72s] @property
[ 72s] def fs(this):
[ 72s] return self.fs.opendir(this.subdir)
[ 72s]
[ 72s] def check(this, p):
[ 72s] return self.check(pathjoin(this.subdir, relpath(p)))
[ 72s]
[ 72s] def thread1():
[ 72s] TestCases_in_subdir("thread1")
[ 72s]
[ 72s] def thread2():
[ 72s] TestCases_in_subdir("thread2")
[ 72s]
[ 72s] def thread3():
[ 72s] TestCases_in_subdir("thread3")
[ 72s] > self._runThreads(thread1, thread2, thread3)
[ 72s]
[ 72s] fs/tests/__init__.py:1074:
[ 72s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
[ 72s] fs/tests/__init__.py:962: in runThread
[ 72s] func()
[ 72s] fs/tests/__init__.py:1067: in thread1
[ 72s] TestCases_in_subdir("thread1")
[ 72s] fs/tests/__init__.py:1057: in __init__
[ 72s] getattr(this, meth)()
[ 72s] fs/tests/__init__.py:534: in test_infokeys
[ 72s] self.assertEqual(self.fs.getinfokeys('info.txt', k), {k: v})
[ 72s] E AssertionError: {'asbytes': <bound method SFTPAttributes.asbytes of <SFTPAttributes: [ size=13 m [truncated]... != {'asbytes': <bound method SFTPAttributes.asbytes of <SFTPAttributes: [ size=13 m [truncated]...
[ 72s] E {'asbytes': <bound method SFTPAttributes.asbytes of <SFTPAttributes: [ size=13 mode=0100777 atime=1462790360 mtime=1462790360 ]>>}
[ 72s]______________________TestSFTPFS.test_concurrent_copydir______________________
[ 72s]
[ 72s] self = <fs.tests.test_expose.TestSFTPFS testMethod=test_concurrent_copydir>
[ 72s]
[ 72s] def test_concurrent_copydir(self):
[ 72s] self.fs.makedir("a")
[ 72s] self.fs.makedir("a/b")
[ 72s] self.fs.setcontents("a/hello.txt", b("hello world"))
[ 72s] self.fs.setcontents("a/guido.txt", b("is a space alien"))
[ 72s] self.fs.setcontents("a/b/parrot.txt", b("pining for the fiords"))
[ 72s]
[ 72s] def copydir():
[ 72s] self._yield()
[ 72s] self.fs.copydir("a", "copy of a")
[ 72s]
[ 72s] def copydir_overwrite():
[ 72s] self._yield()
[ 72s] self.fs.copydir("a", "copy of a", overwrite=True)
[ 72s] # This should error out since we're not overwriting
[ 72s] self.assertRaises(
[ 72s] DestinationExistsError, self._runThreads, copydir, copydir)
[ 72s] self.assert_(self.fs.isdir('a'))
[ 72s] > self.assert_(self.fs.isdir('a'))
[ 72s] E AssertionError: False is not true
[ 72s]
[ 72s] fs/tests/__init__.py:1140: AssertionError
[ 72s]___________________________TestSFTPFS.test_infokeys___________________________
[ 72s]
[ 72s] self = <fs.tests.test_expose.TestSFTPFS testMethod=test_infokeys>
[ 72s]
[ 72s] def test_infokeys(self):
[ 72s] test_str = b("Hello, World!")
[ 72s] self.fs.setcontents("info.txt", test_str)
[ 72s] info = self.fs.getinfo("info.txt")
[ 72s] for k, v in info.iteritems():
[ 72s] > self.assertEqual(self.fs.getinfokeys('info.txt', k), {k: v})
[ 72s] E AssertionError: {'asbytes': <bound method SFTPAttributes.asbytes of <SFTPAttributes: [ size=13 m [truncated]... != {'asbytes': <bound method SFTPAttributes.asbytes of <SFTPAttributes: [ size=13 m [truncated]...
[ 72s] E {'asbytes': <bound method SFTPAttributes.asbytes of <SFTPAttributes: [ size=13 mode=0100777 atime=1462790361 mtime=1462790361 ]>>}
[ 72s]
[ 72s] fs/tests/__init__.py:534: AssertionError
[ 72s] ________________________ TestSFTPFS.test_makedir_winner ________________________
[ 72s]
[ 72s] self = <fs.tests.test_expose.TestSFTPFS testMethod=test_makedir_winner>
[ 72s]
[ 72s] def test_makedir_winner(self):
[ 72s] errors = []
[ 72s]
[ 72s] def makedir():
[ 72s] try:
[ 72s] self.fs.makedir("testdir")
[ 72s] except DestinationExistsError, e:
[ 72s] errors.append(e)
[ 72s]
[ 72s] def makedir_noerror():
[ 72s] try:
[ 72s] self.fs.makedir("testdir", allow_recreate=True)
[ 72s] except DestinationExistsError, e:
[ 72s] errors.append(e)
[ 72s]
[ 72s] def removedir():
[ 72s] try:
[ 72s] self.fs.removedir("testdir")
[ 72s] except (ResourceNotFoundError, ResourceLockedError), e:
[ 72s] errors.append(e)
[ 72s] # One thread should succeed, one should error
[ 72s] > self._runThreads(makedir, makedir)
[ 72s]
[ 72s] fs/tests/__init__.py:1097:
[ 72s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
[ 72s] fs/tests/__init__.py:962: in runThread
[ 72s] func()
[ 72s] fs/tests/__init__.py:1081: in makedir
[ 72s] self.fs.makedir("testdir")
[ 72s] fs/base.py:146: in acquire_lock
[ 72s] return func(self, *args, **kwargs)
[ 72s] fs/errors.py:257: in wrapper
[ 72s] return func(self,*args,**kwds)
[ 72s] fs/sftpfs.py:497: in makedir
[ 72s] stat = self.client.stat(npath)
[ 72s] /usr/lib/python2.7/site-packages/paramiko/sftp_client.py:413: in stat
[ 72s] t, msg = self._request(CMD_STAT, path)
[ 72s] /usr/lib/python2.7/site-packages/paramiko/sftp_client.py:730: in _request
[ 72s] return self._read_response(num)
[ 72s] /usr/lib/python2.7/site-packages/paramiko/sftp_client.py:781: in _read_response
[ 72s] self._convert_status(msg)
[ 72s] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
[ 72s]
[ 72s] self = <paramiko.sftp_client.SFTPClient object at 0x7f7045cce310>
[ 72s] msg = paramiko.Message('\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x0cNo such file\x00\x00\x00\x00')
[ 72s]
[ 72s] def _convert_status(self, msg):
[ 72s] """
[ 72s] Raises EOFError or IOError on error status; otherwise does nothing.
[ 72s] """
[ 72s] code = msg.get_int()
[ 72s] text = msg.get_text()
[ 72s] if code == SFTP_OK:
[ 72s] return
[ 72s] elif code == SFTP_EOF:
[ 72s] raise EOFError(text)
[ 72s] elif code == SFTP_NO_SUCH_FILE:
[ 72s] # clever idea from john a. meinel: map the error codes to errno
[ 72s] > raise IOError(errno.ENOENT, text)
[ 72s] E ResourceNotFoundError: Resource not found: None
[ 72s]
[ 72s] /usr/lib/python2.7/site-packages/paramiko/sftp_client.py:807: ResourceNotFoundError
96bd56b60f6531ba369d152581af72ef28d62082 fixes the infokeys problem, but I haven't yet delved into the concurrency problems.