You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
5.3 KiB
163 lines
5.3 KiB
#!/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])
|
|
|