Nicholas Skaggs has proposed merging lp:~nskaggs/ubuntu-terminal-app/restore-autopilot into lp:ubuntu-terminal-app.
Commit message: Add back templates for autopilot add autopilot readme Requested reviews: Ubuntu Terminal Developers (ubuntu-terminal-dev) For more details, see: https://code.launchpad.net/~nskaggs/ubuntu-terminal-app/restore-autopilot/+merge/288347 Add back templates for autopilot add autopilot readme -- Your team Ubuntu Terminal Developers is requested to review the proposed merge of lp:~nskaggs/ubuntu-terminal-app/restore-autopilot into lp:ubuntu-terminal-app.
=== added file 'README.autopilot.md' --- README.autopilot.md 1970-01-01 00:00:00 +0000 +++ README.autopilot.md 2016-03-07 21:17:09 +0000 @@ -0,0 +1,74 @@ +Running Autopilot tests +======================= +If you are looking for more info about Autopilot or writing AP tests, here are some useful links to help you: + +- [Ubuntu - Quality](http://developer.ubuntu.com/start/quality) +- [Autopilot - Python](https://developer.ubuntu.com/api/autopilot/python/1.5.0/) + +For help and options on running tests, see: + +- [Autopilot tests](https://developer.ubuntu.com/en/start/platform/guides/running-autopilot-tests/) + +Prerequisites +============= + +Install the following autopilot packages required to run the tests, + + $ sudo apt-get install python3-autopilot libautopilot-qt ubuntu-ui-toolkit-autopilot python3-autopilot-vis + +Running tests on the desktop +============================ + +Using terminal: + +* Branch the Music app code, for example, + + $ bzr branch lp:ubuntu-terminal-app + +* Navigate to the tests/autopilot directory. + + $ cd tests/autopilot + +* run all tests. + + $ autopilot3 run -vv ubuntu_terminal_app + +* to list all tests: + + $ autopilot3 list ubuntu_terminal_app + + To run only one test + + $ autopilot3 run -vv ubuntu_terminal_app.tests.test_name + +* Debugging tests using autopilot vis + + $ autopilot3 launch -i Qt qmlscene src/app/terminal + + $ autopilot3 vis + +Running tests using Ubuntu SDK +============================== + +Refer this [tutorial](https://developer.ubuntu.com/en/start/platform/guides/running-autopilot-tests/) to run tests on Ubuntu SDK: + +Running tests on device or emulator: +==================================== + +Using autopkg: + +* Branch the Music app code, for example, + + $ bzr branch lp:ubuntu-terminal-app + +* Navigate to the source directory. + + $ cd ubuntu-terminal-app + +* Build a click package + + $ click-buddy . + +* Run the tests on device (assumes only one click package in the directory) + + $ adt-run . *.click --- ssh -s adb -- -p <PASSWORD> \ No newline at end of file === removed directory 'old-tests' === removed file 'old-tests/CMakeLists.txt' --- old-tests/CMakeLists.txt 2014-10-25 04:42:31 +0000 +++ old-tests/CMakeLists.txt 1970-01-01 00:00:00 +0000 @@ -1,1 +0,0 @@ -add_subdirectory(autopilot) === removed directory 'old-tests/autopilot' === removed file 'old-tests/autopilot/CMakeLists.txt' --- old-tests/autopilot/CMakeLists.txt 2014-10-25 04:42:31 +0000 +++ old-tests/autopilot/CMakeLists.txt 1970-01-01 00:00:00 +0000 @@ -1,8 +0,0 @@ -if(INSTALL_TESTS) -execute_process(COMMAND python3 -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" - OUTPUT_VARIABLE PYTHON_PACKAGE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) - -install(DIRECTORY ${AUTOPILOT_DIR} - DESTINATION ${PYTHON_PACKAGE_DIR} - ) -endif(INSTALL_TESTS) === removed directory 'old-tests/autopilot/ubuntu_terminal_app' === removed file 'old-tests/autopilot/ubuntu_terminal_app/__init__.py' --- old-tests/autopilot/ubuntu_terminal_app/__init__.py 2014-10-25 04:42:31 +0000 +++ old-tests/autopilot/ubuntu_terminal_app/__init__.py 1970-01-01 00:00:00 +0000 @@ -1,174 +0,0 @@ -# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- -# -# Copyright (C) 2013 Canonical Ltd. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation; version 3. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -"""Terminal app autopilot helpers.""" - -from time import sleep -import sqlite3 -import os.path -import ubuntuuitoolkit - - -class TerminalApp(object): - - """Autopilot helper object for the terminal application.""" - - def __init__(self, app_proxy): - self.app = app_proxy - self.main_view = self.app.select_single(MainView) - - @property - def pointing_device(self): - return self.app.pointing_device - - -class MainView(ubuntuuitoolkit.MainView): - - """Autopilot custom proxy object for the MainView.""" - - def __init__(self, *args): - super(MainView, self).__init__(*args) - self.visible.wait_for(True) - - def get_slider_item(self, slider): - return self.wait_select_single("Slider", objectName=slider) - - def get_control_panel(self): - return self.wait_select_single("CtrlKeys", objectName="kbCtrl") - - def get_function_panel(self): - return self.wait_select_single("FnKeys", objectName="kbFn") - - def get_text_panel(self): - return self.wait_select_single("ScrlKeys", objectName="kbScrl") - - def get_terminal_page(self): - return self.wait_select_single("Terminal", objectName="pgTerm") - - def get_circle_menu(self): - return self.wait_select_single("CircleMenu", objectName="cmenu") - - def long_tap_terminal_center(self): - x, y, w, h = self.globalRect - tap_x = (x + w) / 2 - tap_y = (y + h) / 3 - - # tap in the top third of the screen, to avoid OSK - self.pointing_device.move(tap_x, tap_y) - self.pointing_device.press() - # we can hold the press for a long time without issue - # so we'll ensure the app recieves our signal when under load - sleep(4) - self.pointing_device.release() - - def drag_horizontal_slider(self, slider, pos): - """Drag slider until value is set""" - slItem = self.get_slider_item(slider) - - slRect = slItem.select_single("SliderStyle") - - slideMin = int(slItem.minimumValue) - slideMax = int(slItem.maximumValue) - - if pos > slideMax: - raise ValueError("Pos cannot be greater than" + str(slideMax)) - - if pos < slideMin: - raise ValueError("Pos cannot be less than" + str(slideMin)) - - x, y, w, h = slRect.globalRect - # calculate the approximate slide step width - # we take half of the theoretical step value just to make - # sure we don't miss any values - step = w / ((slideMax - slideMin) * 2) - sx = x + step - sy = y + h / 2 - loop = 1 - - # set the slider to minimum value and loop - self.pointing_device.move(sx, sy) - self.pointing_device.click() - - # drag through the slider until the pos matches our desired value - # in case of bad sliding, loop will also timeout - while round(slItem.value) != pos and slItem.value < slideMax \ - and loop <= (slideMax * 2): - valuePos = int(sx + step) - self.pointing_device.drag(sx, sy, valuePos, sy) - sx = valuePos - sleep(1) - loop = loop + 1 - - -class DbMan(object): - - """ - Helper functions for dealing with sqlite databases - """ - - def get_db(self): - dbs_path = os.path.expanduser( - "~/.local/share/com.ubuntu.terminal/Databases") - if not os.path.exists(dbs_path): - return None - - files = [f for f in os.listdir(dbs_path) - if os.path.splitext(f)[1] == ".ini"] - for f in files: - ini_path = os.path.join(dbs_path, f) - with open(ini_path) as ini: - for line in ini: - if "=" in line: - key, val = line.strip().split("=") - if key == "Name" and val == "UbuntuTerminalDB": - try: - return ini_path.replace(".ini", ".sqlite") - except OSError: - pass - return None - - def clean_db(self): - path = self.get_db() - if path is None: - self.assertNotEquals(path, None) - try: - os.remove(path) - except OSError: - pass - - def get_font_size_from_storage(self): - db = self.get_db() - conn = sqlite3.connect(db) - - with conn: - cur = conn.cursor() - cur.execute("SELECT value FROM config WHERE item='fontSize'") - row = cur.fetchone() - if row is None: - self.assertNotEquals(row, None) - return int(row[0]) - - def get_color_scheme_from_storage(self): - db = self.get_db() - conn = sqlite3.connect(db) - - with conn: - cur = conn.cursor() - cur.execute("SELECT value FROM config WHERE item='colorScheme'") - row = cur.fetchone() - if row is None: - self.assertNotEquals(row, None) - return row[0] === removed directory 'old-tests/autopilot/ubuntu_terminal_app/tests' === removed file 'old-tests/autopilot/ubuntu_terminal_app/tests/__init__.py' --- old-tests/autopilot/ubuntu_terminal_app/tests/__init__.py 2014-10-25 04:42:31 +0000 +++ old-tests/autopilot/ubuntu_terminal_app/tests/__init__.py 1970-01-01 00:00:00 +0000 @@ -1,131 +0,0 @@ -# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- -# Copyright 2013 Canonical -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 3, as published -# by the Free Software Foundation. - -"""Terminal app autopilot tests.""" - -import os.path -import fixtures -import logging -import tempfile - -from autopilot import logging as autopilot_logging -from autopilot.testcase import AutopilotTestCase -import ubuntuuitoolkit - -import ubuntu_terminal_app -from gi.repository import Click - -logger = logging.getLogger(__name__) - - -class TerminalTestCase(AutopilotTestCase): - - """A common testcase class that provides useful methods for the terminal - app. - - """ - - binary = 'terminal' - source_dir = os.path.dirname(os.path.dirname(os.path.abspath('.'))) - local_location_binary = os.path.join(source_dir, 'src', 'app', binary) - installed_location_binary = os.path.join('/usr/bin/', binary) - installed_location_qml = '/usr/share/terminal/qml/ubuntu-terminal-app.qml' - - def setUp(self): - super(TerminalTestCase, self).setUp() - launcher_method, _ = self.get_launcher_method_and_type() - self.app = ubuntu_terminal_app.TerminalApp(launcher_method()) - - def get_launcher_method_and_type(self): - if os.path.exists(self.local_location_binary): - launcher = self.launch_test_local - test_type = 'local' - elif os.path.exists(self.installed_location_binary): - launcher = self.launch_test_installed - test_type = 'deb' - else: - launcher = self.launch_test_click - test_type = 'click' - return launcher, test_type - - @autopilot_logging.log_action(logger.info) - def launch_test_local(self): - self.useFixture(fixtures.EnvironmentVariable( - 'QML2_IMPORT_PATH', newvalue=os.path.join(self.source_dir, - 'src', 'plugin'))) - - return self.launch_test_application( - self.local_location_binary, - app_type='qt', - emulator_base=ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase) - - @autopilot_logging.log_action(logger.info) - def launch_test_installed(self): - return self.launch_test_application( - self.installed_location_binary, - '-q', self.installed_location_qml, - app_type='qt', - emulator_base=ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase) - - @autopilot_logging.log_action(logger.info) - def launch_test_click(self): - # We need to pass the "--forceAuth false" argument to the terminal app - # binary, but ubuntu-app-launch doesn't pass arguments to the exec line - # on the desktop file. So we make a test desktop file that has the - # "--forceAuth false" on the exec line. - desktop_file_path = self.write_sandbox_desktop_file() - desktop_file_name = os.path.basename(desktop_file_path) - application_name, _ = os.path.splitext(desktop_file_name) - return self.launch_upstart_application( - application_name, - emulator_base=ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase) - - def write_sandbox_desktop_file(self): - desktop_file_dir = self.get_local_desktop_file_directory() - desktop_file = self.get_named_temporary_file( - suffix='.desktop', dir=desktop_file_dir) - desktop_file.write('[Desktop Entry]\n') - version, installed_path = self.get_installed_version_and_directory() - terminal_sandbox_exec = ( - 'aa-exec-click -p com.ubuntu.terminal_terminal_{}' - ' -- terminal --forceAuth false'.format(version)) - desktop_file_dict = { - 'Type': 'Application', - 'Name': 'terminal', - 'Exec': terminal_sandbox_exec, - 'Icon': 'Not important', - 'Path': installed_path - } - for key, value in desktop_file_dict.items(): - desktop_file.write('{key}={value}\n'.format(key=key, value=value)) - desktop_file.close() - logger.debug(terminal_sandbox_exec) - for key, value in desktop_file_dict.items(): - logger.debug("%s: %s" % (key, value)) - return desktop_file.name - - def get_local_desktop_file_directory(self): - return os.path.join( - os.path.expanduser('~'), '.local', 'share', 'applications') - - def get_named_temporary_file( - self, dir=None, mode='w+t', delete=False, suffix=''): - # Discard files with underscores which look like an APP_ID to Unity - # See https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1329141 - chars = tempfile._RandomNameSequence.characters.strip("_") - tempfile._RandomNameSequence.characters = chars - return tempfile.NamedTemporaryFile( - dir=dir, mode=mode, delete=delete, suffix=suffix) - - def get_installed_version_and_directory(self): - db = Click.DB() - db.read() - package_name = 'com.ubuntu.terminal' - registry = Click.User.for_user(db, name=os.environ.get('USER')) - version = registry.get_version(package_name) - directory = registry.get_path(package_name) - return version, directory === removed file 'old-tests/autopilot/ubuntu_terminal_app/tests/test_terminal.py' --- old-tests/autopilot/ubuntu_terminal_app/tests/test_terminal.py 2014-10-25 04:42:31 +0000 +++ old-tests/autopilot/ubuntu_terminal_app/tests/test_terminal.py 1970-01-01 00:00:00 +0000 @@ -1,157 +0,0 @@ -# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*- -# Copyright 2013 Canonical -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 3, as published -# by the Free Software Foundation. - -"""Terminal app autopilot tests.""" - -from __future__ import absolute_import - -from autopilot.matchers import Eventually -from testtools.matchers import Equals - -from ubuntu_terminal_app.tests import TerminalTestCase -from ubuntu_terminal_app import DbMan -from ubuntuuitoolkit import ToolkitException -from testscenarios import TestWithScenarios - -from time import sleep -import random - - -class TestMainWindow(TerminalTestCase): - - def test_circle_menu_shows(self): - """Make sure that Circle Menu is visible - on long tap""" - self.app.main_view.long_tap_terminal_center() - menu = self.app.main_view.get_circle_menu() - self.assertThat(menu.visible, Eventually(Equals(True))) - - def test_header(self): - """Make sure that Header is visible - in Portrait Mode and not visible in landscape mode""" - kterm = self.app.main_view.get_terminal_page() - header = self.app.main_view.get_header() - if kterm.width > kterm.height: - self.assertThat(header.visible, Equals(False)) - else: - self.assertThat(header.visible, Equals(True)) - - -class TestPanel(TerminalTestCase, TestWithScenarios): - - scenarios = [ - ('controlpanel', - {'button': 'controlkeysaction', - 'helper_method': 'get_control_panel' - }), - - ('functionpanel', - {'button': 'functionkeysaction', - 'helper_method': 'get_function_panel' - }), - - ('textpanel', - {'button': 'textkeysaction', - 'helper_method': 'get_text_panel' - }) - ] - - def open_panel(self, button, helper_method): - """Open named panel""" - header = self.app.main_view.get_header() - header.click_action_button(button) - get_panel = getattr(self.app.main_view, helper_method) - return get_panel() - - def hide_panel(self): - """Close any open panel""" - header = self.app.main_view.get_header() - - # the overflow panel can be left open, so we need to try again - # https://bugs.launchpad.net/ubuntu-terminal-app/+bug/1363233 - try: - header.click_action_button('hidepanelaction') - try: - sleep(2) - header.click_action_button('hidepanelaction') - except ToolkitException: - pass - except ToolkitException: - pass - - def test_panels(self): - """Make sure that Panel is visible - when clicking the toolbar popup items and hides properly.""" - panel = self.open_panel(self.button, self.helper_method) - self.assertThat(panel.visible, Eventually(Equals(True))) - self.hide_panel() - self.assertThat(panel.visible, Eventually(Equals(False))) - - -class TestSettings(TerminalTestCase, DbMan): - - def click_item_selector_item(self, selector, value): - """Clicks item from item selector""" - # This needs a toolkit helper - # https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1272345 - select = self.app.main_view.wait_select_single('ItemSelector', - objectName=selector) - container = select.wait_select_single('Standard', - objectName='listContainer') - self.app.pointing_device.click_object(container) - select.currentlyExpanded.wait_for(True) - # waiting for currentlyExpanded is not enough - # some animation is not accounted for and thus we sleep - sleep(2) - item = container.wait_select_single('Label', text=value) - self.app.pointing_device.click_object(item) - select.currentlyExpanded.wait_for(False) - # waiting for currentlyExpanded is not enough - # some animation is not accounted for and thus we sleep - sleep(1) - - def test_color_scheme_changes(self): - """Make sure that color scheme is set correctly""" - - # are these string translatable? - # if so, we need to do this another way - schemeList = ("BlackOnRandomLight", - "BlackOnWhite", - "BlackOnLightYellow", - "DarkPastels", - "GreenOnBlack", - "Linux", - "WhiteOnBlack") - - colorScheme = self.get_color_scheme_from_storage - for scheme in schemeList: - header = self.app.main_view.get_header() - header.click_action_button('SettingsButton') - self.click_item_selector_item("liSchemes", scheme) - self.app.main_view.go_back() - self.assertThat(colorScheme, Eventually(Equals(scheme))) - - def test_font_size_changes(self): - """Make sure that font size is set correctly""" - header = self.app.main_view.get_header() - header.click_action_button('SettingsButton') - - font_size = self.get_font_size_from_storage - - # change font size to min - self.app.main_view.drag_horizontal_slider("slFont", 8) - self.assertThat(font_size, Eventually(Equals(8))) - - # change font size to max - self.app.main_view.drag_horizontal_slider("slFont", 32) - self.assertThat(font_size, Eventually(Equals(32))) - - # change font size to random sizes - for loop in range(1, 3): - randSize = random.randrange(9, 31, 1) - self.app.main_view.drag_horizontal_slider("slFont", randSize) - self.assertThat(font_size, Eventually(Equals(randSize))) === modified file 'po/com.ubuntu.terminal.pot' --- po/com.ubuntu.terminal.pot 2016-02-07 18:30:11 +0000 +++ po/com.ubuntu.terminal.pot 2016-03-07 21:17:09 +0000 @@ -1,6 +1,6 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Canonical Ltd. -# This file is distributed under the same license as the PACKAGE package. +# This file is distributed under the same license as the package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-02-07 19:27+0100\n" +"POT-Creation-Date: 2016-03-07 16:06-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <l...@li.org>\n" @@ -25,7 +25,7 @@ msgid "Copy" msgstr "" -#: ../src/app/qml/AlternateActionPopover.qml:21 +#: ../src/app/qml/AlternateActionPopover.qml:22 msgid "Paste" msgstr "" @@ -37,19 +37,19 @@ msgid "Enter passcode or passphrase:" msgstr "" -#: ../src/app/qml/AuthenticationDialog.qml:40 +#: ../src/app/qml/AuthenticationDialog.qml:48 msgid "passcode or passphrase" msgstr "" -#: ../src/app/qml/AuthenticationDialog.qml:50 +#: ../src/app/qml/AuthenticationDialog.qml:58 msgid "OK" msgstr "" -#: ../src/app/qml/AuthenticationDialog.qml:62 +#: ../src/app/qml/AuthenticationDialog.qml:70 msgid "Cancel" msgstr "" -#: ../src/app/qml/AuthenticationService.qml:55 +#: ../src/app/qml/AuthenticationService.qml:58 msgid "Authentication failed" msgstr "" @@ -181,44 +181,44 @@ msgid "New tab" msgstr "" -#: ../src/app/qml/TerminalPage.qml:170 +#: ../src/app/qml/TerminalPage.qml:179 msgid "Selection Mode" msgstr "" #. TRANSLATORS: This is the name of a terminal color scheme which is displayed in the settings -#: ../src/app/qml/ubuntu-terminal-app.qml:128 +#: ../src/app/qml/ubuntu-terminal-app.qml:126 msgid "Green on black" msgstr "" -#: ../src/app/qml/ubuntu-terminal-app.qml:128 +#: ../src/app/qml/ubuntu-terminal-app.qml:126 msgid "White on black" msgstr "" -#: ../src/app/qml/ubuntu-terminal-app.qml:128 +#: ../src/app/qml/ubuntu-terminal-app.qml:126 msgid "Black on white" msgstr "" -#: ../src/app/qml/ubuntu-terminal-app.qml:128 +#: ../src/app/qml/ubuntu-terminal-app.qml:126 msgid "Black on random light" msgstr "" -#: ../src/app/qml/ubuntu-terminal-app.qml:128 +#: ../src/app/qml/ubuntu-terminal-app.qml:126 msgid "Linux" msgstr "" -#: ../src/app/qml/ubuntu-terminal-app.qml:128 +#: ../src/app/qml/ubuntu-terminal-app.qml:126 msgid "Cool retro term" msgstr "" -#: ../src/app/qml/ubuntu-terminal-app.qml:128 +#: ../src/app/qml/ubuntu-terminal-app.qml:126 msgid "Dark pastels / Ubuntu (old)" msgstr "" -#: ../src/app/qml/ubuntu-terminal-app.qml:128 +#: ../src/app/qml/ubuntu-terminal-app.qml:126 msgid "Black on light yellow" msgstr "" -#: ../src/app/qml/ubuntu-terminal-app.qml:128 +#: ../src/app/qml/ubuntu-terminal-app.qml:126 msgid "Ubuntu" msgstr "" === modified file 'tests/autopilot/ubuntu_terminal_app/__init__.py' --- tests/autopilot/ubuntu_terminal_app/__init__.py 2015-02-25 00:09:54 +0000 +++ tests/autopilot/ubuntu_terminal_app/__init__.py 2016-03-07 21:17:09 +0000 @@ -16,4 +16,26 @@ """Terminal app autopilot helpers.""" -# TODO Insert new tests here +import ubuntuuitoolkit + + +class TerminalApp(object): + + """Autopilot helper object for the terminal application.""" + + def __init__(self, app_proxy): + self.app = app_proxy + self.main_view = self.app.select_single(MainView) + + @property + def pointing_device(self): + return self.app.pointing_device + + +class MainView(ubuntuuitoolkit.MainView): + + """Autopilot custom proxy object for the MainView.""" + + def __init__(self, *args): + super(MainView, self).__init__(*args) + self.visible.wait_for(True) === modified file 'tests/autopilot/ubuntu_terminal_app/tests/__init__.py' --- tests/autopilot/ubuntu_terminal_app/tests/__init__.py 2015-02-25 00:09:54 +0000 +++ tests/autopilot/ubuntu_terminal_app/tests/__init__.py 2016-03-07 21:17:09 +0000 @@ -7,4 +7,149 @@ """Terminal app autopilot tests.""" -# TODO Insert new tests here. +import os.path +import fixtures +import logging +import tempfile +import gi + +from autopilot import logging as autopilot_logging +from autopilot.testcase import AutopilotTestCase +import ubuntuuitoolkit + +import ubuntu_terminal_app +gi.require_version('Click', '0.4') +from gi.repository import Click + + +logger = logging.getLogger(__name__) + + +class TerminalTestCase(AutopilotTestCase): + + """A common testcase class that provides useful methods for the terminal + app. + + """ + + local_build_location = os.path.dirname(os.path.dirname(os.getcwd())) + sdk_build_location = os.path.join(os.path.dirname(local_build_location), + os.path.basename(local_build_location) + + '-build') + + local_build_location_qml = os.path.join( + local_build_location, 'src', 'app', 'qml', 'ubuntu-terminal-app.qml') + local_build_location_binary = os.path.join(local_build_location, 'src', 'app', 'terminal') + sdk_build_location_qml = os.path.join( + sdk_build_location, 'src', 'app', 'qml', 'ubuntu-terminal-app.qml') + sdk_build_location_binary = os.path.join(sdk_build_location, 'src', 'app', 'terminal') + installed_location_binary = '/usr/bin/ubuntu-terminal-app' + installed_location_qml = '/usr/share/ubuntu-terminal-app/qml/ubuntu-terminal-app.qml' + + def setUp(self): + super(TerminalTestCase, self).setUp() + launcher_method, _ = self.get_launcher_method_and_type() + self.app = ubuntu_terminal_app.TerminalApp(launcher_method()) + + def get_launcher_method_and_type(self): + if os.path.exists(self.local_build_location_binary): + launcher = self.launch_test_local + test_type = 'local' + elif os.path.exists(self.sdk_build_location_binary): + launcher = self.launch_test_sdk + test_type = 'sdk' + elif os.path.exists(self.installed_location_binary): + launcher = self.launch_test_installed + test_type = 'deb' + else: + launcher = self.launch_test_click + test_type = 'click' + return launcher, test_type + + @autopilot_logging.log_action(logger.info) + def launch_test_local(self): + self.useFixture(fixtures.EnvironmentVariable( + 'QML2_IMPORT_PATH', newvalue=os.path.join(self.local_build_location, + 'src', 'plugin'))) + return self.launch_test_application( + self.local_build_location_binary, + app_type='qt', + emulator_base=ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase) + + @autopilot_logging.log_action(logger.info) + def launch_test_sdk(self): + self.useFixture(fixtures.EnvironmentVariable( + 'QML2_IMPORT_PATH', newvalue=os.path.join(self.sdk_build_location, + 'src', 'plugin'))) + return self.launch_test_application( + self.sdk_build_location_binary, + app_type='qt', + emulator_base=ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase) + + + @autopilot_logging.log_action(logger.info) + def launch_test_installed(self): + return self.launch_test_application( + self.installed_location_binary, + '-q', self.installed_location_qml, + app_type='qt', + emulator_base=ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase) + + @autopilot_logging.log_action(logger.info) + def launch_test_click(self): + # We need to pass the "--forceAuth false" argument to the terminal app + # binary, but ubuntu-app-launch doesn't pass arguments to the exec line + # on the desktop file. So we make a test desktop file that has the + # "--forceAuth false" on the exec line. + desktop_file_path = self.write_sandbox_desktop_file() + desktop_file_name = os.path.basename(desktop_file_path) + application_name, _ = os.path.splitext(desktop_file_name) + return self.launch_upstart_application( + application_name, + emulator_base=ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase) + + def write_sandbox_desktop_file(self): + desktop_file_dir = self.get_local_desktop_file_directory() + desktop_file = self.get_named_temporary_file( + suffix='.desktop', dir=desktop_file_dir) + desktop_file.write('[Desktop Entry]\n') + version, installed_path = self.get_installed_version_and_directory() + terminal_sandbox_exec = ( + 'aa-exec-click -p com.ubuntu.terminal_terminal_{}' + ' -- terminal --forceAuth false'.format(version)) + desktop_file_dict = { + 'Type': 'Application', + 'Name': 'terminal', + 'Exec': terminal_sandbox_exec, + 'Icon': 'Not important', + 'Path': installed_path + } + for key, value in desktop_file_dict.items(): + desktop_file.write('{key}={value}\n'.format(key=key, value=value)) + desktop_file.close() + logger.debug(terminal_sandbox_exec) + for key, value in desktop_file_dict.items(): + logger.debug("%s: %s" % (key, value)) + return desktop_file.name + + def get_local_desktop_file_directory(self): + return os.path.join( + os.path.expanduser('~'), '.local', 'share', 'applications') + + def get_named_temporary_file( + self, dir=None, mode='w+t', delete=False, suffix=''): + # Discard files with underscores which look like an APP_ID to Unity + # See https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1329141 + chars = tempfile._RandomNameSequence.characters.strip("_") + tempfile._RandomNameSequence.characters = chars + return tempfile.NamedTemporaryFile( + dir=dir, mode=mode, delete=delete, suffix=suffix) + + def get_installed_version_and_directory(self): + db = Click.DB() + db.read() + package_name = 'com.ubuntu.terminal' + registry = Click.User.for_user(db, name=os.environ.get('USER')) + version = registry.get_version(package_name) + directory = registry.get_path(package_name) + return version, directory === modified file 'tests/autopilot/ubuntu_terminal_app/tests/test_terminal.py' --- tests/autopilot/ubuntu_terminal_app/tests/test_terminal.py 2015-02-25 18:37:32 +0000 +++ tests/autopilot/ubuntu_terminal_app/tests/test_terminal.py 2016-03-07 21:17:09 +0000 @@ -7,12 +7,11 @@ """Terminal app autopilot tests.""" -from autopilot.testcase import AutopilotTestCase - -# TODO Insert new tests here. - - -class DummyTest(AutopilotTestCase): - """This is just a placeholder test""" - def test_dummy_true(self): - self.assertTrue(True) +from ubuntu_terminal_app.tests import TerminalTestCase + + +class TestMainWindow(TerminalTestCase): + def test_example_test(self): + """Just launch app, assert on main view""" + main_view = self.app.main_view + self.assertTrue(main_view)
-- Mailing list: https://launchpad.net/~ubuntu-touch-coreapps-reviewers Post to : ubuntu-touch-coreapps-reviewers@lists.launchpad.net Unsubscribe : https://launchpad.net/~ubuntu-touch-coreapps-reviewers More help : https://help.launchpad.net/ListHelp