blob: a43db75254f02fb83abcb25ac96fd36721d3b45e [file] [log] [blame]
Caroline Tice4bd70462016-10-05 15:41:13 -07001#!/usr/bin/env python2
Yunlian Jiangc5713372016-06-15 11:37:50 -07002"""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
Caroline Ticea8af9a72016-07-20 12:52:59 -070021from cros_utils import command_executer
22from cros_utils import logger
Yunlian Jiangc5713372016-06-15 11:37:50 -070023
Caroline Ticea8af9a72016-07-20 12:52:59 -070024from cros_utils import buildbot_utils
Yunlian Jiangc5713372016-06-15 11:37:50 -070025
26# CL that uses LLVM to build the peppy image.
27USE_LLVM_PATCH = '295217'
28
Yunlian Jiangc5713372016-06-15 11:37:50 -070029CROSTC_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 = [
Caroline Ticea8517eb2016-11-30 14:52:17 -080037 'squawks', # x86_64, rambi (baytrail)
38 'terra', # x86_64, strago (braswell)
39 'lulu', # x86_64, auron (broadwell)
40 'peach_pit', # arm, peach (exynos-5420)
41 'peppy', # x86_64, slippy (haswell celeron)
42 'link', # x86_64, ivybridge (ivybridge)
43 'nyan_big', # arm, nyan (tegra)
44 'sentry', # x86_64, kunimitsu (skylake-u)
45 'chell', # x86_64, glados (skylake-y)
46 'daisy', # arm, daisy (exynos)
Yunlian Jiang9e32aa62017-01-27 13:15:41 -080047 'caroline', # amd64
48 'kevin', # arm, gru (Rockchip)
Caroline Ticea12e9742016-09-08 13:35:02 -070049]
50
Yunlian Jiangc5713372016-06-15 11:37:50 -070051
52class ToolchainVerifier(object):
53 """Class for the toolchain verifier."""
54
Caroline Ticea12e9742016-09-08 13:35:02 -070055 def __init__(self, board, chromeos_root, weekday, patches, compiler):
Yunlian Jiangc5713372016-06-15 11:37:50 -070056 self._board = board
57 self._chromeos_root = chromeos_root
58 self._base_dir = os.getcwd()
59 self._ce = command_executer.GetCommandExecuter()
60 self._l = logger.GetLogger()
Caroline Tice314ea562016-06-24 15:59:01 -070061 self._compiler = compiler
Caroline Tice4bd70462016-10-05 15:41:13 -070062 self._build = '%s-%s-toolchain' % (board, compiler)
Caroline Ticede600772016-10-18 15:27:51 -070063 self._patches = patches.split(',') if patches else []
Yunlian Jiangc5713372016-06-15 11:37:50 -070064 self._patches_string = '_'.join(str(p) for p in self._patches)
65
66 if not weekday:
67 self._weekday = time.strftime('%a')
68 else:
69 self._weekday = weekday
Caroline Ticed00ad412016-07-02 18:00:18 -070070 self._reports = os.path.join(VALIDATION_RESULT_DIR, compiler, board)
Yunlian Jiangc5713372016-06-15 11:37:50 -070071
72 def _FinishSetup(self):
73 """Make sure testing_rsa file is properly set up."""
74 # Fix protections on ssh key
75 command = ('chmod 600 /var/cache/chromeos-cache/distfiles/target'
76 '/chrome-src-internal/src/third_party/chromite/ssh_keys'
77 '/testing_rsa')
78 ret_val = self._ce.ChrootRunCommand(self._chromeos_root, command)
79 if ret_val != 0:
80 raise RuntimeError('chmod for testing_rsa failed')
81
Yunlian Jiangc5713372016-06-15 11:37:50 -070082 def DoAll(self):
83 """Main function inside ToolchainComparator class.
84
85 Launch trybot, get image names, create crosperf experiment file, run
86 crosperf, and copy images into seven-day report directories.
87 """
Caroline Tice1ba6d572016-10-10 11:31:54 -070088 flags = ['--hwtest']
Yunlian Jiangc5713372016-06-15 11:37:50 -070089 date_str = datetime.date.today()
90 description = 'master_%s_%s_%s' % (self._patches_string, self._build,
91 date_str)
Caroline Tice09741972016-11-02 15:22:28 -070092 _ = buildbot_utils.GetTrybotImage(
Caroline Tice1ba6d572016-10-10 11:31:54 -070093 self._chromeos_root,
94 self._build,
95 self._patches,
96 description,
Caroline Tice09741972016-11-02 15:22:28 -070097 other_flags=flags,
98 async=True)
Yunlian Jiangc5713372016-06-15 11:37:50 -070099
Yunlian Jiangc5713372016-06-15 11:37:50 -0700100 return 0
101
Yunlian Jiangc5713372016-06-15 11:37:50 -0700102def Main(argv):
103 """The main function."""
104
105 # Common initializations
106 command_executer.InitCommandExecuter()
107 parser = argparse.ArgumentParser()
Caroline Ticea12e9742016-09-08 13:35:02 -0700108 parser.add_argument(
109 '--chromeos_root',
110 dest='chromeos_root',
111 help='The chromeos root from which to run tests.')
112 parser.add_argument(
113 '--weekday',
114 default='',
115 dest='weekday',
116 help='The day of the week for which to run tests.')
117 parser.add_argument(
118 '--board', default='', dest='board', help='The board to test.')
119 parser.add_argument(
120 '--patch',
121 dest='patches',
Caroline Ticede600772016-10-18 15:27:51 -0700122 default='',
Caroline Ticea12e9742016-09-08 13:35:02 -0700123 help='The patches to use for the testing, '
124 "seprate the patch numbers with ',' "
125 'for more than one patches.')
126 parser.add_argument(
127 '--compiler',
128 dest='compiler',
Caroline Tice4bd70462016-10-05 15:41:13 -0700129 help='Which compiler (llvm, llvm-next or gcc) to use for '
Caroline Ticea12e9742016-09-08 13:35:02 -0700130 'testing.')
Yunlian Jiangc5713372016-06-15 11:37:50 -0700131
132 options = parser.parse_args(argv[1:])
133 if not options.chromeos_root:
134 print('Please specify the ChromeOS root directory.')
135 return 1
Caroline Tice314ea562016-06-24 15:59:01 -0700136 if not options.compiler:
Caroline Tice4bd70462016-10-05 15:41:13 -0700137 print('Please specify which compiler to test (gcc, llvm, or llvm-next).')
Caroline Tice314ea562016-06-24 15:59:01 -0700138 return 1
Caroline Ticede600772016-10-18 15:27:51 -0700139 patches = options.patches
140 if not patches and options.compiler == 'llvm':
Yunlian Jiangc5713372016-06-15 11:37:50 -0700141 patches = USE_LLVM_PATCH
142
143 if options.board:
144 fv = ToolchainVerifier(options.board, options.chromeos_root,
Caroline Tice314ea562016-06-24 15:59:01 -0700145 options.weekday, patches, options.compiler)
Yunlian Jiangc5713372016-06-15 11:37:50 -0700146 return fv.Doall()
147
148 today = datetime.date.today()
149 delta = today - START_DATE
150 days = delta.days
151
152 start_board = (days * TEST_PER_DAY) % len(TEST_BOARD)
153 for i in range(TEST_PER_DAY):
Yunlian Jiang54e72b32016-06-21 14:13:03 -0700154 try:
Caroline Ticea12e9742016-09-08 13:35:02 -0700155 board = TEST_BOARD[(start_board + i) % len(TEST_BOARD)]
156 fv = ToolchainVerifier(board, options.chromeos_root, options.weekday,
157 patches, options.compiler)
Yunlian Jiang54e72b32016-06-21 14:13:03 -0700158 fv.DoAll()
159 except SystemExit:
Caroline Ticed00ad412016-07-02 18:00:18 -0700160 logfile = os.path.join(VALIDATION_RESULT_DIR, options.compiler, board)
Yunlian Jiang54e72b32016-06-21 14:13:03 -0700161 with open(logfile, 'w') as f:
Caroline Ticea12e9742016-09-08 13:35:02 -0700162 f.write('Verifier got an exception, please check the log.\n')
Yunlian Jiangc5713372016-06-15 11:37:50 -0700163
Caroline Ticea12e9742016-09-08 13:35:02 -0700164
Yunlian Jiangc5713372016-06-15 11:37:50 -0700165if __name__ == '__main__':
166 retval = Main(sys.argv)
167 sys.exit(retval)