diff options
-rw-r--r-- | service/pixelated/application.py | 24 | ||||
-rw-r--r-- | service/test/unit/test_application.py | 38 |
2 files changed, 55 insertions, 7 deletions
diff --git a/service/pixelated/application.py b/service/pixelated/application.py index ce1e0258..580d1142 100644 --- a/service/pixelated/application.py +++ b/service/pixelated/application.py @@ -144,9 +144,12 @@ def initialize(): services_factory = _create_service_factory(args) resource = RootResource(services_factory) - start_async = _start_mode(args, resource, services_factory) - add_top_level_system_callbacks(start_async, services_factory) + def start(): + start_async = _start_mode(args, resource, services_factory) + add_top_level_system_callbacks(start_async, services_factory) + log.info('Running the reactor') + reactor.callWhenRunning(start) reactor.run() @@ -178,17 +181,24 @@ def _start_mode(args, resource, services_factory): def _start_in_multi_user_mode(args, root_resource, services_factory): + try: + protected_resources = _setup_multi_user(args, root_resource, services_factory) + start_site(args, protected_resources) + reactor.getThreadPool().adjustPoolsize(5, 15) + return defer.succeed(None) + except Exception as e: + return defer.fail(e) + + +def _setup_multi_user(args, root_resource, services_factory): if args.provider is None: - raise ValueError('provider name is required') + raise ValueError('Multi-user mode: provider name is required') init_monkeypatches() events_server.ensure_server() - config, provider = initialize_leap_provider(args.provider, args.leap_provider_cert, args.leap_provider_cert_fingerprint, args.leap_home) protected_resource = set_up_protected_resources(root_resource, provider, services_factory, banner=args.banner) - start_site(args, protected_resource) - reactor.getThreadPool().adjustPoolsize(5, 15) - return defer.succeed(None) + return protected_resource def set_up_protected_resources(root_resource, provider, services_factory, checker=None, banner=None): diff --git a/service/test/unit/test_application.py b/service/test/unit/test_application.py index 82a956b8..02edcd70 100644 --- a/service/test/unit/test_application.py +++ b/service/test/unit/test_application.py @@ -113,3 +113,41 @@ class ApplicationTest(unittest.TestCase): d.addCallback(_assert_user_logged_out_using_uuid) d.addCallback(_assert_user_logged_out_using_email_id) return d + + @patch('pixelated.application.reactor') + @patch('pixelated.application._setup_multi_user') + def test_should_defer_fail_errors_during_multi_user_start_site(self, mock_multi_user_bootstrap, reactor_mock): + args_mock = MagicMock() + root_resources_mock = MagicMock() + services_factory_mock = MagicMock() + + mock_multi_user_bootstrap.side_effect = Exception('multi-user failed bootstrap for whatever reason') + + d = pixelated.application._start_in_multi_user_mode(args_mock, root_resources_mock, services_factory_mock) + + def _assert_the_same_error_is_relayed_in_the_deferred(e): + self.assertIsInstance(e.value, Exception) + self.assertEqual(e.value.message, 'multi-user failed bootstrap for whatever reason') + + d.addErrback(_assert_the_same_error_is_relayed_in_the_deferred) + return d + + + @patch('pixelated.application.reactor') + @patch('pixelated.application.start_site') + @patch('pixelated.application._setup_multi_user') + def test_should_defer_fail_errors_during_multi_user_bootstrap(self, ignore_setup_multi_user, mock_start_site, reactor_mock): + args_mock = MagicMock() + root_resources_mock = MagicMock() + services_factory_mock = MagicMock() + + mock_start_site.side_effect = Exception('multi-user failed start site for whatever reason') + + d = pixelated.application._start_in_multi_user_mode(args_mock, root_resources_mock, services_factory_mock) + + def _assert_the_same_error_is_relayed_in_the_deferred(e): + self.assertIsInstance(e.value, Exception) + self.assertEqual(e.value.message, 'multi-user failed start site for whatever reason') + + d.addErrback(_assert_the_same_error_is_relayed_in_the_deferred) + return d |