1#!/usr/bin/python 2# 3# Copyright 2012 Google Inc. All Rights Reserved. 4"""dejagnu_compiler.py: Run dejagnu test.""" 5 6__author__ = 'shenhan@google.com (Han Shen)' 7 8import logging 9import optparse 10import os 11import pickle 12import sys 13import xmlrpclib 14 15from automation.clients.helper import jobs 16from automation.clients.helper import perforce 17from automation.common import command as cmd 18from automation.common import job_group 19from automation.common import logger 20 21 22class DejagnuCompilerNightlyClient: 23 DEPOT2_DIR = '//depot2/' 24 P4_CHECKOUT_DIR = 'perforce2/' 25 P4_VERSION_DIR = os.path.join(P4_CHECKOUT_DIR, 'gcctools/chromeos/v14') 26 27 def __init__(self, board, remote, p4_snapshot, cleanup): 28 self._board = board 29 self._remote = remote 30 self._p4_snapshot = p4_snapshot 31 self._cleanup = cleanup 32 33 def Run(self): 34 server = xmlrpclib.Server('http://localhost:8000') 35 server.ExecuteJobGroup(pickle.dumps(self.CreateJobGroup())) 36 37 def CheckoutV14Dir(self): 38 p4view = perforce.View(self.DEPOT2_DIR, [ 39 perforce.PathMapping('gcctools/chromeos/v14/...') 40 ]) 41 return self.GetP4Snapshot(p4view) 42 43 def GetP4Snapshot(self, p4view): 44 p4client = perforce.CommandsFactory(self.P4_CHECKOUT_DIR, p4view) 45 46 if self._p4_snapshot: 47 return p4client.CheckoutFromSnapshot(self._p4_snapshot) 48 else: 49 return p4client.SetupAndDo(p4client.Sync(), p4client.Remove()) 50 51 def CreateJobGroup(self): 52 chain = cmd.Chain(self.CheckoutV14Dir(), cmd.Shell( 53 'python', os.path.join(self.P4_VERSION_DIR, 'test_gcc_dejagnu.py'), 54 '--board=%s' % self._board, '--remote=%s' % self._remote, 55 '--cleanup=%s' % self._cleanup)) 56 label = 'dejagnu' 57 job = jobs.CreateLinuxJob(label, chain, timeout=8 * 60 * 60) 58 return job_group.JobGroup(label, 59 [job], 60 cleanup_on_failure=True, 61 cleanup_on_completion=True) 62 63 64@logger.HandleUncaughtExceptions 65def Main(argv): 66 parser = optparse.OptionParser() 67 parser.add_option('-b', 68 '--board', 69 dest='board', 70 help='Run performance tests on these boards') 71 parser.add_option('-r', 72 '--remote', 73 dest='remote', 74 help='Run performance tests on these remotes') 75 parser.add_option('-p', 76 '--p4_snapshot', 77 dest='p4_snapshot', 78 help=('For development only. ' 79 'Use snapshot instead of checking out.')) 80 parser.add_option('--cleanup', 81 dest='cleanup', 82 default='mount', 83 help=('Cleanup test directory, values could be one of ' 84 '"mount", "chroot" or "chromeos"')) 85 options, _ = parser.parse_args(argv) 86 87 if not all([options.board, options.remote]): 88 logging.error('Specify a board and remote.') 89 return 1 90 91 client = DejagnuCompilerNightlyClient(options.board, options.remote, 92 options.p4_snapshot, options.cleanup) 93 client.Run() 94 return 0 95 96 97if __name__ == '__main__': 98 sys.exit(Main(sys.argv)) 99