1fc3fe1c2SSimon Glass# 2fc3fe1c2SSimon Glass# Copyright (c) 2012 The Chromium OS Authors. 3fc3fe1c2SSimon Glass# 41a459660SWolfgang Denk# SPDX-License-Identifier: GPL-2.0+ 5fc3fe1c2SSimon Glass# 6fc3fe1c2SSimon Glass 7fc3fe1c2SSimon Glassimport os 8fc3fe1c2SSimon Glassimport shutil 9fc3fe1c2SSimon Glassimport sys 10fc3fe1c2SSimon Glassimport tempfile 11fc3fe1c2SSimon Glassimport time 12fc3fe1c2SSimon Glassimport unittest 13fc3fe1c2SSimon Glass 14fc3fe1c2SSimon Glass# Bring in the patman libraries 15fc3fe1c2SSimon Glassour_path = os.path.dirname(os.path.realpath(__file__)) 16fc3fe1c2SSimon Glasssys.path.append(os.path.join(our_path, '../patman')) 17fc3fe1c2SSimon Glass 18fc3fe1c2SSimon Glassimport board 19fc3fe1c2SSimon Glassimport bsettings 20fc3fe1c2SSimon Glassimport builder 21fc3fe1c2SSimon Glassimport control 22fc3fe1c2SSimon Glassimport command 23fc3fe1c2SSimon Glassimport commit 24fc3fe1c2SSimon Glassimport toolchain 25fc3fe1c2SSimon Glass 26fc3fe1c2SSimon Glasserrors = [ 27fc3fe1c2SSimon Glass '''main.c: In function 'main_loop': 28fc3fe1c2SSimon Glassmain.c:260:6: warning: unused variable 'joe' [-Wunused-variable] 29fc3fe1c2SSimon Glass''', 30fc3fe1c2SSimon Glass '''main.c: In function 'main_loop': 31fc3fe1c2SSimon Glassmain.c:295:2: error: 'fred' undeclared (first use in this function) 32fc3fe1c2SSimon Glassmain.c:295:2: note: each undeclared identifier is reported only once for each function it appears in 33fc3fe1c2SSimon Glassmake[1]: *** [main.o] Error 1 34fc3fe1c2SSimon Glassmake: *** [common/libcommon.o] Error 2 35fc3fe1c2SSimon GlassMake failed 36fc3fe1c2SSimon Glass''', 37fc3fe1c2SSimon Glass '''main.c: In function 'main_loop': 38fc3fe1c2SSimon Glassmain.c:280:6: warning: unused variable 'mary' [-Wunused-variable] 39fc3fe1c2SSimon Glass''', 40fc3fe1c2SSimon Glass '''powerpc-linux-ld: warning: dot moved backwards before `.bss' 41fc3fe1c2SSimon Glasspowerpc-linux-ld: warning: dot moved backwards before `.bss' 42fc3fe1c2SSimon Glasspowerpc-linux-ld: u-boot: section .text lma 0xfffc0000 overlaps previous sections 43fc3fe1c2SSimon Glasspowerpc-linux-ld: u-boot: section .rodata lma 0xfffef3ec overlaps previous sections 44fc3fe1c2SSimon Glasspowerpc-linux-ld: u-boot: section .reloc lma 0xffffa400 overlaps previous sections 45fc3fe1c2SSimon Glasspowerpc-linux-ld: u-boot: section .data lma 0xffffcd38 overlaps previous sections 46fc3fe1c2SSimon Glasspowerpc-linux-ld: u-boot: section .u_boot_cmd lma 0xffffeb40 overlaps previous sections 47fc3fe1c2SSimon Glasspowerpc-linux-ld: u-boot: section .bootpg lma 0xfffff198 overlaps previous sections 48fc3fe1c2SSimon Glass''' 49fc3fe1c2SSimon Glass] 50fc3fe1c2SSimon Glass 51fc3fe1c2SSimon Glass 52fc3fe1c2SSimon Glass# hash, subject, return code, list of errors/warnings 53fc3fe1c2SSimon Glasscommits = [ 54fc3fe1c2SSimon Glass ['1234', 'upstream/master, ok', 0, []], 55fc3fe1c2SSimon Glass ['5678', 'Second commit, a warning', 0, errors[0:1]], 56fc3fe1c2SSimon Glass ['9012', 'Third commit, error', 1, errors[0:2]], 57fc3fe1c2SSimon Glass ['3456', 'Fourth commit, warning', 0, [errors[0], errors[2]]], 58fc3fe1c2SSimon Glass ['7890', 'Fifth commit, link errors', 1, [errors[0], errors[3]]], 59fc3fe1c2SSimon Glass ['abcd', 'Sixth commit, fixes all errors', 0, []] 60fc3fe1c2SSimon Glass] 61fc3fe1c2SSimon Glass 62fc3fe1c2SSimon Glassboards = [ 63e19d5781SSimon Glass ['Active', 'arm', 'armv7', '', 'Tester', 'ARM Board 1', 'board0', ''], 64e19d5781SSimon Glass ['Active', 'arm', 'armv7', '', 'Tester', 'ARM Board 2', 'board1', ''], 65e19d5781SSimon Glass ['Active', 'powerpc', 'powerpc', '', 'Tester', 'PowerPC board 1', 'board2', ''], 66e19d5781SSimon Glass ['Active', 'powerpc', 'mpc5xx', '', 'Tester', 'PowerPC board 2', 'board3', ''], 67e19d5781SSimon Glass ['Active', 'sandbox', 'sandbox', '', 'Tester', 'Sandbox board', 'board4', ''], 68fc3fe1c2SSimon Glass] 69fc3fe1c2SSimon Glass 70fc3fe1c2SSimon Glassclass Options: 71fc3fe1c2SSimon Glass """Class that holds build options""" 72fc3fe1c2SSimon Glass pass 73fc3fe1c2SSimon Glass 74fc3fe1c2SSimon Glassclass TestBuild(unittest.TestCase): 75fc3fe1c2SSimon Glass """Test buildman 76fc3fe1c2SSimon Glass 77fc3fe1c2SSimon Glass TODO: Write tests for the rest of the functionality 78fc3fe1c2SSimon Glass """ 79fc3fe1c2SSimon Glass def setUp(self): 80fc3fe1c2SSimon Glass # Set up commits to build 81fc3fe1c2SSimon Glass self.commits = [] 82fc3fe1c2SSimon Glass sequence = 0 83fc3fe1c2SSimon Glass for commit_info in commits: 84fc3fe1c2SSimon Glass comm = commit.Commit(commit_info[0]) 85fc3fe1c2SSimon Glass comm.subject = commit_info[1] 86fc3fe1c2SSimon Glass comm.return_code = commit_info[2] 87fc3fe1c2SSimon Glass comm.error_list = commit_info[3] 88fc3fe1c2SSimon Glass comm.sequence = sequence 89fc3fe1c2SSimon Glass sequence += 1 90fc3fe1c2SSimon Glass self.commits.append(comm) 91fc3fe1c2SSimon Glass 92fc3fe1c2SSimon Glass # Set up boards to build 93fc3fe1c2SSimon Glass self.boards = board.Boards() 94fc3fe1c2SSimon Glass for brd in boards: 95fc3fe1c2SSimon Glass self.boards.AddBoard(board.Board(*brd)) 96fc3fe1c2SSimon Glass self.boards.SelectBoards([]) 97fc3fe1c2SSimon Glass 98fc3fe1c2SSimon Glass # Set up the toolchains 99fc3fe1c2SSimon Glass bsettings.Setup() 100fc3fe1c2SSimon Glass self.toolchains = toolchain.Toolchains() 101fc3fe1c2SSimon Glass self.toolchains.Add('arm-linux-gcc', test=False) 102fc3fe1c2SSimon Glass self.toolchains.Add('sparc-linux-gcc', test=False) 103fc3fe1c2SSimon Glass self.toolchains.Add('powerpc-linux-gcc', test=False) 104fc3fe1c2SSimon Glass self.toolchains.Add('gcc', test=False) 105fc3fe1c2SSimon Glass 106fc3fe1c2SSimon Glass def Make(self, commit, brd, stage, *args, **kwargs): 107fc3fe1c2SSimon Glass result = command.CommandResult() 108fc3fe1c2SSimon Glass boardnum = int(brd.target[-1]) 109fc3fe1c2SSimon Glass result.return_code = 0 110fc3fe1c2SSimon Glass result.stderr = '' 111fc3fe1c2SSimon Glass result.stdout = ('This is the test output for board %s, commit %s' % 112fc3fe1c2SSimon Glass (brd.target, commit.hash)) 113fc3fe1c2SSimon Glass if boardnum >= 1 and boardnum >= commit.sequence: 114fc3fe1c2SSimon Glass result.return_code = commit.return_code 115fc3fe1c2SSimon Glass result.stderr = ''.join(commit.error_list) 116fc3fe1c2SSimon Glass if stage == 'build': 117fc3fe1c2SSimon Glass target_dir = None 118fc3fe1c2SSimon Glass for arg in args: 119fc3fe1c2SSimon Glass if arg.startswith('O='): 120fc3fe1c2SSimon Glass target_dir = arg[2:] 121fc3fe1c2SSimon Glass 122fc3fe1c2SSimon Glass if not os.path.isdir(target_dir): 123fc3fe1c2SSimon Glass os.mkdir(target_dir) 124fc3fe1c2SSimon Glass #time.sleep(.2 + boardnum * .2) 125fc3fe1c2SSimon Glass 126fc3fe1c2SSimon Glass result.combined = result.stdout + result.stderr 127fc3fe1c2SSimon Glass return result 128fc3fe1c2SSimon Glass 129fc3fe1c2SSimon Glass def testBasic(self): 130fc3fe1c2SSimon Glass """Test basic builder operation""" 131fc3fe1c2SSimon Glass output_dir = tempfile.mkdtemp() 132fc3fe1c2SSimon Glass if not os.path.isdir(output_dir): 133fc3fe1c2SSimon Glass os.mkdir(output_dir) 134fc3fe1c2SSimon Glass build = builder.Builder(self.toolchains, output_dir, None, 1, 2, 135fc3fe1c2SSimon Glass checkout=False, show_unknown=False) 136fc3fe1c2SSimon Glass build.do_make = self.Make 137fc3fe1c2SSimon Glass board_selected = self.boards.GetSelectedDict() 138fc3fe1c2SSimon Glass 139fc3fe1c2SSimon Glass #build.BuildCommits(self.commits, board_selected, False) 140*b2ea7ab2SSimon Glass build.BuildBoards(self.commits, board_selected, False) 141*b2ea7ab2SSimon Glass build.SetDisplayOptions(show_errors=True); 142*b2ea7ab2SSimon Glass build.ShowSummary(self.commits, board_selected) 143fc3fe1c2SSimon Glass 144fc3fe1c2SSimon Glass def _testGit(self): 145fc3fe1c2SSimon Glass """Test basic builder operation by building a branch""" 146fc3fe1c2SSimon Glass base_dir = tempfile.mkdtemp() 147fc3fe1c2SSimon Glass if not os.path.isdir(base_dir): 148fc3fe1c2SSimon Glass os.mkdir(base_dir) 149fc3fe1c2SSimon Glass options = Options() 150fc3fe1c2SSimon Glass options.git = os.getcwd() 151fc3fe1c2SSimon Glass options.summary = False 152fc3fe1c2SSimon Glass options.jobs = None 153fc3fe1c2SSimon Glass options.dry_run = False 154fc3fe1c2SSimon Glass #options.git = os.path.join(base_dir, 'repo') 155fc3fe1c2SSimon Glass options.branch = 'test-buildman' 156fc3fe1c2SSimon Glass options.force_build = False 157fc3fe1c2SSimon Glass options.list_tool_chains = False 158fc3fe1c2SSimon Glass options.count = -1 159fc3fe1c2SSimon Glass options.git_dir = None 160fc3fe1c2SSimon Glass options.threads = None 161fc3fe1c2SSimon Glass options.show_unknown = False 162fc3fe1c2SSimon Glass options.quick = False 163fc3fe1c2SSimon Glass options.show_errors = False 164fc3fe1c2SSimon Glass options.keep_outputs = False 165fc3fe1c2SSimon Glass args = ['tegra20'] 166fc3fe1c2SSimon Glass control.DoBuildman(options, args) 167fc3fe1c2SSimon Glass 168fc3fe1c2SSimon Glassif __name__ == "__main__": 169fc3fe1c2SSimon Glass unittest.main() 170