log failure properly, add test

This commit is contained in:
meejah 2018-02-21 13:31:45 -07:00
parent 39080852cc
commit 797932244d
2 changed files with 31 additions and 1 deletions

View File

@ -681,7 +681,7 @@ class Uploader(QueueMixin):
return self._real_notify(opaque, path, events_mask)
except Exception as e:
self._log(u"error calling _real_notify: {}".format(e))
return Failure()
twlog.err(Failure())
def _real_notify(self, opaque, path, events_mask):
self._log("inotify event %r, %r, %r\n" % (opaque, path, ', '.join(self._inotify.humanReadableMask(events_mask))))

View File

@ -1,6 +1,7 @@
import os, sys, time
import shutil, json
import mock
from os.path import join, exists
from twisted.trial import unittest
@ -1553,6 +1554,35 @@ class SingleMagicFolderTestMixin(MagicFolderCLITestMixin, ShouldFailMixin, Reall
for item0, item1 in zip(upstatus0, upstatus1):
self.assertEqual(item0, item1)
@defer.inlineCallbacks
def test_real_notify_failure(self):
def bad_stuff(*args, **kw):
# the function we replaced would trigger this hook, so we
# have to or things will stall
self.magicfolder.uploader._call_hook(u"foo", "inotify")
raise RuntimeError("the bad stuff")
patch_notify = mock.patch.object(
self.magicfolder.uploader,
'_real_notify',
mock.Mock(side_effect=bad_stuff),
)
with patch_notify:
path0 = os.path.join(self.local_dir, u'foo')
yield self.fileops.write(path0, 'foo\n')
# do a reactor turn; this is necessary because our "bad_stuff"
# method calls the hook (so the above 'yield' resumes) right
# *before* it raises the exception; thus, we ensure all the
# pending callbacks including the exception are processed
# before we flush the errors.
yield task.deferLater(reactor, 0, lambda: None)
errors = self.flushLoggedErrors()
self.assertEqual(1, len(errors))
self.assertIn("the bad stuff", str(errors[0]))
@defer.inlineCallbacks
def test_delete_and_restore(self):
# setup: create a file