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