xref: /rk3399_rockchip-uboot/tools/buildman/test.py (revision b2ea7ab25258621871db1f884be1a2f2b1641741)
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