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

"""Module containing class that implements an au_worker for a test device."""

import unittest

import cros_build_lib as cros_lib

import au_worker

class RealAUWorker(au_worker.AUWorker):
  """Test harness for updating real images."""

  def __init__(self, options, test_results_root):
    """Processes non-vm-specific options."""
    au_worker.AUWorker.__init__(self, options, test_results_root)
    self.remote = options.remote
    if not self.remote: cros_lib.Die('We require a remote address for tests.')

  def PrepareBase(self, image_path):
    """Auto-update to base image to prepare for test."""
    self.PrepareRealBase(image_path)

  def UpdateImage(self, image_path, src_image_path='', stateful_change='old',
                  proxy_port=None, private_key_path=None):
    """Updates a remote image using image_to_live.sh."""
    stateful_change_flag = self.GetStatefulChangeFlag(stateful_change)
    cmd = ['%s/image_to_live.sh' % self.crosutils,
           '--remote=%s' % self.remote,
           stateful_change_flag,
           '--verify',
          ]
    self.AppendUpdateFlags(cmd, image_path, src_image_path, proxy_port,
                           private_key_path)
    self.RunUpdateCmd(cmd)

  def UpdateUsingPayload(self, update_path, stateful_change='old',
                         proxy_port=None):
    """Updates a remote image using image_to_live.sh."""
    stateful_change_flag = self.GetStatefulChangeFlag(stateful_change)
    cmd = ['%s/image_to_live.sh' % self.crosutils,
           '--payload=%s' % update_path,
           '--remote=%s' % self.remote,
           stateful_change_flag,
           '--verify',
          ]
    if proxy_port: cmd.append('--proxy_port=%s' % proxy_port)
    self.RunUpdateCmd(cmd)

  def VerifyImage(self, unittest, percent_required_to_pass=100):
    """Verifies an image using run_remote_tests.sh with verification suite."""
    test_directory = self.GetNextResultsPath('verify')
    output = cros_lib.RunCommand(
        ['run_remote_tests.sh',
         '--remote=%s' % self.remote,
         '--results_dir_root=%s' % test_directory,
         self.verify_suite,
        ], error_ok=True, enter_chroot=True, redirect_stdout=True,
        cwd=self.crosutils)
    return self.AssertEnoughTestsPassed(unittest, output,
                                        percent_required_to_pass)

