#!/usr/bin/python
#
# Copyright 2012 Google Inc. All Rights Reserved.

"""dejagnu_compiler.py: Run dejagnu test."""

__author__ = 'shenhan@google.com  (Han Shen)'


import logging
import optparse
import os
import pickle
import sys
import xmlrpclib

from automation.clients.helper import jobs
from automation.clients.helper import perforce
from automation.common import command as cmd
from automation.common import job_group
from automation.common import logger


class DejagnuCompilerNightlyClient:
  DEPOT2_DIR = '//depot2/'
  P4_CHECKOUT_DIR = 'perforce2/'
  P4_VERSION_DIR = os.path.join(P4_CHECKOUT_DIR, 'gcctools/chromeos/v14')

  def __init__(self, board, remote, p4_snapshot, cleanup):
    self._board = board
    self._remote = remote
    self._p4_snapshot = p4_snapshot
    self._cleanup = cleanup

  def Run(self):
    server = xmlrpclib.Server('http://localhost:8000')
    server.ExecuteJobGroup(pickle.dumps(self.CreateJobGroup()))

  def CheckoutV14Dir(self):
    p4view = perforce.View(self.DEPOT2_DIR, [
        perforce.PathMapping('gcctools/chromeos/v14/...')])
    return self.GetP4Snapshot(p4view)

  def GetP4Snapshot(self, p4view):
    p4client = perforce.CommandsFactory(self.P4_CHECKOUT_DIR, p4view)

    if self._p4_snapshot:
      return p4client.CheckoutFromSnapshot(self._p4_snapshot)
    else:
      return p4client.SetupAndDo(p4client.Sync(), p4client.Remove())

  def CreateJobGroup(self):
    chain = cmd.Chain(
        self.CheckoutV14Dir(),
        cmd.Shell('python',
                  os.path.join(self.P4_VERSION_DIR, 'test_gcc_dejagnu.py'),
                  '--board=%s' % self._board,
                  '--remote=%s' % self._remote,
                  '--cleanup=%s' % self._cleanup))
    label = 'dejagnu'
    job = jobs.CreateLinuxJob(label, chain, timeout=8*60*60)
    return job_group.JobGroup(label, [job], cleanup_on_failure=True,
                              cleanup_on_completion=True)


@logger.HandleUncaughtExceptions
def Main(argv):
  parser = optparse.OptionParser()
  parser.add_option('-b', '--board', dest='board',
                    help='Run performance tests on these boards')
  parser.add_option('-r', '--remote', dest='remote',
                    help='Run performance tests on these remotes')
  parser.add_option('-p', '--p4_snapshot', dest='p4_snapshot',
                    help=('For development only. '
                          'Use snapshot instead of checking out.'))
  parser.add_option('--cleanup', dest='cleanup', default='mount',
                    help=('Cleanup test directory, values could be one of '
                          '"mount", "chroot" or "chromeos"'))
  options, _ = parser.parse_args(argv)

  if not all([options.board, options.remote]):
    logging.error('Specify a board and remote.')
    return 1

  client = DejagnuCompilerNightlyClient(
    options.board, options.remote, options.p4_snapshot, options.cleanup)
  client.Run()
  return 0


if __name__ == '__main__':
  sys.exit(Main(sys.argv))
