| # Copyright 2018 The Bazel Authors. All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| from absl.testing import absltest |
| from src.test.py.bazel import test_base |
| |
| |
| class FirstTimeUseTest(test_base.TestBase): |
| |
| def _FailWithOutput(self, output): |
| self.fail('FAIL:\n | %s\n---' % '\n | '.join(output)) |
| |
| def testNoPythonRequirement(self): |
| """Regression test for https://github.com/bazelbuild/bazel/issues/6463.""" |
| _, stdout, stderr = self.RunBazel(['info', 'release']) |
| for line in stdout + stderr: |
| if 'python' in line and 'not found on PATH' in line: |
| self._FailWithOutput(stdout + stderr) |
| |
| def _AssertBazelRunBinaryOutput(self, exit_code, stdout, stderr): |
| self.AssertExitCode(exit_code, 0, stderr) |
| found_hello = found_arg_a = found_arg_bc = False |
| for line in stdout + stderr: |
| if 'ERROR' in line and 'needs a shell' in line: |
| self._FailWithOutput(stdout + stderr) |
| if not found_hello and 'hello python' in line: |
| found_hello = True |
| elif not found_arg_a and 'arg[1]=(a)': |
| found_arg_a = True |
| elif not found_arg_bc and 'arg[2]=(b c)': |
| found_arg_bc = True |
| break |
| if not found_hello or not found_arg_a or not found_arg_bc: |
| self._FailWithOutput(stdout + stderr) |
| |
| def testNoBashRequiredForSimpleBazelRun(self): |
| """Regression test for https://github.com/bazelbuild/bazel/issues/8229.""" |
| self.ScratchFile('foo/BUILD', [ |
| 'py_binary(', |
| ' name = "x",' |
| ' srcs = ["x.py"],', |
| ' args = ["a", "\'b c\'"],', |
| ')', |
| ]) |
| self.ScratchFile('foo/x.py', [ |
| 'from __future__ import print_function', |
| 'import sys', |
| 'print("hello python")', |
| 'for i in range(len(sys.argv)):', |
| ' print("arg%d=(%s)" % (i, sys.argv[i]))', |
| ]) |
| |
| if test_base.TestBase.IsWindows(): |
| # "bazel run" needs no Bash on Windows, so this call should succeed. |
| exit_code, stdout, stderr = self.RunBazel( |
| [ |
| 'run', |
| '--shell_executable=', |
| '//foo:x', |
| ], |
| allow_failure=True, |
| ) |
| self._AssertBazelRunBinaryOutput(exit_code, stdout, stderr) |
| else: |
| exit_code, stdout, stderr = self.RunBazel( |
| [ |
| 'run', |
| # Run fails because we provide no shell. Platforms other than |
| # Windows always use Bash for "bazel run". |
| '--shell_executable=', |
| '//foo:x', |
| ], |
| allow_failure=True, |
| ) |
| self.AssertNotExitCode(exit_code, 0, stderr) |
| found_error = False |
| for line in stdout + stderr: |
| if 'ERROR' in line and 'needs a shell' in line: |
| found_error = True |
| break |
| if not found_error: |
| self._FailWithOutput(stdout + stderr) |
| |
| # Run succeeds because there is a shell. |
| exit_code, stdout, stderr = self.RunBazel( |
| ['run', '//foo:x'], allow_failure=True |
| ) |
| self._AssertBazelRunBinaryOutput(exit_code, stdout, stderr) |
| |
| |
| if __name__ == '__main__': |
| absltest.main() |