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