summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/pixelated/application.py25
-rw-r--r--service/test/unit/test_application.py32
2 files changed, 49 insertions, 8 deletions
diff --git a/service/pixelated/application.py b/service/pixelated/application.py
index 69af27b9..2474b79b 100644
--- a/service/pixelated/application.py
+++ b/service/pixelated/application.py
@@ -78,6 +78,9 @@ class SingleUserServicesFactory(object):
def services(self, user_id):
return self._services
+ def log_out_user(self, user_id):
+ reactor.stop()
+
class UserAgentMode(object):
def __init__(self, is_single_user):
@@ -132,23 +135,29 @@ def initialize():
services_factory = _create_service_factory(args)
resource = RootResource(services_factory)
- deferred = _start_mode(args, resource, services_factory)
+ start_async = _start_mode(args, resource, services_factory)
+ add_top_level_system_callbacks(start_async, services_factory)
+ log.info('Running the reactor')
+ reactor.run()
+
+
+def add_top_level_system_callbacks(deferred, services_factory):
def _quit_on_error(failure):
failure.printTraceback()
reactor.stop()
- def _register_shutdown_on_token_expire(leap_session):
- register(events.SOLEDAD_INVALID_AUTH_TOKEN, lambda *unused: reactor.stop())
+ def _log_user_out(user_data):
+ log.info('Invalid soledad token, logging out %s' % user_data)
+ services_factory.log_out_user(user_data['uuid'])
+
+ def _log_user_out_on_token_expire(leap_session):
+ register(events.SOLEDAD_INVALID_AUTH_TOKEN, _log_user_out)
return leap_session
- deferred.addCallback(_register_shutdown_on_token_expire)
+ deferred.addCallback(_log_user_out_on_token_expire)
deferred.addErrback(_quit_on_error)
- log.info('Running the reactor')
-
- reactor.run()
-
def _start_mode(args, resource, services_factory):
if services_factory.mode.is_single_user:
diff --git a/service/test/unit/test_application.py b/service/test/unit/test_application.py
index 5f7f9c74..7fb2b9ff 100644
--- a/service/test/unit/test_application.py
+++ b/service/test/unit/test_application.py
@@ -1,5 +1,6 @@
import unittest
+from leap.common.events import catalog as events
from mock import patch, MagicMock, ANY
import pixelated
@@ -73,3 +74,34 @@ class ApplicationTest(unittest.TestCase):
d.addCallback(_assert)
return d
+
+ @patch('leap.common.events.client')
+ @patch('pixelated.application.reactor')
+ @patch('pixelated.application.services.Services')
+ def test_should_log_user_out_if_invalid_soledad_token(self, services_mock, reactor_mock, events_mock):
+ app_mock = MagicMock()
+ services_factory_mock = MagicMock()
+
+ mock_service_log_user_out = MagicMock(return_value=None)
+ services_factory_mock.log_out_user = mock_service_log_user_out
+
+ leap_session = MagicMock()
+ register_mock = events_mock.register
+ register_mock.register.return_value = None
+
+ config = ApplicationTest.MockConfig(12345, '127.0.0.1')
+ d = pixelated.application.start_user_agent_in_single_user_mode(app_mock, services_factory_mock, config.home, leap_session)
+
+ pixelated.application.add_top_level_system_callbacks(d, services_factory_mock)
+
+ def _assert_user_logged_out(_):
+ used_arguments = register_mock.call_args[0]
+ self.assertIsNotNone(used_arguments)
+ soledad_invalid_auth_event = used_arguments[0]
+ self.assertEqual(soledad_invalid_auth_event, events.SOLEDAD_INVALID_AUTH_TOKEN)
+ used_log_out_method = used_arguments[1]
+ used_log_out_method({'uuid': 'some_uuid'})
+ mock_service_log_user_out.assert_called_once_with('some_uuid')
+
+ d.addCallback(_assert_user_logged_out)
+ return d