buildman: Show boards with warning with w+

At present we should boards with warnings in the same way as those with
errors. This is not ideal. Add a new 'warn' state and show these listed
in yellow to match the actual warning lines printing with -e.

Signed-off-by: Simon Glass <sjg@chromium.org>
diff --git a/tools/buildman/builder.py b/tools/buildman/builder.py
index d9d86ef..6a6c83b 100644
--- a/tools/buildman/builder.py
+++ b/tools/buildman/builder.py
@@ -1197,6 +1197,7 @@
 
 
         ok_boards = []      # List of boards fixed since last commit
+        warn_boards = []    # List of boards with warnings since last commit
         err_boards = []     # List of new broken boards since last commit
         new_boards = []     # List of boards that didn't exist last time
         unknown_boards = [] # List of boards that were not built
@@ -1212,9 +1213,15 @@
                 if outcome.rc == OUTCOME_UNKNOWN:
                     unknown_boards.append(target)
                 elif outcome.rc < base_outcome:
-                    ok_boards.append(target)
+                    if outcome.rc == OUTCOME_WARNING:
+                        warn_boards.append(target)
+                    else:
+                        ok_boards.append(target)
                 elif outcome.rc > base_outcome:
-                    err_boards.append(target)
+                    if outcome.rc == OUTCOME_WARNING:
+                        warn_boards.append(target)
+                    else:
+                        err_boards.append(target)
             else:
                 new_boards.append(target)
 
@@ -1225,11 +1232,13 @@
                 self._base_warn_line_boards, warn_lines, warn_line_boards, 'w')
 
         # Display results by arch
-        if any((ok_boards, err_boards, unknown_boards, new_boards, worse_err,
-                better_err, worse_warn, better_warn)):
+        if any((ok_boards, warn_boards, err_boards, unknown_boards, new_boards,
+                worse_err, better_err, worse_warn, better_warn)):
             arch_list = {}
             self.AddOutcome(board_selected, arch_list, ok_boards, '',
                     self.col.GREEN)
+            self.AddOutcome(board_selected, arch_list, warn_boards, 'w+',
+                    self.col.YELLOW)
             self.AddOutcome(board_selected, arch_list, err_boards, '+',
                     self.col.RED)
             self.AddOutcome(board_selected, arch_list, new_boards, '*', self.col.BLUE)
diff --git a/tools/buildman/test.py b/tools/buildman/test.py
index 5c82c50..de02f61 100644
--- a/tools/buildman/test.py
+++ b/tools/buildman/test.py
@@ -97,6 +97,8 @@
 
 BASE_DIR = 'base'
 
+OUTCOME_OK, OUTCOME_WARN, OUTCOME_ERR = range(3)
+
 class Options:
     """Class that holds build options"""
     pass
@@ -166,9 +168,10 @@
         result.combined = result.stdout + result.stderr
         return result
 
-    def assertSummary(self, text, arch, plus, boards, ok=False):
+    def assertSummary(self, text, arch, plus, boards, outcome=OUTCOME_ERR):
         col = self._col
-        expected_colour = col.GREEN if ok else col.RED
+        expected_colour = (col.GREEN if outcome == OUTCOME_OK else
+                           col.YELLOW if outcome == OUTCOME_WARN else col.RED)
         expect = '%10s: ' % arch
         # TODO(sjg@chromium.org): If plus is '', we shouldn't need this
         expect += ' ' + col.Color(expected_colour, plus)
@@ -192,6 +195,8 @@
         build.do_make = self.Make
         board_selected = self.boards.GetSelectedDict()
 
+        # Build the boards for the pre-defined commits and warnings/errors
+        # associated with each. This calls our Make() to inject the fake output.
         build.BuildBoards(self.commits, board_selected, keep_outputs=False,
                           verbose=False)
         lines = terminal.GetPrintTestLines()
@@ -207,33 +212,49 @@
         build.ShowSummary(self.commits, board_selected)
         #terminal.EchoPrintTestLines()
         lines = terminal.GetPrintTestLines()
+
+        # Upstream commit: no errors
         self.assertEqual(lines[0].text, '01: %s' % commits[0][1])
+
+        # Second commit: all archs should fail with warnings
         self.assertEqual(lines[1].text, '02: %s' % commits[1][1])
 
-        # We expect all archs to fail
         col = terminal.Color()
