blob: 729047281cb311e2a039148aa1571d0343d67522 [file] [log] [blame]
# pylint: disable=g-bad-file-header
# 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.
import os
import unittest
from src.test.py.bazel import test_base
class RunfilesSandboxedTest(test_base.TestBase):
def _FailWithContents(self, msg, contents):
self.fail("%s\ncontents =\n | %s\n---" % (msg, "\n | ".join(contents)))
def testRunfilesLibrariesFindRunfilesWithoutEnvvars(self):
for s, t, exe in [
("WORKSPACE.mock", "WORKSPACE", False),
("bar/BUILD.mock", "bar/BUILD", False),
("bar/bar.py", "bar/bar.py", True),
("bar/bar-py-data.txt", "bar/bar-py-data.txt", False),
("bar/Bar.java", "bar/Bar.java", False),
("bar/bar-java-data.txt", "bar/bar-java-data.txt", False),
("bar/bar.sh", "bar/bar.sh", True),
("bar/bar-sh-data.txt", "bar/bar-sh-data.txt", False),
("bar/bar.cc", "bar/bar.cc", False),
("bar/bar-cc-data.txt", "bar/bar-cc-data.txt", False),
]:
self.CopyFile(
self.Rlocation("io_bazel/src/test/py/bazel/testdata/runfiles_test/" +
s), t, exe)
self.ScratchFile(
"foo/BUILD",
[
"genrule(",
" name = 'gen',",
" outs = ['stdout.txt', 'data_files.txt'],",
" cmd = 'cat $$(' + ",
# The genrule runs all bar-<language> tools, saves the complete
# stdout into stdout.txt, and prints the contents of rlocations
# reported by the tools (i.e. the contents of the
# bar-<language>-data.txt files) into data_files.txt.
" ' ( $(location //bar:bar-py) && ' +",
" ' $(location //bar:bar-java) && ' +",
" ' $(location //bar:bar-sh) && ' +",
" ' $(location //bar:bar-cc) ; ' +",
" ' ) | ' + ",
" ' tee $(location stdout.txt) | ' + ",
" ' grep \"^rloc=\" | ' + ",
" ' sed \"s,^rloc=,,\"' + ",
" ') > $(location data_files.txt)',",
" tools = [",
" '//bar:bar-cc',",
" '//bar:bar-java',",
" '//bar:bar-py',",
" '//bar:bar-sh',",
" ],",
")"
])
exit_code, stdout, stderr = self.RunBazel(["info", "bazel-genfiles"])
self.AssertExitCode(exit_code, 0, stderr)
bazel_genfiles = stdout[0]
exit_code, _, stderr = self.RunBazel([
"build",
"--verbose_failures",
"//foo:gen",
"--genrule_strategy=sandboxed",
])
self.AssertExitCode(exit_code, 0, stderr)
stdout_txt = os.path.join(bazel_genfiles, "foo/stdout.txt")
self.assertTrue(os.path.isfile(stdout_txt))
data_files_txt = os.path.join(bazel_genfiles, "foo/data_files.txt")
self.assertTrue(os.path.isfile(data_files_txt))
# Output of the bar-<language> binaries that they printed to stdout.
stdout_lines = []
with open(stdout_txt, "rt") as f:
stdout_lines = [line.strip() for line in f.readlines()]
# Contents of the bar-<language>-data.txt files.
data_files = []
with open(data_files_txt, "rt") as f:
data_files = [line.strip() for line in f.readlines()]
if len(stdout_lines) != 8:
self._FailWithContents("wrong number of output lines", stdout_lines)
i = 0
for lang in [("py", "Python", "bar.py"), ("java", "Java", "Bar.java"),
("sh", "Bash", "bar.sh"), ("cc", "C++", "bar.cc")]:
# Check that the bar-<language> binary printed the expected output.
if stdout_lines[i * 2] != "Hello %s Bar!" % lang[1]:
self._FailWithContents("wrong line for " + lang[1], stdout_lines)
if not stdout_lines[i * 2 + 1].startswith("rloc="):
self._FailWithContents("wrong line for " + lang[1], stdout_lines)
if not stdout_lines[i * 2 + 1].endswith(
"foo_ws/bar/bar-%s-data.txt" % lang[0]):
self._FailWithContents("wrong line for " + lang[1], stdout_lines)
# Assert the contents of bar-<language>-data.txt. This indicates that
# the runfiles library in the bar-<language> binary found the correct
# runfile and returned a valid path.
if data_files[i] != "data for " + lang[2]:
self._FailWithContents("runfile does not exist for " + lang[1],
stdout_lines)
i += 1
if __name__ == "__main__":
unittest.main()