Add an AnalysisMock for Bazel; all the analysis action tests pass.

Change-Id: I83a280d53272972bace811b1493825b5dc48a4d2

--
MOS_MIGRATED_REVID=87608375
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/BazelAnalysisMock.java
new file mode 100644
index 0000000..be20313
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BazelAnalysisMock.java
@@ -0,0 +1,89 @@
+// Copyright 2015 Google Inc. 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.
+package com.google.devtools.build.lib.analysis;
+
+import com.google.common.base.Functions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.io.ByteStreams;
+import com.google.devtools.build.lib.analysis.config.ConfigurationFactory;
+import com.google.devtools.build.lib.analysis.util.AnalysisMock;
+import com.google.devtools.build.lib.bazel.rules.BazelConfiguration;
+import com.google.devtools.build.lib.bazel.rules.BazelConfigurationCollection;
+import com.google.devtools.build.lib.bazel.rules.BazelRuleClassProvider;
+import com.google.devtools.build.lib.packages.util.MockToolsConfig;
+import com.google.devtools.build.lib.rules.cpp.CppConfigurationLoader;
+import com.google.devtools.build.lib.rules.java.JavaConfigurationLoader;
+import com.google.devtools.build.lib.rules.java.JvmConfigurationLoader;
+import com.google.devtools.build.lib.rules.objc.ObjcConfigurationLoader;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Collection;
+
+public class BazelAnalysisMock extends AnalysisMock {
+  public static final AnalysisMock INSTANCE = new BazelAnalysisMock();
+
+  @Override
+  public void setupMockClient(MockToolsConfig config) throws IOException {
+    config.create("tools/jdk/BUILD",
+        "package(default_visibility=['//visibility:public'])",
+        "java_toolchain(name = 'toolchain', encoding = 'UTF-8', source_version = '8', ",
+        "  target_version = '8')",
+        "filegroup(name = 'jdk-null')",
+        "filegroup(name = 'jdk-default', srcs = [':java'], path = 'jdk/jre')",
+        "filegroup(name = 'jdk', srcs = [':jdk-default', ':jdk-null'])",
+        "filegroup(name='langtools', srcs=['jdk/lib/tools.jar'])",
+        "filegroup(name='bootclasspath', srcs=['jdk/jre/lib/rt.jar'])",
+        "filegroup(name='java', srcs = ['jdk/jre/bin/java'])",
+        "exports_files(['JavaBuilder_deploy.jar','SingleJar_deploy.jar',",
+        "               'JavaBuilderCanary_deploy.jar', 'ijar'])");
+    config.create("tools/cpp/BUILD",
+        "filegroup(name = 'toolchain', srcs = [':cc-compiler-local', ':empty'])",
+        "cc_toolchain(name = 'cc-compiler-local', all_files = ':empty', compiler_files = ':empty',",
+        "cpu = 'local', dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
+        "  linker_files = ':empty',",
+        "objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',)",
+        "cc_toolchain(name = 'cc-compiler-darwin', all_files = ':empty', ",
+        "  compiler_files = ':empty',",
+        "cpu = 'local', dwp_files = ':empty', dynamic_runtime_libs = [':empty'], ",
+        "  linker_files = ':empty',",
+        "objcopy_files = ':empty', static_runtime_libs = [':empty'], strip_files = ':empty',)");
+    config.create("tools/cpp/CROSSTOOL", readFromResources("MOCK_CROSSTOOL"));
+  }
+
+  public static String readFromResources(String filename) {
+    try (InputStream in = BazelAnalysisMock.class.getClassLoader().getResourceAsStream(filename)) {
+      return new String(ByteStreams.toByteArray(in), StandardCharsets.UTF_8);
+    } catch (IOException e) {
+      // This should never happen.
+      throw new AssertionError(e);
+    }
+  }
+
+  @Override
+  public ConfigurationFactory createConfigurationFactory() {
+    return new ConfigurationFactory(new BazelConfigurationCollection(),
+        new BazelConfiguration.Loader(),
+        new CppConfigurationLoader(Functions.<String>identity()),
+        new JvmConfigurationLoader(BazelRuleClassProvider.JAVA_CPU_SUPPLIER),
+        new JavaConfigurationLoader(BazelRuleClassProvider.JAVA_CPU_SUPPLIER),
+        new ObjcConfigurationLoader());
+  }
+
+  @Override
+  public Collection<String> getOptionOverrides() {
+    return ImmutableList.of();
+  }
+}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockToolsConfig.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockToolsConfig.java
index fcf9b6f..0ea49bf 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockToolsConfig.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockToolsConfig.java
@@ -48,7 +48,9 @@
       @Nullable Path runfilesDirectoryOpt) {
     this.rootDirectory = rootDirectory;
     this.realFileSystem = realFileSystem;
-    if (runfilesDirectoryOpt == null) {
+    if (!realFileSystem) {
+      this.runfilesDirectory = null;
+    } else if (runfilesDirectoryOpt == null) {
       this.runfilesDirectory = rootDirectory.getRelative(BlazeTestUtils.runfilesDir());
     } else {
       this.runfilesDirectory = runfilesDirectoryOpt;
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
index 28ca6bf..85205a6 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
@@ -44,7 +44,8 @@
   /**
    * Name of a class with an INSTANCE field of type AnalysisMock to be used for analysis tests.
    */
-  public static final String TEST_ANALYSIS_MOCK = "DOES-NOT-WORK-YET";
+  public static final String TEST_ANALYSIS_MOCK =
+      "com.google.devtools.build.lib.analysis.BazelAnalysisMock";
 
   /**
    * Directory where we can find bazel's Java tests, relative to a test's runfiles directory.