-        self.assertSummary(lines[2].text, 'sandbox', '+', ['board4'])
-        self.assertSummary(lines[3].text, 'arm', '+', ['board1'])
-        self.assertSummary(lines[4].text, 'powerpc', '+', ['board2', 'board3'])
+        self.assertSummary(lines[2].text, 'sandbox', 'w+', ['board4'],
+                           outcome=OUTCOME_WARN)
+        self.assertSummary(lines[3].text, 'arm', 'w+', ['board1'],
+                           outcome=OUTCOME_WARN)
+        self.assertSummary(lines[4].text, 'powerpc', 'w+', ['board2', 'board3'],
+                           outcome=OUTCOME_WARN)
 
-        # Now we should have the compiler warning
+        # Second commit: The warnings should be listed
         self.assertEqual(lines[5].text, 'w+%s' %
                 errors[0].rstrip().replace('\n', '\nw+'))
         self.assertEqual(lines[5].colour, col.MAGENTA)
 
+        # Third commit: Still fails
         self.assertEqual(lines[6].text, '03: %s' % commits[2][1])
         self.assertSummary(lines[7].text, 'sandbox', '+', ['board4'])
-        self.assertSummary(lines[8].text, 'arm', '', ['board1'], ok=True)
+        self.assertSummary(lines[8].text, 'arm', '', ['board1'],
+                           outcome=OUTCOME_OK)
         self.assertSummary(lines[9].text, 'powerpc', '+', ['board2', 'board3'])
 
-        # Compiler error
+        # Expect a compiler error
         self.assertEqual(lines[10].text, '+%s' %
                 errors[1].rstrip().replace('\n', '\n+'))
 
+        # Fourth commit: Compile errors are fixed, just have warning for board3
         self.assertEqual(lines[11].text, '04: %s' % commits[3][1])
-        self.assertSummary(lines[12].text, 'sandbox', '', ['board4'], ok=True)
-        self.assertSummary(lines[13].text, 'powerpc', '', ['board2', 'board3'],
-                ok=True)
+        self.assertSummary(lines[12].text, 'sandbox', 'w+', ['board4'],
+                           outcome=OUTCOME_WARN)
+        expect = '%10s: ' % 'powerpc'
+        expect += ' ' + col.Color(col.GREEN, '')
+        expect += '  '
+        expect += col.Color(col.GREEN, ' %s' % 'board2')
+        expect += ' ' + col.Color(col.YELLOW, 'w+')
+        expect += '  '
+        expect += col.Color(col.YELLOW, ' %s' % 'board3')
+        self.assertEqual(lines[13].text, expect)
 
         # Compile error fixed
         self.assertEqual(lines[14].text, '-%s' %
@@ -244,9 +265,11 @@
                 errors[2].rstrip().replace('\n', '\nw+'))
         self.assertEqual(lines[15].colour, col.MAGENTA)
 
+        # Fifth commit
         self.assertEqual(lines[16].text, '05: %s' % commits[4][1])
         self.assertSummary(lines[17].text, 'sandbox', '+', ['board4'])
-        self.assertSummary(lines[18].text, 'powerpc', '', ['board3'], ok=True)
+        self.assertSummary(lines[18].text, 'powerpc', '', ['board3'],
+                           outcome=OUTCOME_OK)
 
         # The second line of errors[3] is a duplicate, so buildman will drop it
         expect = errors[3].rstrip().split('\n')
@@ -257,8 +280,10 @@
         self.assertEqual(lines[20].text, 'w-%s' %
                 errors[2].rstrip().replace('\n', '\nw-'))
 
+        # Sixth commit
         self.assertEqual(lines[21].text, '06: %s' % commits[5][1])
-        self.assertSummary(lines[22].text, 'sandbox', '', ['board4'], ok=True)
+        self.assertSummary(lines[22].text, 'sandbox', '', ['board4'],
+                           outcome=OUTCOME_OK)
 
         # The second line of errors[3] is a duplicate, so buildman will drop it
         expect = errors[3].rstrip().split('\n')
@@ -269,6 +294,7 @@
         self.assertEqual(lines[24].text, 'w-%s' %
                 errors[0].rstrip().replace('\n', '\nw-'))
 
+        # Seventh commit
         self.assertEqual(lines[25].text, '07: %s' % commits[6][1])
         self.assertSummary(lines[26].text, 'sandbox', '+', ['board4'])