# 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()
