#!/usr/bin/python2 """Script adapter used by automation client for testing dejagnu. This is not intended to be run on command line. To kick off a single dejagnu run, use ./dejagnu/run_dejagnu.py """ from __future__ import print_function import argparse import sys import setup_chromeos from dejagnu import gdb_dejagnu from cros_utils import command_executer from cros_utils import email_sender class DejagnuAdapter(object): """Dejagnu Adapter class.""" def __init__(self, board, remote, gdb_dir, chromeos_root, cleanup): self._board = board self._remote = remote self._gdb_dir = gdb_dir self._chromeos_root = chromeos_root self._cleanup = cleanup self._cmd_exec = command_executer.GetCommandExecuter() def SetupChromeOS(self): cmd = [setup_chromeos.__file__, '--dir=' + self._chromeos_root, '--minilayout', '--jobs=8'] ret = setup_chromeos.Main(cmd) if ret: raise RuntimeError('Failed to checkout chromeos') ## Do cros_sdk and setup_board, otherwise build_tc in next step will fail. cmd = 'cd {0} && cros_sdk --download'.format(self._chromeos_root) ret = self._cmd_exec.RunCommand(cmd, terminated_timeout=9000) if ret: raise RuntimeError('Failed to create chroot.') def SetupBoard(self): cmd = './setup_board --board=' + self._board ret = self._cmd_exec.ChrootRunCommand(self._chromeos_root, cmd, terminated_timeout=4000) if ret: raise RuntimeError('Failed to setup board.') def CheckGDB(self): args = [gdb_dejagnu.__file__, '--board=' + self._board, '--chromeos_root=' + self._chromeos_root, '--mount=' + self._gdb_dir, '--remote=' + self._remote] if self._cleanup: args.append('--cleanup=' + self._cleanup) return gdb_dejagnu.Main(args) # Parse the output log to determine how many failures we have. # Return -1 if parse output log failed. def GetNumNewFailures(result): if not result: return 0 return len(result) # Do not throw any exception in this function! def EmailResult(result): email_to = ['yunlian@google.com'] if len(result) == 4: subject = 'Job failed: dejagnu test didn\'t finish' email_text = ( 'Job failed prematurely, check exception below.\n' + result[3]) elif result[0]: subject = 'Job finished: dejagnu test failed' num_new_failures = GetNumNewFailures(result[1]) if num_new_failures >= 0: summary = '{0} new fail(s), check log below.'.format(num_new_failures) else: summary = 'At least 1 new fail found, check log below.' email_text = (summary + ('\nStdout ====\n' '{0}\n' '\nStderr ===\n' '{1}\n').format(result[1], result[2])) else: subject = 'Job finished: dejagnu test passed' email_text = ('Cool! No new fail found.\n' '\nStdout ====\n' '{0}\n' '\nStderr ====\n' '{1}\n').format(result[1], result[2]) try: email_sender.EmailSender().SendEmail(email_to, subject, email_text) print('Email sent.') except Exception as e: # Do not propagate this email sending exception, you want to email an # email exception? Just log it on console. print('Sending email failed - {0}' 'Subject: {1}' 'Text: {2}').format( str(e), subject, email_text) def ProcessArguments(argv): """Processing script arguments.""" parser = argparse.ArgumentParser( description=('This script is used by nightly client to test gdb. ' 'DO NOT run it unless you know what you are doing.'), usage='test_gdb_dejagnu.py options') parser.add_argument('-b', '--board', dest='board', help=('Required. Specify board type. For example ' '\'lumpy\' and \'daisy\'')) parser.add_argument('-r', '--remote', dest='remote', help=('Required. Specify remote board address')) parser.add_argument('-g', '--gdb_dir', dest='gdb_dir', default='', help=('Optional. Specify gdb checkout directory.')) parser.add_argument('-c', '--chromeos_root', dest='chromeos_root', default='chromeos.live', help=('Optional. Specify chromeos checkout directory.')) parser.add_argument('--cleanup', dest='cleanup', default=None, help=('Optional. Do cleanup after the test.')) options = parser.parse_args(argv) if not options.board or not options.remote: raise SyntaxError('--board and --remote are mandatory options.') return options def Main(argv): opt = ProcessArguments(argv) print(opt) adapter = DejagnuAdapter(opt.board, opt.remote, opt.gdb_dir, opt.chromeos_root, opt.cleanup) try: adapter.SetupChromeOS() adapter.SetupBoard() ret = adapter.CheckGDB() except Exception as e: print(e) ret = (1, '', '', str(e)) finally: EmailResult(ret) return ret if __name__ == '__main__': retval = Main(sys.argv[1:]) sys.exit(retval[0])