#!/usr/bin/python2
#
# Copyright 2011 Google Inc. All Rights Reserved.
"""chromeos.py: Build & Test ChromeOS using custom compilers."""

__author__ = 'asharif@google.com (Ahmad Sharif)'

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 ChromeOSNightlyClient(object):
  DEPOT2_DIR = '//depot2/'
  P4_CHECKOUT_DIR = 'perforce2/'
  P4_VERSION_DIR = os.path.join(P4_CHECKOUT_DIR, 'gcctools/chromeos/v14')

  def __init__(self, board, remote, gcc_githash, p4_snapshot=''):
    self._board = board
    self._remote = remote
    self._gcc_githash = gcc_githash
    self._p4_snapshot = p4_snapshot

  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_toolchains.py'),
                  '--force-mismatch',
                  '--clean',
                  '--public',  # crbug.com/145822
                  '--board=%s' % self._board,
                  '--remote=%s' % self._remote,
                  '--githashes=%s' % self._gcc_githash))
    label = 'testlabel'
    job = jobs.CreateLinuxJob(label, chain, timeout=24 * 60 * 60)

    return job_group.JobGroup(label, [job], True, False)


@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('-g',
                    '--gcc_githash',
                    dest='gcc_githash',
                    help='Use this gcc_githash.')
  parser.add_option('-p',
                    '--p4_snapshot',
                    dest='p4_snapshot',
                    default='',
                    help='Use this p4_snapshot.')
  options, _ = parser.parse_args(argv)

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

  client = ChromeOSNightlyClient(options.board,
                                 options.remote,
                                 options.gcc_githash,
                                 p4_snapshot=options.p4_snapshot)
  client.Run()
  return 0


if __name__ == '__main__':
  logger.SetUpRootLogger(level=logging.DEBUG, display_flags={'name': False})
  sys.exit(Main(sys.argv))
