def test_stop_logs_error_on_timeout(self):
        mock_add_detail = Mock()
        mock_glib_loop = Mock()
        patch_get_loop = patch.object(
            UpstartApplicationLauncher,
            '_get_glib_loop',
            new=mock_glib_loop,
        )
        mock_UAL = Mock()

        # we replace the add_observer function with one that can set the
        # tiemout state, so we can ibject the timeout condition within the
        # glib loop. This is ugly, but necessary.
        def fake_add_observer(fn, state):
            state['status'] = UpstartApplicationLauncher.Timeout

        mock_UAL.observer_add_app_stop = fake_add_observer
        patch_UAL = patch.object(_l, 'UbuntuAppLaunch', new=mock_UAL)
        launcher = UpstartApplicationLauncher(mock_add_detail)
        app_id = self.getUniqueString()
        mock_logger = Mock()
        patch_logger = patch.object(_l, '_logger', new=mock_logger)
        with ExitStack() as patches:
            patches.enter_context(patch_get_loop)
            patches.enter_context(patch_UAL)
            patches.enter_context(patch_logger)

            launcher._stop_application(app_id)

            mock_logger.error.assert_called_once_with(
                "Timed out waiting for Application with app_id '%s' to stop.",
                app_id)
    def test_stop_calls_libUAL_stop_function(self):
        mock_add_detail = Mock()
        mock_glib_loop = Mock()
        patch_get_loop = patch.object(
            UpstartApplicationLauncher,
            '_get_glib_loop',
            new=mock_glib_loop,
        )
        mock_UAL = Mock()
        patch_UAL = patch.object(_l, 'UbuntuAppLaunch', new=mock_UAL)
        launcher = UpstartApplicationLauncher(mock_add_detail)
        app_id = self.getUniqueString()
        with ExitStack() as patches:
            patches.enter_context(patch_get_loop)
            patches.enter_context(patch_UAL)

            launcher._stop_application(app_id)
            mock_UAL.stop_application.assert_called_once_with(app_id)
    def test_stop_adds_app_stopped_observer(self):
        mock_add_detail = Mock()
        mock_glib_loop = Mock()
        patch_get_loop = patch.object(
            UpstartApplicationLauncher,
            '_get_glib_loop',
            new=mock_glib_loop,
        )
        mock_UAL = Mock()
        patch_UAL = patch.object(_l, 'UbuntuAppLaunch', new=mock_UAL)
        launcher = UpstartApplicationLauncher(mock_add_detail)
        app_id = self.getUniqueString()
        with ExitStack() as patches:
            patches.enter_context(patch_get_loop)
            patches.enter_context(patch_UAL)

            launcher._stop_application(app_id)
            call_args = mock_UAL.observer_add_app_stop.call_args[0]
            self.assertThat(call_args[0],
                            Equals(UpstartApplicationLauncher._on_stopped))
            self.assertThat(call_args[1]['expected_app_id'], Equals(app_id))