Merge lp:~veebers/unity8/ap_make_use_of_helpers_in_tests into lp:unity8

Proposed by Christopher Lee on 2013-10-17
Status: Merged
Approved by: Michał Sawicz on 2013-11-19
Approved revision: 481
Merged at revision: 541
Proposed branch: lp:~veebers/unity8/ap_make_use_of_helpers_in_tests
Merge into: lp:unity8
Prerequisite: lp:~veebers/unity8/adding_unlock_emulator
Diff against target: 452 lines (+111/-101)
4 files modified
tests/autopilot/unity8/process_helpers.py (+67/-40)
tests/autopilot/unity8/shell/tests/__init__.py (+8/-21)
tests/autopilot/unity8/shell/tests/test_hud.py (+11/-10)
tests/autopilot/unity8/shell/tests/test_notifications.py (+25/-30)
To merge this branch: bzr merge lp:~veebers/unity8/ap_make_use_of_helpers_in_tests
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve on 2013-11-20
Michał Sawicz 2013-10-17 Approve on 2013-11-19
Review via email: mp+191575@code.launchpad.net

Commit message

Unity8 tests now make use of the helper functions (added in the pre-req branch) so that the helper functions are tested as part of daily business.

Description of the change

Unity8 tests now make use of the helper functions (added in the pre-req branch) so that the helper functions are tested as part of daily business.

To post a comment you must log in.
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:477
http://jenkins.qa.ubuntu.com/job/unity8-ci/1444/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-saucy/5081
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-touch/3023/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-saucy/2312
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-saucy-amd64-ci/467
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-saucy-armhf-ci/1444
        deb: http://jenkins.qa.ubuntu.com/job/unity8-saucy-armhf-ci/1444/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-saucy-i386-ci/1443
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-saucy/1249
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-saucy-amd64/956
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-saucy-amd64/956/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-saucy-armhf/3025
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-saucy-armhf/3025/artifact/work/output/*zip*/output.zip
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-maguro/2531/console
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-mako/2577/console
    SUCCESS: http://10.97.0.26:8080/job/touch-flash-device/83
    SUCCESS: http://10.97.0.26:8080/job/touch-flash-device/84

Click here to trigger a rebuild:
http://10.97.0.26:8080/job/unity8-ci/1444/rebuild

review: Needs Fixing (continuous-integration)
Michał Sawicz (saviq) wrote :

9 +def unlock_unity(unity_proxy_obj=None):

Please add to docstring.

=====

62 +def restart_unity_with_testability(args=None):

64 + if args is None:
65 + args = []

75 +def restart_unity(args=None):

101 + if args is None:
102 + args = []

Any reason for not going (args=[]) in arguments?

review: Needs Fixing
Michał Sawicz (saviq) wrote :

Hey, can we have an update on this?

478. By Christopher Lee on 2013-11-14

Merge Trunk

479. By Christopher Lee on 2013-11-14

Fix use of empty lists and add better docstrings.

Christopher Lee (veebers) wrote :

Sorry for the delay Michał, have updated with fixes for outlined issues.

480. By Christopher Lee on 2013-11-14

Cleanup logging and print output.

Michał Sawicz (saviq) wrote :

133 + universal_newlines=False,

That's the default, any reason why we want this explicitly? Or maybe you meant True?

review: Needs Information
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:480
http://jenkins.qa.ubuntu.com/job/unity8-ci/1645/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty/736
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty-touch/724/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-trusty/247
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-trusty-amd64-ci/168
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-trusty-armhf-ci/169
        deb: http://jenkins.qa.ubuntu.com/job/unity8-trusty-armhf-ci/169/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-trusty-i386-ci/168
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-trusty/670
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/736
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/736/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/724
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/724/artifact/work/output/*zip*/output.zip
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-mako/3353/console
    SUCCESS: http://s-jenkins:8080/job/touch-flash-device/1442

Click here to trigger a rebuild:
http://s-jenkins:8080/job/unity8-ci/1645/rebuild

review: Needs Fixing (continuous-integration)
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Michał Sawicz (saviq) wrote :

91 +def restart_unity_normally():
92 + restart_unity()

Wonder if we need this at all? And if we do, should it not pass *args through?

review: Needs Information
481. By Christopher Lee on 2013-11-19

