Merge "Updating makefiles for hidl_interface." into oc-mr1-dev-plus-aosp
diff --git a/gnss/1.0/vts/functional/VtsHalGnssV1_0TargetTest.cpp b/gnss/1.0/vts/functional/VtsHalGnssV1_0TargetTest.cpp
index 91e75fe..b3ab594 100644
--- a/gnss/1.0/vts/functional/VtsHalGnssV1_0TargetTest.cpp
+++ b/gnss/1.0/vts/functional/VtsHalGnssV1_0TargetTest.cpp
@@ -147,7 +147,8 @@
           EXPECT_EQ(location_called_count_, 1);
       }
       if (location_called_count_ > 0) {
-          CheckLocation(last_location_, checkAccuracies);
+          // don't require speed on first fix
+          CheckLocation(last_location_, checkAccuracies, false);
           return true;
       }
       return false;
@@ -176,20 +177,24 @@
 
   /*
    * CheckLocation:
-   * Helper function to vet Location fields
+   *   Helper function to vet Location fields
    */
-  void CheckLocation(GnssLocation& location, bool checkAccuracies) {
+  void CheckLocation(GnssLocation& location, bool checkAccuracies, bool checkSpeed) {
       EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_LAT_LONG);
       EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_ALTITUDE);
-      EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_SPEED);
+      if (checkSpeed) {
+          EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_SPEED);
+      }
       EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_HORIZONTAL_ACCURACY);
       // New uncertainties available in O must be provided,
       // at least when paired with modern hardware (2017+)
       if (checkAccuracies) {
           EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_VERTICAL_ACCURACY);
-          EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_SPEED_ACCURACY);
-          if (location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING) {
-              EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING_ACCURACY);
+          if (checkSpeed) {
+              EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_SPEED_ACCURACY);
+              if (location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING) {
+                  EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING_ACCURACY);
+              }
           }
       }
       EXPECT_GE(location.latitudeDegrees, -90.0);
@@ -198,12 +203,14 @@
       EXPECT_LE(location.longitudeDegrees, 180.0);
       EXPECT_GE(location.altitudeMeters, -1000.0);
       EXPECT_LE(location.altitudeMeters, 30000.0);
-      EXPECT_GE(location.speedMetersPerSec, 0.0);
-      EXPECT_LE(location.speedMetersPerSec, 5.0);  // VTS tests are stationary.
+      if (checkSpeed) {
+          EXPECT_GE(location.speedMetersPerSec, 0.0);
+          EXPECT_LE(location.speedMetersPerSec, 5.0);  // VTS tests are stationary.
 
-      // Non-zero speeds must be reported with an associated bearing
-      if (location.speedMetersPerSec > 0.0) {
-          EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING);
+          // Non-zero speeds must be reported with an associated bearing
+          if (location.speedMetersPerSec > 0.0) {
+              EXPECT_TRUE(location.gnssLocationFlags & GnssLocationFlags::HAS_BEARING);
+          }
       }
 
       /*
@@ -356,7 +363,7 @@
     for (int i = 1; i < LOCATIONS_TO_CHECK; i++) {
         EXPECT_EQ(std::cv_status::no_timeout, wait(LOCATION_TIMEOUT_SUBSEQUENT_SEC));
         EXPECT_EQ(location_called_count_, i + 1);
-        CheckLocation(last_location_, checkMoreAccuracies);
+        CheckLocation(last_location_, checkMoreAccuracies, true);
     }
   }
 
diff --git a/micro-vts.sh b/micro-vts.sh
new file mode 100755
index 0000000..bb6f7d7
--- /dev/null
+++ b/micro-vts.sh
@@ -0,0 +1,114 @@
+#!/bin/bash
+
+# See hal_hidl_gtest.py
+
+THREADS=
+CHECKER=vts_testability_checker
+CHECKER_DEVICE_PATH="/data/local/tmp/${CHECKER}"
+PRINT_COMMANDS=
+
+function run() {
+    if [ "${PRINT_COMMANDS}" = true ] ; then
+        >&2 echo "*** $@"
+    fi
+    $@
+}
+
+function make_modules() {
+    if [ "${THREADS}" != "0" ] ; then
+        run make -j${THREADS} -C ${ANDROID_BUILD_TOP} -f build/core/main.mk $@
+    fi
+}
+
+function push_checker() {
+    run adb push ${OUT}/system/bin/${CHECKER} ${CHECKER_DEVICE_PATH}
+}
+
+function push_test() {
+    local module=$1
+    for test_dir in nativetest nativetest64 ; do
+        local test_file=/data/${test_dir}/${module}/${module}
+        run adb push ${OUT}${test_file} ${test_file}
+    done
+}
+
+function read_checker_output() {
+    python -c 'import json,sys;obj=json.load(sys.stdin);sys.stdout.write("%s\n"%obj["Testable"]);map(lambda i:sys.stdout.write("%s\n"%i),obj["instances"])'
+}
+
+function run_test() {
+    local module=$1
+    local status=0
+
+    for test_dir in nativetest nativetest64 ; do
+        local test_file=/data/${test_dir}/${module}/${module}
+        local interfaces=$(run adb shell ${test_file} --list_registered_services \
+            | sed -n 's/^hal_service: \(.*\)$/\1/p')
+        if [ -z "$interfaces" ]; then
+            run adb shell ${test_file} || status=$?
+        else
+            for interface in ${interfaces} ; do
+                local output=$(run adb shell ${CHECKER_DEVICE_PATH} -c ${interface} | read_checker_output)
+                local testable=$(echo "${output}" | head -n1)
+                local instances=$(echo "${output}" | tail -n+2)
+
+                if [ "${testable}" == "True" ] ; then
+                    for instance in ${instances} ; do
+                        run adb shell ${test_file} --hal_service_instance="${interface}/${instance}" || status=$?
+                    done
+                fi
+            done
+        fi
+    done
+    return ${status}
+}
+
+function usage() {
+    echo "usage: $0 -m <module_name> [-m <module_name>[...]] [-j <jobs>] [-p]"
+    echo "          -m <module_name>: name of test (e.g. VtsHalHealthV2_0TargetTest)"
+    echo "          -p: print commands"
+    echo "          -j <jobs>: # jobs in make. "
+    echo "                     -j0 skips making any modules."
+    echo "                     If not present, use infinite number of jobs."
+
+    exit 1
+}
+
+function main() {
+    local modules=
+
+    while getopts "m:j:p" option ; do
+        case "${option}" in
+            m)
+                [ ! -z ${OPTARG} ] || usage
+                modules="${modules} ${OPTARG}"
+                ;;
+            j)
+                THREADS=${OPTARG}
+                ;;
+            p)
+                PRINT_COMMANDS=true
+                ;;
+            *)
+                usage
+                ;;
+        esac
+    done
+
+    set -e
+    make_modules ${CHECKER} ${modules}
+    run adb root
+    push_checker
+    for module in ${modules} ; do
+        push_test ${module}
+    done
+
+    set +e
+    local status=0
+    for module in ${modules} ; do
+        run_test ${module} || status=$?
+    done
+    return ${status}
+}
+
+main $@