Bazel, python tests: add more context to failures

The Python integration tests will now print the
stderr if the inner Bazel failed.

This should help diagnosing test failures on CI.

Change-Id: I138c1a6327cc263ba6a6e2c720c39ec5d4858d87
PiperOrigin-RevId: 160265298
diff --git a/src/test/py/bazel/bazel_clean_test.py b/src/test/py/bazel/bazel_clean_test.py
index 51f085f..dc9f055 100644
--- a/src/test/py/bazel/bazel_clean_test.py
+++ b/src/test/py/bazel/bazel_clean_test.py
@@ -22,33 +22,36 @@
   def testBazelClean(self):
     self.ScratchFile('WORKSPACE')
     self.ScratchFile('foo/BUILD', [
-        'genrule(', '  name = "x",', '  outs = ["x.out"],',
-        '  cmd = "touch $@",', ')'
+        'genrule(',
+        '  name = "x",',
+        '  outs = ["x.out"],',
+        '  cmd = "touch $@",',
+        ')',
     ])
 
-    exit_code, stdout, _ = self.RunBazel(['info', 'bazel-genfiles'])
-    self.assertEqual(exit_code, 0)
+    exit_code, stdout, stderr = self.RunBazel(['info', 'bazel-genfiles'])
+    self.AssertExitCode(exit_code, 0, stderr)
     bazel_genfiles = stdout[0]
 
-    exit_code, stdout, _ = self.RunBazel(['info', 'output_base'])
-    self.assertEqual(exit_code, 0)
+    exit_code, stdout, stderr = self.RunBazel(['info', 'output_base'])
+    self.AssertExitCode(exit_code, 0, stderr)
     output_base = stdout[0]
 
-    exit_code, _, _ = self.RunBazel(['build', '//foo:x'])
-    self.assertEqual(exit_code, 0)
+    exit_code, _, stderr = self.RunBazel(['build', '//foo:x'])
+    self.AssertExitCode(exit_code, 0, stderr)
     self.assertTrue(os.path.exists(os.path.join(bazel_genfiles, 'foo/x.out')))
 
-    exit_code, _, _ = self.RunBazel(['clean'])
-    self.assertEqual(exit_code, 0)
+    exit_code, _, stderr = self.RunBazel(['clean'])
+    self.AssertExitCode(exit_code, 0, stderr)
     self.assertFalse(os.path.exists(os.path.join(bazel_genfiles, 'foo/x.out')))
     self.assertTrue(os.path.exists(output_base))
 
-    exit_code, _, _ = self.RunBazel(['build', '//foo:x'])
-    self.assertEqual(exit_code, 0)
+    exit_code, _, stderr = self.RunBazel(['build', '//foo:x'])
+    self.AssertExitCode(exit_code, 0, stderr)
     self.assertTrue(os.path.exists(os.path.join(bazel_genfiles, 'foo/x.out')))
 
-    exit_code, _, _ = self.RunBazel(['clean', '--expunge'])
-    self.assertEqual(exit_code, 0)
+    exit_code, _, stderr = self.RunBazel(['clean', '--expunge'])
+    self.AssertExitCode(exit_code, 0, stderr)
     self.assertFalse(os.path.exists(os.path.join(bazel_genfiles, 'foo/x.out')))
     self.assertFalse(os.path.exists(output_base))
 
diff --git a/src/test/py/bazel/bazel_server_mode_test.py b/src/test/py/bazel/bazel_server_mode_test.py
index b132b0e..dbe71fb 100644
--- a/src/test/py/bazel/bazel_server_mode_test.py
+++ b/src/test/py/bazel/bazel_server_mode_test.py
@@ -22,12 +22,12 @@
   def testBazelServerMode(self):
     self.ScratchFile('WORKSPACE')
 
-    exit_code, stdout, _ = self.RunBazel(['info', 'server_pid'])
-    self.assertEqual(exit_code, 0)
+    exit_code, stdout, stderr = self.RunBazel(['info', 'server_pid'])
+    self.AssertExitCode(exit_code, 0, stderr)
     pid1 = stdout[0]
 
-    exit_code, stdout, _ = self.RunBazel(['info', 'server_pid'])
-    self.assertEqual(exit_code, 0)
+    exit_code, stdout, stderr = self.RunBazel(['info', 'server_pid'])
+    self.AssertExitCode(exit_code, 0, stderr)
     pid2 = stdout[0]
 
     self.assertEqual(pid1, pid2)
diff --git a/src/test/py/bazel/bazel_windows_test.py b/src/test/py/bazel/bazel_windows_test.py
index 27bc373..163606b 100644
--- a/src/test/py/bazel/bazel_windows_test.py
+++ b/src/test/py/bazel/bazel_windows_test.py
@@ -22,14 +22,17 @@
     self.ScratchFile('WORKSPACE')
     self.ScratchFile('foo/BUILD', ['cc_binary(name="x", srcs=["x.cc"])'])
     self.ScratchFile('foo/x.cc', [
-        '#include <stdio.h>', 'int main(int, char**) {'
-        '  printf("hello\\n");', '  return 0;', '}'
+        '#include <stdio.h>',
+        'int main(int, char**) {'
+        '  printf("hello\\n");',
+        '  return 0;',
+        '}',
     ])
 
     exit_code, _, stderr = self.RunBazel(
         ['--batch', 'build', '//foo:x', '--cpu=x64_windows_msys'],
         env_remove={'BAZEL_SH'})
-    self.assertEqual(exit_code, 2)
+    self.AssertExitCode(exit_code, 2, stderr)
     self.assertIn('\'BAZEL_SH\' environment variable is not set',
                   '\n'.join(stderr))
 
@@ -37,13 +40,13 @@
         '--batch', '--host_jvm_args=-Dbazel.windows_unix_root=', 'build',
         '//foo:x', '--cpu=x64_windows_msys'
     ])
-    self.assertEqual(exit_code, 37)
+    self.AssertExitCode(exit_code, 37, stderr)
     self.assertIn('"bazel.windows_unix_root" JVM flag is not set',
                   '\n'.join(stderr))
 
-    exit_code, _, _ = self.RunBazel(
+    exit_code, _, stderr = self.RunBazel(
         ['--batch', 'build', '//foo:x', '--cpu=x64_windows_msys'])
-    self.assertEqual(exit_code, 0)
+    self.AssertExitCode(exit_code, 0, stderr)
 
 
 if __name__ == '__main__':
diff --git a/src/test/py/bazel/test_base.py b/src/test/py/bazel/test_base.py
index 7d0bba7..71e89dc 100644
--- a/src/test/py/bazel/test_base.py
+++ b/src/test/py/bazel/test_base.py
@@ -55,6 +55,17 @@
     os.mkdir(self._tests_root)
     os.chdir(self._tests_root)
 
+  def AssertExitCode(self, actual_exit_code, expected_exit_code, stderr_lines):
+    """Assert that `actual_exit_code` == `expected_exit_code`."""
+    if actual_exit_code != expected_exit_code:
+      self.fail('\n'.join([
+          'Bazel exited with %d (expected %d), stderr:' % (actual_exit_code,
+                                                           expected_exit_code),
+          '(start stderr)----------------------------------------',
+      ] + (stderr_lines or []) + [
+          '(end stderr)------------------------------------------',
+      ]))
+
   @staticmethod
   def GetEnv(name, default=None):
     """Returns environment variable `name`.