python,runfiles library: don't pick up TEST_SRCDIR

The Python runfiles library will no longer pick up
the runfiles directory from $TEST_SRCDIR.

This is in accordance with the Java runfiles
library, see the motivation in
https://github.com/bazelbuild/bazel/issues/4598

The commit also adds a test for this functionality
as well as exercising that the runfiles library
can find the runfiles directory even if no
RUNFILES_* envvars are exported.

See https://github.com/bazelbuild/bazel/issues/4598
See https://github.com/bazelbuild/bazel/issues/4460

Change-Id: I6e4d154cdca66b29d7c6e77743cf8109638238b5
PiperOrigin-RevId: 185009819
diff --git a/src/test/py/bazel/runfiles_test.py b/src/test/py/bazel/runfiles_test.py
index abe23d0..f416904 100644
--- a/src/test/py/bazel/runfiles_test.py
+++ b/src/test/py/bazel/runfiles_test.py
@@ -122,6 +122,53 @@
       self.fail("lines: %s" % lines)
     self.assertEqual(lines[0], "data for bar.py")
 
+  def testPythonRunfilesLibraryFindsRunfilesWithoutEnvvars(self):
+    for s, t in [
+        ("WORKSPACE.mock", "WORKSPACE"),
+        ("bar/BUILD.mock", "bar/BUILD"),
+        ("bar/bar.py", "bar/bar.py"),
+        ("bar/bar-py-data.txt", "bar/bar-py-data.txt"),
+    ]:
+      self.CopyFile(
+          self.Rlocation(
+              "io_bazel/src/test/py/bazel/testdata/runfiles_test/" + s), t)
+
+    exit_code, stdout, stderr = self.RunBazel(["info", "bazel-bin"])
+    self.AssertExitCode(exit_code, 0, stderr)
+    bazel_bin = stdout[0]
+
+    exit_code, _, stderr = self.RunBazel(["build", "//bar:all"])
+    self.AssertExitCode(exit_code, 0, stderr)
+
+    if test_base.TestBase.IsWindows():
+      bin_path = os.path.join(bazel_bin, "bar/bar-py.exe")
+    else:
+      bin_path = os.path.join(bazel_bin, "bar/bar-py")
+
+    self.assertTrue(os.path.exists(bin_path))
+
+    exit_code, stdout, stderr = self.RunProgram(
+        [bin_path],
+        env_remove=set([
+            "RUNFILES_MANIFEST_FILE",
+            "RUNFILES_MANIFEST_ONLY",
+            "RUNFILES_DIR",
+            "JAVA_RUNFILES",
+        ]),
+        env_add={"TEST_SRCDIR": "__ignore_me__"})
+    self.AssertExitCode(exit_code, 0, stderr)
+    if len(stdout) < 2:
+      self.fail("stdout: %s" % stdout)
+    self.assertEqual(stdout[0], "Hello Python Bar!")
+    six.assertRegex(self, stdout[1], "^rloc=.*/bar/bar-py-data.txt")
+    self.assertNotIn("__ignore_me__", stdout[1])
+
+    with open(stdout[1].split("=", 1)[1], "r") as f:
+      lines = [l.strip() for l in f.readlines()]
+    if len(lines) != 1:
+      self.fail("lines: %s" % lines)
+    self.assertEqual(lines[0], "data for bar.py")
+
 
 if __name__ == "__main__":
   unittest.main()
diff --git a/src/tools/runfiles/runfiles.py b/src/tools/runfiles/runfiles.py
index 0a9149b..f889def 100644
--- a/src/tools/runfiles/runfiles.py
+++ b/src/tools/runfiles/runfiles.py
@@ -69,9 +69,8 @@
   the whole manifest file upon instantiation; this may be relevant for
   performance consideration.
 
-  Otherwise, if `env` contains "RUNFILES_DIR" or "TEST_SRCDIR" with non-empty
-  value (checked in this priority order), this method returns a directory-based
-  implementation.
+  Otherwise, if `env` contains "RUNFILES_DIR" with non-empty value (checked in
+  this priority order), this method returns a directory-based implementation.
 
   If neither cases apply, this method returns null.
 
@@ -87,8 +86,6 @@
     return CreateManifestBased(manifest)
 
   directory = env_map.get("RUNFILES_DIR")
-  if not directory:
-    directory = env_map.get("TEST_SRCDIR")
   if directory:
     return CreateDirectoryBased(directory)
 
diff --git a/src/tools/runfiles/runfiles_test.py b/src/tools/runfiles/runfiles_test.py
index 10c1b8e..2255542 100644
--- a/src/tools/runfiles/runfiles_test.py
+++ b/src/tools/runfiles/runfiles_test.py
@@ -46,7 +46,7 @@
       r = runfiles.Create({
           "RUNFILES_MANIFEST_FILE": mf.Path(),
           "RUNFILES_DIR": "ignored when RUNFILES_MANIFEST_FILE has a value",
-          "TEST_SRCDIR": "ignored when RUNFILES_MANIFEST_FILE has a value"
+          "TEST_SRCDIR": "always ignored",
       })
       self.assertEqual(r.Rlocation("a/b"), "c/d")
       self.assertIsNone(r.Rlocation("foo"))
@@ -55,17 +55,12 @@
   def testCreatesDirectoryBasedRunfiles(self):
     r = runfiles.Create({
         "RUNFILES_DIR": "runfiles/dir",
-        "TEST_SRCDIR": "ignored when RUNFILES_DIR is set"
+        "TEST_SRCDIR": "always ignored",
     })
     self.assertEqual(r.Rlocation("a/b"), "runfiles/dir/a/b")
     self.assertEqual(r.Rlocation("foo"), "runfiles/dir/foo")
     self.assertDictEqual(r.EnvVar(), {"RUNFILES_DIR": "runfiles/dir"})
 
-    r = runfiles.Create({"TEST_SRCDIR": "test/srcdir"})
-    self.assertEqual(r.Rlocation("a/b"), "test/srcdir/a/b")
-    self.assertEqual(r.Rlocation("foo"), "test/srcdir/foo")
-    self.assertDictEqual(r.EnvVar(), {"RUNFILES_DIR": "test/srcdir"})
-
   def testFailsToCreateManifestBasedBecauseManifestDoesNotExist(self):
 
     def _Run():
@@ -78,10 +73,13 @@
       runfiles.Create({
           "RUNFILES_MANIFEST_FILE": mf.Path(),
           "RUNFILES_DIR": "whatever",
-          "TEST_SRCDIR": "whatever"
+          "TEST_SRCDIR": "always ignored",
       })
-    runfiles.Create({"RUNFILES_DIR": "whatever", "TEST_SRCDIR": "whatever"})
-    runfiles.Create({"TEST_SRCDIR": "whatever"})
+    runfiles.Create({
+        "RUNFILES_DIR": "whatever",
+        "TEST_SRCDIR": "always ignored",
+    })
+    self.assertIsNone(runfiles.Create({"TEST_SRCDIR": "always ignored"}))
     self.assertIsNone(runfiles.Create({"FOO": "bar"}))
 
   def testManifestBasedRlocation(self):