blob: 0d088e8ff19d519872cb7e49ff1ba130bd06ef97 [file] [log] [blame]
Caroline Tice4bd70462016-10-05 15:41:13 -07001#!/usr/bin/env python2
Ting-Yuan Huang4f59a622017-08-16 12:32:56 -07002#
3# Copyright 2017 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
Yunlian Jiangc5713372016-06-15 11:37:50 -07006"""Script for running llvm validation tests on ChromeOS.
7
8This script launches a buildbot to build ChromeOS with the llvm on
9a particular board; then it finds and downloads the trybot image and the
10corresponding official image, and runs test for correctness.
11It then generates a report, emails it to the c-compiler-chrome, as
12well as copying the result into a directory.
13"""
14
15# Script to test different toolchains against ChromeOS benchmarks.
16
17from __future__ import print_function
18
19import argparse
20import datetime
21import os
22import sys
23import time
24
Caroline Ticea8af9a72016-07-20 12:52:59 -070025from cros_utils import command_executer
26from cros_utils import logger
Yunlian Jiangc5713372016-06-15 11:37:50 -070027
Caroline Ticea8af9a72016-07-20 12:52:59 -070028from cros_utils import buildbot_utils
Yunlian Jiangc5713372016-06-15 11:37:50 -070029
Yunlian Jiangc5713372016-06-15 11:37:50 -070030CROSTC_ROOT = '/usr/local/google/crostc'
31ROLE_ACCOUNT = 'mobiletc-prebuild'
32TOOLCHAIN_DIR = os.path.dirname(os.path.realpath(__file__))
33MAIL_PROGRAM = '~/var/bin/mail-sheriff'
34VALIDATION_RESULT_DIR = os.path.join(CROSTC_ROOT, 'validation_result')
35START_DATE = datetime.date(2016, 1, 1)
Manoj Guptadd8675b2018-01-25 10:59:06 -080036TEST_PER_DAY = 4
Caroline Tice09cacd02017-08-11 13:02:29 -070037
38# Information about Rotating Boards
39# Board Arch Reference Platform Kernel
40# Board Version
41# -------- ------ --------- ---------- -------
42# caroline x86_64 glados skylake-y 3.18
43# daisy armv7 daisy exynos-5250 3.8.11
44# eve x86_64 poppy kabylake-y 4.4.79
Manoj Gupta470bbf52018-01-23 09:54:28 -080045# fizz x86_64 fizz kabylake-u/r 4.4
Caroline Tice09cacd02017-08-11 13:02:29 -070046# gale armv7 3.18
Manoj Guptadd8675b2018-01-25 10:59:06 -080047# guado_moblab x86_64 3.14
Manoj Guptafc7d1e62018-01-16 16:21:18 -080048# kahlee x86_64 kahlee stoney ridge 4.14
Caroline Tice09cacd02017-08-11 13:02:29 -070049# kevin armv7 gru rockchip-3399 4.4.79
50# lakitu x86_64 4.4.79
51# link x86_64 ivybridge ivybridge 3.8.11
52# lumpy x86_64 -- sandybridge 3.8.11
53# nyan_big armv7 nyan tegra 3.10.18
54# peach_pit armv7 peach exynos-5420 3.8.11
55# peppy x86_64 slippy haswell 3.8.11
Manoj Guptaac5072d2017-09-29 10:51:20 -070056# pyro x86_64 reef apollo lake 4.4.79
Caroline Tice09cacd02017-08-11 13:02:29 -070057# sentry x86_64 kunimitsu skylake-u 3.18
Manoj Guptaac5072d2017-09-29 10:51:20 -070058# swanky x86_64 rambi baytrail 4.4.79
Caroline Tice09cacd02017-08-11 13:02:29 -070059# terra x86_64 strago braswell 3.18
60# whirlwind armv7 3.14
Manoj Gupta470bbf52018-01-23 09:54:28 -080061# zoombini x86_64 zoombini cannonlake-y 4.14
Caroline Tice09cacd02017-08-11 13:02:29 -070062
Yunlian Jiangc5713372016-06-15 11:37:50 -070063TEST_BOARD = [
Caroline Tice09cacd02017-08-11 13:02:29 -070064 'caroline',
65 'daisy',
66 'eve',
Manoj Gupta470bbf52018-01-23 09:54:28 -080067 'fizz',
Caroline Tice09cacd02017-08-11 13:02:29 -070068 'gale',
Manoj Guptadd8675b2018-01-25 10:59:06 -080069 'guado_moblab',
Manoj Guptafc7d1e62018-01-16 16:21:18 -080070 'kahlee',
Caroline Tice09cacd02017-08-11 13:02:29 -070071 'kevin',
Caroline Tice856bc6c2017-06-29 16:21:43 -070072 'lakitu',
Caroline Tice09cacd02017-08-11 13:02:29 -070073 'link',
74 'lumpy',
75 'nyan_big',
76 'peach_pit',
77 'peppy',
Manoj Guptaac5072d2017-09-29 10:51:20 -070078 'pyro',
Caroline Tice09cacd02017-08-11 13:02:29 -070079 'sentry',
Manoj Guptaac5072d2017-09-29 10:51:20 -070080 'swanky',
Caroline Tice09cacd02017-08-11 13:02:29 -070081 'terra',
Caroline Tice856bc6c2017-06-29 16:21:43 -070082 'whirlwind',
Manoj Gupta470bbf52018-01-23 09:54:28 -080083 'zoombini',
Caroline Ticea12e9742016-09-08 13:35:02 -070084]
85
Yunlian Jiangc5713372016-06-15 11:37:50 -070086
87class ToolchainVerifier(object):
88 """Class for the toolchain verifier."""
89
Caroline Ticea12e9742016-09-08 13:35:02 -070090 def __init__(self, board, chromeos_root, weekday, patches, compiler):
Yunlian Jiangc5713372016-06-15 11:37:50 -070091 self._board = board
92 self._chromeos_root = chromeos_root
93 self._base_dir = os.getcwd()
94 self._ce = command_executer.GetCommandExecuter()
95 self._l = logger.GetLogger()
Caroline Tice314ea562016-06-24 15:59:01 -070096 self._compiler = compiler
Yunlian Jiangbddbcd32017-11-27 10:59:30 -080097 self._build = '%s-%s-toolchain-tryjob' % (board, compiler)
Caroline Ticede600772016-10-18 15:27:51 -070098 self._patches = patches.split(',') if patches else []
Yunlian Jiangc5713372016-06-15 11:37:50 -070099 self._patches_string = '_'.join(str(p) for p in self._patches)
100
101 if not weekday:
102 self._weekday = time.strftime('%a')
103 else:
104 self._weekday = weekday
Caroline Ticed00ad412016-07-02 18:00:18 -0700105 self._reports = os.path.join(VALIDATION_RESULT_DIR, compiler, board)
Yunlian Jiangc5713372016-06-15 11:37:50 -0700106
107 def _FinishSetup(self):
108 """Make sure testing_rsa file is properly set up."""
109 # Fix protections on ssh key
110 command = ('chmod 600 /var/cache/chromeos-cache/distfiles/target'
111 '/chrome-src-internal/src/third_party/chromite/ssh_keys'
112 '/testing_rsa')
113 ret_val = self._ce.ChrootRunCommand(self._chromeos_root, command)
114 if ret_val != 0:
115 raise RuntimeError('chmod for testing_rsa failed')
116
Caroline Tice9c4003a2017-11-07 16:37:33 -0800117 def DoAll(self, crostc_dir):
Yunlian Jiangc5713372016-06-15 11:37:50 -0700118 """Main function inside ToolchainComparator class.
119
120 Launch trybot, get image names, create crosperf experiment file, run
121 crosperf, and copy images into seven-day report directories.
122 """
123 date_str = datetime.date.today()
124 description = 'master_%s_%s_%s' % (self._patches_string, self._build,
125 date_str)
Caroline Tice9c4003a2017-11-07 16:37:33 -0800126 if crostc_dir:
127 _ = buildbot_utils.GetTrybotImage(
128 self._chromeos_root,
129 self._build,
130 self._patches,
131 description,
132 tryjob_flags=['--hwtest'],
133 credentials_dir=crostc_dir,
134 async=True)
135 else:
136 _ = buildbot_utils.GetTrybotImage(
137 self._chromeos_root,
138 self._build,
139 self._patches,
140 description,
141 tryjob_flags=['--hwtest'],
142 async=True)
Yunlian Jiangc5713372016-06-15 11:37:50 -0700143
Yunlian Jiangc5713372016-06-15 11:37:50 -0700144 return 0
145
Manoj Guptad575b8a2017-03-08 10:51:28 -0800146
Yunlian Jiangc5713372016-06-15 11:37:50 -0700147def Main(argv):
148 """The main function."""
149
150 # Common initializations
151 command_executer.InitCommandExecuter()
152 parser = argparse.ArgumentParser()
Caroline Ticea12e9742016-09-08 13:35:02 -0700153 parser.add_argument(
154 '--chromeos_root',
155 dest='chromeos_root',
156 help='The chromeos root from which to run tests.')
157 parser.add_argument(
158 '--weekday',
159 default='',
160 dest='weekday',
161 help='The day of the week for which to run tests.')
162 parser.add_argument(
163 '--board', default='', dest='board', help='The board to test.')
164 parser.add_argument(
165 '--patch',
166 dest='patches',
Caroline Ticede600772016-10-18 15:27:51 -0700167 default='',
Caroline Ticea12e9742016-09-08 13:35:02 -0700168 help='The patches to use for the testing, '
169 "seprate the patch numbers with ',' "
170 'for more than one patches.')
171 parser.add_argument(
172 '--compiler',
173 dest='compiler',
Caroline Tice4bd70462016-10-05 15:41:13 -0700174 help='Which compiler (llvm, llvm-next or gcc) to use for '
Caroline Ticea12e9742016-09-08 13:35:02 -0700175 'testing.')
Caroline Tice9c4003a2017-11-07 16:37:33 -0800176 parser.add_argument(
177 '--crostc_dir',
178 dest='crostc_dir',
179 help='Path to the directory containing the '
180 'chromeos-toolchain-credentials.json file; normally in the '
181 'crostc repo.')
Yunlian Jiangc5713372016-06-15 11:37:50 -0700182
183 options = parser.parse_args(argv[1:])
184 if not options.chromeos_root:
185 print('Please specify the ChromeOS root directory.')
186 return 1
Caroline Tice314ea562016-06-24 15:59:01 -0700187 if not options.compiler:
Caroline Tice4bd70462016-10-05 15:41:13 -0700188 print('Please specify which compiler to test (gcc, llvm, or llvm-next).')
Caroline Tice314ea562016-06-24 15:59:01 -0700189 return 1
Yunlian Jiangc5713372016-06-15 11:37:50 -0700190
191 if options.board:
192 fv = ToolchainVerifier(options.board, options.chromeos_root,
Manoj Guptad575b8a2017-03-08 10:51:28 -0800193 options.weekday, options.patches, options.compiler)
Yunlian Jiangc5713372016-06-15 11:37:50 -0700194 return fv.Doall()
195
196 today = datetime.date.today()
197 delta = today - START_DATE
198 days = delta.days
199
200 start_board = (days * TEST_PER_DAY) % len(TEST_BOARD)
201 for i in range(TEST_PER_DAY):
Yunlian Jiang54e72b32016-06-21 14:13:03 -0700202 try:
Caroline Ticea12e9742016-09-08 13:35:02 -0700203 board = TEST_BOARD[(start_board + i) % len(TEST_BOARD)]
204 fv = ToolchainVerifier(board, options.chromeos_root, options.weekday,
Manoj Gupta86fe1ed2017-03-09 10:37:35 -0800205 options.patches, options.compiler)
Caroline Tice9c4003a2017-11-07 16:37:33 -0800206 fv.DoAll(options.crostc_dir)
Yunlian Jiang54e72b32016-06-21 14:13:03 -0700207 except SystemExit:
Caroline Ticed00ad412016-07-02 18:00:18 -0700208 logfile = os.path.join(VALIDATION_RESULT_DIR, options.compiler, board)
Yunlian Jiang54e72b32016-06-21 14:13:03 -0700209 with open(logfile, 'w') as f:
Caroline Ticea12e9742016-09-08 13:35:02 -0700210 f.write('Verifier got an exception, please check the log.\n')
Yunlian Jiangc5713372016-06-15 11:37:50 -0700211
Caroline Ticea12e9742016-09-08 13:35:02 -0700212
Yunlian Jiangc5713372016-06-15 11:37:50 -0700213if __name__ == '__main__':
214 retval = Main(sys.argv)
215 sys.exit(retval)