on xenial help sign in
Added a test to swipe out an application started by url-dispatcher.
commit20d4a3d08d3ecbd13aa2479247c8f48a9860e626 authorLeo Arias <leo.arias@canonical.com> dateWed 5 Feb 2014, 13:14 (13 years ago) parentc87b241
9 files changed+129−61
debian/control+3−1 tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+9−13 tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+56 tests/autopilot/unity8/process_helpers.py+7−6 tests/autopilot/unity8/shell/emulators/__init__.py−1 tests/autopilot/unity8/shell/emulators/main_window.py+45−27 tests/autopilot/unity8/shell/tests/__init__.py+3−3 tests/autopilot/unity8/shell/tests/test_hud.py+4−7 tests/autopilot/unity8/shell/tests/test_notifications.py+2−3
debian/control+3−1
@@ -103,7 +103,8 @@ Description: Unity 8 shell
103103
104104Package: unity8-autopilot
105105Architecture: all
106−Depends: gir1.2-glib-2.0,
106+Depends: camera-app,
107+ gir1.2-glib-2.0,
107108 libautopilot-qt (>= 1.4),
108109 libqt5test5,
109110 libqt5widgets5,
@@ -113,6 +114,7 @@ Depends: gir1.2-glib-2.0,
113114 python-mock,
114115 unity8 (>= ${source:Version}),
115116 unity8-fake-env (>= ${source:Version}),
117+ url-dispatcher-tools,
116118 ${misc:Depends},
117119 ${python:Depends},
118120 ${shlibs:Depends},
tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+9−13
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2013 Canonical
4+# Copyright (C) 2013, 2014 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -44,9 +44,8 @@ class ApplicationLifecycleTests(UnityTestCase):
4444 self.skipTest("Test cannot be run on the desktop.")
4545
4646 def swipe_screen_from_right(self):
47− qml_view = self.main_window.get_qml_view()
48− width = qml_view.width
49− height = qml_view.height
47+ width = self.main_window.width
48+ height = self.main_window.height
5049 start_x = width
5150 start_y = int(height/2)
5251 end_x = int(width/2)
@@ -55,9 +54,6 @@ class ApplicationLifecycleTests(UnityTestCase):
5554 logger.info("Swiping screen from the right edge")
5655 self.touch.drag(start_x, start_y, end_x, end_y)
5756
58− def _get_current_focused_app_id(self):
59− return self._proxy.select_single("Shell").currentFocusedAppId
60−
6157 def _launch_app(self, app_name):
6258 """Launches the application *app_name*
6359
@@ -86,7 +82,7 @@ class ApplicationLifecycleTests(UnityTestCase):
8682
8783 self.assertThat(app, NotEquals(None))
8884 self.assertThat(
89− self._get_current_focused_app_id(),
85+ self.main_window.get_current_focused_app_id(),
9086 Eventually(Equals("messaging-app"))
9187 )
9288
@@ -98,13 +94,13 @@ class ApplicationLifecycleTests(UnityTestCase):
9894
9995 self._launch_app("messaging-app")
10096 self.assertThat(
101− self._get_current_focused_app_id(),
97+ self.main_window.get_current_focused_app_id(),
10298 Eventually(Equals("messaging-app"))
10399 )
104100
105101 self._launch_app("address-book-app")
106102 self.assertThat(
107− self._get_current_focused_app_id(),
103+ self.main_window.get_current_focused_app_id(),
108104 Eventually(Equals("address-book-app"))
109105 )
110106
@@ -119,19 +115,19 @@ class ApplicationLifecycleTests(UnityTestCase):
119115
120116 self._launch_app("messaging-app")
121117 self.assertThat(
122− self._get_current_focused_app_id(),
118+ self.main_window.get_current_focused_app_id(),
123119 Eventually(Equals("messaging-app"))
124120 )
125121
126122 self._launch_app("address-book-app")
127123 self.assertThat(
128− self._get_current_focused_app_id(),
124+ self.main_window.get_current_focused_app_id(),
129125 Eventually(Equals("address-book-app"))
130126 )
131127
132128 self.swipe_screen_from_right()
133129
134130 self.assertThat(
135− self._get_current_focused_app_id(),
131+ self.main_window.get_current_focused_app_id(),
136132 Eventually(Equals("messaging-app"))
137133 )
tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.pynew file+56
@@ -0,0 +1,56 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity Autopilot Test Suite
4+# Copyright (C) 2014 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+"""Test the integration with the URL dispatcher service."""
21+
22+import os
23+
24+from autopilot import platform
25+from autopilot.matchers import Eventually
26+from testtools.matchers import Equals
27+
28+from unity8 import process_helpers
29+from unity8.shell import tests
30+
31+
32+class URLDispatcherTestCase(tests.UnityTestCase):
33+
34+ scenarios = tests._get_device_emulation_scenarios()
35+
36+ def setUp(self):
37+ if platform.model() == 'Desktop':
38+ self.skipTest("URL dispatcher doesn't works on the desktop.")
39+ super(URLDispatcherTestCase, self).setUp()
40+ unity_proxy = self.launch_unity()
41+ process_helpers.unlock_unity(unity_proxy)
42+
43+ def test_swipe_out_application_started_by_url_dispatcher(self):
44+ self.assertEqual('', self.main_window.get_current_focused_app_id())
45+ # XXX we shouldn't depend on external applictions; but the camera app
46+ # is already a depedency for other tests, so it's not that bad to use
47+ # it while the url-dispatcher implements the testability features to
48+ # let us launch a fake app. --elopio - 2014-02-05
49+ os.system('url-dispatcher application:///camera-app.desktop')
50+ self.assertThat(
51+ self.main_window.get_current_focused_app_id,
52+ Eventually(Equals('camera-app')))
53+ self.main_window.show_dash_swiping()
54+ self.assertThat(
55+ self.main_window.get_current_focused_app_id,
56+ Eventually(Equals('')))
tests/autopilot/unity8/process_helpers.py+7−6
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Utilities
4−# Copyright (C) 2013 Canonical
4+# Copyright (C) 2013, 2014 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -23,8 +23,8 @@ from autopilot.introspection import (
2323)
2424import logging
2525import subprocess
26−from unity8.shell.emulators import UnityEmulatorBase
27−from unity8.shell.emulators.main_window import MainWindow
26+from unity8.shell import emulators
27+from unity8.shell.emulators import main_window as main_window_emulator
2828
2929logger = logging.getLogger(__name__)
3030
@@ -54,7 +54,7 @@ def unlock_unity(unity_proxy_obj=None):
5454 try:
5555 pid = _get_unity_pid()
5656 unity = _get_unity_proxy_object(pid)
57− main_window = MainWindow(unity)
57+ main_window = unity.select_single(main_window_emulator.QQuickView)
5858 except ProcessSearchError as e:
5959 raise CannotAccessUnity(
6060 "Cannot introspect unity, make sure that it has been started "
@@ -64,7 +64,8 @@ def unlock_unity(unity_proxy_obj=None):
6464 % str(e)
6565 )
6666 else:
67− main_window = MainWindow(unity_proxy_obj)
67+ main_window = unity_proxy_obj.select_single(
68+ main_window_emulator.QQuickView)
6869
6970 greeter = main_window.get_greeter()
7071 if greeter.created == False:
@@ -155,5 +156,5 @@ def _get_unity_pid():
155156def _get_unity_proxy_object(pid):
156157 return get_proxy_object_for_existing_process(
157158 pid=pid,
158− emulator_base=UnityEmulatorBase,
159+ emulator_base=emulators.UnityEmulatorBase,
159160 )
tests/autopilot/unity8/shell/emulators/__init__.py−1
@@ -19,7 +19,6 @@
1919
2020from autopilot import input, introspection
2121
22−
2322class UnityEmulatorBase(introspection.CustomEmulatorBase):
2423 """A base class for all unity emulators."""
2524
tests/autopilot/unity8/shell/emulators/main_window.py+45−27
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 Canonical
4+# Copyright (C) 2012, 2013, 2014 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -17,85 +17,103 @@
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818#
1919
20+import logging
2021
22+from autopilot import logging as autopilot_logging
23+
24+from unity8.shell import emulators
2125from unity8.shell.emulators.greeter import Greeter
2226from unity8.shell.emulators.hud import Hud
2327from unity8.shell.emulators.dash import Dash
2428from unity8.shell.emulators.launcher import Launcher
2529
30+logger = logging.getLogger(__name__)
2631
27−class MainWindow(object):
28− """An emulator class that makes it easy to interact with the shell"""
29−
30− def __init__(self, app):
31− self.app = app
3232
33− def get_qml_view(self):
34− """Get the main QML view"""
35− return self.app.select_single("QQuickView")
33+class QQuickView(emulators.UnityEmulatorBase):
34+ """An emulator class that makes it easy to interact with the shell"""
3635
3736 def get_greeter(self):
38− return self.app.select_single(Greeter)
37+ return self.select_single(Greeter)
3938
4039 def get_greeter_content_loader(self):
41− return self.app.wait_select_single(
40+ return self.wait_select_single(
4241 "QQuickLoader",
4342 objectName="greeterContentLoader"
4443 )
4544
4645 def get_greeter_background(self):
47− return self.app.select_single("CrossFadeImage", objectName="greeterBackground")
46+ return self.select_single(
47+ "CrossFadeImage", objectName="greeterBackground")
4848
4949 def get_login_loader(self):
50− return self.app.select_single("QQuickLoader", objectName="loginLoader")
50+ return self.select_single("QQuickLoader", objectName="loginLoader")
5151
5252 def get_login_list(self):
53− return self.app.select_single("LoginList")
53+ return self.select_single("LoginList")
5454
5555 def get_hud(self):
56− return self.app.select_single(Hud)
56+ return self.select_single(Hud)
5757
5858 def get_hud_showable(self):
59− return self.app.select_single("Showable", objectName="hudShowable")
59+ return self.select_single("Showable", objectName="hudShowable")
6060
6161 def get_hud_show_button(self):
62− return self.app.select_single("HudButton")
62+ return self.select_single("HudButton")
6363
6464 def get_hud_edge_drag_area(self):
65− return self.app.select_single(objectName="hudDragArea")
65+ return self.select_single(objectName="hudDragArea")
6666
6767 def get_dash(self):
68− return self.app.select_single(Dash)
68+ return self.select_single(Dash)
6969
7070 def get_bottombar(self):
71− return self.app.select_single("Bottombar")
71+ return self.select_single("Bottombar")
7272
7373 def get_launcher(self):
74− return self.app.select_single(Launcher)
74+ return self.select_single(Launcher)
7575
7676 def get_pinPadLoader(self):
77− return self.app.select_single(
77+ return self.select_single(
7878 "QQuickLoader",
7979 objectName="pinPadLoader"
8080 )
8181
8282 def get_pinPadButton(self, buttonId):
83− return self.app.select_single(
83+ return self.select_single(
8484 "PinPadButton",
8585 objectName="pinPadButton%i" % buttonId
8686 )
8787
8888 def get_lockscreen(self):
89− return self.app.select_single("Lockscreen")
89+ return self.select_single("Lockscreen")
9090
9191 def get_pinentryField(self):
92− return self.app.select_single(objectName="pinentryField")
92+ return self.select_single(objectName="pinentryField")
9393
9494 def get_indicator(self, indicator_name):
95− return self.app.select_single(
95+ return self.select_single(
9696 'DefaultIndicatorWidget',
9797 objectName=indicator_name+'-widget'
9898 )
9999
100100 def get_shell_background(self):
101− return self.app.select_single("CrossFadeImage", objectName="backgroundImage")
101+ return self.select_single(
102+ "CrossFadeImage", objectName="backgroundImage")
103+
104+ @autopilot_logging.log_action(logger.info)
105+ def show_dash_swiping(self):
106+ """Show the dash swiping from the left."""
107+ width = self.width
108+ height = self.height
109+ start_x = 0
110+ start_y = height // 2
111+ end_x = width // 2
112+ end_y = start_y
113+
114+ self.pointing_device.drag(start_x, start_y, end_x, end_y)
115+ return self.get_dash()
116+
117+ def get_current_focused_app_id(self):
118+ """Return the id of the focused application."""
119+ return self.select_single('Shell').currentFocusedAppId
tests/autopilot/unity8/shell/tests/__init__.py+3−3
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 Canonical
4+# Copyright (C) 2012, 2013, 2014 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -43,8 +43,8 @@ from unity8 import (
4343 get_data_dirs
4444)
4545from unity8.process_helpers import restart_unity_with_testability
46+from unity8.shell.emulators import main_window as main_window_emulator
4647from unity8.shell.emulators.dash import Dash
47−from unity8.shell.emulators.main_window import MainWindow
4848
4949
5050logger = logging.getLogger(__name__)
@@ -391,4 +391,4 @@ class UnityTestCase(AutopilotTestCase):
391391
392392 @property
393393 def main_window(self):
394− return MainWindow(self._proxy)
394+ return self._proxy.select_single(main_window_emulator.QQuickView)
tests/autopilot/unity8/shell/tests/test_hud.py+4−7
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 Canonical
4+# Copyright (C) 2012, 2013, 2014 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -41,7 +41,6 @@ class TestHud(UnityTestCase, DragMixin):
4141 """
4242 unity_proxy = self.launch_unity()
4343 unlock_unity(unity_proxy)
44− window = self.main_window.get_qml_view()
4544 hud_show_button = self.main_window.get_hud_show_button()
4645 edge_drag_area = self.main_window.get_hud_edge_drag_area()
4746 hud = self.main_window.get_hud()
@@ -49,7 +48,7 @@ class TestHud(UnityTestCase, DragMixin):
4948 self._launch_test_app_from_app_screen()
5049
5150 swipe_coords = hud.get_button_swipe_coords(
52− window,
51+ self.main_window,
5352 hud_show_button
5453 )
5554 initialBottomMargin = int(hud_show_button.bottomMargin)
@@ -83,14 +82,13 @@ class TestHud(UnityTestCase, DragMixin):
8382 """
8483 unity_proxy = self.launch_unity()
8584 unlock_unity(unity_proxy)
86− window = self.main_window.get_qml_view()
8785 hud_show_button = self.main_window.get_hud_show_button()
8886 hud = self.main_window.get_hud()
8987
9088 self._launch_test_app_from_app_screen()
9189
9290 swipe_coords = hud.get_button_swipe_coords(
93− window,
91+ self.main_window,
9492 hud_show_button
9593 )
9694
@@ -137,7 +135,6 @@ class TestHud(UnityTestCase, DragMixin):
137135 """
138136 unity_proxy = self.launch_unity()
139137 unlock_unity(unity_proxy)
140− window = self.main_window.get_qml_view()
141138 hud = self.main_window.get_hud()
142139
143140 self._launch_test_app_from_app_screen()
@@ -146,7 +143,7 @@ class TestHud(UnityTestCase, DragMixin):
146143
147144 start_x, start_y = hud.get_close_button_coords()
148145 end_x = start_x
149− end_y = int(window.height / 2)
146+ end_y = int(self.main_window.height / 2)
150147
151148 self.touch.drag(start_x, start_y, end_x, end_y)
152149 self.assertThat(hud.shown, Eventually(Equals(False)))
tests/autopilot/unity8/shell/tests/test_notifications.py+2−3
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
33# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 Canonical
4+# Copyright (C) 2012, 2013, 2014 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -61,8 +61,7 @@ class NotificationsBase(UnityTestCase):
6161 return os.path.dirname(__file__) + "/../../../../../qml/graphics/" + icon_name
6262
6363 def _get_notifications_list(self):
64− main_view = self.main_window.get_qml_view()
65− return main_view.select_single(
64+ return self.main_window.select_single(
6665 "Notifications",
6766 objectName='notificationList'
6867 )