~allanlesage/uci-engine/coverage-extractor

« back to all changes in this revision

Viewing changes to coverage-retriever/coverageretriever/tests/test_handle_request.py

  • Committer: Allan LeSage
  • Date: 2014-10-03 20:48:44 UTC
  • Revision ID: allan.lesage@canonical.com-20141003204844-r0aty01f0y2dm5ml
Initial coverage-retriever for review.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
# Ubuntu CI Engine
 
3
# Copyright 2014 Canonical Ltd.
 
4
#
 
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.
 
8
#
 
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.
 
13
#
 
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/>.
 
16
 
 
17
import os
 
18
 
 
19
from mock import patch
 
20
 
 
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,
 
31
)
 
32
 
 
33
CURDIR = os.path.dirname(__file__)
 
34
 
 
35
 
 
36
class HandleRequestTestCase(CoverageRetrieverWorkerTestCase):
 
37
 
 
38
    def setUp(self):
 
39
        super(HandleRequestTestCase, self).setUp()
 
40
        self.put_fake_build_log()
 
41
 
 
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,
 
48
                                                         self.fake_logger)
 
49
        self.assertEqual(amqp_utils.progress_completed, amqp_result)
 
50
        self.assertEqual(
 
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)
 
57
 
 
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,
 
66
                                                         self.fake_logger)
 
67
        self.assertEqual(amqp_utils.progress_failed, amqp_result)
 
68
        self.assertEqual(
 
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'))
 
73
 
 
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,
 
82
                                                         self.fake_logger)
 
83
        self.assertEqual(amqp_utils.progress_failed, amqp_result)
 
84
        self.assertEqual(
 
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'))
 
89
 
 
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(),
 
94
                                DataStoreException(),
 
95
                                self.build_log_text]
 
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,
 
100
                                                         self.fake_logger)
 
101
        self.assertEqual(amqp_utils.progress_completed, amqp_result)
 
102
        self.assertEqual(
 
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)