Support cpufeatures from Android NDK.

Fixes https://github.com/bazelbuild/bazel/issues/2499.

Example usage:

    $ cat jni.cc
    #include "ndk/sources/android/cpufeatures/cpu-features.h"
    ...
    AndroidCpuFamily family = android_getCpuFamily();

    $ cat BUILD
    cc_library(
        name = "jni",
        srcs = ["jni.cc"],
        deps = ["@androidndk//:cpufeatures"],
    )
    android_binary(
        name = "app",
        manifest = 'AndroidManifest.xml',
        srcs = glob(["*.java"]),
        deps = [":jni"],
    )

    $ cat WORKSPACE
    android_sdk_repository(name = 'androidsdk')
    android_ndk_repository(name = 'androidndk')

RELNOTES: android_ndk_repository now creates a cc_library (@androidndk//:cpufeatures) for the cpufeatures library that is bundled in the Android NDK. See https://developer.android.com/ndk/guides/cpu-features.html for more details.

PiperOrigin-RevId: 154732798
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
index 2a45ad0..98411f1 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java
@@ -238,6 +238,7 @@
     String ccToolchainSuiteTemplate = getTemplate("android_ndk_cc_toolchain_suite_template.txt");
     String ccToolchainTemplate = getTemplate("android_ndk_cc_toolchain_template.txt");
     String stlFilegroupTemplate = getTemplate("android_ndk_stl_filegroup_template.txt");
+    String miscLibrariesTemplate = getTemplate("android_ndk_misc_libraries_template.txt");
 
     StringBuilder ccToolchainSuites = new StringBuilder();
     StringBuilder ccToolchainRules = new StringBuilder();
@@ -281,7 +282,8 @@
         .replace("%ruleName%", ruleName)
         .replace("%ccToolchainSuites%", ccToolchainSuites)
         .replace("%ccToolchainRules%", ccToolchainRules)
-        .replace("%stlFilegroups%", stlFilegroups);
+        .replace("%stlFilegroups%", stlFilegroups)
+        .replace("%miscLibraries%", miscLibrariesTemplate);
   }
 
   static String createToolchainName(String stlName) {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_build_file_template.txt b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_build_file_template.txt
index eeee1d2..eb2f818 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_build_file_template.txt
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_build_file_template.txt
@@ -44,3 +44,9 @@
 ################################################################
 
 %stlFilegroups%
+
+################################################################
+# Miscellaneous runtime libraries
+################################################################
+
+%miscLibraries%
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_misc_libraries_template.txt b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_misc_libraries_template.txt
new file mode 100644
index 0000000..d15b335
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/android_ndk_misc_libraries_template.txt
@@ -0,0 +1,5 @@
+cc_library(
+    name = 'cpufeatures',
+    srcs = glob(['ndk/sources/android/cpufeatures/*.c']),
+    hdrs = glob(['ndk/sources/android/cpufeatures/*.h']),
+)
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryTest.java
index 3c6ad91..00853ed 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryTest.java
@@ -18,8 +18,10 @@
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.FilesToRunProvider;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.packages.AttributeContainer;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -150,4 +152,29 @@
             + "'androidndk' is 15. The major revisions supported by Bazel are [10, 11, 12, 13, 14]."
             + " Defaulting to revision 14.");
   }
