pyfilesystem icon indicating copy to clipboard operation
pyfilesystem copied to clipboard

some paramiko dependant tests fail reproducible

Open frispete opened this issue 8 years ago • 1 comments

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

frispete avatar May 10 '16 15:05 frispete

96bd56b60f6531ba369d152581af72ef28d62082 fixes the infokeys problem, but I haven't yet delved into the concurrency problems.

lurch avatar Jul 04 '16 14:07 lurch