Просмотр исходного кода

buildman: Allow tests to have their own boards

Rather than reading boards.cfg, which may take time to generate and is not
necessarily suitable for running tests, create our own list of boards.

Signed-off-by: Simon Glass <sjg@chromium.org>
Simon Glass 10 лет назад
Родитель
Сommit
823e60b62a
2 измененных файлов с 31 добавлено и 10 удалено
  1. 12 9
      tools/buildman/control.py
  2. 19 1
      tools/buildman/func_test.py

+ 12 - 9
tools/buildman/control.py

@@ -78,7 +78,7 @@ def ShowActions(series, why_selected, boards_selected, builder, options):
     print ('Total boards to build for each commit: %d\n' %
     print ('Total boards to build for each commit: %d\n' %
             why_selected['all'])
             why_selected['all'])
 
 
-def DoBuildman(options, args, toolchains=None, make_func=None):
+def DoBuildman(options, args, toolchains=None, make_func=None, boards=None):
     """The main control code for buildman
     """The main control code for buildman
 
 
     Args:
     Args:
@@ -90,6 +90,8 @@ def DoBuildman(options, args, toolchains=None, make_func=None):
                 to execute 'make'. If this is None, the normal function
                 to execute 'make'. If this is None, the normal function
                 will be used, which calls the 'make' tool with suitable
                 will be used, which calls the 'make' tool with suitable
                 arguments. This setting is useful for tests.
                 arguments. This setting is useful for tests.
+        board: Boards() object to use, containing a list of available
+                boards. If this is None it will be created and scanned.
     """
     """
     if options.full_help:
     if options.full_help:
         pager = os.getenv('PAGER')
         pager = os.getenv('PAGER')
@@ -135,14 +137,15 @@ def DoBuildman(options, args, toolchains=None, make_func=None):
         sys.exit(col.Color(col.RED, str))
         sys.exit(col.Color(col.RED, str))
 
 
     # Work out what subset of the boards we are building
     # Work out what subset of the boards we are building
-    board_file = os.path.join(options.git, 'boards.cfg')
-    status = subprocess.call([os.path.join(options.git,
-                                           'tools/genboardscfg.py')])
-    if status != 0:
-        sys.exit("Failed to generate boards.cfg")
-
-    boards = board.Boards()
-    boards.ReadBoards(os.path.join(options.git, 'boards.cfg'))
+    if not boards:
+        board_file = os.path.join(options.git, 'boards.cfg')
+        status = subprocess.call([os.path.join(options.git,
+                                                'tools/genboardscfg.py')])
+        if status != 0:
+                sys.exit("Failed to generate boards.cfg")
+
+        boards = board.Boards()
+        boards.ReadBoards(os.path.join(options.git, 'boards.cfg'))
 
 
     exclude = []
     exclude = []
     if options.exclude:
     if options.exclude:

+ 19 - 1
tools/buildman/func_test.py

@@ -10,6 +10,7 @@ import sys
 import tempfile
 import tempfile
 import unittest
 import unittest
 
 
+import board
 import bsettings
 import bsettings
 import cmdline
 import cmdline
 import command
 import command
@@ -34,6 +35,14 @@ chromeos_daisy=VBOOT=${chroot}/build/daisy/usr ${vboot}
 chromeos_peach=VBOOT=${chroot}/build/peach_pit/usr ${vboot}
 chromeos_peach=VBOOT=${chroot}/build/peach_pit/usr ${vboot}
 '''
 '''
 
 
+boards = [
+    ['Active', 'arm', 'armv7', '', 'Tester', 'ARM Board 1', 'board0',  ''],
+    ['Active', 'arm', 'armv7', '', 'Tester', 'ARM Board 2', 'board1', ''],
+    ['Active', 'powerpc', 'powerpc', '', 'Tester', 'PowerPC board 1', 'board2', ''],
+    ['Active', 'powerpc', 'mpc5xx', '', 'Tester', 'PowerPC board 2', 'board3', ''],
+    ['Active', 'sandbox', 'sandbox', '', 'Tester', 'Sandbox board', 'board4', ''],
+]
+
 class TestFunctional(unittest.TestCase):
 class TestFunctional(unittest.TestCase):
     """Functional test for buildman.
     """Functional test for buildman.
 
 
@@ -55,6 +64,9 @@ class TestFunctional(unittest.TestCase):
         self._toolchains.Add('gcc', test=False)
         self._toolchains.Add('gcc', test=False)
         bsettings.Setup(None)
         bsettings.Setup(None)
         bsettings.AddFile(settings_data)
         bsettings.AddFile(settings_data)
+        self._boards = board.Boards()
+        for brd in boards:
+            self._boards.AddBoard(board.Board(*brd))
 
 
     def tearDown(self):
     def tearDown(self):
         shutil.rmtree(self._base_dir)
         shutil.rmtree(self._base_dir)
@@ -67,7 +79,7 @@ class TestFunctional(unittest.TestCase):
         sys.argv = [sys.argv[0]] + list(args)
         sys.argv = [sys.argv[0]] + list(args)
         options, args = cmdline.ParseArgs()
         options, args = cmdline.ParseArgs()
         return control.DoBuildman(options, args, toolchains=self._toolchains,
         return control.DoBuildman(options, args, toolchains=self._toolchains,
-                make_func=self._HandleMake)
+                make_func=self._HandleMake, boards=self._boards)
 
 
     def testFullHelp(self):
     def testFullHelp(self):
         command.test_result = None
         command.test_result = None
@@ -194,6 +206,12 @@ class TestFunctional(unittest.TestCase):
         print 'make', stage
         print 'make', stage
         sys.exit(1)
         sys.exit(1)
 
 
+    def testNoBoards(self):
+        """Test that buildman aborts when there are no boards"""
+        self._boards = board.Boards()
+        with self.assertRaises(SystemExit):
+            self._RunControl()
+
     def testCurrentSource(self):
     def testCurrentSource(self):
         """Very simple test to invoke buildman on the current source"""
         """Very simple test to invoke buildman on the current source"""
         self._RunControl()
         self._RunControl()