diff options
-rwxr-xr-x | test/test-dbus.py | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/test/test-dbus.py b/test/test-dbus.py index 9af8bfd7..276e45df 100755 --- a/test/test-dbus.py +++ b/test/test-dbus.py @@ -9163,6 +9163,55 @@ class TestHTTP(CmdlineUtil, unittest.TestCase): self.assertEqual(err, None) self.assertEqual(0, code) + @timeout(200) + @property("ENV", "SYNCEVOLUTION_FILE_SOURCE_DELAY_OPEN_addressbook-slow-server=400") + def testAbortThread(self): + """TestHTTP.testAbortThread - slow down server in open, abort sync while waiting for background thread""" + port = self.runHTTPServer() + self.setUpConfigs(port, slowServer=True, requestMaxTime=200) + self.session = None + self.isWaiting = False + self.messages = [] + def output(path, level, message, process): + self.messages.append(message) + if 'wait for background thread: ' in message: + self.isWaiting = True + signal = bus.add_signal_receiver(output, + 'LogOutput', + 'org.syncevolution.Server', + self.server.bus_name, + None, + byte_arrays=True, + utf8_strings=True) + + s = self.startCmdline(["--sync", "slow", "--daemon=no", "client"], + preserveOutputOrder=True) + + # Wait for session... + while not self.session: + self.loopIteration('waiting for session', may_block=True) + # ... and the confirmation that the background thread is running. + while not self.isWaiting: + self.loopIteration('background thread', may_block=True) + + # We need to abort syncevo-dbus-server. Aborting the client via SIGTERM + # would not abort the server. + self.session.Abort(timeout=self.dbusTimeout) + + # The HTTP client should see a network error. + out, err, code = self.finishCmdline(s, expectSuccess=False, sessionFlags=None) + self.assertEqual(err, None) + self.assertEqual(1, code) + self.assertIn('external transport failure', out) + + # We expect that the FileSyncSource::open() detects the abort + # request quickly and then let's the background thread be + # reaped normally by the master thread. + self.assertIn('background thread completed', self.messages) + + # Finally, also check server session status. + status, error, sources = self.session.GetStatus(timeout=self.dbusTimeout) + self.assertEqual(('done', 20017), (status, error)) if __name__ == '__main__': unittest.main() |