buildbot_test_llvm.py revision de600776d8342db1ae2579efd4ca07adbc310d6c
1#!/usr/bin/env python2
2"""Script for running llvm validation tests on ChromeOS.
3
4This script launches a buildbot to build ChromeOS with the llvm on
5a particular board; then it finds and downloads the trybot image and the
6corresponding official image, and runs test for correctness.
7It then generates a report, emails it to the c-compiler-chrome, as
8well as copying the result into a directory.
9"""
10
11# Script to test different toolchains against ChromeOS benchmarks.
12
13from __future__ import print_function
14
15import argparse
16import datetime
17import os
18import sys
19import time
20
21from cros_utils import command_executer
22from cros_utils import logger
23
24from cros_utils import buildbot_utils
25
26# CL that uses LLVM to build the peppy image.
27USE_LLVM_PATCH = '295217'
28
29CROSTC_ROOT = '/usr/local/google/crostc'
30ROLE_ACCOUNT = 'mobiletc-prebuild'
31TOOLCHAIN_DIR = os.path.dirname(os.path.realpath(__file__))
32MAIL_PROGRAM = '~/var/bin/mail-sheriff'
33VALIDATION_RESULT_DIR = os.path.join(CROSTC_ROOT, 'validation_result')
34START_DATE = datetime.date(2016, 1, 1)
35TEST_PER_DAY = 2
36TEST_BOARD = [
37    'squawks',
38    'terra',
39    'lulu',
40    'peach_pit',
41    'peppy',
42    'link',
43    'sentry',
44    'chell',
45    'nyan_big',
46    'daisy',
47]
48
49
50class ToolchainVerifier(object):
51  """Class for the toolchain verifier."""
52
53  def __init__(self, board, chromeos_root, weekday, patches, compiler):
54    self._board = board
55    self._chromeos_root = chromeos_root
56    self._base_dir = os.getcwd()
57    self._ce = command_executer.GetCommandExecuter()
58    self._l = logger.GetLogger()
59    self._compiler = compiler
60    self._build = '%s-%s-toolchain' % (board, compiler)
61    self._patches = patches.split(',') if patches else []
62    self._patches_string = '_'.join(str(p) for p in self._patches)
63
64    if not weekday:
65      self._weekday = time.strftime('%a')
66    else:
67      self._weekday = weekday
68    self._reports = os.path.join(VALIDATION_RESULT_DIR, compiler, board)
69
70  def _FinishSetup(self):
71    """Make sure testing_rsa file is properly set up."""
72    # Fix protections on ssh key
73    command = ('chmod 600 /var/cache/chromeos-cache/distfiles/target'
74               '/chrome-src-internal/src/third_party/chromite/ssh_keys'
75               '/testing_rsa')
76    ret_val = self._ce.ChrootRunCommand(self._chromeos_root, command)
77    if ret_val != 0:
78      raise RuntimeError('chmod for testing_rsa failed')
79
80  def DoAll(self):
81    """Main function inside ToolchainComparator class.
82
83    Launch trybot, get image names, create crosperf experiment file, run
84    crosperf, and copy images into seven-day report directories.
85    """
86    flags = ['--hwtest']
87    date_str = datetime.date.today()
88    description = 'master_%s_%s_%s' % (self._patches_string, self._build,
89                                       date_str)
90    trybot_image = buildbot_utils.GetTrybotImage(
91        self._chromeos_root,
92        self._build,
93        self._patches,
94        description,
95        other_flags=flags)
96    if len(trybot_image) == 0:
97      self._l.LogError('Unable to find trybot_image for %s!' % description)
98      return 1
99
100    if os.getlogin() == ROLE_ACCOUNT:
101      self._FinishSetup()
102
103    return 0
104
105
106def SendEmail(start_board, compiler):
107  """Send out the test results for all the boards."""
108
109  # This is no longer the correct way to get results.  Until
110  # this is fixed, don't send any email at all.
111  return 0
112
113  results = ''
114  for i in range(len(TEST_BOARD)):
115    board = TEST_BOARD[(start_board + i) % len(TEST_BOARD)]
116    f = os.path.join(VALIDATION_RESULT_DIR, compiler, board)
117    if not os.path.exists(f):
118      continue
119    results += board
120    results += '\n'
121    file_name = os.path.join(VALIDATION_RESULT_DIR, f)
122    with open(file_name, 'r') as readin:
123      read_data = readin.read()
124      results += read_data
125
126  output = os.path.join(VALIDATION_RESULT_DIR, compiler, 'result')
127  with open(output, 'w') as out:
128    out.write(results)
129
130  ce = command_executer.GetCommandExecuter()
131  if os.path.exists(os.path.expanduser(MAIL_PROGRAM)):
132    email_title = '%s validation test results' % compiler
133    command = ('cat %s | %s -s "%s" -team' %
134               (output, MAIL_PROGRAM, email_title))
135    ce.RunCommand(command)
136
137
138def Main(argv):
139  """The main function."""
140
141  # Common initializations
142  command_executer.InitCommandExecuter()
143  parser = argparse.ArgumentParser()
144  parser.add_argument(
145      '--chromeos_root',
146      dest='chromeos_root',
147      help='The chromeos root from which to run tests.')
148  parser.add_argument(
149      '--weekday',
150      default='',
151      dest='weekday',
152      help='The day of the week for which to run tests.')
153  parser.add_argument(
154      '--board', default='', dest='board', help='The board to test.')
155  parser.add_argument(
156      '--patch',
157      dest='patches',
158      default='',
159      help='The patches to use for the testing, '
160      "seprate the patch numbers with ',' "
161      'for more than one patches.')
162  parser.add_argument(
163      '--compiler',
164      dest='compiler',
165      help='Which compiler (llvm, llvm-next or gcc) to use for '
166      'testing.')
167
168  options = parser.parse_args(argv[1:])
169  if not options.chromeos_root:
170    print('Please specify the ChromeOS root directory.')
171    return 1
172  if not options.compiler:
173    print('Please specify which compiler to test (gcc, llvm, or llvm-next).')
174    return 1
175  patches = options.patches
176  if not patches and options.compiler == 'llvm':
177    patches = USE_LLVM_PATCH
178
179  if options.board:
180    fv = ToolchainVerifier(options.board, options.chromeos_root,
181                           options.weekday, patches, options.compiler)
182    return fv.Doall()
183
184  today = datetime.date.today()
185  delta = today - START_DATE
186  days = delta.days
187
188  start_board = (days * TEST_PER_DAY) % len(TEST_BOARD)
189  for i in range(TEST_PER_DAY):
190    try:
191      board = TEST_BOARD[(start_board + i) % len(TEST_BOARD)]
192      fv = ToolchainVerifier(board, options.chromeos_root, options.weekday,
193                             patches, options.compiler)
194      fv.DoAll()
195    except SystemExit:
196      logfile = os.path.join(VALIDATION_RESULT_DIR, options.compiler, board)
197      with open(logfile, 'w') as f:
198        f.write('Verifier got an exception, please check the log.\n')
199
200  SendEmail(start_board, options.compiler)
201
202
203if __name__ == '__main__':
204  retval = Main(sys.argv)
205  sys.exit(retval)
206