cros_run_unit_tests: query ebuilds in parallel

The equery command is slow (like ~1 second), so let's speed things up by
running them all in parallel.  This takes it from like ~20secs to ~6secs.

BUG=chromium:342180
TEST=`./cros_run_unit_tests --board=sonic --pretend` takes ~33% of the time it used to

Change-Id: Id14ba63daf00aedf62a72972f1e1e36f830b57ef
Reviewed-on: https://chromium-review.googlesource.com/185596
Reviewed-by: Gaurav Shah <gauravsh@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
diff --git a/cros_run_unit_tests b/cros_run_unit_tests
index b908380..3f240f8 100755
--- a/cros_run_unit_tests
+++ b/cros_run_unit_tests
@@ -80,23 +80,36 @@
   export USE="${USE} -cros-debug"
 fi
 
-TEST_PACKAGE_LIST=""
-for package in ${PACKAGE_LIST}; do
-  if grep -xq "${package}" "${BLACK_LIST_FILE}" || \
-     [[ " ${BLACK_LIST_PACKAGES} " =~ " ${package} " ]]; then
-    warn "Skipping package ${package} since it is blacklisted."
-    continue
-  fi
-  EBUILD_PATH=$( equery-${FLAGS_board} which ${package} 2> /dev/null ) || \
-    warn "${package} not found"
-  if [ -n "${EBUILD_PATH}" ]; then
-    if check_src_test "${EBUILD_PATH}"; then
-      TEST_PACKAGE_LIST+=" ${package}"
-    else
-      NO_UNITTESTS+=" ${package}"
+ALL_PACKAGE_LIST=$(
+  jobs=0
+  for package in ${PACKAGE_LIST}; do
+    (
+    if grep -xq "${package}" "${BLACK_LIST_FILE}" || \
+       [[ " ${BLACK_LIST_PACKAGES} " =~ " ${package} " ]]; then
+      warn "Skipping package ${package} since it is blacklisted."
+      continue
     fi
-  fi
-done
+    EBUILD_PATH=$(equery-${FLAGS_board} which ${package} 2>/dev/null) || \
+      warn "${package} not found"
+    if [[ -n ${EBUILD_PATH} ]]; then
+      if check_src_test "${EBUILD_PATH}"; then
+        echo "y:${package}"
+      else
+        echo "n:${package}"
+      fi
+    fi
+    ) &
+    if [[ ${jobs} -ge ${NUM_JOBS} ]]; then
+      jobs=0
+      wait
+    else
+      : $(( jobs += 1 ))
+    fi
+  done | sort
+  wait
+)
+TEST_PACKAGE_LIST=$(echo "${ALL_PACKAGE_LIST}" | sed -n '/^y:/s:^..::p')
+NO_UNITTESTS=$(echo "${ALL_PACKAGE_LIST}" | sed -n '/^n:/s:^..::p')
 
 if [ -n "${NO_UNITTESTS}" ]; then
   warn "The following packages have no unit tests:"