1*4882a593Smuzhiyun# 2*4882a593Smuzhiyun# Copyright (c) 2012 The Chromium OS Authors. 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun# 6*4882a593Smuzhiyun 7*4882a593Smuzhiyunimport os 8*4882a593Smuzhiyunimport shutil 9*4882a593Smuzhiyunimport sys 10*4882a593Smuzhiyunimport tempfile 11*4882a593Smuzhiyunimport time 12*4882a593Smuzhiyunimport unittest 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun# Bring in the patman libraries 15*4882a593Smuzhiyunour_path = os.path.dirname(os.path.realpath(__file__)) 16*4882a593Smuzhiyunsys.path.append(os.path.join(our_path, '../patman')) 17*4882a593Smuzhiyun 18*4882a593Smuzhiyunimport board 19*4882a593Smuzhiyunimport bsettings 20*4882a593Smuzhiyunimport builder 21*4882a593Smuzhiyunimport control 22*4882a593Smuzhiyunimport command 23*4882a593Smuzhiyunimport commit 24*4882a593Smuzhiyunimport terminal 25*4882a593Smuzhiyunimport toolchain 26*4882a593Smuzhiyun 27*4882a593Smuzhiyunsettings_data = ''' 28*4882a593Smuzhiyun# Buildman settings file 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun[toolchain] 31*4882a593Smuzhiyunmain: /usr/sbin 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun[toolchain-alias] 34*4882a593Smuzhiyunx86: i386 x86_64 35*4882a593Smuzhiyun''' 36*4882a593Smuzhiyun 37*4882a593Smuzhiyunerrors = [ 38*4882a593Smuzhiyun '''main.c: In function 'main_loop': 39*4882a593Smuzhiyunmain.c:260:6: warning: unused variable 'joe' [-Wunused-variable] 40*4882a593Smuzhiyun''', 41*4882a593Smuzhiyun '''main.c: In function 'main_loop2': 42*4882a593Smuzhiyunmain.c:295:2: error: 'fred' undeclared (first use in this function) 43*4882a593Smuzhiyunmain.c:295:2: note: each undeclared identifier is reported only once for each function it appears in 44*4882a593Smuzhiyunmake[1]: *** [main.o] Error 1 45*4882a593Smuzhiyunmake: *** [common/libcommon.o] Error 2 46*4882a593SmuzhiyunMake failed 47*4882a593Smuzhiyun''', 48*4882a593Smuzhiyun '''main.c: In function 'main_loop3': 49*4882a593Smuzhiyunmain.c:280:6: warning: unused variable 'mary' [-Wunused-variable] 50*4882a593Smuzhiyun''', 51*4882a593Smuzhiyun '''powerpc-linux-ld: warning: dot moved backwards before `.bss' 52*4882a593Smuzhiyunpowerpc-linux-ld: warning: dot moved backwards before `.bss' 53*4882a593Smuzhiyunpowerpc-linux-ld: u-boot: section .text lma 0xfffc0000 overlaps previous sections 54*4882a593Smuzhiyunpowerpc-linux-ld: u-boot: section .rodata lma 0xfffef3ec overlaps previous sections 55*4882a593Smuzhiyunpowerpc-linux-ld: u-boot: section .reloc lma 0xffffa400 overlaps previous sections 56*4882a593Smuzhiyunpowerpc-linux-ld: u-boot: section .data lma 0xffffcd38 overlaps previous sections 57*4882a593Smuzhiyunpowerpc-linux-ld: u-boot: section .u_boot_cmd lma 0xffffeb40 overlaps previous sections 58*4882a593Smuzhiyunpowerpc-linux-ld: u-boot: section .bootpg lma 0xfffff198 overlaps previous sections 59*4882a593Smuzhiyun''', 60*4882a593Smuzhiyun '''In file included from %(basedir)sarch/sandbox/cpu/cpu.c:9:0: 61*4882a593Smuzhiyun%(basedir)sarch/sandbox/include/asm/state.h:44:0: warning: "xxxx" redefined [enabled by default] 62*4882a593Smuzhiyun%(basedir)sarch/sandbox/include/asm/state.h:43:0: note: this is the location of the previous definition 63*4882a593Smuzhiyun%(basedir)sarch/sandbox/cpu/cpu.c: In function 'do_reset': 64*4882a593Smuzhiyun%(basedir)sarch/sandbox/cpu/cpu.c:27:1: error: unknown type name 'blah' 65*4882a593Smuzhiyun%(basedir)sarch/sandbox/cpu/cpu.c:28:12: error: expected declaration specifiers or '...' before numeric constant 66*4882a593Smuzhiyunmake[2]: *** [arch/sandbox/cpu/cpu.o] Error 1 67*4882a593Smuzhiyunmake[1]: *** [arch/sandbox/cpu] Error 2 68*4882a593Smuzhiyunmake[1]: *** Waiting for unfinished jobs.... 69*4882a593SmuzhiyunIn file included from %(basedir)scommon/board_f.c:55:0: 70*4882a593Smuzhiyun%(basedir)sarch/sandbox/include/asm/state.h:44:0: warning: "xxxx" redefined [enabled by default] 71*4882a593Smuzhiyun%(basedir)sarch/sandbox/include/asm/state.h:43:0: note: this is the location of the previous definition 72*4882a593Smuzhiyunmake: *** [sub-make] Error 2 73*4882a593Smuzhiyun''' 74*4882a593Smuzhiyun] 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun# hash, subject, return code, list of errors/warnings 78*4882a593Smuzhiyuncommits = [ 79*4882a593Smuzhiyun ['1234', 'upstream/master, ok', 0, []], 80*4882a593Smuzhiyun ['5678', 'Second commit, a warning', 0, errors[0:1]], 81*4882a593Smuzhiyun ['9012', 'Third commit, error', 1, errors[0:2]], 82*4882a593Smuzhiyun ['3456', 'Fourth commit, warning', 0, [errors[0], errors[2]]], 83*4882a593Smuzhiyun ['7890', 'Fifth commit, link errors', 1, [errors[0], errors[3]]], 84*4882a593Smuzhiyun ['abcd', 'Sixth commit, fixes all errors', 0, []], 85*4882a593Smuzhiyun ['ef01', 'Seventh commit, check directory suppression', 1, [errors[4]]], 86*4882a593Smuzhiyun] 87*4882a593Smuzhiyun 88*4882a593Smuzhiyunboards = [ 89*4882a593Smuzhiyun ['Active', 'arm', 'armv7', '', 'Tester', 'ARM Board 1', 'board0', ''], 90*4882a593Smuzhiyun ['Active', 'arm', 'armv7', '', 'Tester', 'ARM Board 2', 'board1', ''], 91*4882a593Smuzhiyun ['Active', 'powerpc', 'powerpc', '', 'Tester', 'PowerPC board 1', 'board2', ''], 92*4882a593Smuzhiyun ['Active', 'sandbox', 'sandbox', '', 'Tester', 'Sandbox board', 'board4', ''], 93*4882a593Smuzhiyun] 94*4882a593Smuzhiyun 95*4882a593SmuzhiyunBASE_DIR = 'base' 96*4882a593Smuzhiyun 97*4882a593Smuzhiyunclass Options: 98*4882a593Smuzhiyun """Class that holds build options""" 99*4882a593Smuzhiyun pass 100*4882a593Smuzhiyun 101*4882a593Smuzhiyunclass TestBuild(unittest.TestCase): 102*4882a593Smuzhiyun """Test buildman 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun TODO: Write tests for the rest of the functionality 105*4882a593Smuzhiyun """ 106*4882a593Smuzhiyun def setUp(self): 107*4882a593Smuzhiyun # Set up commits to build 108*4882a593Smuzhiyun self.commits = [] 109*4882a593Smuzhiyun sequence = 0 110*4882a593Smuzhiyun for commit_info in commits: 111*4882a593Smuzhiyun comm = commit.Commit(commit_info[0]) 112*4882a593Smuzhiyun comm.subject = commit_info[1] 113*4882a593Smuzhiyun comm.return_code = commit_info[2] 114*4882a593Smuzhiyun comm.error_list = commit_info[3] 115*4882a593Smuzhiyun comm.sequence = sequence 116*4882a593Smuzhiyun sequence += 1 117*4882a593Smuzhiyun self.commits.append(comm) 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun # Set up boards to build 120*4882a593Smuzhiyun self.boards = board.Boards() 121*4882a593Smuzhiyun for brd in boards: 122*4882a593Smuzhiyun self.boards.AddBoard(board.Board(*brd)) 123*4882a593Smuzhiyun self.boards.SelectBoards([]) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun # Add some test settings 126*4882a593Smuzhiyun bsettings.Setup(None) 127*4882a593Smuzhiyun bsettings.AddFile(settings_data) 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun # Set up the toolchains 130*4882a593Smuzhiyun self.toolchains = toolchain.Toolchains() 131*4882a593Smuzhiyun self.toolchains.Add('arm-linux-gcc', test=False) 132*4882a593Smuzhiyun self.toolchains.Add('sparc-linux-gcc', test=False) 133*4882a593Smuzhiyun self.toolchains.Add('powerpc-linux-gcc', test=False) 134*4882a593Smuzhiyun self.toolchains.Add('gcc', test=False) 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun # Avoid sending any output 137*4882a593Smuzhiyun terminal.SetPrintTestMode() 138*4882a593Smuzhiyun self._col = terminal.Color() 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun def Make(self, commit, brd, stage, *args, **kwargs): 141*4882a593Smuzhiyun global base_dir 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun result = command.CommandResult() 144*4882a593Smuzhiyun boardnum = int(brd.target[-1]) 145*4882a593Smuzhiyun result.return_code = 0 146*4882a593Smuzhiyun result.stderr = '' 147*4882a593Smuzhiyun result.stdout = ('This is the test output for board %s, commit %s' % 148*4882a593Smuzhiyun (brd.target, commit.hash)) 149*4882a593Smuzhiyun if ((boardnum >= 1 and boardnum >= commit.sequence) or 150*4882a593Smuzhiyun boardnum == 4 and commit.sequence == 6): 151*4882a593Smuzhiyun result.return_code = commit.return_code 152*4882a593Smuzhiyun result.stderr = (''.join(commit.error_list) 153*4882a593Smuzhiyun % {'basedir' : base_dir + '/.bm-work/00/'}) 154*4882a593Smuzhiyun if stage == 'build': 155*4882a593Smuzhiyun target_dir = None 156*4882a593Smuzhiyun for arg in args: 157*4882a593Smuzhiyun if arg.startswith('O='): 158*4882a593Smuzhiyun target_dir = arg[2:] 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun if not os.path.isdir(target_dir): 161*4882a593Smuzhiyun os.mkdir(target_dir) 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun result.combined = result.stdout + result.stderr 164*4882a593Smuzhiyun return result 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun def assertSummary(self, text, arch, plus, boards, ok=False): 167*4882a593Smuzhiyun col = self._col 168*4882a593Smuzhiyun expected_colour = col.GREEN if ok else col.RED 169*4882a593Smuzhiyun expect = '%10s: ' % arch 170*4882a593Smuzhiyun # TODO(sjg@chromium.org): If plus is '', we shouldn't need this 171*4882a593Smuzhiyun expect += ' ' + col.Color(expected_colour, plus) 172*4882a593Smuzhiyun expect += ' ' 173*4882a593Smuzhiyun for board in boards: 174*4882a593Smuzhiyun expect += col.Color(expected_colour, ' %s' % board) 175*4882a593Smuzhiyun self.assertEqual(text, expect) 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun def testOutput(self): 178*4882a593Smuzhiyun """Test basic builder operation and output 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun This does a line-by-line verification of the summary output. 181*4882a593Smuzhiyun """ 182*4882a593Smuzhiyun global base_dir 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun base_dir = tempfile.mkdtemp() 185*4882a593Smuzhiyun if not os.path.isdir(base_dir): 186*4882a593Smuzhiyun os.mkdir(base_dir) 187*4882a593Smuzhiyun build = builder.Builder(self.toolchains, base_dir, None, 1, 2, 188*4882a593Smuzhiyun checkout=False, show_unknown=False) 189*4882a593Smuzhiyun build.do_make = self.Make 190*4882a593Smuzhiyun board_selected = self.boards.GetSelectedDict() 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun build.BuildBoards(self.commits, board_selected, keep_outputs=False, 193*4882a593Smuzhiyun verbose=False) 194*4882a593Smuzhiyun lines = terminal.GetPrintTestLines() 195*4882a593Smuzhiyun count = 0 196*4882a593Smuzhiyun for line in lines: 197*4882a593Smuzhiyun if line.text.strip(): 198*4882a593Smuzhiyun count += 1 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun # We should get two starting messages, then an update for every commit 201*4882a593Smuzhiyun # built. 202*4882a593Smuzhiyun self.assertEqual(count, len(commits) * len(boards) + 2) 203*4882a593Smuzhiyun build.SetDisplayOptions(show_errors=True); 204*4882a593Smuzhiyun build.ShowSummary(self.commits, board_selected) 205*4882a593Smuzhiyun #terminal.EchoPrintTestLines() 206*4882a593Smuzhiyun lines = terminal.GetPrintTestLines() 207*4882a593Smuzhiyun self.assertEqual(lines[0].text, '01: %s' % commits[0][1]) 208*4882a593Smuzhiyun self.assertEqual(lines[1].text, '02: %s' % commits[1][1]) 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun # We expect all archs to fail 211*4882a593Smuzhiyun col = terminal.Color() 212*4882a593Smuzhiyun self.assertSummary(lines[2].text, 'sandbox', '+', ['board4']) 213*4882a593Smuzhiyun self.assertSummary(lines[3].text, 'arm', '+', ['board1']) 214*4882a593Smuzhiyun self.assertSummary(lines[4].text, 'powerpc', '+', ['board2', 'board3']) 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun # Now we should have the compiler warning 217*4882a593Smuzhiyun self.assertEqual(lines[5].text, 'w+%s' % 218*4882a593Smuzhiyun errors[0].rstrip().replace('\n', '\nw+')) 219*4882a593Smuzhiyun self.assertEqual(lines[5].colour, col.MAGENTA) 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun self.assertEqual(lines[6].text, '03: %s' % commits[2][1]) 222*4882a593Smuzhiyun self.assertSummary(lines[7].text, 'sandbox', '+', ['board4']) 223*4882a593Smuzhiyun self.assertSummary(lines[8].text, 'arm', '', ['board1'], ok=True) 224*4882a593Smuzhiyun self.assertSummary(lines[9].text, 'powerpc', '+', ['board2', 'board3']) 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun # Compiler error 227*4882a593Smuzhiyun self.assertEqual(lines[10].text, '+%s' % 228*4882a593Smuzhiyun errors[1].rstrip().replace('\n', '\n+')) 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun self.assertEqual(lines[11].text, '04: %s' % commits[3][1]) 231*4882a593Smuzhiyun self.assertSummary(lines[12].text, 'sandbox', '', ['board4'], ok=True) 232*4882a593Smuzhiyun self.assertSummary(lines[13].text, 'powerpc', '', ['board2', 'board3'], 233*4882a593Smuzhiyun ok=True) 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun # Compile error fixed 236*4882a593Smuzhiyun self.assertEqual(lines[14].text, '-%s' % 237*4882a593Smuzhiyun errors[1].rstrip().replace('\n', '\n-')) 238*4882a593Smuzhiyun self.assertEqual(lines[14].colour, col.GREEN) 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun self.assertEqual(lines[15].text, 'w+%s' % 241*4882a593Smuzhiyun errors[2].rstrip().replace('\n', '\nw+')) 242*4882a593Smuzhiyun self.assertEqual(lines[15].colour, col.MAGENTA) 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun self.assertEqual(lines[16].text, '05: %s' % commits[4][1]) 245*4882a593Smuzhiyun self.assertSummary(lines[17].text, 'sandbox', '+', ['board4']) 246*4882a593Smuzhiyun self.assertSummary(lines[18].text, 'powerpc', '', ['board3'], ok=True) 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun # The second line of errors[3] is a duplicate, so buildman will drop it 249*4882a593Smuzhiyun expect = errors[3].rstrip().split('\n') 250*4882a593Smuzhiyun expect = [expect[0]] + expect[2:] 251*4882a593Smuzhiyun self.assertEqual(lines[19].text, '+%s' % 252*4882a593Smuzhiyun '\n'.join(expect).replace('\n', '\n+')) 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun self.assertEqual(lines[20].text, 'w-%s' % 255*4882a593Smuzhiyun errors[2].rstrip().replace('\n', '\nw-')) 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun self.assertEqual(lines[21].text, '06: %s' % commits[5][1]) 258*4882a593Smuzhiyun self.assertSummary(lines[22].text, 'sandbox', '', ['board4'], ok=True) 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun # The second line of errors[3] is a duplicate, so buildman will drop it 261*4882a593Smuzhiyun expect = errors[3].rstrip().split('\n') 262*4882a593Smuzhiyun expect = [expect[0]] + expect[2:] 263*4882a593Smuzhiyun self.assertEqual(lines[23].text, '-%s' % 264*4882a593Smuzhiyun '\n'.join(expect).replace('\n', '\n-')) 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun self.assertEqual(lines[24].text, 'w-%s' % 267*4882a593Smuzhiyun errors[0].rstrip().replace('\n', '\nw-')) 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun self.assertEqual(lines[25].text, '07: %s' % commits[6][1]) 270*4882a593Smuzhiyun self.assertSummary(lines[26].text, 'sandbox', '+', ['board4']) 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun # Pick out the correct error lines 273*4882a593Smuzhiyun expect_str = errors[4].rstrip().replace('%(basedir)s', '').split('\n') 274*4882a593Smuzhiyun expect = expect_str[3:8] + [expect_str[-1]] 275*4882a593Smuzhiyun self.assertEqual(lines[27].text, '+%s' % 276*4882a593Smuzhiyun '\n'.join(expect).replace('\n', '\n+')) 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun # Now the warnings lines 279*4882a593Smuzhiyun expect = [expect_str[0]] + expect_str[10:12] + [expect_str[9]] 280*4882a593Smuzhiyun self.assertEqual(lines[28].text, 'w+%s' % 281*4882a593Smuzhiyun '\n'.join(expect).replace('\n', '\nw+')) 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun self.assertEqual(len(lines), 29) 284*4882a593Smuzhiyun shutil.rmtree(base_dir) 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun def _testGit(self): 287*4882a593Smuzhiyun """Test basic builder operation by building a branch""" 288*4882a593Smuzhiyun base_dir = tempfile.mkdtemp() 289*4882a593Smuzhiyun if not os.path.isdir(base_dir): 290*4882a593Smuzhiyun os.mkdir(base_dir) 291*4882a593Smuzhiyun options = Options() 292*4882a593Smuzhiyun options.git = os.getcwd() 293*4882a593Smuzhiyun options.summary = False 294*4882a593Smuzhiyun options.jobs = None 295*4882a593Smuzhiyun options.dry_run = False 296*4882a593Smuzhiyun #options.git = os.path.join(base_dir, 'repo') 297*4882a593Smuzhiyun options.branch = 'test-buildman' 298*4882a593Smuzhiyun options.force_build = False 299*4882a593Smuzhiyun options.list_tool_chains = False 300*4882a593Smuzhiyun options.count = -1 301*4882a593Smuzhiyun options.git_dir = None 302*4882a593Smuzhiyun options.threads = None 303*4882a593Smuzhiyun options.show_unknown = False 304*4882a593Smuzhiyun options.quick = False 305*4882a593Smuzhiyun options.show_errors = False 306*4882a593Smuzhiyun options.keep_outputs = False 307*4882a593Smuzhiyun args = ['tegra20'] 308*4882a593Smuzhiyun control.DoBuildman(options, args) 309*4882a593Smuzhiyun shutil.rmtree(base_dir) 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun def testBoardSingle(self): 312*4882a593Smuzhiyun """Test single board selection""" 313*4882a593Smuzhiyun self.assertEqual(self.boards.SelectBoards(['sandbox']), 314*4882a593Smuzhiyun {'all': 1, 'sandbox': 1}) 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun def testBoardArch(self): 317*4882a593Smuzhiyun """Test single board selection""" 318*4882a593Smuzhiyun self.assertEqual(self.boards.SelectBoards(['arm']), 319*4882a593Smuzhiyun {'all': 2, 'arm': 2}) 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun def testBoardArchSingle(self): 322*4882a593Smuzhiyun """Test single board selection""" 323*4882a593Smuzhiyun self.assertEqual(self.boards.SelectBoards(['arm sandbox']), 324*4882a593Smuzhiyun {'all': 3, 'arm': 2, 'sandbox' : 1}) 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun def testBoardArchSingleMultiWord(self): 327*4882a593Smuzhiyun """Test single board selection""" 328*4882a593Smuzhiyun self.assertEqual(self.boards.SelectBoards(['arm', 'sandbox']), 329*4882a593Smuzhiyun {'all': 3, 'arm': 2, 'sandbox' : 1}) 330*4882a593Smuzhiyun 331*4882a593Smuzhiyun def testBoardSingleAnd(self): 332*4882a593Smuzhiyun """Test single board selection""" 333*4882a593Smuzhiyun self.assertEqual(self.boards.SelectBoards(['Tester & arm']), 334*4882a593Smuzhiyun {'all': 2, 'Tester&arm': 2}) 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun def testBoardTwoAnd(self): 337*4882a593Smuzhiyun """Test single board selection""" 338*4882a593Smuzhiyun self.assertEqual(self.boards.SelectBoards(['Tester', '&', 'arm', 339*4882a593Smuzhiyun 'Tester' '&', 'powerpc', 340*4882a593Smuzhiyun 'sandbox']), 341*4882a593Smuzhiyun {'all': 5, 'Tester&powerpc': 2, 'Tester&arm': 2, 342*4882a593Smuzhiyun 'sandbox' : 1}) 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun def testBoardAll(self): 345*4882a593Smuzhiyun """Test single board selection""" 346*4882a593Smuzhiyun self.assertEqual(self.boards.SelectBoards([]), {'all': 5}) 347*4882a593Smuzhiyun 348*4882a593Smuzhiyun def testBoardRegularExpression(self): 349*4882a593Smuzhiyun """Test single board selection""" 350*4882a593Smuzhiyun self.assertEqual(self.boards.SelectBoards(['T.*r&^Po']), 351*4882a593Smuzhiyun {'T.*r&^Po': 2, 'all': 2}) 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun def testBoardDuplicate(self): 354*4882a593Smuzhiyun """Test single board selection""" 355*4882a593Smuzhiyun self.assertEqual(self.boards.SelectBoards(['sandbox sandbox', 356*4882a593Smuzhiyun 'sandbox']), 357*4882a593Smuzhiyun {'all': 1, 'sandbox': 1}) 358*4882a593Smuzhiyun def CheckDirs(self, build, dirname): 359*4882a593Smuzhiyun self.assertEqual('base%s' % dirname, build._GetOutputDir(1)) 360*4882a593Smuzhiyun self.assertEqual('base%s/fred' % dirname, 361*4882a593Smuzhiyun build.GetBuildDir(1, 'fred')) 362*4882a593Smuzhiyun self.assertEqual('base%s/fred/done' % dirname, 363*4882a593Smuzhiyun build.GetDoneFile(1, 'fred')) 364*4882a593Smuzhiyun self.assertEqual('base%s/fred/u-boot.sizes' % dirname, 365*4882a593Smuzhiyun build.GetFuncSizesFile(1, 'fred', 'u-boot')) 366*4882a593Smuzhiyun self.assertEqual('base%s/fred/u-boot.objdump' % dirname, 367*4882a593Smuzhiyun build.GetObjdumpFile(1, 'fred', 'u-boot')) 368*4882a593Smuzhiyun self.assertEqual('base%s/fred/err' % dirname, 369*4882a593Smuzhiyun build.GetErrFile(1, 'fred')) 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun def testOutputDir(self): 372*4882a593Smuzhiyun build = builder.Builder(self.toolchains, BASE_DIR, None, 1, 2, 373*4882a593Smuzhiyun checkout=False, show_unknown=False) 374*4882a593Smuzhiyun build.commits = self.commits 375*4882a593Smuzhiyun build.commit_count = len(self.commits) 376*4882a593Smuzhiyun subject = self.commits[1].subject.translate(builder.trans_valid_chars) 377*4882a593Smuzhiyun dirname ='/%02d_of_%02d_g%s_%s' % (2, build.commit_count, commits[1][0], 378*4882a593Smuzhiyun subject[:20]) 379*4882a593Smuzhiyun self.CheckDirs(build, dirname) 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun def testOutputDirCurrent(self): 382*4882a593Smuzhiyun build = builder.Builder(self.toolchains, BASE_DIR, None, 1, 2, 383*4882a593Smuzhiyun checkout=False, show_unknown=False) 384*4882a593Smuzhiyun build.commits = None 385*4882a593Smuzhiyun build.commit_count = 0 386*4882a593Smuzhiyun self.CheckDirs(build, '/current') 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun def testOutputDirNoSubdirs(self): 389*4882a593Smuzhiyun build = builder.Builder(self.toolchains, BASE_DIR, None, 1, 2, 390*4882a593Smuzhiyun checkout=False, show_unknown=False, 391*4882a593Smuzhiyun no_subdirs=True) 392*4882a593Smuzhiyun build.commits = None 393*4882a593Smuzhiyun build.commit_count = 0 394*4882a593Smuzhiyun self.CheckDirs(build, '') 395*4882a593Smuzhiyun 396*4882a593Smuzhiyun def testToolchainAliases(self): 397*4882a593Smuzhiyun self.assertTrue(self.toolchains.Select('arm') != None) 398*4882a593Smuzhiyun with self.assertRaises(ValueError): 399*4882a593Smuzhiyun self.toolchains.Select('no-arch') 400*4882a593Smuzhiyun with self.assertRaises(ValueError): 401*4882a593Smuzhiyun self.toolchains.Select('x86') 402*4882a593Smuzhiyun 403*4882a593Smuzhiyun self.toolchains = toolchain.Toolchains() 404*4882a593Smuzhiyun self.toolchains.Add('x86_64-linux-gcc', test=False) 405*4882a593Smuzhiyun self.assertTrue(self.toolchains.Select('x86') != None) 406*4882a593Smuzhiyun 407*4882a593Smuzhiyun self.toolchains = toolchain.Toolchains() 408*4882a593Smuzhiyun self.toolchains.Add('i386-linux-gcc', test=False) 409*4882a593Smuzhiyun self.assertTrue(self.toolchains.Select('x86') != None) 410*4882a593Smuzhiyun 411*4882a593Smuzhiyun def testToolchainDownload(self): 412*4882a593Smuzhiyun """Test that we can download toolchains""" 413*4882a593Smuzhiyun self.assertEqual('https://www.kernel.org/pub/tools/crosstool/files/bin/x86_64/4.9.0/x86_64-gcc-4.9.0-nolibc_arm-unknown-linux-gnueabi.tar.xz', 414*4882a593Smuzhiyun self.toolchains.LocateArchUrl('arm')) 415*4882a593Smuzhiyun 416*4882a593Smuzhiyun 417*4882a593Smuzhiyunif __name__ == "__main__": 418*4882a593Smuzhiyun unittest.main() 419