kiwi-el8/test/unit/command_process_test.py
Marcus Schäfer e6cc5bfa09 Move from nose to pytest
nose is no longer maintained, thus we have to move to another
testing system. This commit updates the tox setup and all tests
to use pytest instead of nose.
2016-03-14 12:23:14 +01:00

153 lines
5.9 KiB
Python

from mock import patch
from mock import call
from collections import namedtuple
import mock
from .test_helper import *
from kiwi.exceptions import (
KiwiCommandError
)
from kiwi.command_process import CommandProcess
from kiwi.command_process import CommandIterator
class TestCommandProcess(object):
def fake_matcher(self, item, output):
return True
def poll(self):
return self.data_flow.pop()
def outavailable(self):
return True
def erravailable(self):
return True
def outdata(self):
return self.data_out.pop()
def errdata(self):
return self.data_err.pop()
def create_flow_method(self, method):
def create_method(arg=None):
return method()
return create_method
def setup(self):
self.data_flow = [True, None, None, None, None, None, None]
self.data_out = [b'', b'\n', b'a', b't', b'a', b'd']
self.data_err = [b'', b'r', b'o', b'r', b'r', b'e']
self.flow = self.create_flow_method(self.poll)
self.flow_out_available = self.create_flow_method(self.outavailable)
self.flow_err_available = self.create_flow_method(self.erravailable)
self.flow_out = self.create_flow_method(self.outdata)
self.flow_err = self.create_flow_method(self.errdata)
@patch('kiwi.command.Command')
@patch('kiwi.logger.log.debug')
def test_poll_show_progress(self, mock_log_debug, mock_command):
match_method = CommandProcess(mock_command).create_match_method(
self.fake_matcher
)
process = CommandProcess(mock_command)
process.command.command.process.poll = self.flow
process.command.command.output_available = self.flow_out_available
process.command.command.error_available = self.flow_err_available
process.command.command.output.read = self.flow_out
process.command.command.error.read = self.flow_err
process.command.command.process.returncode = 0
process.poll_show_progress(['a', 'b'], match_method)
assert mock_log_debug.call_args_list == [
call('%s: %s', 'system', 'data')
]
@raises(KiwiCommandError)
@patch('kiwi.command.Command')
def test_poll_show_progress_raises(self, mock_command):
match_method = CommandProcess(mock_command).create_match_method(
self.fake_matcher
)
process = CommandProcess(mock_command)
process.command.command.process.poll = self.flow
process.command.command.output_available = self.flow_out_available
process.command.command.error_available = self.flow_err_available
process.command.command.output.read = self.flow_out
process.command.command.error.read = self.flow_err
process.command.command.process.returncode = 1
process.poll_show_progress(['a', 'b'], match_method)
@patch('kiwi.command.Command')
@patch('kiwi.logger.log.debug')
def test_poll(self, mock_log_debug, mock_command):
process = CommandProcess(mock_command)
process.command.command.process.poll = self.flow
process.command.command.output_available = self.flow_out_available
process.command.command.error_available = self.flow_err_available
process.command.command.output.read = self.flow_out
process.command.command.error.read = self.flow_err
process.command.command.process.returncode = 0
process.poll()
assert mock_log_debug.call_args_list == [
call('%s: %s', 'system', 'data')
]
@raises(KiwiCommandError)
@patch('kiwi.command.Command')
def test_poll_raises(self, mock_command):
process = CommandProcess(mock_command)
process.command.command.process.poll = self.flow
process.command.command.output_available = self.flow_out_available
process.command.command.error_available = self.flow_err_available
process.command.command.output.read = self.flow_out
process.command.command.error.read = self.flow_err
process.command.command.output.read.return_value = 'data'
process.command.command.process.returncode = 1
process.poll()
@patch('kiwi.command.Command')
@patch('kiwi.logger.log.debug')
def test_poll_and_watch(self, mock_log_debug, mock_command):
process = CommandProcess(mock_command)
process.command.command.process.poll = self.flow
process.command.command.output_available = self.flow_out_available
process.command.command.error_available = self.flow_err_available
process.command.command.output.read = self.flow_out
process.command.command.error.read = self.flow_err
process.command.command.process.returncode = 1
result = process.poll_and_watch()
call = mock_log_debug.call_args_list[0]
assert mock_log_debug.call_args_list[0] == \
call('--------------out start-------------')
call = mock_log_debug.call_args_list[1]
assert mock_log_debug.call_args_list[1] == \
call('data')
call = mock_log_debug.call_args_list[2]
assert mock_log_debug.call_args_list[2] == \
call('--------------out stop--------------')
assert result.stderr == 'error'
@patch('kiwi.command.Command')
def test_create_match_method(self, mock_command):
match_method = CommandProcess(mock_command).create_match_method(
self.fake_matcher
)
assert match_method('a', 'b') is True
@patch('kiwi.command.Command')
def test_destructor(self, mock_command):
process = CommandProcess(mock_command)
process.command.command.process.returncode = None
process.command.command.process.pid = 42
process.command.command.process.kill = mock.Mock()
process.__del__()
process.command.command.process.kill.assert_called_once_with()
def test_command_iterator(self):
iterator = CommandIterator(mock.Mock())
assert iterator.__iter__() == iterator