Fix issues raised in MR; removed un-needed function, fixed docstring, fix typo for universal_newlines

Christopher Lee (veebers) wrote :

@Michał hmm, good point. Designed to be a nicety but adds noise, removed.

I also fixed a couple of other smaller issues, one that you pointed out earlier.

Michał Sawicz (saviq) :
review: Approve
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:481
http://jenkins.qa.ubuntu.com/job/unity8-ci/1676/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty/882
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty-touch/869
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/unity-phablet-qmluitests-trusty/310
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-trusty-amd64-ci/199
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-trusty-armhf-ci/200
        deb: http://jenkins.qa.ubuntu.com/job/unity8-trusty-armhf-ci/200/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/unity8-trusty-i386-ci/199
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-trusty/793
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/882
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/882/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/869
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/869/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-mako/3470
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/1559

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/unity8-ci/1676/rebuild

review: Needs Fixing (continuous-integration)
Christopher Lee (veebers) wrote :

For the most recent CI run:

  - autopilot-testrunner-otto-trusty failed as the screen (not unity, the unity7 env it's being run on) was locked and was stuck at the password prompt.

  - Still looking at the qmltests, see if we can get them a little more stable.

review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'tests/autopilot/unity8/process_helpers.py'
2--- tests/autopilot/unity8/process_helpers.py 2013-10-16 04:08:49 +0000
3+++ tests/autopilot/unity8/process_helpers.py 2013-11-19 20:53:31 +0000
4@@ -21,18 +21,25 @@
5 get_proxy_object_for_existing_process,
6 ProcessSearchError,
7 )
8+import logging
9 import subprocess
10 from unity8.shell.emulators import UnityEmulatorBase
11 from unity8.shell.emulators.main_window import MainWindow
12
13+logger = logging.getLogger(__name__)
14+
15
16 class CannotAccessUnity(Exception):
17 pass
18
19
20-def unlock_unity():
21+def unlock_unity(unity_proxy_obj=None):
22 """Helper function that attempts to unlock the unity greeter.
23
24+ If unity_proxy_object is None create a proxy object by querying for the
25+ running unity process.
26+ Otherwise re-use the passed proxy object.
27+
28 :raises RuntimeError: if the greeter attempts and fails to be unlocked.
29
30 :raises RuntimeWarning: when the greeter cannot be found because it is
31@@ -43,30 +50,42 @@
32 upstart job cannot be found at all.
33
34 """
35- pid = _get_unity_pid()
36- try:
37- unity = get_proxy_object_for_existing_process(
38- pid=pid,
39- emulator_base=UnityEmulatorBase,
40- )
41- main_window = MainWindow(unity)
42-
43- greeter = main_window.get_greeter()
44- if greeter is None:
45- raise RuntimeWarning("Greeter appears to be already unlocked.")
46- greeter.swipe()
47- except ProcessSearchError as e:
48- raise CannotAccessUnity(
49- "Cannot introspect unity, make sure that it has been started "
50- "with testability. Perhaps use the function "
51- "'restart_unity_with_testability' this module provides."
52- "(%s)"
53- % str(e)
54- )
55-
56-
57-def restart_unity_with_testability():
58- """Restarts (or just starts) unity8 with the testability driver loaded
59+ if unity_proxy_obj is None:
60+ try:
61+ pid = _get_unity_pid()
62+ unity = _get_unity_proxy_object(pid)
63+ main_window = MainWindow(unity)
64+ except ProcessSearchError as e:
65+ raise CannotAccessUnity(
66+ "Cannot introspect unity, make sure that it has been started "
67+ "with testability. Perhaps use the function "
68+ "'restart_unity_with_testability' this module provides."
69+ "(%s)"
70+ % str(e)
71+ )
72+ else:
73+ main_window = MainWindow(unity_proxy_obj)
74+
75+ greeter = main_window.get_greeter()
76+ if greeter is None:
77+ raise RuntimeWarning("Greeter appears to be already unlocked.")
78+ greeter.swipe()
79+
80+
81+def restart_unity_with_testability(*args):
82+ """Restarts (or starts) unity with testability enabled.
83+
84+ Passes *args arguments to the launched process.
85+
86+ """
87+ args += ("QT_LOAD_TESTABILITY=1",)
88+ return restart_unity(*args)
89+
90+
91+def restart_unity(*args):
92+ """Restarts (or starts) unity8 using the provided arguments.
93+
94+ Passes *args arguments to the launched process.
95
96 :raises subprocess.CalledProcessError: if unable to stop or start the
97 unity8 upstart job.
98@@ -75,27 +94,28 @@
99 status = _get_unity_status()
100 if "start/" in status:
101 try:
102- print("Stopping unity.")
103- subprocess.check_call([
104- 'initctl',
105- 'stop',
106- 'unity8',
107- ])
108+ output = subprocess.check_output(['initctl', 'stop', 'unity8'])
109+ logger.info(output)
110 except subprocess.CalledProcessError as e:
111- e.args += ("Failed to stop running instance of unity8", )
112+ e.args += (
113+ "Failed to stop running instance of unity8: %s" % e.output,
114+ )
115 raise
116
117 try:
118- print("Starting unity with testability.")
119- subprocess.check_call([
120- 'initctl',
121- 'start',
122- 'unity8',
123- 'QT_LOAD_TESTABILITY=1',
124- ])
125+ command = ['initctl', 'start', 'unity8'] + list(args)
126+ output = subprocess.check_output(
127+ command,
128+ stderr=subprocess.STDOUT,
129+ universal_newlines=True,
130+ )
131+ logger.info(output)
132+ pid = _get_unity_pid()
133 except subprocess.CalledProcessError as e:
134- e.args += ("Failed to start unity8 with testability ", )
135+ e.args += ("Failed to start unity8: %s" % e.output,)
136 raise
137+ else:
138+ return _get_unity_proxy_object(pid)
139
140
141 def _get_unity_status():
142@@ -114,3 +134,10 @@
143 if not "start/" in status:
144 raise CannotAccessUnity("Unity is not in the running state.")
145 return int(status.split()[-1])
146+
147+
148+def _get_unity_proxy_object(pid):
149+ return get_proxy_object_for_existing_process(
150+ pid=pid,
151+ emulator_base=UnityEmulatorBase,
152+ )
153
154=== modified file 'tests/autopilot/unity8/shell/tests/__init__.py'
155--- tests/autopilot/unity8/shell/tests/__init__.py 2013-11-01 13:59:50 +0000
156+++ tests/autopilot/unity8/shell/tests/__init__.py 2013-11-19 20:53:31 +0000
157@@ -28,7 +28,6 @@
158 from autopilot.testcase import AutopilotTestCase
159 from autopilot.matchers import Eventually
160 from autopilot.input import Touch
161-from autopilot.introspection import get_proxy_object_for_existing_process
162 from autopilot.display import Display
163 import logging
164 import os.path
165@@ -43,7 +42,7 @@
166 get_default_extra_mock_libraries,
167 get_data_dirs
168 )
169-from unity8.shell.emulators import UnityEmulatorBase
170+from unity8.process_helpers import restart_unity_with_testability
171 from unity8.shell.emulators.dash import Dash
172 from unity8.shell.emulators.main_window import MainWindow
173
174@@ -105,7 +104,7 @@
175 ),
176 "upstart")
177 )
178- )
179+ )
180 sys.exit(1)
181
182 if "start/" in output:
183@@ -303,32 +302,20 @@
184
185 binary_arg = "BINARY=%s" % binary_path
186 extra_args = "ARGS=%s" % " ".join(args)
187-
188- output = subprocess.check_output(
189- [
190- "/sbin/initctl",
191- "start",
192- "unity8",
193- binary_arg,
194- extra_args,
195- ] + ["%s=%s" % (k, v) for k, v in self._environment.iteritems()],
196- stderr=subprocess.STDOUT,
197- )
198+ env_args = ["%s=%s" % (k, v) for k, v in self._environment.iteritems()]
199+ all_args = [binary_arg, extra_args] + env_args
200
201 self.addCleanup(self._cleanup_launching_upstart_unity)
202
203- pid = int(output.split()[-1])
204-
205- return get_proxy_object_for_existing_process(
206- pid=pid,
207- emulator_base=UnityEmulatorBase,
208- )
209+ return restart_unity_with_testability(*all_args)
210
211 def _cleanup_launching_upstart_unity(self):
212 logger.info("Stopping unity")
213 try:
214 subprocess.check_output(
215- ["/sbin/initctl", "stop", "unity8"], stderr=subprocess.STDOUT)
216+ ["/sbin/initctl", "stop", "unity8"],
217+ stderr=subprocess.STDOUT
218+ )
219 except subprocess.CalledProcessError:
220 logger.warning("Appears unity was already stopped!")
221
222
223=== modified file 'tests/autopilot/unity8/shell/tests/test_hud.py'
224--- tests/autopilot/unity8/shell/tests/test_hud.py 2013-10-02 09:24:10 +0000
225+++ tests/autopilot/unity8/shell/tests/test_hud.py 2013-11-19 20:53:31 +0000
226@@ -19,6 +19,7 @@
227
228 from __future__ import absolute_import
229
230+from unity8.process_helpers import unlock_unity
231 from unity8.shell import with_lightdm_mock, DragMixin
232 from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
233
234@@ -38,8 +39,8 @@
235 The button must disappear when touching somewhere on the screen except the button itself.
236
237 """
238- self.launch_unity()
239- self.main_window.get_greeter().swipe()
240+ unity_proxy = self.launch_unity()
241+ unlock_unity(unity_proxy)
242 window = self.main_window.get_qml_view()
243 hud_show_button = self.main_window.get_hud_show_button()
244 edge_drag_area = self.main_window.get_hud_edge_drag_area()
245@@ -80,8 +81,8 @@
246 Test that the hud button stays on screen and tapping it opens the hud.
247
248 """
249- self.launch_unity()
250- self.main_window.get_greeter().swipe()
251+ unity_proxy = self.launch_unity()
252+ unlock_unity(unity_proxy)
253 window = self.main_window.get_qml_view()
254 hud_show_button = self.main_window.get_hud_show_button()
255 hud = self.main_window.get_hud()
256@@ -117,8 +118,8 @@
257
258 def test_hide_hud_click(self):
259 """Tapping the close button of the Hud must dismiss it."""
260- self.launch_unity()
261- self.main_window.get_greeter().swipe()
262+ unity_proxy = self.launch_unity()
263+ unlock_unity(unity_proxy)
264 hud = self.main_window.get_hud()
265
266 self._launch_test_app_from_app_screen()
267@@ -134,8 +135,8 @@
268 released downward.
269
270 """
271- self.launch_unity()
272- self.main_window.get_greeter().swipe()
273+ unity_proxy = self.launch_unity()
274+ unlock_unity(unity_proxy)
275 window = self.main_window.get_qml_view()
276 hud = self.main_window.get_hud()
277
278@@ -152,8 +153,8 @@
279
280 def test_launcher_hides_hud(self):
281 """Opening the Launcher while the Hud is active must close the Hud."""
282- self.launch_unity()
283- self.main_window.get_greeter().swipe()
284+ unity_proxy = self.launch_unity()
285+ unlock_unity(unity_proxy)
286 hud = self.main_window.get_hud()
287 launcher = self.main_window.get_launcher()
288
289
290=== modified file 'tests/autopilot/unity8/shell/tests/test_notifications.py'
291--- tests/autopilot/unity8/shell/tests/test_notifications.py 2013-11-01 13:59:50 +0000
292+++ tests/autopilot/unity8/shell/tests/test_notifications.py 2013-11-19 20:53:31 +0000
293@@ -21,6 +21,7 @@
294
295 from __future__ import absolute_import
296
297+from unity8.process_helpers import unlock_unity
298 from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
299
300 from testtools.matchers import Equals, NotEquals
301@@ -118,9 +119,8 @@
302
303 def test_interactive(self):
304 """Interactive notification must react upon click on itself."""
305- self.launch_unity()
306- greeter = self.main_window.get_greeter()
307- greeter.swipe()
308+ unity_proxy = self.launch_unity()
309+ unlock_unity(unity_proxy)
310
311 notify_list = self._get_notifications_list()
312
313@@ -158,9 +158,8 @@
314 def test_sd_incoming_call(self):
315 """Rejecting a call should make notification expand and
316 offer more options."""
317- self.launch_unity()
318- greeter = self.main_window.get_greeter()
319- greeter.swipe()
320+ unity_proxy = self.launch_unity()
321+ unlock_unity(unity_proxy)
322
323 notify_list = self._get_notifications_list()
324
325@@ -336,9 +335,8 @@
326
327 def test_icon_summary_body(self):
328 """Notification must display the expected summary and body text."""
329- self.launch_unity()
330- greeter = self.main_window.get_greeter()
331- greeter.swipe()
332+ unity_proxy = self.launch_unity()
333+ unlock_unity(unity_proxy)
334
335 notify_list = self._get_notifications_list()
336
337@@ -377,9 +375,8 @@
338 def test_icon_summary(self):
339 """Notification must display the expected summary and secondary
340 icon."""
341- self.launch_unity()
342- greeter = self.main_window.get_greeter()
343- greeter.swipe()
344+ unity_proxy = self.launch_unity()
345+ unlock_unity(unity_proxy)
346
347 notify_list = self._get_notifications_list()
348
349@@ -416,9 +413,8 @@
350 def test_urgency_order(self):
351 """Notifications must be displayed in order according to their
352 urgency."""
353- self.launch_unity()
354- greeter = self.main_window.get_greeter()
355- greeter.swipe()
356+ unity_proxy = self.launch_unity()
357+ unlock_unity(unity_proxy)
358
359 notify_list = self._get_notifications_list()
360
361@@ -504,9 +500,8 @@
362
363 def test_summary_and_body(self):
364 """Notification must display the expected summary- and body-text."""
365- self.launch_unity()
366- greeter = self.main_window.get_greeter()
367- greeter.swipe()
368+ unity_proxy = self.launch_unity()
369+ unlock_unity(unity_proxy)
370
371 notify_list = self._get_notifications_list()
372
373@@ -518,6 +513,7 @@
374
375 notification = notify_list.wait_select_single(
376 'Notification', objectName='notification1')
377+
378 self._assert_notification(
379 notification,
380 summary,
381@@ -529,9 +525,8 @@
382
383 def test_summary_only(self):
384 """Notification must display only the expected summary-text."""
385- self.launch_unity()
386- greeter = self.main_window.get_greeter()
387- greeter.swipe()
388+ unity_proxy = self.launch_unity()
389+ unlock_unity(unity_proxy)
390
391 notify_list = self._get_notifications_list()
392
393@@ -548,9 +543,8 @@
394 def test_update_notification_same_layout(self):
395 """Notification must allow updating its contents while being
396 displayed."""
397- self.launch_unity()
398- greeter = self.main_window.get_greeter()
399- greeter.swipe()
400+ unity_proxy = self.launch_unity()
401+ unlock_unity(unity_proxy)
402
403 notify_list = self._get_notifications_list()
404
405@@ -587,9 +581,8 @@
406 def test_update_notification_layout_change(self):
407 """Notification must allow updating its contents and layout while
408 being displayed."""
409- self.launch_unity()
410- greeter = self.main_window.get_greeter()
411- greeter.swipe()
412+ unity_proxy = self.launch_unity()
413+ unlock_unity(unity_proxy)
414
415 notify_list = self._get_notifications_list()
416
417@@ -612,6 +605,7 @@
418
419 get_notification = lambda: notify_list.wait_select_single(
420 'Notification', objectName='notification1')
421+
422 self._assert_notification(
423 get_notification(),
424 summary,
425@@ -633,9 +627,8 @@
426
427 def test_append_hint(self):
428 """Notification has to accumulate body-text using append-hint."""
429- self.launch_unity()
430- greeter = self.main_window.get_greeter()
431- greeter.swipe()
432+ unity_proxy = self.launch_unity()
433+ unlock_unity(unity_proxy)
434
435 notify_list = self._get_notifications_list()
436
437@@ -654,6 +647,7 @@
438
439 get_notification = lambda: notify_list.wait_select_single(
440 'Notification', objectName='notification1')
441+
442 notification = get_notification()
443 self._assert_notification(
444 notification,
445@@ -685,6 +679,7 @@
446 hints=[('x-canonical-append', 'true')]
447 )
448 notification.show()
449+
450 get_notification = lambda: notify_list.wait_select_single(
451 'Notification',
452 objectName='notification1'

Subscribers

People subscribed via source and target branches