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