| # Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging |
| import os |
| import shutil |
| |
| |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.server import autotest |
| from autotest_lib.server import test |
| from autotest_lib.server.cros import sonic_extension_downloader |
| |
| |
| class sonic_AppTest(test.test): |
| """Tests that a sonic device can start its apps.""" |
| version = 1 |
| |
| |
| def initialize(self, sonic_host, extension_dir=None): |
| """Download the latest extension, or use a local path if specified.""" |
| # TODO: crbug.com/337708 |
| if not extension_dir: |
| logging.info('Downloading ToT extension for test since no local ' |
| 'extension specified.') |
| extension_path = os.path.join(self.job.clientdir, 'deps', |
| 'sonic_extension') |
| sonic_extension_downloader.setup_extension(extension_path) |
| self.extension_path = extension_path |
| else: |
| logging.info('Using local extension for test %s.', |
| self.extension_dir) |
| self.extension_path = None |
| |
| |
| def run_once(self, cros_host, sonic_host, app='ChromeCast', payload=None, |
| extension_dir=None): |
| """Sonic test to start an app. |
| |
| By default this test will test tab cast by installing an extension |
| on the cros host and using chromedriver to cast a tab. If another app |
| is specified, like YouTube or Netflix, the app is tested directly |
| through the server running on port 8080 on the sonic device. |
| |
| @param app: The name of the application to start. |
| eg: YouTube |
| @param payload: The payload to send to the app. |
| eg: http://www.youtube.com |
| @param extension_dir: The directory to load a custom extension from. |
| |
| @raises CmdExecutionError: If a command failed to execute on the host. |
| @raises TestError: If the app didn't start, or the app was unrecognized, |
| or the payload is invalid. |
| """ |
| logging.info('Testing app %s, sonic_host %s and chromeos device %s ', |
| app, sonic_host.hostname, cros_host.hostname) |
| if app == 'ChromeCast': |
| sonic_host.enable_test_extension() |
| client_at = autotest.Autotest(cros_host) |
| client_at.run_test('desktopui_SonicExtension', |
| chromecast_ip=sonic_host.hostname, |
| extension_dir=extension_dir) |
| elif payload and (app == 'Netflix' or app == 'YouTube'): |
| sonic_host.run('logcat -c') |
| sonic_host.client.start_app(app, payload) |
| log = sonic_host.run('logcat -d').stdout |
| app_started_confirmation = 'App started:' |
| for line in log.split('\n'): |
| if app_started_confirmation in line: |
| logging.info('Successfully started app: %s', line) |
| break |
| else: |
| logging.error(log) |
| raise error.TestError('App %s failed to start' % app) |
| else: |
| raise error.TestError('Cannot start app %s with payload %s' % |
| (app, payload)) |
| |
| |
| def cleanup(self, cros_host, sonic_host, app='ChromeCast'): |
| sonic_host.client.stop_app(app) |
| if self.extension_path: |
| shutil.rmtree(self.extension_path, ignore_errors=True) |