+
+  @Test
+  public void testMiscLibraries() throws Exception {
+    scratchPlatformsDirectories("arch-x86", 19, 20, 22, 24);
+    scratch.file(String.format("/ndk/sources/android/cpufeatures/cpu-features.c"));
+    scratch.file(String.format("/ndk/sources/android/cpufeatures/cpu-features.h"));
+    FileSystemUtils.appendIsoLatin1(
+        scratch.resolve("WORKSPACE"),
+        "android_ndk_repository(",
+        "    name = 'androidndk',",
+        "    path = '/ndk',",
+        ")");
+    invalidatePackages();
+
+    ConfiguredTarget cpufeatures = getConfiguredTarget("@androidndk//:cpufeatures");
+    assertThat(cpufeatures).isNotNull();
+    AttributeContainer attributes =
+        cpufeatures.getTarget().getAssociatedRule().getAttributeContainer();
+    assertThat(attributes.isAttributeValueExplicitlySpecified("srcs")).isTrue();
+    assertThat(attributes.getAttr("srcs").toString())
+        .isEqualTo("[@androidndk//:ndk/sources/android/cpufeatures/cpu-features.c]");
+    assertThat(attributes.isAttributeValueExplicitlySpecified("hdrs")).isTrue();
+    assertThat(attributes.getAttr("hdrs").toString())
+        .isEqualTo("[@androidndk//:ndk/sources/android/cpufeatures/cpu-features.h]");
+  }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ndk12bfiles.txt b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ndk12bfiles.txt
index e53209b..e293d12 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ndk12bfiles.txt
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ndk12bfiles.txt
@@ -1,4 +1,192 @@
-hread.req.lockable/thread.req.lockable.req/nothing_to_do.pass.cpp
+rces/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.promise/set_value_at_thread_exit_void.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.promise/set_value_const.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.promise/set_value_void.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.promise/swap.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.promise/uses_allocator.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/copy_assign.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/copy_ctor.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/ctor_future.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/dtor.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/get.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/move_assign.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/move_ctor.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/wait_for.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/wait.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.shared_future/wait_until.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.state/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/assign_copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/assign_move.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor1.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor2.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func_alloc.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_func.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/ctor_move.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/dtor.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/get_future.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/make_ready_at_thread_exit.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/operator.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/reset.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.members/swap.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.nonmembers/swap.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/futures.task.nonmembers/uses_allocator.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.tas/types.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/copy_assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/copy_ctor.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/dtor.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/get.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/move_assign.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/move_ctor.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/share.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/wait_for.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/wait.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/futures.unique_future/wait_until.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/test_allocator.h
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/futures/version.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/macro.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/cv_status.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/notify_all_at_thread_exit.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/destructor.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/notify_all.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/notify_one.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait.exception.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait_for.exception.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait_for.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait_for_pred.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait_pred.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait_until.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvarany/wait_until_pred.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/destructor.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/native_handle.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/notify_all.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/notify_one.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/wait_for.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/wait_for_pred.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/wait.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/wait_pred.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/wait_until.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/thread.condition.condvar/wait_until_pred.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.condition/version.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.general/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock.algorithm/lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock.algorithm/try_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.guard/adopt_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.guard/assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.guard/copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.guard/mutex.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.guard/types.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/copy_assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/copy_ctor.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_assign.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/move_ctor.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_adopt_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_defer_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_duration.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_time_point.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.cons/mutex_try_to_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock_for.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/try_lock_until.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.locking/unlock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/member_swap.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/nonmember_swap.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.mod/release.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/mutex.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/op_bool.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/thread.lock.shared.obs/owns_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.shared/types.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/copy_assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/copy_ctor.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_assign.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/move_ctor.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_adopt_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_defer_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_duration.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_time_point.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.cons/mutex_try_to_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock_for.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/try_lock_until.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.locking/unlock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/member_swap.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/nonmember_swap.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.mod/release.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/mutex.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/op_bool.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/thread.lock.unique.obs/owns_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/thread.lock.unique/types.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.lock/types.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.general/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/native_handle.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.class/try_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/native_handle.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.mutex.requirements.mutex/thread.mutex.recursive/try_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/lock_shared.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_for.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared_for.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_shared_until.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.sharedtimedmutex.requirements/thread.sharedtimedmutex.class/try_lock_until.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock_for.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.class/try_lock_until.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock_for.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.mutex.requirements/thread.timedmutex.requirements/thread.timedmutex.recursive/try_lock_until.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.once/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.once/thread.once.callonce/call_once.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.once/thread.once.onceflag/assign.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.once/thread.once.onceflag/copy.fail.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/thread.once/thread.once.onceflag/default.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.mutex/version.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.req/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.req/thread.req.exception/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.req/thread.req.lockable/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.req/thread.req.lockable/thread.req.lockable.basic/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.req/thread.req.lockable/thread.req.lockable.general/nothing_to_do.pass.cpp
+sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.req/thread.req.lockable/thread.req.lockable.req/nothing_to_do.pass.cpp
 sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.req/thread.req.lockable/thread.req.lockable.timed/nothing_to_do.pass.cpp
 sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.req/thread.req.native/nothing_to_do.pass.cpp
 sources/cxx-stl/llvm-libc++/libcxx/test/thread/thread.req/thread.req.paramname/nothing_to_do.pass.cpp
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ndkfiles.txt b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ndkfiles.txt
index 3fc3e9f..d06793f 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ndkfiles.txt
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/android/ndkcrosstools/ndkfiles.txt
@@ -1,4 +1,371 @@
-m.h
+id-21/arch-x86_64/usr/include/linux/netfilter/xt_helper.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_HMARK.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_IDLETIMER.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_ipcomp.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_iprange.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_ipvs.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_l2tp.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_LED.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_length.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_limit.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_LOG.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_mac.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_mark.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_MARK.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_multiport.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_nfacct.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_NFLOG.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_NFQUEUE.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_osf.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_owner.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_physdev.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_pkttype.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_policy.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_quota.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_rateest.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_RATEEST.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_realm.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_recent.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_rpfilter.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_sctp.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_SECMARK.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_set.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_socket.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_state.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_statistic.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_string.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_SYNPROXY.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_tcpmss.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_TCPMSS.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_TCPOPTSTRIP.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_tcpudp.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_TEE.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_time.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_TPROXY.h
+platforms/android-21/arch-x86_64/usr/include/linux/netfilter/xt_u32.h
+platforms/android-21/arch-x86_64/usr/include/linux/net.h
+platforms/android-21/arch-x86_64/usr/include/linux/netlink_diag.h
+platforms/android-21/arch-x86_64/usr/include/linux/netlink.h
+platforms/android-21/arch-x86_64/usr/include/linux/netrom.h
+platforms/android-21/arch-x86_64/usr/include/linux/net_tstamp.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfc.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfs2.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfs3.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfs4.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfs4_mount.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfsacl.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfsd/cld.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfsd/debug.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfsd/export.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfsd/nfsfh.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfsd/stats.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfs_fs.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfs.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfs_idmap.h
+platforms/android-21/arch-x86_64/usr/include/linux/nfs_mount.h
+platforms/android-21/arch-x86_64/usr/include/linux/nl80211.h
+platforms/android-21/arch-x86_64/usr/include/linux/n_r3964.h
+platforms/android-21/arch-x86_64/usr/include/linux/nubus.h
+platforms/android-21/arch-x86_64/usr/include/linux/nvme.h
+platforms/android-21/arch-x86_64/usr/include/linux/nvram.h
+platforms/android-21/arch-x86_64/usr/include/linux/omap3isp.h
+platforms/android-21/arch-x86_64/usr/include/linux/omapfb.h
+platforms/android-21/arch-x86_64/usr/include/linux/oom.h
+platforms/android-21/arch-x86_64/usr/include/linux/openvswitch.h
+platforms/android-21/arch-x86_64/usr/include/linux/packet_diag.h
+platforms/android-21/arch-x86_64/usr/include/linux/param.h
+platforms/android-21/arch-x86_64/usr/include/linux/parport.h
+platforms/android-21/arch-x86_64/usr/include/linux/patchkey.h
+platforms/android-21/arch-x86_64/usr/include/linux/pci.h
+platforms/android-21/arch-x86_64/usr/include/linux/pci_regs.h
+platforms/android-21/arch-x86_64/usr/include/linux/perf_event.h
+platforms/android-21/arch-x86_64/usr/include/linux/personality.h
+platforms/android-21/arch-x86_64/usr/include/linux/pfkeyv2.h
+platforms/android-21/arch-x86_64/usr/include/linux/pg.h
+platforms/android-21/arch-x86_64/usr/include/linux/phantom.h
+platforms/android-21/arch-x86_64/usr/include/linux/phonet.h
+platforms/android-21/arch-x86_64/usr/include/linux/pktcdvd.h
+platforms/android-21/arch-x86_64/usr/include/linux/pkt_cls.h
+platforms/android-21/arch-x86_64/usr/include/linux/pkt_sched.h
+platforms/android-21/arch-x86_64/usr/include/linux/pmu.h
+platforms/android-21/arch-x86_64/usr/include/linux/poll.h
+platforms/android-21/arch-x86_64/usr/include/linux/posix_types.h
+platforms/android-21/arch-x86_64/usr/include/linux/ppdev.h
+platforms/android-21/arch-x86_64/usr/include/linux/ppp-comp.h
+platforms/android-21/arch-x86_64/usr/include/linux/ppp_defs.h
+platforms/android-21/arch-x86_64/usr/include/linux/ppp-ioctl.h
+platforms/android-21/arch-x86_64/usr/include/linux/pps.h
+platforms/android-21/arch-x86_64/usr/include/linux/prctl.h
+platforms/android-21/arch-x86_64/usr/include/linux/ptp_clock.h
+platforms/android-21/arch-x86_64/usr/include/linux/ptrace.h
+platforms/android-21/arch-x86_64/usr/include/linux/qnx4_fs.h
+platforms/android-21/arch-x86_64/usr/include/linux/qnxtypes.h
+platforms/android-21/arch-x86_64/usr/include/linux/quota.h
+platforms/android-21/arch-x86_64/usr/include/linux/radeonfb.h
+platforms/android-21/arch-x86_64/usr/include/linux/raid/md_p.h
+platforms/android-21/arch-x86_64/usr/include/linux/raid/md_u.h
+platforms/android-21/arch-x86_64/usr/include/linux/random.h
+platforms/android-21/arch-x86_64/usr/include/linux/raw.h
+platforms/android-21/arch-x86_64/usr/include/linux/rds.h
+platforms/android-21/arch-x86_64/usr/include/linux/reboot.h
+platforms/android-21/arch-x86_64/usr/include/linux/reiserfs_fs.h
+platforms/android-21/arch-x86_64/usr/include/linux/reiserfs_xattr.h
+platforms/android-21/arch-x86_64/usr/include/linux/resource.h
+platforms/android-21/arch-x86_64/usr/include/linux/rfkill.h
+platforms/android-21/arch-x86_64/usr/include/linux/romfs_fs.h
+platforms/android-21/arch-x86_64/usr/include/linux/rose.h
+platforms/android-21/arch-x86_64/usr/include/linux/route.h
+platforms/android-21/arch-x86_64/usr/include/linux/rtc.h
+platforms/android-21/arch-x86_64/usr/include/linux/rtnetlink.h
+platforms/android-21/arch-x86_64/usr/include/linux/scc.h
+platforms/android-21/arch-x86_64/usr/include/linux/sched.h
+platforms/android-21/arch-x86_64/usr/include/linux/screen_info.h
+platforms/android-21/arch-x86_64/usr/include/linux/sctp.h
+platforms/android-21/arch-x86_64/usr/include/linux/sdla.h
+platforms/android-21/arch-x86_64/usr/include/linux/seccomp.h
+platforms/android-21/arch-x86_64/usr/include/linux/securebits.h
+platforms/android-21/arch-x86_64/usr/include/linux/selinux_netlink.h
+platforms/android-21/arch-x86_64/usr/include/linux/sem.h
+platforms/android-21/arch-x86_64/usr/include/linux/serial_core.h
+platforms/android-21/arch-x86_64/usr/include/linux/serial.h
+platforms/android-21/arch-x86_64/usr/include/linux/serial_reg.h
+platforms/android-21/arch-x86_64/usr/include/linux/serio.h
+platforms/android-21/arch-x86_64/usr/include/linux/shm.h
+platforms/android-21/arch-x86_64/usr/include/linux/signalfd.h
+platforms/android-21/arch-x86_64/usr/include/linux/signal.h
+platforms/android-21/arch-x86_64/usr/include/linux/snmp.h
+platforms/android-21/arch-x86_64/usr/include/linux/sock_diag.h
+platforms/android-21/arch-x86_64/usr/include/linux/socket.h
+platforms/android-21/arch-x86_64/usr/include/linux/sockios.h
+platforms/android-21/arch-x86_64/usr/include/linux/som.h
+platforms/android-21/arch-x86_64/usr/include/linux/sonet.h
+platforms/android-21/arch-x86_64/usr/include/linux/sonypi.h
+platforms/android-21/arch-x86_64/usr/include/linux/soundcard.h
+platforms/android-21/arch-x86_64/usr/include/linux/sound.h
+platforms/android-21/arch-x86_64/usr/include/linux/spi/spidev.h
+platforms/android-21/arch-x86_64/usr/include/linux/stat.h
+platforms/android-21/arch-x86_64/usr/include/linux/stddef.h
+platforms/android-21/arch-x86_64/usr/include/linux/string.h
+platforms/android-21/arch-x86_64/usr/include/linux/sunrpc/debug.h
+platforms/android-21/arch-x86_64/usr/include/linux/suspend_ioctls.h
+platforms/android-21/arch-x86_64/usr/include/linux/swab.h
+platforms/android-21/arch-x86_64/usr/include/linux/sw_sync.h
+platforms/android-21/arch-x86_64/usr/include/linux/sync.h
+platforms/android-21/arch-x86_64/usr/include/linux/synclink.h
+platforms/android-21/arch-x86_64/usr/include/linux/sysctl.h
+platforms/android-21/arch-x86_64/usr/include/linux/sysinfo.h
+platforms/android-21/arch-x86_64/usr/include/linux/taskstats.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_act/tc_csum.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_act/tc_defact.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_act/tc_gact.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_act/tc_ipt.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_act/tc_mirred.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_act/tc_nat.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_act/tc_pedit.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_act/tc_skbedit.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_ematch/tc_em_cmp.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_ematch/tc_em_meta.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_ematch/tc_em_nbyte.h
+platforms/android-21/arch-x86_64/usr/include/linux/tc_ematch/tc_em_text.h
+platforms/android-21/arch-x86_64/usr/include/linux/tcp.h
+platforms/android-21/arch-x86_64/usr/include/linux/tcp_metrics.h
+platforms/android-21/arch-x86_64/usr/include/linux/telephony.h
+platforms/android-21/arch-x86_64/usr/include/linux/termios.h
+platforms/android-21/arch-x86_64/usr/include/linux/time.h
+platforms/android-21/arch-x86_64/usr/include/linux/times.h
+platforms/android-21/arch-x86_64/usr/include/linux/timex.h
+platforms/android-21/arch-x86_64/usr/include/linux/tiocl.h
+platforms/android-21/arch-x86_64/usr/include/linux/tipc_config.h
+platforms/android-21/arch-x86_64/usr/include/linux/tipc.h
+platforms/android-21/arch-x86_64/usr/include/linux/toshiba.h
+platforms/android-21/arch-x86_64/usr/include/linux/tty_flags.h
+platforms/android-21/arch-x86_64/usr/include/linux/tty.h
+platforms/android-21/arch-x86_64/usr/include/linux/types.h
+platforms/android-21/arch-x86_64/usr/include/linux/udf_fs_i.h
+platforms/android-21/arch-x86_64/usr/include/linux/udp.h
+platforms/android-21/arch-x86_64/usr/include/linux/uhid.h
+platforms/android-21/arch-x86_64/usr/include/linux/uinput.h
+platforms/android-21/arch-x86_64/usr/include/linux/uio.h
+platforms/android-21/arch-x86_64/usr/include/linux/ultrasound.h
+platforms/android-21/arch-x86_64/usr/include/linux/un.h
+platforms/android-21/arch-x86_64/usr/include/linux/unistd.h
+platforms/android-21/arch-x86_64/usr/include/linux/unix_diag.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/audio.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/cdc.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/cdc-wdm.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/ch11.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/ch9.h
+platforms/android-21/arch-x86_64/usr/include/linux/usbdevice_fs.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/f_accessory.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/f_mtp.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/functionfs.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/gadgetfs.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/g_printer.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/midi.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/tmc.h
+platforms/android-21/arch-x86_64/usr/include/linux/usb/video.h
+platforms/android-21/arch-x86_64/usr/include/linux/utime.h
+platforms/android-21/arch-x86_64/usr/include/linux/utsname.h
+platforms/android-21/arch-x86_64/usr/include/linux/uuid.h
+platforms/android-21/arch-x86_64/usr/include/linux/uvcvideo.h
+platforms/android-21/arch-x86_64/usr/include/linux/v4l2-common.h
+platforms/android-21/arch-x86_64/usr/include/linux/v4l2-controls.h
+platforms/android-21/arch-x86_64/usr/include/linux/v4l2-dv-timings.h
+platforms/android-21/arch-x86_64/usr/include/linux/v4l2-mediabus.h
+platforms/android-21/arch-x86_64/usr/include/linux/v4l2-subdev.h
+platforms/android-21/arch-x86_64/usr/include/linux/version.h
+platforms/android-21/arch-x86_64/usr/include/linux/veth.h
+platforms/android-21/arch-x86_64/usr/include/linux/vfio.h
+platforms/android-21/arch-x86_64/usr/include/linux/vhost.h
+platforms/android-21/arch-x86_64/usr/include/linux/videodev2.h
+platforms/android-21/arch-x86_64/usr/include/linux/virtio_9p.h
+platforms/android-21/arch-x86_64/usr/include/linux/virtio_balloon.h
+platforms/android-21/arch-x86_64/usr/include/linux/virtio_blk.h
+platforms/android-21/arch-x86_64/usr/include/linux/virtio_config.h
+platforms/android-21/arch-x86_64/usr/include/linux/virtio_console.h
+platforms/android-21/arch-x86_64/usr/include/linux/virtio_ids.h
+platforms/android-21/arch-x86_64/usr/include/linux/virtio_net.h
+platforms/android-21/arch-x86_64/usr/include/linux/virtio_pci.h
+platforms/android-21/arch-x86_64/usr/include/linux/virtio_ring.h
+platforms/android-21/arch-x86_64/usr/include/linux/virtio_rng.h
+platforms/android-21/arch-x86_64/usr/include/linux/vm_sockets.h
+platforms/android-21/arch-x86_64/usr/include/linux/vsp1.h
+platforms/android-21/arch-x86_64/usr/include/linux/vt.h
+platforms/android-21/arch-x86_64/usr/include/linux/wait.h
+platforms/android-21/arch-x86_64/usr/include/linux/wanrouter.h
+platforms/android-21/arch-x86_64/usr/include/linux/watchdog.h
+platforms/android-21/arch-x86_64/usr/include/linux/wimax.h
+platforms/android-21/arch-x86_64/usr/include/linux/wimax/i2400m.h
+platforms/android-21/arch-x86_64/usr/include/linux/wireless.h
+platforms/android-21/arch-x86_64/usr/include/linux/x25.h
+platforms/android-21/arch-x86_64/usr/include/linux/xattr.h
+platforms/android-21/arch-x86_64/usr/include/linux/xfrm.h
+platforms/android-21/arch-x86_64/usr/include/linux/zorro.h
+platforms/android-21/arch-x86_64/usr/include/linux/zorro_ids.h
+platforms/android-21/arch-x86_64/usr/include/locale.h
+platforms/android-21/arch-x86_64/usr/include/machine/asm.h
+platforms/android-21/arch-x86_64/usr/include/machine/elf_machdep.h
+platforms/android-21/arch-x86_64/usr/include/machine/endian.h
+platforms/android-21/arch-x86_64/usr/include/machine/exec.h
+platforms/android-21/arch-x86_64/usr/include/machine/fenv.h
+platforms/android-21/arch-x86_64/usr/include/machine/fpu.h
+platforms/android-21/arch-x86_64/usr/include/machine/ieee.h
+platforms/android-21/arch-x86_64/usr/include/machine/setjmp.h
+platforms/android-21/arch-x86_64/usr/include/machine/wchar_limits.h
+platforms/android-21/arch-x86_64/usr/include/malloc.h
+platforms/android-21/arch-x86_64/usr/include/math.h
+platforms/android-21/arch-x86_64/usr/include/media/NdkMediaCodec.h
+platforms/android-21/arch-x86_64/usr/include/media/NdkMediaCrypto.h
+platforms/android-21/arch-x86_64/usr/include/media/NdkMediaDrm.h
+platforms/android-21/arch-x86_64/usr/include/media/NdkMediaError.h
+platforms/android-21/arch-x86_64/usr/include/media/NdkMediaExtractor.h
+platforms/android-21/arch-x86_64/usr/include/media/NdkMediaFormat.h
+platforms/android-21/arch-x86_64/usr/include/media/NdkMediaMuxer.h
+platforms/android-21/arch-x86_64/usr/include/memory.h
+platforms/android-21/arch-x86_64/usr/include/mntent.h
+platforms/android-21/arch-x86_64/usr/include/netdb.h
+platforms/android-21/arch-x86_64/usr/include/net/ethernet.h
+platforms/android-21/arch-x86_64/usr/include/net/ethertypes.h
+platforms/android-21/arch-x86_64/usr/include/net/if_arp.h
+platforms/android-21/arch-x86_64/usr/include/net/if_ether.h
+platforms/android-21/arch-x86_64/usr/include/net/if.h
+platforms/android-21/arch-x86_64/usr/include/net/if_ieee1394.h
+platforms/android-21/arch-x86_64/usr/include/net/if_packet.h
+platforms/android-21/arch-x86_64/usr/include/net/if_types.h
+platforms/android-21/arch-x86_64/usr/include/netinet/ether.h
+platforms/android-21/arch-x86_64/usr/include/netinet/icmp6.h
+platforms/android-21/arch-x86_64/usr/include/netinet/if_ether.h
+platforms/android-21/arch-x86_64/usr/include/netinet/in6.h
+platforms/android-21/arch-x86_64/usr/include/netinet/in.h
+platforms/android-21/arch-x86_64/usr/include/netinet/in_systm.h
+platforms/android-21/arch-x86_64/usr/include/netinet/ip6.h
+platforms/android-21/arch-x86_64/usr/include/netinet/ip.h
+platforms/android-21/arch-x86_64/usr/include/netinet/ip_icmp.h
+platforms/android-21/arch-x86_64/usr/include/netinet/tcp.h
+platforms/android-21/arch-x86_64/usr/include/netinet/udp.h
+platforms/android-21/arch-x86_64/usr/include/netpacket/packet.h
+platforms/android-21/arch-x86_64/usr/include/net/route.h
+platforms/android-21/arch-x86_64/usr/include/nsswitch.h
+platforms/android-21/arch-x86_64/usr/include/OMXAL/OpenMAXAL_Android.h
+platforms/android-21/arch-x86_64/usr/include/OMXAL/OpenMAXAL.h
+platforms/android-21/arch-x86_64/usr/include/OMXAL/OpenMAXAL_Platform.h
+platforms/android-21/arch-x86_64/usr/include/pathconf.h
+platforms/android-21/arch-x86_64/usr/include/paths.h
+platforms/android-21/arch-x86_64/usr/include/poll.h
+platforms/android-21/arch-x86_64/usr/include/pthread.h
+platforms/android-21/arch-x86_64/usr/include/pwd.h
+platforms/android-21/arch-x86_64/usr/include/regex.h
+platforms/android-21/arch-x86_64/usr/include/resolv.h
+platforms/android-21/arch-x86_64/usr/include/rs/cpp/RenderScript.h
+platforms/android-21/arch-x86_64/usr/include/rs/cpp/rsCppStructs.h
+platforms/android-21/arch-x86_64/usr/include/rs/cpp/rsDispatch.h
+platforms/android-21/arch-x86_64/usr/include/rs/cpp/util/RefBase.h
+platforms/android-21/arch-x86_64/usr/include/rs/cpp/util/StrongPointer.h
+platforms/android-21/arch-x86_64/usr/include/rs/cpp/util/TypeHelpers.h
+platforms/android-21/arch-x86_64/usr/include/rs/rsDefines.h
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_allocation.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_atomic.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_core_math.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_core.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_debug.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_element.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_math.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_matrix.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_object.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_quaternion.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_sampler.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_time.rsh
+platforms/android-21/arch-x86_64/usr/include/rs/scriptc/rs_types.rsh
+platforms/android-21/arch-x86_64/usr/include/sched.h
+platforms/android-21/arch-x86_64/usr/include/search.h
+platforms/android-21/arch-x86_64/usr/include/semaphore.h
+platforms/android-21/arch-x86_64/usr/include/setjmp.h
+platforms/android-21/arch-x86_64/usr/include/sgtty.h
+platforms/android-21/arch-x86_64/usr/include/signal.h
+platforms/android-21/arch-x86_64/usr/include/SLES/OpenSLES_AndroidConfiguration.h
+platforms/android-21/arch-x86_64/usr/include/SLES/OpenSLES_Android.h
+platforms/android-21/arch-x86_64/usr/include/SLES/OpenSLES_AndroidMetadata.h
+platforms/android-21/arch-x86_64/usr/include/SLES/OpenSLES.h
+platforms/android-21/arch-x86_64/usr/include/SLES/OpenSLES_Platform.h
+platforms/android-21/arch-x86_64/usr/include/stdatomic.h
+platforms/android-21/arch-x86_64/usr/include/stdint.h
+platforms/android-21/arch-x86_64/usr/include/stdio.h
+platforms/android-21/arch-x86_64/usr/include/stdlib.h
+platforms/android-21/arch-x86_64/usr/include/string.h
+platforms/android-21/arch-x86_64/usr/include/strings.h
+platforms/android-21/arch-x86_64/usr/include/sys/auxv.h
+platforms/android-21/arch-x86_64/usr/include/sys/cachectl.h
+platforms/android-21/arch-x86_64/usr/include/sys/capability.h
+platforms/android-21/arch-x86_64/usr/include/sys/cdefs_elf.h
+platforms/android-21/arch-x86_64/usr/include/sys/cdefs.h
+platforms/android-21/arch-x86_64/usr/include/sys/endian.h
+platforms/android-21/arch-x86_64/usr/include/sys/epoll.h
+platforms/android-21/arch-x86_64/usr/include/sys/errno.h
+platforms/android-21/arch-x86_64/usr/include/sys/eventfd.h
+platforms/android-21/arch-x86_64/usr/include/sys/file.h
+platforms/android-21/arch-x86_64/usr/include/sys/fsuid.h
+platforms/android-21/arch-x86_64/usr/include/sys/glibc-syscalls.h
+platforms/android-21/arch-x86_64/usr/include/sys/inotify.h
+platforms/android-21/arch-x86_64/usr/include/sys/ioctl_compat.h
+platforms/android-21/arch-x86_64/usr/include/sys/ioctl.h
+platforms/android-21/arch-x86_64/usr/include/sys/ipc.h
+platforms/android-21/arch-x86_64/usr/include/sys/klog.h
+platforms/android-21/arch-x86_64/usr/include/sys/limits.h
+platforms/android-21/arch-x86_64/usr/include/syslog.h
+platforms/android-21/arch-x86_64/usr/include/sys/mman.h
+platforms/android-21/arch-x86_64/usr/include/sys/mount.h
+platforms/android-21/arch-x86_64/usr/include/sys/msg.h
+platforms/android-21/arch-x86_64/usr/include/sys/param.h
+platforms/android-21/arch-x86_64/usr/include/sys/personality.h
+platforms/android-21/arch-x86_64/usr/include/sys/poll.h
+platforms/android-21/arch-x86_64/usr/include/sys/prctl.h
+platforms/android-21/arch-x86_64/usr/include/sys/ptrace.h
+platforms/android-21/arch-x86_64/usr/include/sys/queue.h
+platforms/android-21/arch-x86_64/usr/include/sys/reboot.h
+platforms/android-21/arch-x86_64/usr/include/sys/reg.h
+platforms/android-21/arch-x86_64/usr/include/sys/resource.h
+platforms/android-21/arch-x86_64/usr/include/sys/select.h
+platforms/android-21/arch-x86_64/usr/include/sys/sem.h
 platforms/android-21/arch-x86_64/usr/include/sys/sendfile.h
 platforms/android-21/arch-x86_64/usr/include/sys/shm.h
 platforms/android-21/arch-x86_64/usr/include/sys/signalfd.h
