Fix tmpdir with standalone test strategy

If the tmpdir wasn't below the execroot, Bazel would crash and print a stack
trace.

Also, the test was incorrect because the EOF wasn't quoted, so it was actually
just executing "echo TEST_TMPDIR=/path/to/tmpdir" which (surprise surprise)
matched TEST_TMPDIR=/path/to/tmpdir.

Finally, the test was _also_ incorrect because it was using the cached test
result for the second case, since changing the tmpdir doesn't invalidate the
test result. So it not only was comparing a constant string to a constant
string, but it wasn't even re-evaluating the constant string.

--
MOS_MIGRATED_REVID=130637221
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/StandaloneTestStrategy.java b/src/main/java/com/google/devtools/build/lib/rules/test/StandaloneTestStrategy.java
index f2af631..2651b72 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/StandaloneTestStrategy.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/StandaloneTestStrategy.java
@@ -155,11 +155,18 @@
     vars.putAll(config.getLocalShellEnvironment());
     vars.putAll(action.getTestEnv());
 
+    String tmpDirString;
+    if (tmpDir.startsWith(execRoot)) {
+      tmpDirString = tmpDir.relativeTo(execRoot).getPathString();
+    } else {
+      tmpDirString = tmpDir.getPathString();
+    }
+
     String testSrcDir = runfilesDir.relativeTo(execRoot).getPathString();
     vars.put("JAVA_RUNFILES", testSrcDir);
     vars.put("PYTHON_RUNFILES", testSrcDir);
     vars.put("TEST_SRCDIR", testSrcDir);
-    vars.put("TEST_TMPDIR", tmpDir.relativeTo(execRoot).getPathString());
+    vars.put("TEST_TMPDIR", tmpDirString);
     vars.put("TEST_WORKSPACE", action.getRunfilesPrefix());
     vars.put("XML_OUTPUT_FILE", xmlOutputPath.relativeTo(execRoot).getPathString());
     if (!action.isEnableRunfiles()) {
diff --git a/src/test/shell/bazel/bazel_test_test.sh b/src/test/shell/bazel/bazel_test_test.sh
index 98a80cb..1c98a69 100755
--- a/src/test/shell/bazel/bazel_test_test.sh
+++ b/src/test/shell/bazel/bazel_test_test.sh
@@ -91,7 +91,7 @@
 
 function test_tmpdir() {
   mkdir -p foo
-  cat > foo/bar_test.sh <<EOF
+  cat > foo/bar_test.sh <<'EOF'
 #!/bin/bash
 echo TEST_TMPDIR=$TEST_TMPDIR
 EOF
@@ -106,9 +106,23 @@
     fail "Running sh_test failed"
   expect_log "TEST_TMPDIR=/.*"
 
-  bazel test --test_output=all --test_tmpdir=$TEST_TMPDIR //foo:bar_test \
+  bazel test --nocache_test_results --test_output=all --test_tmpdir=$TEST_TMPDIR //foo:bar_test \
     >& $TEST_log || fail "Running sh_test failed"
   expect_log "TEST_TMPDIR=$TEST_TMPDIR"
+
+  # If we run `bazel test //src/test/shell/bazel:bazel_test_test` on Linux, it
+  # will be sandboxed and this "inner test" creating /foo/bar will actually
+  # succeed. If we run it on OS X (or in general without sandboxing enabled),
+  # it will fail to create /foo/bar, since obviously we don't have write
+  # permissions.
+  if bazel test --nocache_test_results --test_output=all \
+    --test_tmpdir=/foo/bar //foo:bar_test >& $TEST_log; then
+    # We are in a sandbox.
+    expect_log "TEST_TMPDIR=/foo/bar"
+  else
+    # We are not sandboxed.
+    expect_log "Could not create TEST_TMPDIR"
+  fi
 }
 
 function test_env_vars() {