# Copyright (c) 2011 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.

AUTHOR = "Chrome OS Team"
NAME = "Auto Update Smoke Test"
TIME = "SHORT"
TEST_CATEGORY = "Functional"
TEST_CLASS = "suite"
TEST_TYPE = "server"

DOC = """
This is a special control file used by the autoupdate (AU) test scheduler. It
requires a target update URL be provided in order to run.

The test relies on Autotest to image the machine to the proper base image prior
to execution. The target machine is then imaged to the target version and a
basic smoke test is run to verify functionality.
"""
import os, shutil, tempfile
from autotest_lib.server import autoserv_parser


def run_client_test(machine):
    host = hosts.create_host(machine)

    # Image the machine with the requested build. Run it as a test instead of
    # directly in the control file so useful log information is collected.
    update_url = "%(update_url)s"
    if job.run_test("autoupdate", host=host, update_url=update_url,
                    disable_sysinfo=True):
        # Let the rest of Autotest know about the new update. Necessary to make
        # sure test packages are served from the correct version. AU URLs are
        # suffixed with ".../au/<build>" which must be stripped since the test
        # packages are located at the image root.
        autoserv_parser.autoserv_parser.options.image = (
            update_url.rstrip('/').rsplit('/', 2)[0])

        at = autotest.Autotest(host)

        # Fetch smoke suite package for the build we're testing. Since the repo
        # list returned by at.get_fetch_location() is ordered from least to
        # greatest, take the last entry.
        smoke_temp = tempfile.mkdtemp(dir=job.tmpdir)
        job.pkgmgr.add_repository(at.get_fetch_location()[-1])
        job.pkgmgr.install_pkg('suite_Smoke', 'test', smoke_temp, smoke_temp,
                               preserve_install_dir=True)

        # Execute smoke suite control file 'installed' from package.
        at.run(os.path.join(smoke_temp, 'control'))

        # Cleanup temp directory.
        shutil.rmtree(smoke_temp)


job.parallel_on_machines(run_client_test, machines)
