~fginther/jenkins-launchpad-plugin/config-file-trigger

« back to all changes in this revision

Viewing changes to tests/test_jenkinsutils.py

  • Committer: Tarmac
  • Author(s): Martin Mrazik
  • Date: 2013-02-06 16:51:06 UTC
  • mfrom: (69.2.9 downstream_ci_jobs)
  • Revision ID: tarmac-20130206165106-5ft49ocifoxgrymm
This implements a better messages for the ci/autolanding jobs in case freestyle jobs with downstream jobs are executed. The idea is that you would be able to create the following structure in jenkins:

my-project-ci (freestyle job, executing my-project-pbuilder and my-project-baremetalbuild)
  \
   - my-project-pbuilder (multiconfiguration job)
  \
   - my-project-baremetalbuild (freestyle job)

The voting in launchpad will look like this:
--------------snip---------------
PASSED: Continuous integration, rev:72
http://ip:8080/job/my-project-ci/3/
Executed test runs:
         FAILURE: http://ip:8080/job/my-project-pbuilder/./distribution=raring,flavor=amd64/3/console
         FAILURE: http://ip:8080/job/my-project-pbuilder/./distribution=raring,flavor=i386/3/console
         SUCCESS: http://ip:8080/job/my-project-baremetalbuild/7//console

Click here to trigger a rebuild:
   http://ip:8080/job/my-project-ci/3//rebuild/?
--------------snip---------------.

Approved by Francis Ginther.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from mock import MagicMock, patch
 
2
import jenkinsutils
 
3
import unittest
 
4
from tests import JenkinsJSONData
 
5
from settings import PUBLIC_JENKINS_URL
 
6
 
 
7
 
 
8
class JenkinsUtilsGetDownstreamProjects(unittest.TestCase):
 
9
    def setUp(self):
 
10
        self.jenkins = MagicMock()
 
11
        self.jenkins.get_json_data = MagicMock(
 
12
                return_value={'downstreamProjects':
 
13
                                            [{'name': 'project1'},
 
14
                                             {'name': 'project2'},
 
15
                                             {'name': 'project3'}]})
 
16
 
 
17
    def test_get_downstream_projects(self):
 
18
        ret = jenkinsutils.get_downstream_projects(self.jenkins,
 
19
                                                   'http://ip/job/x/55')
 
20
        expected = ['project1', 'project2', 'project3']
 
21
        self.assertEqual(ret, expected)
 
22
 
 
23
 
 
24
def hide_jenkins_url(url):
 
25
    return url.replace('10.0.0.1', 'jenkins')
 
26
 
 
27
 
 
28
class JenkinsUtilsGetDownstreamBuilds(unittest.TestCase):
 
29
 
 
30
    def setUp(self):
 
31
        self.jenkins = JenkinsJSONData()
 
32
 
 
33
    def test_get_downstream_builds(self):
 
34
        ret = jenkinsutils.get_downstream_builds(self.jenkins,
 
35
                                                     'http://ip:8080/job/',
 
36
                                                     'my-job',
 
37
                                                     3)
 
38
        expected = [
 
39
                {'project': 'job-multiconfig',
 
40
                 'number': 3,
 
41
                 'url': 'http://ip:8080/job/job-multiconfig/3/',
 
42
                 'result': 'FAILURE', },
 
43
                {'project': 'job-freestyle',
 
44
                 'number': 7,
 
45
                 'url': 'http://ip:8080/job/job-freestyle/7/',
 
46
                 'result': 'SUCCESS', },
 
47
                ]
 
48
        self.assertEqual(ret, expected)
 
49
 
 
50
 
 
51
class JenkinsUtilsIsMatrixJob(unittest.TestCase):
 
52
 
 
53
    def setUp(self):
 
54
        self.jenkins = JenkinsJSONData()
 
55
 
 
56
    def test_matrix_job(self):
 
57
        ret = jenkinsutils.is_matrix_job(self.jenkins,
 
58
                'http://ip:8080/job/job-multiconfig/')
 