diff --git a/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java b/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
index a3ea359..dcd3ea0 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/ConfigurationFragmentPolicyTest.java
@@ -1,89 +1,4 @@
-// Copyright 2016 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.
-package com.google.devtools.build.lib.packages;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
-import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for the ConfigurationFragmentPolicy builder and methods.
- */
-@RunWith(JUnit4.class)
-public final class ConfigurationFragmentPolicyTest {
-
-  @SkylarkModule(name = "test_fragment", doc = "first fragment")
-  private static final class TestFragment {}
-
-  @SkylarkModule(name = "other_fragment", doc = "second fragment")
-  private static final class OtherFragment {}
-
-  @SkylarkModule(name = "unknown_fragment", doc = "useless waste of permgen")
-  private static final class UnknownFragment {}
-
-  @Test
-  public void testMissingFragmentPolicy() throws Exception {
-    ConfigurationFragmentPolicy policy =
-        new ConfigurationFragmentPolicy.Builder()
-            .setMissingFragmentPolicy(MissingFragmentPolicy.IGNORE)
-            .build();
-
-    assertThat(policy.getMissingFragmentPolicy()).isEqualTo(MissingFragmentPolicy.IGNORE);
-
-    ConfigurationFragmentPolicy otherPolicy =
-        new ConfigurationFragmentPolicy.Builder()
-            .setMissingFragmentPolicy(MissingFragmentPolicy.CREATE_FAIL_ACTIONS)
-            .build();
-
-    assertThat(otherPolicy.getMissingFragmentPolicy())
-        .isEqualTo(MissingFragmentPolicy.CREATE_FAIL_ACTIONS);
-  }
-
-  @Test
-  public void testRequiresConfigurationFragments_AddsToRequiredSet() throws Exception {
-    // Although these aren't configuration fragments, there are no requirements as to what the class
-    // has to be, so...
-    ConfigurationFragmentPolicy policy =
-        new ConfigurationFragmentPolicy.Builder()
-            .requiresConfigurationFragments(ImmutableSet.<Class<?>>of(Integer.class, String.class))
-            .requiresConfigurationFragments(ImmutableSet.<Class<?>>of(String.class, Long.class))
-            .build();
-
-    assertThat(policy.getRequiredConfigurationFragments())
-        .containsExactly(Integer.class, String.class, Long.class);
-  }
-
-  @Test
-  public void testRequiresConfigurationFragments_RequiredAndLegalForSpecifiedConfiguration()
-      throws Exception {
-    ConfigurationFragmentPolicy policy =
-        new ConfigurationFragmentPolicy.Builder()
-            .requiresConfigurationFragments(ImmutableSet.<Class<?>>of(Integer.class))
-            .requiresHostConfigurationFragments(ImmutableSet.<Class<?>>of(Long.class))
-            .build();
-
-    assertThat(policy.getRequiredConfigurationFragments()).containsAllOf(Integer.class, Long.class);
-
-    assertThat(policy.isLegalConfigurationFragment(Integer.class)).isTrue();
-    assertThat(policy.isLegalConfigurationFragment(Integer.class, ConfigurationTransition.NONE))
+(policy.isLegalConfigurationFragment(Integer.class, ConfigurationTransition.NONE))
         .isTrue();
     // TODO(mstaib): .isFalse() when dynamic configurations care which configuration a fragment was
     // specified for
diff --git a/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java b/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java
index 30011adc..5b9beaf 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/GlobCacheTest.java
@@ -1,4 +1,270 @@
-syntactic shorthand for Lists.newArrayList(strings) */
+// Copyright 2015 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.
+package com.google.devtools.build.lib.packages;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+
+import com.google.common.collect.Lists;
+import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.packages.Globber.BadGlobException;
+import com.google.devtools.build.lib.testutil.Scratch;
+import com.google.devtools.build.lib.testutil.TestUtils;
+import com.google.devtools.build.lib.util.Pair;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
+import com.google.devtools.build.lib.vfs.Path;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@link GlobCache}
+ */
+@RunWith(JUnit4.class)
+public class GlobCacheTest {
+
+  private static final List<String> NONE = Collections.emptyList();
+
+  private Scratch scratch = new Scratch("/workspace");
+
+  private Path packageDirectory;
+  private Path buildFile;
+  private GlobCache cache;
+
+  @Before
+  public final void createFiles() throws Exception  {
+    buildFile = scratch.file("isolated/BUILD",
+        "# contents don't matter in this test");
+    scratch.file("isolated/sub/BUILD",
+        "# contents don't matter in this test");
+
+    packageDirectory = buildFile.getParentDirectory();
+
+    scratch.file("isolated/first.txt",
+        "# this is first.txt");
+
+    scratch.file("isolated/second.txt",
+        "# this is second.txt");
+
+    scratch.file("isolated/first.js",
+        "# this is first.js");
+
+    scratch.file("isolated/second.js",
+        "# this is second.js");
+
+    // Files in subdirectories
+
+    scratch.file("isolated/foo/first.js",
+        "# this is foo/first.js");
+
+    scratch.file("isolated/foo/second.js",
+        "# this is foo/second.js");
+
+    scratch.file("isolated/bar/first.js",
+        "# this is bar/first.js");
+
+    scratch.file("isolated/bar/second.js",
+        "# this is bar/second.js");
+
+    scratch.file("isolated/sub/sub.js",
+        "# this is sub/sub.js");
+
+    cache =
+        new GlobCache(
+            packageDirectory,
+            PackageIdentifier.createInMainRepo("isolated"),
+            new CachingPackageLocator() {
+              @Override
+              public Path getBuildFileForPackage(PackageIdentifier packageId) {
+                String packageName = packageId.getPackageFragment().getPathString();
+                if (packageName.equals("isolated")) {
+                  return scratch.resolve("isolated/BUILD");
+                } else if (packageName.equals("isolated/sub")) {
+                  return scratch.resolve("isolated/sub/BUILD");
+                } else {
+                  return null;
+                }
+              }
+            },
+            null,
+            TestUtils.getPool(),
+            -1);
+  }
+
+  @After
+  public final void deleteFiles() throws Exception  {
+    FileSystemUtils.deleteTreesBelow(scratch.getFileSystem().getRootDirectory());
+  }
+
+  @Test
+  public void testSafeGlob() throws Exception {
+    List<Path> paths = cache.safeGlobUnsorted("*.js", false).get();
+    assertPathsAre(paths,
+        "/workspace/isolated/first.js", "/workspace/isolated/second.js");
+  }
+
+  @Test
+  public void testSafeGlobInvalidPatterns() throws Exception {
+    for (String pattern : new String[] {"Foo?.txt", "List{Test}.py"}) {
+      try {
+        cache.safeGlobUnsorted(pattern, false);
+        fail("Expected pattern " + pattern + " to fail");
+      } catch (BadGlobException expected) {
+      }
+    }
+  }
+
+  @Test
+  public void testGetGlob() throws Exception {
+    List<String> glob = cache.getGlobUnsorted("*.js");
+    assertThat(glob).containsExactly("first.js", "second.js");
+  }
+
+  @Test
+  public void testGetGlob_subdirectory() throws Exception {
+    List<String> glob = cache.getGlobUnsorted("foo/*.js");
+    assertThat(glob).containsExactly("foo/first.js", "foo/second.js");
+  }
+
+  @Test
+  public void testGetKeySet() throws Exception {
+    assertThat(cache.getKeySet()).isEmpty();
+
+    cache.getGlobUnsorted("*.java");
+    assertThat(cache.getKeySet()).containsExactly(Pair.of("*.java", false));
+
+    cache.getGlobUnsorted("*.java");
+    assertThat(cache.getKeySet()).containsExactly(Pair.of("*.java", false));
+
+    cache.getGlobUnsorted("*.js");
+    assertThat(cache.getKeySet()).containsExactly(Pair.of("*.java", false), Pair.of("*.js", false));
+
+    cache.getGlobUnsorted("*.java", true);
+    assertThat(cache.getKeySet()).containsExactly(Pair.of("*.java", false), Pair.of("*.js", false),
+        Pair.of("*.java", true));
+
+    try {
+      cache.getGlobUnsorted("invalid?");
+      fail("Expected an invalid regex exception");
+    } catch (BadGlobException expected) {
+    }
+    assertThat(cache.getKeySet()).containsExactly(Pair.of("*.java", false), Pair.of("*.js", false),
+        Pair.of("*.java", true));
+
+    cache.getGlobUnsorted("foo/first.*");
+    assertThat(cache.getKeySet()).containsExactly(Pair.of("*.java", false), Pair.of("*.java", true),
+        Pair.of("*.js", false), Pair.of("foo/first.*", false));
+  }
+
+  @Test
+  public void testGlob() throws Exception {
+    assertEmpty(cache.globUnsorted(list("*.java"), NONE, false));
+
+    assertThat(cache.globUnsorted(list("*.*"), NONE, false)).containsExactly(
+        "first.js", "first.txt", "second.js", "second.txt");
+
+    assertThat(cache.globUnsorted(list("*.*"), list("first.js"), false)).containsExactly(
+        "first.txt", "second.js", "second.txt");
+
+    assertThat(cache.globUnsorted(list("*.txt", "first.*"), NONE, false)).containsExactly(
+        "first.txt", "second.txt", "first.js");
+  }
+
+  @Test
+  public void testRecursiveGlobDoesNotMatchSubpackage() throws Exception {
+    List<String> glob = cache.getGlobUnsorted("**/*.js");
+    assertThat(glob).containsExactly("first.js", "second.js", "foo/first.js", "bar/first.js",
+        "foo/second.js", "bar/second.js");
+  }
+
+  @Test
+  public void testSingleFileExclude_Star() throws Exception {
+    assertThat(cache.globUnsorted(list("*"), list("first.txt"), false)).containsExactly(
+        "BUILD", "bar", "first.js", "foo", "second.js", "second.txt");
+  }
+
+  @Test
+  public void testSingleFileExclude_StarStar() throws Exception {
+    assertThat(cache.globUnsorted(list("**"), list("first.txt"), false)).containsExactly(
+        "BUILD", "bar", "bar/first.js", "bar/second.js", "first.js", "foo", "foo/first.js",
+        "foo/second.js", "second.js", "second.txt");
+  }
+
+  @Test
+  public void testExcludeAll_Star() throws Exception {
+    assertThat(cache.globUnsorted(list("*"), list("*"), false)).isEmpty();
+  }
+
+  @Test
+  public void testExcludeAll_Star_NoMatchesAnyway() throws Exception {
+    assertThat(cache.globUnsorted(list("nope"), list("*"), false)).isEmpty();
+  }
+
+  @Test
+  public void testExcludeAll_StarStar() throws Exception {
+    assertThat(cache.globUnsorted(list("**"), list("**"), false)).isEmpty();
+  }
+
+  @Test
+  public void testExcludeAll_Manual() throws Exception {
+    assertThat(cache.globUnsorted(list("**"), list("*", "*/*", "*/*/*"), false)).isEmpty();
+  }
+
+  @Test
+  public void testSingleFileExcludeDoesntMatch() throws Exception {
+    assertThat(cache.globUnsorted(list("first.txt"), list("nope.txt"), false)).containsExactly(
+        "first.txt");
+  }
+
+  @Test
+  public void testExcludeDirectory() throws Exception {
+    assertThat(cache.globUnsorted(list("foo/*"), NONE, true)).containsExactly(
+        "foo/first.js", "foo/second.js");
+    assertThat(cache.globUnsorted(list("foo/*"), list("foo"), false)).containsExactly(
+        "foo/first.js", "foo/second.js");
+  }
+
+  @Test
+  public void testChildGlobWithChildExclude() throws Exception {
+    assertThat(cache.globUnsorted(list("foo/*"), list("foo/*"), false)).isEmpty();
+    assertThat(
+        cache.globUnsorted(list("foo/first.js", "foo/second.js"), list("foo/*"), false)).isEmpty();
+    assertThat(cache.globUnsorted(list("foo/first.js"), list("foo/first.js"), false)).isEmpty();
+    assertThat(cache.globUnsorted(list("foo/first.js"), list("*/first.js"), false)).isEmpty();
+    assertThat(cache.globUnsorted(list("foo/first.js"), list("*/*"), false)).isEmpty();
+  }
+
+  private void assertEmpty(Collection<?> glob) {
+    assertThat(glob).isEmpty();
+  }
+
+  private void assertPathsAre(List<Path> paths, String... strings) {
+    List<String> pathStrings = new ArrayList<>();
+    for (Path path : paths) {
+      pathStrings.add(path.getPathString());
+    }
+    assertThat(pathStrings).containsExactlyElementsIn(Arrays.asList(strings));
+  }
+
+  /* syntactic shorthand for Lists.newArrayList(strings) */
   private List<String> list(String... strings) {
     return Lists.newArrayList(strings);
   }