Merge lp:~tpeeters/ubuntu-ui-toolkit/ap-toolbar-open into lp:ubuntu-ui-toolkit
- ap-toolbar-open
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Florian Boucault |
Approved revision: | 837 |
Merged at revision: | 826 |
Proposed branch: | lp:~tpeeters/ubuntu-ui-toolkit/ap-toolbar-open |
Merge into: | lp:ubuntu-ui-toolkit |
Diff against target: |
195 lines (+80/-37) 2 files modified
tests/autopilot/ubuntuuitoolkit/emulators.py (+53/-30) tests/autopilot/ubuntuuitoolkit/tests/test_emulators.py (+27/-7) |
To merge this branch: | bzr merge lp:~tpeeters/ubuntu-ui-toolkit/ap-toolbar-open |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot | continuous-integration | Approve | |
Leo Arias (community) | code review, test analysis, ran tests | Approve | |
Ubuntu SDK team | Pending | ||
Review via email: mp+194122@code.launchpad.net |
Commit message
Description of the change
Ensure the toolbar is opened when clicking a toolbar in autopilot tests
PS Jenkins bot (ps-jenkins) wrote : | # |
Leo Arias (elopio) wrote : | # |
42 + return self.get_
the close method doesn't return anything, so you can remove the 'return' from there.
50 + def open(self):
72 + def close(self):
Now we are missing tests for those two new public methods. It would be basically to copy the existing tests, but calling get_toolbar(). With the existing tests for the open and close methods of the main view, you can leave them as they are, or you could use a mock just to check that the new open and close methods were called.
95 + # ensure the toolbar is open
96 + self.open()
I find it weird that the click_button method opens the toolbar if it's not open. I think I would prefer to raise an exception if when called click_button the toolbar is not opened.
98 + # ensure the toolbar is still open (may have closed due to timeout)
99 + self.open()
I do like this other open. I think it's just how a real use would act.
119 +# def test_click_
This test is failing for you probably because you are not using autopilot 1.4.
With this branch, we would be missing also a test that checks that the button is clicked even if the toolbar was closed during the method call. I think you can reproduce that condition changing self.pointing_
Thank you for working on this!
Leo Arias (elopio) : | # |
Olivier Tilloy (osomon) wrote : | # |
Copying my comments from bug #1248487:
« I’m not proposing that open_toolbar close it first, I’m proposing that if it’s already open the emulator does some sort of interaction with it (details to be figured out) to ensure it won’t autohide.
Your proposal works for click_button(), but what if I want to interact differently with the toolbar. E.g., what if the toolbar contains a TextField, or some other widget? I will still want to ensure that when I call open_toolbar(), it remains open. »
Tim Peeters (tpeeters) wrote : | # |
> Copying my comments from bug #1248487:
>
> « I’m not proposing that open_toolbar close it first, I’m proposing that if
> it’s already open the emulator does some sort of interaction with it (details
> to be figured out) to ensure it won’t autohide.
>
> Your proposal works for click_button(), but what if I want to interact
> differently with the toolbar. E.g., what if the toolbar contains a TextField,
> or some other widget? I will still want to ensure that when I call
> open_toolbar(), it remains open. »
The current design specs say that if it is not interacted with for 5 seconds it should close. So I don't know how to incorporate that with your requirement.
Do you currently have a use case?
Olivier Tilloy (osomon) wrote : | # |
> > Copying my comments from bug #1248487:
> >
> > « I’m not proposing that open_toolbar close it first, I’m proposing that if
> > it’s already open the emulator does some sort of interaction with it
> (details
> > to be figured out) to ensure it won’t autohide.
> >
> > Your proposal works for click_button(), but what if I want to interact
> > differently with the toolbar. E.g., what if the toolbar contains a
> TextField,
> > or some other widget? I will still want to ensure that when I call
> > open_toolbar(), it remains open. »
>
> The current design specs say that if it is not interacted with for 5 seconds
> it should close. So I don't know how to incorporate that with your
> requirement.
So even if it was manually revealed, it will auto-hide after 5 seconds of inactivity?
Tim Peeters (tpeeters) wrote : | # |
Yes, it will always hide after 5 seconds.
For most apps this is not a problem, because clicking a button takes virtually no time. But I realize that for the browser, the user may be entering a URL in the address bar for >5s. So for that case, I would have to detect when the user starts and stops interacting with items inside the toolbar, and stop the timer during interaction (and reset afterwards).
Olivier Tilloy (osomon) wrote : | # |
> Yes, it will always hide after 5 seconds.
Ok. I hadn’t understood this. I thought it would autohide only when automatically shown.
So I guess the only solution for autopilot tests is to always ensure the toolbar is first hidden by interacting with the application’s contents, then manually reveal it and interact with it (e.g. click a button).
Otherwise we’ll always run into race conditions where the toolbar auto-hides while the cursor is moving towards one of its buttons.
Either that, or your proposal of ensuring the toolbar is shown in click_button(…) before actually clicking the button.
> For most apps this is not a problem, because clicking a button takes virtually
> no time. But I realize that for the browser, the user may be entering a URL in
> the address bar for >5s. So for that case, I would have to detect when the
> user starts and stops interacting with items inside the toolbar, and stop the
> timer during interaction (and reset afterwards).
No, this is not a problem in the browser, as it uses a custom toolbar, not the default one.
Tim Peeters (tpeeters) wrote : | # |
> 95 + # ensure the toolbar is open
> 96 + self.open()
>
> I find it weird that the click_button method opens the toolbar if it's not
> open. I think I would prefer to raise an exception if when called click_button
> the toolbar is not opened.
You cannot really know whether the toolbar is open when clicking.
When you call toolbar_open(), the toolbar opens, but things can happen between that and the actual click on the button so that the toolbar closes again. For example, a timeout can occur. If the toolbar was opened initially, it will close after 5s. But in a test it is possible that only after 4.5s toolbar.open() is called (which does nothing because it was open already), and then it takes 1s to move the cursor to the button to click it, but in the meantime the toolbar closed already.
I think it is a matter of choice whether we want click_button() to open the toolbar for you, or if we want always toolbar_open() to be called before click_button(). Note that you would *always* call toolbar_open() (or toolbar.open()) before click_button, so why not integrate it in that function?
Tim Peeters (tpeeters) wrote : | # |
> 119 +# def test_click_
>
> This test is failing for you probably because you are not using autopilot 1.4.
I know. Before merging this, I will put the test back in. I just uncommented it now to make it easier to test on my laptop.
> Thank you for working on this!
No problem :) thanks for assisting me :)
- 827. By Tim Peeters
-
remove return in close() call
- 828. By Tim Peeters
-
additional documentation for click_button
- 829. By Tim Peeters
-
use new/updated functions in test_emulators
Tim Peeters (tpeeters) wrote : | # |
> Yes, it will always hide after 5 seconds.
>
> For most apps this is not a problem, because clicking a button takes virtually
> no time. But I realize that for the browser, the user may be entering a URL in
> the address bar for >5s. So for that case, I would have to detect when the
> user starts and stops interacting with items inside the toolbar, and stop the
> timer during interaction (and reset afterwards).
This is no problem for the browser, because it uses its own custom toolbar.
However, if applications use the toolbar as in the browser, this can cause problems.
I reported this bug to fix it: https:/
- 830. By Tim Peeters
-
require toolbar to be opened before calling click_button
- 831. By Tim Peeters
-
put test_click_
unexisting_ button( ) back in. should work with AP 1.4
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:829
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:831
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 832. By Tim Peeters
-
fix too long line in python
- 833. By Tim Peeters
-
revert fix, is fixed in upcoming merge
- 834. By Tim Peeters
-
Added missing tests and fixed pep257. Thanks elopio.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:832
http://
Executed test runs:
UNSTABLE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
FAILURE: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:834
http://
Executed test runs:
UNSTABLE: http://
FAILURE: http://
SUCCESS: http://
FAILURE: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
FAILURE: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 835. By Tim Peeters
-
empty
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:835
http://
Executed test runs:
UNSTABLE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
FAILURE: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Leo Arias (elopio) wrote : | # |
62 + return self
The failure is because that line is overindented. You should return the toolbar even if it is hidden.
Thank you for merging my changes.
- 836. By Tim Peeters
-
fix indentation
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:836
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 837. By Tim Peeters
-
push trunk
Tim Peeters (tpeeters) wrote : | # |
^"push trunk" should be "merge trunk" (just to clarify that nothing was pushed to trunk from here)
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:837
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Preview Diff
1 | === modified file 'tests/autopilot/ubuntuuitoolkit/emulators.py' | |||
2 | --- tests/autopilot/ubuntuuitoolkit/emulators.py 2013-11-06 16:38:23 +0000 | |||
3 | +++ tests/autopilot/ubuntuuitoolkit/emulators.py 2013-11-08 17:15:25 +0000 | |||
4 | @@ -88,39 +88,11 @@ | |||
5 | 88 | :return: The toolbar. | 88 | :return: The toolbar. |
6 | 89 | 89 | ||
7 | 90 | """ | 90 | """ |
24 | 91 | toolbar = self.get_toolbar() | 91 | return self.get_toolbar().open() |
9 | 92 | toolbar.animating.wait_for(False) | ||
10 | 93 | if not toolbar.opened: | ||
11 | 94 | self._drag_to_open_toolbar() | ||
12 | 95 | toolbar.opened.wait_for(True) | ||
13 | 96 | toolbar.animating.wait_for(False) | ||
14 | 97 | |||
15 | 98 | return toolbar | ||
16 | 99 | |||
17 | 100 | def _drag_to_open_toolbar(self): | ||
18 | 101 | x, y, _, _ = self.globalRect | ||
19 | 102 | line_x = x + self.width * 0.50 | ||
20 | 103 | start_y = y + self.height - 1 | ||
21 | 104 | stop_y = y + self.height - self.get_toolbar().height | ||
22 | 105 | |||
23 | 106 | self.pointing_device.drag(line_x, start_y, line_x, stop_y) | ||
25 | 107 | 92 | ||
26 | 108 | def close_toolbar(self): | 93 | def close_toolbar(self): |
27 | 109 | """Close the toolbar if it's opened.""" | 94 | """Close the toolbar if it's opened.""" |
42 | 110 | toolbar = self.get_toolbar() | 95 | self.get_toolbar().close() |
29 | 111 | toolbar.animating.wait_for(False) | ||
30 | 112 | if toolbar.opened: | ||
31 | 113 | self._drag_to_close_toolbar() | ||
32 | 114 | toolbar.opened.wait_for(False) | ||
33 | 115 | toolbar.animating.wait_for(False) | ||
34 | 116 | |||
35 | 117 | def _drag_to_close_toolbar(self): | ||
36 | 118 | x, y, _, _ = self.globalRect | ||
37 | 119 | line_x = x + self.width * 0.50 | ||
38 | 120 | start_y = y + self.height - self.get_toolbar().height | ||
39 | 121 | stop_y = y + self.height - 1 | ||
40 | 122 | |||
41 | 123 | self.pointing_device.drag(line_x, start_y, line_x, stop_y) | ||
43 | 124 | 96 | ||
44 | 125 | def get_tabs(self): | 97 | def get_tabs(self): |
45 | 126 | """Return the Tabs emulator of the MainView. | 98 | """Return the Tabs emulator of the MainView. |
46 | @@ -244,9 +216,52 @@ | |||
47 | 244 | class Toolbar(UbuntuUIToolkitEmulatorBase): | 216 | class Toolbar(UbuntuUIToolkitEmulatorBase): |
48 | 245 | """Toolbar Autopilot emulator.""" | 217 | """Toolbar Autopilot emulator.""" |
49 | 246 | 218 | ||
50 | 219 | def open(self): | ||
51 | 220 | """Open the toolbar if it's not already opened. | ||
52 | 221 | |||
53 | 222 | :return: The toolbar. | ||
54 | 223 | |||
55 | 224 | """ | ||
56 | 225 | self.animating.wait_for(False) | ||
57 | 226 | if not self.opened: | ||
58 | 227 | self._drag_to_open() | ||
59 | 228 | self.opened.wait_for(True) | ||
60 | 229 | self.animating.wait_for(False) | ||
61 | 230 | |||
62 | 231 | return self | ||
63 | 232 | |||
64 | 233 | def _drag_to_open(self): | ||
65 | 234 | x, y, _, _ = self.globalRect | ||
66 | 235 | line_x = x + self.width * 0.50 | ||
67 | 236 | start_y = y + self.height - 1 | ||
68 | 237 | stop_y = y | ||
69 | 238 | |||
70 | 239 | self.pointing_device.drag(line_x, start_y, line_x, stop_y) | ||
71 | 240 | |||
72 | 241 | def close(self): | ||
73 | 242 | """Close the toolbar if it's opened.""" | ||
74 | 243 | self.animating.wait_for(False) | ||
75 | 244 | if self.opened: | ||
76 | 245 | self._drag_to_close() | ||
77 | 246 | self.opened.wait_for(False) | ||
78 | 247 | self.animating.wait_for(False) | ||
79 | 248 | |||
80 | 249 | def _drag_to_close(self): | ||
81 | 250 | x, y, _, _ = self.globalRect | ||
82 | 251 | line_x = x + self.width * 0.50 | ||
83 | 252 | start_y = y | ||
84 | 253 | stop_y = y + self.height - 1 | ||
85 | 254 | |||
86 | 255 | self.pointing_device.drag(line_x, start_y, line_x, stop_y) | ||
87 | 256 | |||
88 | 247 | def click_button(self, object_name): | 257 | def click_button(self, object_name): |
89 | 248 | """Click a button of the toolbar. | 258 | """Click a button of the toolbar. |
90 | 249 | 259 | ||
91 | 260 | The toolbar should be opened before clicking the button, or an | ||
92 | 261 | exception will be raised. If the toolbar is closed for some reason | ||
93 | 262 | (e.g., timer finishes) after moving the mouse cursor and before | ||
94 | 263 | clicking the button, it is re-opened automatically by this function. | ||
95 | 264 | |||
96 | 250 | :parameter object_name: The QML objectName property of the button. | 265 | :parameter object_name: The QML objectName property of the button. |
97 | 251 | :raise ToolkitEmulatorException: If there is no button with that object | 266 | :raise ToolkitEmulatorException: If there is no button with that object |
98 | 252 | name. | 267 | name. |
99 | @@ -257,6 +272,14 @@ | |||
100 | 257 | except dbus.StateNotFoundError: | 272 | except dbus.StateNotFoundError: |
101 | 258 | raise ToolkitEmulatorException( | 273 | raise ToolkitEmulatorException( |
102 | 259 | 'Button with objectName "{0}" not found.'.format(object_name)) | 274 | 'Button with objectName "{0}" not found.'.format(object_name)) |
103 | 275 | # ensure the toolbar is open | ||
104 | 276 | if not self.opened: | ||
105 | 277 | raise ToolkitEmulatorException( | ||
106 | 278 | 'Toolbar must be opened before calling click_button().') | ||
107 | 279 | self.pointing_device.move_to_object(button) | ||
108 | 280 | # ensure the toolbar is still open (may have closed due to timeout) | ||
109 | 281 | self.open() | ||
110 | 282 | # click the button | ||
111 | 260 | self.pointing_device.click_object(button) | 283 | self.pointing_device.click_object(button) |
112 | 261 | 284 | ||
113 | 262 | def _get_button(self, object_name): | 285 | def _get_button(self, object_name): |
114 | 263 | 286 | ||
115 | === modified file 'tests/autopilot/ubuntuuitoolkit/tests/test_emulators.py' | |||
116 | --- tests/autopilot/ubuntuuitoolkit/tests/test_emulators.py 2013-11-06 16:45:12 +0000 | |||
117 | +++ tests/autopilot/ubuntuuitoolkit/tests/test_emulators.py 2013-11-08 17:15:25 +0000 | |||
118 | @@ -87,6 +87,18 @@ | |||
119 | 87 | toolbar = self.main_view.get_toolbar() | 87 | toolbar = self.main_view.get_toolbar() |
120 | 88 | self.assertIsInstance(toolbar, emulators.Toolbar) | 88 | self.assertIsInstance(toolbar, emulators.Toolbar) |
121 | 89 | 89 | ||
122 | 90 | def test_open_toolbar(self): | ||
123 | 91 | with mock.patch.object(emulators.Toolbar, 'open') as mock_open: | ||
124 | 92 | self.main_view.open_toolbar() | ||
125 | 93 | |||
126 | 94 | mock_open.assert_called_once_with() | ||
127 | 95 | |||
128 | 96 | def test_close_toolbar(self): | ||
129 | 97 | with mock.patch.object(emulators.Toolbar, 'close') as mock_close: | ||
130 | 98 | self.main_view.close_toolbar() | ||
131 | 99 | |||
132 | 100 | mock_close.assert_called_once_with() | ||
133 | 101 | |||
134 | 90 | def test_open_toolbar_returns_the_toolbar(self): | 102 | def test_open_toolbar_returns_the_toolbar(self): |
135 | 91 | toolbar = self.main_view.open_toolbar() | 103 | toolbar = self.main_view.open_toolbar() |
136 | 92 | self.assertIsInstance(toolbar, emulators.Toolbar) | 104 | self.assertIsInstance(toolbar, emulators.Toolbar) |
137 | @@ -171,29 +183,29 @@ | |||
138 | 171 | self.assertFalse(self.toolbar.opened) | 183 | self.assertFalse(self.toolbar.opened) |
139 | 172 | 184 | ||
140 | 173 | def test_open_toolbar(self): | 185 | def test_open_toolbar(self): |
142 | 174 | self.main_view.open_toolbar() | 186 | self.toolbar.open() |
143 | 175 | self.assertTrue(self.toolbar.opened) | 187 | self.assertTrue(self.toolbar.opened) |
144 | 176 | self.assertFalse(self.toolbar.animating) | 188 | self.assertFalse(self.toolbar.animating) |
145 | 177 | 189 | ||
146 | 178 | def test_opened_toolbar_is_not_opened_again(self): | 190 | def test_opened_toolbar_is_not_opened_again(self): |
148 | 179 | self.main_view.open_toolbar() | 191 | self.toolbar.open() |
149 | 180 | with mock.patch.object( | 192 | with mock.patch.object( |
150 | 181 | self.main_view.pointing_device, 'drag') as mock_drag: | 193 | self.main_view.pointing_device, 'drag') as mock_drag: |
152 | 182 | self.main_view.open_toolbar() | 194 | self.toolbar.open() |
153 | 183 | 195 | ||
154 | 184 | self.assertFalse(mock_drag.called) | 196 | self.assertFalse(mock_drag.called) |
155 | 185 | self.assertTrue(self.toolbar.opened) | 197 | self.assertTrue(self.toolbar.opened) |
156 | 186 | 198 | ||
157 | 187 | def test_close_toolbar(self): | 199 | def test_close_toolbar(self): |
160 | 188 | self.main_view.open_toolbar() | 200 | self.toolbar.open() |
161 | 189 | self.main_view.close_toolbar() | 201 | self.toolbar.close() |
162 | 190 | self.assertFalse(self.toolbar.opened) | 202 | self.assertFalse(self.toolbar.opened) |
163 | 191 | self.assertFalse(self.toolbar.animating) | 203 | self.assertFalse(self.toolbar.animating) |
164 | 192 | 204 | ||
165 | 193 | def test_closed_toolbar_is_not_closed_again(self): | 205 | def test_closed_toolbar_is_not_closed_again(self): |
166 | 194 | with mock.patch.object( | 206 | with mock.patch.object( |
167 | 195 | self.main_view.pointing_device, 'drag') as mock_drag: | 207 | self.main_view.pointing_device, 'drag') as mock_drag: |
169 | 196 | self.main_view.close_toolbar() | 208 | self.toolbar.close() |
170 | 197 | 209 | ||
171 | 198 | self.assertFalse(mock_drag.called) | 210 | self.assertFalse(mock_drag.called) |
172 | 199 | self.assertFalse(self.toolbar.opened) | 211 | self.assertFalse(self.toolbar.opened) |
173 | @@ -201,7 +213,7 @@ | |||
174 | 201 | def test_click_toolbar_button(self): | 213 | def test_click_toolbar_button(self): |
175 | 202 | label = self.app.select_single('Label', objectName='clicked_label') | 214 | label = self.app.select_single('Label', objectName='clicked_label') |
176 | 203 | self.assertNotEqual(label.text, 'Button clicked.') | 215 | self.assertNotEqual(label.text, 'Button clicked.') |
178 | 204 | self.main_view.open_toolbar() | 216 | self.toolbar.open() |
179 | 205 | self.toolbar.click_button('buttonName') | 217 | self.toolbar.click_button('buttonName') |
180 | 206 | self.assertEqual(label.text, 'Button clicked.') | 218 | self.assertEqual(label.text, 'Button clicked.') |
181 | 207 | 219 | ||
182 | @@ -213,6 +225,14 @@ | |||
183 | 213 | self.assertEqual( | 225 | self.assertEqual( |
184 | 214 | error.message, 'Button with objectName "unexisting" not found.') | 226 | error.message, 'Button with objectName "unexisting" not found.') |
185 | 215 | 227 | ||
186 | 228 | def test_click_button_on_closed_toolbar(self): | ||
187 | 229 | error = self.assertRaises( | ||
188 | 230 | emulators.ToolkitEmulatorException, self.toolbar.click_button, | ||
189 | 231 | 'buttonName') | ||
190 | 232 | self.assertEqual( | ||
191 | 233 | error.message, | ||
192 | 234 | 'Toolbar must be opened before calling click_button().') | ||
193 | 235 | |||
194 | 216 | 236 | ||
195 | 217 | class TabsTestCase(tests.QMLStringAppTestCase): | 237 | class TabsTestCase(tests.QMLStringAppTestCase): |
196 | 218 | 238 |
FAILED: Continuous integration, rev:826 jenkins. qa.ubuntu. com/job/ ubuntu- ui-toolkit- ci/1168/ jenkins. qa.ubuntu. com/job/ generic- mediumtests- trusty/ 517/console jenkins. qa.ubuntu. com/job/ generic- mediumtests- trusty- touch/505/ console jenkins. qa.ubuntu. com/job/ ubuntu- ui-toolkit- trusty- amd64-ci/ 116/console jenkins. qa.ubuntu. com/job/ ubuntu- ui-toolkit- trusty- armhf-ci/ 116/console jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- amd64/517/ console jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- armhf/505/ console
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild: 10.97.0. 26:8080/ job/ubuntu- ui-toolkit- ci/1168/ rebuild
http://