| # Copyright 2017 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from __future__ import absolute_import |
| from __future__ import division |
| from __future__ import print_function |
| |
| import pytest |
| |
| from lucifer import eventlib |
| from lucifer.eventlib import Event |
| |
| |
| def test_run_event_command_normal(capfd): |
| """Test happy path.""" |
| handler = _FakeHandler() |
| |
| ret = eventlib.run_event_command( |
| event_handler=handler, |
| args=['bash', '-c', |
| 'echo starting;' |
| 'echo log message >&2;' |
| 'echo completed;']) |
| |
| # Handler should be called with events in order. |
| assert handler.events == [(Event('starting'), ''), (Event('completed'), '')] |
| # Handler should return the exit status of the command. |
| assert ret == 0 |
| # Child stderr should go to stderr. |
| out, err = capfd.readouterr() |
| assert out == '' |
| assert err == 'log message\n' |
| |
| |
| def test_run_event_command_normal_with_messages(): |
| """Test happy path with messages.""" |
| handler = _FakeHandler() |
| |
| ret = eventlib.run_event_command( |
| event_handler=handler, |
| args=['bash', '-c', 'echo starting foo']) |
| |
| # Handler should be called with events and messages. |
| assert handler.events == [(Event('starting'), 'foo')] |
| # Handler should return the exit status of the command. |
| assert ret == 0 |
| |
| |
| def test_run_event_command_with_invalid_events(): |
| """Test passing invalid events.""" |
| handler = _FakeHandler() |
| eventlib.run_event_command( |
| event_handler=handler, |
| args=['bash', '-c', 'echo foo; echo bar']) |
| # Handler should not be called with invalid events. |
| assert handler.events == [] |
| |
| |
| def test_run_event_command_with_failed_command(): |
| """Test passing invalid events.""" |
| handler = _FakeHandler() |
| ret = eventlib.run_event_command( |
| event_handler=handler, |
| args=['bash', '-c', 'exit 1']) |
| # Handler should return the exit status of the command. |
| assert ret == 1 |
| |
| |
| def test_run_event_command_should_not_hide_handler_exception(): |
| """Test handler exceptions.""" |
| handler = _RaisingHandler(_FakeError) |
| with pytest.raises(_FakeError): |
| eventlib.run_event_command( |
| event_handler=handler, |
| args=['bash', '-c', 'echo starting; echo completed']) |
| |
| |
| class _FakeHandler(object): |
| """Event handler for testing; stores events.""" |
| |
| def __init__(self): |
| self.events = [] |
| |
| def __call__(self, event, msg): |
| self.events.append((event, msg)) |
| |
| |
| class _RaisingHandler(object): |
| """Event handler for testing; raises.""" |
| |
| def __init__(self, exception): |
| self._exception = exception |
| |
| def __call__(self, event, msg): |
| raise self._exception |
| |
| |
| class _FakeError(Exception): |
| """Fake exception for tests.""" |