# Copyright (c) 2010 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 os
from datetime import datetime
from autotest_lib.client.bin import boottool, utils
from autotest_lib.client.bin.job import base_client_job
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import cros_logging


LAST_BOOT_TAG = object()

class site_job(base_client_job):


    def __init__(self, *args, **kwargs):
        base_client_job.__init__(self, *args, **kwargs)


    def _runtest(self, url, tag, args, dargs):
        # this replaced base_client_job._runtest, which is called by
        # base_client_job.runtest.group_func (see job.py)
        try:
            self.last_error = None
            base_client_job._runtest(self, url, tag, args, dargs)
        except error.TestBaseException, detail:
            self.last_error = detail
            raise


    def run_test(self, url, *args, **dargs):
        log_pauser = cros_logging.LogRotationPauser()
        passed = False
        try:
            log_pauser.begin()
            passed = base_client_job.run_test(self, url, *args, **dargs)
            if not passed:
                # Save the VM state immediately after the test failure.
                # This is a NOOP if the the test isn't running in a VM or
                # if the VM is not properly configured to save state.
                group, testname = self.pkgmgr.get_package_name(url, 'test')
                now = datetime.now().strftime('%I:%M:%S.%f')
                checkpoint_name = '%s-%s' % (testname, now)
                utils.save_vm_state(checkpoint_name)
        finally:
            log_pauser.end()
        return passed


    def reboot(self, tag=LAST_BOOT_TAG):
        if tag == LAST_BOOT_TAG:
            tag = self.last_boot_tag
        else:
            self.last_boot_tag = tag

        self.reboot_setup()
        self.harness.run_reboot()

        # sync first, so that a sync during shutdown doesn't time out
        utils.system("sync; sync", ignore_status=True)

        utils.system("(sleep 5; reboot) </dev/null >/dev/null 2>&1 &")
        self.quit()


    def require_gcc(self):
        return False
