Merge lp:~barry/mediaplayer-app/py3autopilot into lp:mediaplayer-app
- py3autopilot
- Merge into trunk
Status: | Superseded |
---|---|
Proposed branch: | lp:~barry/mediaplayer-app/py3autopilot |
Merge into: | lp:mediaplayer-app |
Diff against target: |
270 lines (+42/-44) 7 files modified
debian/changelog (+7/-0) debian/control (+3/-3) tests/autopilot/CMakeLists.txt (+1/-1) tests/autopilot/mediaplayer_app/emulators/main_window.py (+3/-3) tests/autopilot/mediaplayer_app/tests/__init__.py (+0/-1) tests/autopilot/mediaplayer_app/tests/test_player.py (+1/-7) tests/autopilot/mediaplayer_app/tests/test_player_with_video.py (+27/-29) |
To merge this branch: | bzr merge lp:~barry/mediaplayer-app/py3autopilot |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot | continuous-integration | Needs Fixing | |
Ubuntu Phablet Team | Pending | ||
Review via email: mp+222548@code.launchpad.net |
This proposal has been superseded by a proposal from 2014-07-15.
Commit message
* Port autopilot tests to Python 3.
* Bump Standards-Version to 3.9.5.
Description of the change
* Port autopilot tests to Python 3.
* Bump Standards-Version to 3.9.5.
PS Jenkins bot (ps-jenkins) wrote : | # |
Leo Arias (elopio) wrote : | # |
I've kicked a new jenkins run to see what's the status of this branch.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:235
http://
Executed test runs:
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
- 236. By Barry Warsaw
-
trunk merge
- 237. By Barry Warsaw
-
Pre-requisite branch merge.
- 238. By Barry Warsaw
-
merge trunk
Unmerged revisions
Preview Diff
1 | === modified file 'debian/changelog' | |||
2 | --- debian/changelog 2014-05-09 16:12:00 +0000 | |||
3 | +++ debian/changelog 2014-06-09 19:48:39 +0000 | |||
4 | @@ -1,3 +1,10 @@ | |||
5 | 1 | mediaplayer-app (0.20.5+14.10.20140502-0ubuntu4) UNRELEASED; urgency=medium | ||
6 | 2 | |||
7 | 3 | * Port autopilot tests to Python 3. | ||
8 | 4 | * Bump Standards-Version to 3.9.5. | ||
9 | 5 | |||
10 | 6 | -- Barry Warsaw <barry@ubuntu.com> Mon, 09 Jun 2014 15:47:08 -0400 | ||
11 | 7 | |||
12 | 1 | mediaplayer-app (0.20.5+14.10.20140502-0ubuntu3) utopic; urgency=medium | 8 | mediaplayer-app (0.20.5+14.10.20140502-0ubuntu3) utopic; urgency=medium |
13 | 2 | 9 | ||
14 | 3 | * Renaming dep package qtdeclarative5-qtmultimedia-plugin to | 10 | * Renaming dep package qtdeclarative5-qtmultimedia-plugin to |
15 | 4 | 11 | ||
16 | === modified file 'debian/control' | |||
17 | --- debian/control 2014-05-09 16:11:44 +0000 | |||
18 | +++ debian/control 2014-06-09 19:48:39 +0000 | |||
19 | @@ -8,11 +8,11 @@ | |||
20 | 8 | libgl1-mesa-dev | libgl-dev, | 8 | libgl1-mesa-dev | libgl-dev, |
21 | 9 | libgles2-mesa-dev, | 9 | libgles2-mesa-dev, |
22 | 10 | pkg-config, | 10 | pkg-config, |
24 | 11 | python, | 11 | python3, |
25 | 12 | qtbase5-dev, | 12 | qtbase5-dev, |
26 | 13 | qtdeclarative5-dev, | 13 | qtdeclarative5-dev, |
27 | 14 | qtmultimedia5-dev, | 14 | qtmultimedia5-dev, |
29 | 15 | Standards-Version: 3.9.4 | 15 | Standards-Version: 3.9.5 |
30 | 16 | # If you don't have commit rights to lp:mediaplayer-app but need to upload | 16 | # If you don't have commit rights to lp:mediaplayer-app but need to upload |
31 | 17 | # packaging changes, just go ahead. The developers will notice and sync | 17 | # packaging changes, just go ahead. The developers will notice and sync |
32 | 18 | # up the code again. | 18 | # up the code again. |
33 | @@ -43,7 +43,7 @@ | |||
34 | 43 | libqt5test5, | 43 | libqt5test5, |
35 | 44 | libqt5widgets5, | 44 | libqt5widgets5, |
36 | 45 | mediaplayer-app (>= ${source:Version}), | 45 | mediaplayer-app (>= ${source:Version}), |
38 | 46 | python-autopilot, | 46 | python3-autopilot, |
39 | 47 | Conflicts: media-player-autopilot | 47 | Conflicts: media-player-autopilot |
40 | 48 | Replaces: media-player-autopilot | 48 | Replaces: media-player-autopilot |
41 | 49 | Provides: media-player-autopilot | 49 | Provides: media-player-autopilot |
42 | 50 | 50 | ||
43 | === modified file 'tests/autopilot/CMakeLists.txt' | |||
44 | --- tests/autopilot/CMakeLists.txt 2013-05-23 20:00:37 +0000 | |||
45 | +++ tests/autopilot/CMakeLists.txt 2014-06-09 19:48:39 +0000 | |||
46 | @@ -1,6 +1,6 @@ | |||
47 | 1 | set(AUTOPILOT_DIR mediaplayer_app) | 1 | set(AUTOPILOT_DIR mediaplayer_app) |
48 | 2 | 2 | ||
50 | 3 | execute_process(COMMAND python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()" | 3 | execute_process(COMMAND python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" |
51 | 4 | OUTPUT_VARIABLE PYTHON_PACKAGE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) | 4 | OUTPUT_VARIABLE PYTHON_PACKAGE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) |
52 | 5 | 5 | ||
53 | 6 | install(DIRECTORY ${AUTOPILOT_DIR} | 6 | install(DIRECTORY ${AUTOPILOT_DIR} |
54 | 7 | 7 | ||
55 | === modified file 'tests/autopilot/mediaplayer_app/emulators/main_window.py' | |||
56 | --- tests/autopilot/mediaplayer_app/emulators/main_window.py 2013-10-21 11:47:18 +0000 | |||
57 | +++ tests/autopilot/mediaplayer_app/emulators/main_window.py 2014-06-09 19:48:39 +0000 | |||
58 | @@ -6,7 +6,7 @@ | |||
59 | 6 | # by the Free Software Foundation. | 6 | # by the Free Software Foundation. |
60 | 7 | 7 | ||
61 | 8 | 8 | ||
63 | 9 | class MainWindow(object): | 9 | class MainWindow: |
64 | 10 | """An emulator class that makes it easy to interact with the camera-app.""" | 10 | """An emulator class that makes it easy to interact with the camera-app.""" |
65 | 11 | 11 | ||
66 | 12 | def __init__(self, app): | 12 | def __init__(self, app): |
67 | @@ -17,10 +17,10 @@ | |||
68 | 17 | return self.app.select_single("QQuickView") | 17 | return self.app.select_single("QQuickView") |
69 | 18 | 18 | ||
70 | 19 | def get_controls(self): | 19 | def get_controls(self): |
72 | 20 | return self.app.select_single("Controls", objectName="controls") | 20 | return self.app.select_single("Controls", objectName="controls") |
73 | 21 | 21 | ||
74 | 22 | def get_video_area(self): | 22 | def get_video_area(self): |
76 | 23 | return self.app.select_single("VideoPlayer", objectName="player") | 23 | return self.app.select_single("VideoPlayer", objectName="player") |
77 | 24 | 24 | ||
78 | 25 | def get_toolbar(self): | 25 | def get_toolbar(self): |
79 | 26 | return self.app.select_single("GenericToolbar", objectName="toolbar") | 26 | return self.app.select_single("GenericToolbar", objectName="toolbar") |
80 | 27 | 27 | ||
81 | === modified file 'tests/autopilot/mediaplayer_app/tests/__init__.py' | |||
82 | --- tests/autopilot/mediaplayer_app/tests/__init__.py 2013-09-04 16:25:10 +0000 | |||
83 | +++ tests/autopilot/mediaplayer_app/tests/__init__.py 2014-06-09 19:48:39 +0000 | |||
84 | @@ -7,7 +7,6 @@ | |||
85 | 7 | 7 | ||
86 | 8 | """mediaplayer-app autopilot tests.""" | 8 | """mediaplayer-app autopilot tests.""" |
87 | 9 | 9 | ||
88 | 10 | import os.path | ||
89 | 11 | import os | 10 | import os |
90 | 12 | 11 | ||
91 | 13 | from autopilot.input import Mouse, Touch, Pointer | 12 | from autopilot.input import Mouse, Touch, Pointer |
92 | 14 | 13 | ||
93 | === modified file 'tests/autopilot/mediaplayer_app/tests/test_player.py' | |||
94 | --- tests/autopilot/mediaplayer_app/tests/test_player.py 2013-10-21 11:47:18 +0000 | |||
95 | +++ tests/autopilot/mediaplayer_app/tests/test_player.py 2014-06-09 19:48:39 +0000 | |||
96 | @@ -7,8 +7,6 @@ | |||
97 | 7 | 7 | ||
98 | 8 | """Tests for the Mediaplayer App""" | 8 | """Tests for the Mediaplayer App""" |
99 | 9 | 9 | ||
100 | 10 | from __future__ import absolute_import | ||
101 | 11 | |||
102 | 12 | from autopilot.matchers import Eventually | 10 | from autopilot.matchers import Eventually |
103 | 13 | from testtools.matchers import Equals | 11 | from testtools.matchers import Equals |
104 | 14 | 12 | ||
105 | @@ -26,15 +24,11 @@ | |||
106 | 26 | self.assertThat( | 24 | self.assertThat( |
107 | 27 | self.main_window.get_qml_view().visible, Eventually(Equals(True))) | 25 | self.main_window.get_qml_view().visible, Eventually(Equals(True))) |
108 | 28 | 26 | ||
109 | 29 | def tearDown(self): | ||
110 | 30 | super(TestPlayer, self).tearDown() | ||
111 | 31 | |||
112 | 32 | def test_no_video_dialog_visible(self): | 27 | def test_no_video_dialog_visible(self): |
113 | 33 | """ Makes sure 'No Video' dialog appears if the meidaplayer is opened | 28 | """ Makes sure 'No Video' dialog appears if the meidaplayer is opened |
114 | 34 | without a video file argument. | 29 | without a video file argument. |
115 | 35 | 30 | ||
116 | 36 | """ | 31 | """ |
117 | 37 | 32 | ||
119 | 38 | dialog = self.main_window.get_no_video_dialog() | 33 | dialog = self.main_window.get_no_video_dialog() |
120 | 39 | self.assertThat(dialog.visible, Eventually(Equals(True))) | 34 | self.assertThat(dialog.visible, Eventually(Equals(True))) |
121 | 40 | |||
122 | 41 | 35 | ||
123 | === modified file 'tests/autopilot/mediaplayer_app/tests/test_player_with_video.py' | |||
124 | --- tests/autopilot/mediaplayer_app/tests/test_player_with_video.py 2014-04-17 21:30:48 +0000 | |||
125 | +++ tests/autopilot/mediaplayer_app/tests/test_player_with_video.py 2014-06-09 19:48:39 +0000 | |||
126 | @@ -7,8 +7,6 @@ | |||
127 | 7 | 7 | ||
128 | 8 | """Tests for the Mediaplayer App""" | 8 | """Tests for the Mediaplayer App""" |
129 | 9 | 9 | ||
130 | 10 | from __future__ import absolute_import | ||
131 | 11 | |||
132 | 12 | from autopilot.matchers import Eventually | 10 | from autopilot.matchers import Eventually |
133 | 13 | from autopilot.platform import model | 11 | from autopilot.platform import model |
134 | 14 | from testtools import skipIf | 12 | from testtools import skipIf |
135 | @@ -26,8 +24,9 @@ | |||
136 | 26 | In the testfarm, the application may take some time to show up.""" | 24 | In the testfarm, the application may take some time to show up.""" |
137 | 27 | def setUp(self): | 25 | def setUp(self): |
138 | 28 | super(TestPlayerWithVideo, self).setUp() | 26 | super(TestPlayerWithVideo, self).setUp() |
141 | 29 | print model() | 27 | print(model()) |
142 | 30 | if model() == 'Nexus 4' or model() == 'Galaxy Nexus' or model() == "Nexus 7 (2013) Wi-Fi" or model() == "Nexus 10": | 28 | if model() in ( |
143 | 29 | 'Nexus 4', 'Galaxy Nexus', "Nexus 7 (2013) Wi-Fi", "Nexus 10"): | ||
144 | 31 | self.launch_app("h264.avi") | 30 | self.launch_app("h264.avi") |
145 | 32 | else: | 31 | else: |
146 | 33 | self.launch_app("small.ogg") | 32 | self.launch_app("small.ogg") |
147 | @@ -37,9 +36,6 @@ | |||
148 | 37 | player = self.main_window.get_player() | 36 | player = self.main_window.get_player() |
149 | 38 | self.assertThat(player.playing, Eventually(Equals(True))) | 37 | self.assertThat(player.playing, Eventually(Equals(True))) |
150 | 39 | 38 | ||
151 | 40 | def tearDown(self): | ||
152 | 41 | super(TestPlayerWithVideo, self).tearDown() | ||
153 | 42 | |||
154 | 43 | def show_controls(self): | 39 | def show_controls(self): |
155 | 44 | video_area = self.main_window.get_video_area() | 40 | video_area = self.main_window.get_video_area() |
156 | 45 | self.pointing_device.click_object(video_area) | 41 | self.pointing_device.click_object(video_area) |
157 | @@ -56,22 +52,20 @@ | |||
158 | 56 | playback_button = self.main_window.get_playback_button() | 52 | playback_button = self.main_window.get_playback_button() |
159 | 57 | player = self.main_window.get_player() | 53 | player = self.main_window.get_player() |
160 | 58 | 54 | ||
164 | 59 | """ Default state after load the video is playing and with pause | 55 | # Default state after load the video is playing and with pause icon. |
162 | 60 | icon. | ||
163 | 61 | """ | ||
165 | 62 | self.assertProperty(player, playing=True, paused=False) | 56 | self.assertProperty(player, playing=True, paused=False) |
166 | 63 | self.assertProperty(playback_button, icon="pause") | 57 | self.assertProperty(playback_button, icon="pause") |
167 | 64 | 58 | ||
168 | 65 | self.pointing_device.click_object(playback_button) | 59 | self.pointing_device.click_object(playback_button) |
169 | 66 | 60 | ||
172 | 67 | """ First click must pause the video, change playing state and show | 61 | # First click must pause the video, change playing state and show play |
173 | 68 | play icon. """ | 62 | # icon. |
174 | 69 | self.assertProperty(player, playing=False, paused=True) | 63 | self.assertProperty(player, playing=False, paused=True) |
175 | 70 | self.assertProperty(playback_button, icon="play") | 64 | self.assertProperty(playback_button, icon="play") |
176 | 71 | 65 | ||
177 | 72 | self.pointing_device.click() | 66 | self.pointing_device.click() |
178 | 73 | 67 | ||
180 | 74 | """ Second click should change the state to playing again """ | 68 | # Second click should change the state to playing again |
181 | 75 | self.assertProperty(player, playing=True, paused=False) | 69 | self.assertProperty(player, playing=True, paused=False) |
182 | 76 | self.assertProperty(playback_button, icon="pause") | 70 | self.assertProperty(playback_button, icon="pause") |
183 | 77 | 71 | ||
184 | @@ -83,14 +77,14 @@ | |||
185 | 83 | scene_selector = self.main_window.get_scene_selector() | 77 | scene_selector = self.main_window.get_scene_selector() |
186 | 84 | slider = self.main_window.get_slider() | 78 | slider = self.main_window.get_slider() |
187 | 85 | 79 | ||
189 | 86 | """ Default state is hide """ | 80 | # Default state is hide |
190 | 87 | self.assertProperty(scene_selector, visible=False) | 81 | self.assertProperty(scene_selector, visible=False) |
191 | 88 | 82 | ||
193 | 89 | """ Scene selector must apper when clicking int the slider handler """ | 83 | # Scene selector must apper when clicking int the slider handler |
194 | 90 | self.pointing_device.click_object(slider) | 84 | self.pointing_device.click_object(slider) |
195 | 91 | self.assertProperty(scene_selector, visible=True) | 85 | self.assertProperty(scene_selector, visible=True) |
196 | 92 | 86 | ||
198 | 93 | """ click again must dismiss the scene selector """ | 87 | # click again must dismiss the scene selector |
199 | 94 | self.pointing_device.click() | 88 | self.pointing_device.click() |
200 | 95 | self.assertProperty(scene_selector, visible=False) | 89 | self.assertProperty(scene_selector, visible=False) |
201 | 96 | 90 | ||
202 | @@ -104,26 +98,28 @@ | |||
203 | 104 | selector = self.main_window.get_scene_selector() | 98 | selector = self.main_window.get_scene_selector() |
204 | 105 | self.assertThat(selector.count, Eventually(GreaterThan(3))) | 99 | self.assertThat(selector.count, Eventually(GreaterThan(3))) |
205 | 106 | 100 | ||
207 | 107 | """ Show scene selector """ | 101 | # Show scene selector |
208 | 108 | self.pointing_device.click_object(slider) | 102 | self.pointing_device.click_object(slider) |
209 | 109 | 103 | ||
211 | 110 | """ Make sure that the scenes are in correct place """ | 104 | # Make sure that the scenes are in correct place |
212 | 111 | scene_0 = self.main_window.get_scene_0() | 105 | scene_0 = self.main_window.get_scene_0() |
213 | 112 | selectorRect = selector.globalRect | 106 | selectorRect = selector.globalRect |
214 | 113 | self.pointing_device.drag( | 107 | self.pointing_device.drag( |
217 | 114 | selectorRect[0], selectorRect[1] + selectorRect[3] / 2, | 108 | selectorRect[0], selectorRect[1] + selectorRect[3] // 2, |
218 | 115 | selectorRect[0] + selectorRect[2], selectorRect[1] + selectorRect[3] / 2) | 109 | selectorRect[0] + selectorRect[2], |
219 | 110 | selectorRect[1] + selectorRect[3] // 2) | ||
220 | 116 | self.assertThat(selector.moving, Eventually(Equals(False))) | 111 | self.assertThat(selector.moving, Eventually(Equals(False))) |
221 | 117 | self.assertThat(scene_0.x, Eventually(Equals(0))) | 112 | self.assertThat(scene_0.x, Eventually(Equals(0))) |
222 | 118 | 113 | ||
224 | 119 | """ Click in the second scene """ | 114 | # Click in the second scene |
225 | 120 | scene_2 = self.main_window.get_scene_2() | 115 | scene_2 = self.main_window.get_scene_2() |
226 | 121 | self.assertThat(scene_2.ready, Eventually(Equals(True))) | 116 | self.assertThat(scene_2.ready, Eventually(Equals(True))) |
227 | 122 | self.pointing_device.click_object(scene_2) | 117 | self.pointing_device.click_object(scene_2) |
228 | 123 | self.assertThat(selector.currentIndex, Eventually(Equals(2))) | 118 | self.assertThat(selector.currentIndex, Eventually(Equals(2))) |
229 | 124 | self.assertProperty(time_line, value=1.107) | 119 | self.assertProperty(time_line, value=1.107) |
230 | 125 | 120 | ||
232 | 126 | @skipIf(model() == 'Nexus 4' or model() == 'Galaxy Nexus', 'Screen width not enough for seekbar') | 121 | @skipIf(model() in ('Nexus 4', 'Galaxy Nexus'), |
233 | 122 | 'Screen width not enough for seekbar') | ||
234 | 127 | def test_time_display_behavior(self): | 123 | def test_time_display_behavior(self): |
235 | 128 | self.show_controls() | 124 | self.show_controls() |
236 | 129 | self.pause_video() | 125 | self.pause_video() |
237 | @@ -131,24 +127,26 @@ | |||
238 | 131 | time_line = self.main_window.get_slider() | 127 | time_line = self.main_window.get_slider() |
239 | 132 | time_label = self.main_window.get_time_label() | 128 | time_label = self.main_window.get_time_label() |
240 | 133 | 129 | ||
242 | 134 | """ Seek to the midle of the movie """ | 130 | # Seek to the midle of the movie |
243 | 135 | self.pointing_device.click_object(time_line) | 131 | self.pointing_device.click_object(time_line) |
244 | 136 | 132 | ||
246 | 137 | """ Time label must show the current video time (diff from zero or empty) """ | 133 | # Time label must show the current video time (diff from zero or empty) |
247 | 138 | self.assertNotEqual(time_label.text, "00:00:00") | 134 | self.assertNotEqual(time_label.text, "00:00:00") |
248 | 139 | self.assertNotEqual(time_label.text, "") | 135 | self.assertNotEqual(time_label.text, "") |
249 | 140 | 136 | ||
251 | 141 | """ Click in the label to change the state """ | 137 | # Click in the label to change the state |
252 | 142 | self.pointing_device.click_object(time_label) | 138 | self.pointing_device.click_object(time_label) |
253 | 143 | 139 | ||
255 | 144 | """ After the click the label must show the remaning time (with '-' signal) """ | 140 | # After the click the label must show the remaning time (with '-' |
256 | 141 | # signal) | ||
257 | 145 | self.assertEqual(time_label.text[0:1], "-") | 142 | self.assertEqual(time_label.text[0:1], "-") |
258 | 146 | 143 | ||
260 | 147 | @skipIf(model() == 'Nexus 4' or model() == 'Galaxy Nexus', 'Screen width not enough for seekbar') | 144 | @skipIf(model() in ('Nexus 4', 'Galaxy Nexus'), |
261 | 145 | 'Screen width not enough for seekbar') | ||
262 | 148 | def test_show_controls_at_end(self): | 146 | def test_show_controls_at_end(self): |
263 | 149 | controls = self.main_window.get_controls() | 147 | controls = self.main_window.get_controls() |
265 | 150 | """ The controls are invisible by default """ | 148 | # The controls are invisible by default |
266 | 151 | self.assertThat(controls.visible, Eventually(Equals(False))) | 149 | self.assertThat(controls.visible, Eventually(Equals(False))) |
267 | 152 | 150 | ||
269 | 153 | """ wait for video ends and control appears """ | 151 | # wait for video ends and control appears |
270 | 154 | self.assertThat(controls.visible, Eventually(Equals(True), timeout=35)) | 152 | self.assertThat(controls.visible, Eventually(Equals(True), timeout=35)) |
FAILED: Continuous integration, rev:235 jenkins. qa.ubuntu. com/job/ mediaplayer- app-ci/ 195/ jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- utopic- touch/775 jenkins. qa.ubuntu. com/job/ generic- mediumtests- utopic/ 708 jenkins. qa.ubuntu. com/job/ mediaplayer- app-utopic- amd64-ci/ 3 jenkins. qa.ubuntu. com/job/ mediaplayer- app-utopic- armhf-ci/ 3 jenkins. qa.ubuntu. com/job/ mediaplayer- app-utopic- armhf-ci/ 3/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ mediaplayer- app-utopic- i386-ci/ 3 jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- runner- mako/1201 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- utopic- armhf/1433 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- utopic- armhf/1433/ artifact/ work/output/ *zip*/output. zip s-jenkins. ubuntu- ci:8080/ job/touch- flash-device/ 8254 jenkins. qa.ubuntu. com/job/ autopilot- testrunner- otto-utopic/ 631 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- utopic- amd64/847 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- utopic- amd64/847/ artifact/ work/output/ *zip*/output. zip
http://
Executed test runs:
UNSTABLE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/mediaplayer -app-ci/ 195/rebuild
http://