59
        self.assertEqual(ret, True)
 
60
 
 
61
    def test_matrix_job_with_build_number(self):
 
62
        ret = jenkinsutils.is_matrix_job(self.jenkins,
 
63
                'http://ip:8080/job/job-multiconfig/32')
 
64
        self.assertEqual(ret, True)
 
65
 
 
66
    def test_non_matrix_job(self):
 
67
        ret = jenkinsutils.is_matrix_job(self.jenkins,
 
68
                'http://ip:8080/job/job-freestyle/')
 
69
        self.assertEqual(ret, False)
 
70
 
 
71
 
 
72
class JenkinsUtilsGetExecutedBuilds(unittest.TestCase):
 
73
    def setUp(self):
 
74
        self.jenkins = JenkinsJSONData()
 
75
        self.build_url = self.jenkins.build_url
 
76
 
 
77
    def test_get_executed_builds_wrong_url(self):
 
78
        ret = jenkinsutils.get_executed_builds(self.jenkins,
 
79
                                                   'wrong url')
 
80
        expected = None
 
81
        self.assertEqual(ret, expected)
 
82
 
 
83
    def test_get_executed_builds(self):
 
84
        with patch('jenkinsutils.hide_jenkins_url', new=hide_jenkins_url):
 
85
            ret = jenkinsutils.get_executed_builds(self.jenkins,
 
86
                                                   self.build_url)
 
87
        expected = [
 
88
                {'output': 'http://ip:8080/job/job-multiconfig/.' +
 
89
                            '/distribution=raring,flavor=amd64/3/console',
 
90
                 'result': 'FAILURE', },
 
91
                {'output': 'http://ip:8080/job/job-multiconfig/.' +
 
92
                            '/distribution=raring,flavor=i386/3/console',
 
93
                 'result': 'FAILURE', },
 
94
                {'output': 'http://ip:8080/job/job-freestyle/7//console',
 
95
                 'result': u'SUCCESS', },
 
96
                ]
 
97
        self.assertEqual(ret, expected)
 
98
 
 
99
 
 
100
class JenkinsUtilsGetExecutedTestRuns(unittest.TestCase):
 
101
    def setUp(self):
 
102
        self.jenkins = JenkinsJSONData()
 
103
 
 
104
    def test_get_coverity_artifacts(self):
 
105
        with patch('jenkinsutils.hide_jenkins_url', new=hide_jenkins_url):
 
106
            ret = jenkinsutils.get_coverity_artifacts(self.jenkins,
 
107
                                    'http://ip:8080/job/job-multiconfig/' +
 
108
                                    './distribution=raring,flavor=amd64/3/')
 
109
        expected = ['http://ip:8080/job/job-multiconfig/./distribution=' +
 
110
                     'raring,flavor=amd64/3//artifact/results/coverity/' +
 
111
                     'CID_10895.html',
 
112
                   'http://ip:8080/job/job-multiconfig/./distribution=' +
 
113
                     'raring,flavor=amd64/3//artifact/results/coverity/' +
 
114
                     'CID_10896.html',
 
115
                   ]
 
116
        self.assertEqual(ret, expected)
 
117
 
 
118
 
 
119
class JenkinsUtilsIsJobPublished(unittest.TestCase):
 
120
    def test_is_job_published_with_private_job(self):
 
121
        jenkins = MagicMock()
 
122
        jenkins.get_job_config = MagicMock(return_value='<b></b>')
 
123
        with patch('jenkinsutils.jenkins.Jenkins',
 
124
                   new=MagicMock(return_value=jenkins)):
 
125
            self.assertFalse(jenkinsutils.is_job_published('my-job'))
 
126
 
 
127
    def test_is_job_published_with_no_job(self):
 
128
        jenkins = MagicMock()
 
129
        jenkins.get_job_config = MagicMock(return_value='')
 
