3
# Copyright 2014 Canonical Ltd.
5
# This program is free software: you can redistribute it and/or modify it
6
# under the terms of the GNU Affero General Public License version 3, as
7
# published by the Free Software Foundation.
9
# This program is distributed in the hope that it will be useful, but
10
# WITHOUT ANY WARRANTY; without even the implied warranties of
11
# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
12
# PURPOSE. See the GNU Affero General Public License for more details.
14
# You should have received a copy of the GNU Affero General Public License
15
# along with this program. If not, see <http://www.gnu.org/licenses/>.
19
from mock import patch
21
from ci_utils import amqp_utils
22
from ci_utils.data_store import DataStoreException
23
from ci_utils.testing.fixtures import FakeDataStore
24
from coverageretriever import CoverageRetrieverException
25
from coverageretriever.tests import CoverageRetrieverWorkerTestCase
26
from coverageretriever.run_worker import (
27
CoverageRetrieverWorker,
28
SUCCESS_MESSAGE_TEMPLATE,
29
PARSE_FAILURE_TEMPLATE,
30
SWIFT_FAILURE_TEMPLATE,
33
CURDIR = os.path.dirname(__file__)
36
class HandleRequestTestCase(CoverageRetrieverWorkerTestCase):
39
super(HandleRequestTestCase, self).setUp()
40
self.put_fake_build_log()
42
def test_worker_handles_request_successfully(self):
43
"""Large integration test for coverage retrieval."""
44
worker = CoverageRetrieverWorker()
45
fake_params = {'build_log_filename': 'build.log',
46
'ticket_id': 'fake_ticket_id'}
47
amqp_result, result_data = worker.handle_request(fake_params,
49
self.assertEqual(amqp_utils.progress_completed, amqp_result)
51
SUCCESS_MESSAGE_TEMPLATE.format('fake_ticket_id'),
52
result_data['message'])
53
self.fake_logger.info.assert_called_with(
54
SUCCESS_MESSAGE_TEMPLATE.format('fake_ticket_id'))
55
coverage_xml = self.fake_data_store.get_file('coverage.xml')
56
self.validate_coverage_xml(coverage_xml)
58
@patch('coverageretriever.run_worker.snip_coverage_xml')
59
def test_coverage_xml_not_found(self, snip_coverage_xml):
60
"""Return failure if coverage.xml not found in build log."""
61
snip_coverage_xml.side_effect = CoverageRetrieverException()
62
worker = CoverageRetrieverWorker()
63
fake_params = {'build_log_filename': 'build.log',
64
'ticket_id': 'fake_ticket_id'}
65
amqp_result, result_data = worker.handle_request(fake_params,
67
self.assertEqual(amqp_utils.progress_failed, amqp_result)
69
PARSE_FAILURE_TEMPLATE.format('fake_ticket_id'),
70
result_data['message'])
71
self.fake_logger.error.assert_called_with(
72
PARSE_FAILURE_TEMPLATE.format('fake_ticket_id'))
74
@patch.object(CoverageRetrieverWorker, 'get_build_log')
75
def test_build_log_not_in_swift(self, get_build_log):
76
"""Return failure if swift fails to yield our build log."""
77
get_build_log.side_effect = DataStoreException()
78
worker = CoverageRetrieverWorker()
79
fake_params = {'build_log_filename': 'build.log',
80
'ticket_id': 'fake_ticket_id'}
81
amqp_result, result_data = worker.handle_request(fake_params,
83
self.assertEqual(amqp_utils.progress_failed, amqp_result)
85
SWIFT_FAILURE_TEMPLATE.format('fake_ticket_id'),
86
result_data['message'])
87
self.fake_logger.error.assert_called_with(
88
SWIFT_FAILURE_TEMPLATE.format('fake_ticket_id'))
90
@patch.object(FakeDataStore, 'get_file')
91
def test_retry_get_build_log_from_swift(self, get_file):
92
"""Retry getting build log from swift."""
93
get_file.side_effect = [DataStoreException(),
96
worker = CoverageRetrieverWorker()
97
fake_params = {'build_log_filename': 'build.log',
98
'ticket_id': 'fake_ticket_id'}
99
amqp_result, result_data = worker.handle_request(fake_params,
101
self.assertEqual(amqp_utils.progress_completed, amqp_result)
103
SUCCESS_MESSAGE_TEMPLATE.format('fake_ticket_id'),
104
result_data['message'])
105
self.fake_logger.info.assert_called_with(
106
SUCCESS_MESSAGE_TEMPLATE.format('fake_ticket_id'))
107
self.assertEqual(3, get_file.call_count)