Add --local_test_jobs to limit local test concurrency

Users have asked for ways to control the concurrency level of their
local tests. They can do it right now using the --local_resources
option, but that is unintuitive and affects the parallelism of
non-test actions.

This option changes the kind of resources obtained for local tests. If
set, the CPU, RAM, and IO dimensions for local tests will not be used,
and a new localTestCount dimension will be used, where the capacity is
equal to the option's value, and each local test consumes one unit.

--
MOS_MIGRATED_REVID=87177698
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 0c8d404..b248b05 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -42,6 +42,7 @@
 import com.google.devtools.build.lib.actions.ExecutorInitException;
 import com.google.devtools.build.lib.actions.LocalHostCapacity;
 import com.google.devtools.build.lib.actions.ResourceManager;
+import com.google.devtools.build.lib.actions.ResourceSet;
 import com.google.devtools.build.lib.actions.SpawnActionContext;
 import com.google.devtools.build.lib.actions.TestExecException;
 import com.google.devtools.build.lib.actions.cache.ActionCache;
@@ -760,11 +761,12 @@
   private void configureResourceManager(BuildRequest request) {
     ResourceManager resourceMgr = ResourceManager.instance();
     ExecutionOptions options = request.getOptions(ExecutionOptions.class);
+    ResourceSet resources;
     if (options.availableResources != null) {
-      resourceMgr.setAvailableResources(options.availableResources);
+      resources = options.availableResources;
       resourceMgr.setRamUtilizationPercentage(100);
     } else {
-      resourceMgr.setAvailableResources(LocalHostCapacity.getLocalHostCapacity());
+      resources = LocalHostCapacity.getLocalHostCapacity();
       resourceMgr.setRamUtilizationPercentage(options.ramUtilizationPercentage);
       if (options.useResourceAutoSense) {
         getReporter().handle(
@@ -772,6 +774,14 @@
       }
       ResourceManager.instance().setAutoSensing(/*autosense=*/false);
     }
+
+    resourceMgr.setAvailableResources(ResourceSet.create(
+        resources.getMemoryMb(),
+        resources.getCpuUsage(),
+        resources.getIoUsage(),
+        request.getExecutionOptions().usingLocalTestJobs()
+            ? request.getExecutionOptions().localTestJobs : Integer.MAX_VALUE
+    ));
   }
 
   /**