130
        with patch('jenkinsutils.jenkins.Jenkins',
 
131
                   new=MagicMock(return_value=jenkins)):
 
132
            self.assertFalse(jenkinsutils.is_job_published(None))
 
133
 
 
134
    def test_is_job_published_with_public_job(self):
 
135
        jenkins = MagicMock()
 
136
        jenkins.get_job_config = MagicMock(
 
137
           return_value='<hudson.plugins.build__publisher.BuildPublisher>' +
 
138
                        '</hudson.plugins.build__publisher.BuildPublisher>')
 
139
        with patch('jenkinsutils.jenkins.Jenkins',
 
140
                   new=MagicMock(return_value=jenkins)):
 
141
            self.assertTrue(jenkinsutils.is_job_published('my-job'))
 
142
 
 
143
    def test_is_job_published_with_exception(self):
 
144
        jenkins = MagicMock()
 
145
        jenkins.get_job_config.side_effect = Exception(
 
146
                                                 'get_job_config exception')
 
147
        with patch('jenkinsutils.jenkins.Jenkins',
 
148
                   new=MagicMock(return_value=jenkins)):
 
149
            self.assertFalse(jenkinsutils.is_job_published('my-job'))
 
150
 
 
151
 
 
152
class JenkinsUtilsTestHideJenkinsUrl(unittest.TestCase):
 
153
 
 
154
    def test_hide_jenkins_url_public_url(self):
 
155
        urls = [
 
156
                ('http://10.0.0.1:8080/job/android-audiosystem/31/',
 
157
                 PUBLIC_JENKINS_URL + '/job/android-audiosystem/31/'),
 
158
                ('http://10.0.0.1:8080/job/android-ubuntu-matrix/4/',
 
159
                 PUBLIC_JENKINS_URL + '/job/android-ubuntu-matrix/4/'),
 
160
                ('https://10.0.0.1:8080/job/unity-ci/32/',
 
161
                 PUBLIC_JENKINS_URL + '/job/unity-ci/32/')
 
162
               ]
 
163
 
 
164
        is_job_published = lambda job: True
 
165
        for url, expected in urls:
 
166
            with patch('jenkinsutils.is_job_published',
 
167
                       new=is_job_published):
 
168
                self.assertEqual(jenkinsutils.hide_jenkins_url(url),
 
169
                                 expected)
 
170
 
 
171
    def test_hide_jenkins_url_hidden_url(self):
 
172
        urls = [
 
173
                'https://10.0.0.1:8080/job/android-audiosystem/31/',
 
174
                'http://10.0.0.1:8080/job/android-ubuntu-matrix/4/',
 
175
                'http://10.0.0.1:8080/job/unity-ci/32/',
 
176
               ]
 
177
 
 
178
        is_job_published = lambda job: False
 
179
        for url in urls:
 
180
            with patch('jenkinsutils.is_job_published',
 
181
                       new=is_job_published):
 
182
                self.assertEqual(jenkinsutils.hide_jenkins_url(url),
 
183
                           url.replace('http://10.0.0.1:8080',
 
184
                                       'http://jenkins:8080'))
 
185
 
 
186
    def test_hide_jenkins_url_unknown_url(self):
 
187
        urls = [
 
188
                'http://12.0.0.2:8080/job/android-audiosystem/31/',
 
189
                'http://12.0.0.2:8080/job/android-ubuntu-matrix/4/',
 
190
                'https://12.0.0.2:8080/job/unity-ci/32/',
 
191
                'https://12.0.0.080/droid-audiosystem/31/',
 
192
                'http://12.0.0.080/droid-ubuntu-matrix/4/',
 
193
                'http://12.0.0.080/ity-ci/32/',
 
194
               ]
 
195
 
 
196
        is_job_published = lambda job: False
 
197
        for url in urls:
 
198
            with patch('jenkinsutils.is_job_published',
 
199
                       new=is_job_published):
 
200
                self.assertEqual(jenkinsutils.hide_jenkins_url(url),
 
201
                                 url)