blob: 9533217470c568423ef2347b2154b9b9f54d6a96 [file] [log] [blame]
# 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_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):
self.events.append(event)
class _RaisingHandler(object):
"""Event handler for testing; raises."""
def __init__(self, exception):
self._exception = exception
def __call__(self, event):
raise self._exception
class _FakeError(Exception):
"""Fake exception for tests."""