# 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)