Fix false alarm zero GPS measurement CTS failure

Android was updated to allow GnssMeasurementEvent's with
zero valid measurements (and just a clock.)
This CTS Verifier update now allows this.

Improved flakiness of GnssMeasurementRegistration status
check.

Also improved some test timeouts (restoring per test times),
output text, and variable names.

Bug: 30391885
Change-Id: I28e2995559ef745866d3137abc913621544215b5
diff --git a/apps/CtsVerifier/res/values/strings.xml b/apps/CtsVerifier/res/values/strings.xml
index 2c81626..de685b3 100644
--- a/apps/CtsVerifier/res/values/strings.xml
+++ b/apps/CtsVerifier/res/values/strings.xml
@@ -419,7 +419,7 @@
 
     <!-- Strings for Location GNSS tests -->
     <string name="location_gnss_constellation_type_test">GNSS Measurement Constellation Test</string>
-    <string name="location_gnss_measure_no_location_test">GNSS Measurement WhenNoLocation Test</string>
+    <string name="location_gnss_measure_no_location_test">GNSS Measurement Before Location Test</string>
     <string name="location_gnss_reg_test">GNSS Measurement Registration Test</string>
     <string name="location_gnss_value_test">GNSS Measurement Values Test</string>
     <string name="location_gnss_nav_msg_test">GNSS Navigation Message Test</string>
diff --git a/tests/tests/location/src/android/location/cts/GnssMeasurementRegistrationTest.java b/tests/tests/location/src/android/location/cts/GnssMeasurementRegistrationTest.java
index b46e906..2457c76 100644
--- a/tests/tests/location/src/android/location/cts/GnssMeasurementRegistrationTest.java
+++ b/tests/tests/location/src/android/location/cts/GnssMeasurementRegistrationTest.java
@@ -54,7 +54,6 @@
     private static final int GPS_EVENTS_COUNT = 1;
     private TestLocationListener mLocationListener;
     private TestGnssMeasurementListener mMeasurementListener;
-    private TestGpsStatusListener mGpsStatusListener;
 
     @Override
     protected void setUp() throws Exception {
@@ -72,9 +71,6 @@
         if (mMeasurementListener != null) {
             mTestLocationManager.unregisterGnssMeasurementCallback(mMeasurementListener);
         }
-        if (mGpsStatusListener != null) {
-            mTestLocationManager.removeGpsStatusListener(mGpsStatusListener);
-        }
         super.tearDown();
     }
 
@@ -94,8 +90,8 @@
         mTestLocationManager.registerGnssMeasurementCallback(mMeasurementListener);
 
         mMeasurementListener.await();
-        if (!mMeasurementListener.verifyState(isMeasurementTestStrict())) {
-            // If test is strict verifyState will assert conditions are good for further testing.
+        if (!mMeasurementListener.verifyStatus(isMeasurementTestStrict())) {
+            // If test is strict verifyStatus will assert conditions are good for further testing.
             // Else this returns false and, we arrive here, and then return from here (pass.)
             return;
         }
@@ -111,7 +107,7 @@
 
         SoftAssert.failAsWarning(
                 TAG,
-                "GPS measurements were not received without registering for location updates."
+                "GPS measurements were not received without registering for location updates. "
                 + "Trying again with Location request.");
 
         // Register for location updates.
diff --git a/tests/tests/location/src/android/location/cts/GnssMeasurementValuesTest.java b/tests/tests/location/src/android/location/cts/GnssMeasurementValuesTest.java
index e68464e..023b616 100644
--- a/tests/tests/location/src/android/location/cts/GnssMeasurementValuesTest.java
+++ b/tests/tests/location/src/android/location/cts/GnssMeasurementValuesTest.java
@@ -93,7 +93,7 @@
 
         Log.i(TAG, "Location status received = " + mLocationListener.isLocationReceived());
 
-        if (!mMeasurementListener.verifyState(isMeasurementTestStrict())) {
+        if (!mMeasurementListener.verifyStatus(isMeasurementTestStrict())) {
             // If test is strict and veriifyState reutrns false, an assert exception happens and
             // test fails.   If test is not strict, we arrive here, and:
             return; // exit (with pass)
diff --git a/tests/tests/location/src/android/location/cts/GnssMeasurementWhenNoLocationTest.java b/tests/tests/location/src/android/location/cts/GnssMeasurementWhenNoLocationTest.java
index 18d9552..0f4775e 100644
--- a/tests/tests/location/src/android/location/cts/GnssMeasurementWhenNoLocationTest.java
+++ b/tests/tests/location/src/android/location/cts/GnssMeasurementWhenNoLocationTest.java
@@ -55,7 +55,7 @@
  */
 public class GnssMeasurementWhenNoLocationTest extends GnssTestCase {
 
-    private static final String TAG = "GnssMeasWhenNoFixTest";
+    private static final String TAG = "GnssMeasBeforeLocTest";
     private TestGnssMeasurementListener mMeasurementListener;
     private TestGpsStatusListener mGpsStatusListener;
     private TestLocationListener mLocationListener;
@@ -88,7 +88,7 @@
     }
 
     /**
-     * Test GPS measurements without a location fix.
+     * Test for GPS measurements before a location fix.
      */
     public void testGnssMeasurementWhenNoLocation() throws Exception {
         // Checks if GPS hardware feature is present, skips test (pass) if not,
@@ -116,12 +116,13 @@
         mLocationListener = new TestLocationListener(LOCATIONS_COUNT);
         mTestLocationManager.requestLocationUpdates(mLocationListener);
 
-        if (!mMeasurementListener.verifyState(isMeasurementTestStrict())) {
-            return; // exit peacefully (if not already asserted out inside verifyState)
+        mMeasurementListener.awaitStatus();
+        if (!mMeasurementListener.verifyStatus(isMeasurementTestStrict())) {
+            return; // exit peacefully (if not already asserted out inside verifyStatus)
         }
 
-        // Wait for a few measurements (so as to check later that we've satisified this wait
-        // before getting _any_ locations.)
+        // Wait for two measurement events - this is better than waiting for a location calculation
+        // because the test generally completes much faster.
         mMeasurementListener.await();
 
         Log.i(TAG, "mLocationListener.isLocationReceived(): "
@@ -134,22 +135,23 @@
         List<GnssMeasurementsEvent> events = mMeasurementListener.getEvents();
         Log.i(TAG, "Number of GPS measurement events received = " + events.size());
 
-        SoftAssert.failOrWarning(isMeasurementTestStrict(),
-                "No GnssMeasurementEvent's found. Device may be indoors.  Retry outdoors?",
-                !events.isEmpty());
-        if (events.isEmpty() && !isMeasurementTestStrict()) {
-            return; // allow a (passing) return, if not strict, otherwise continue
-        }
-
         // Ensure that after getting a few (at least 2) measurements, that we still don't have
         // location (i.e. that we got measurements before location.)  Fail, if strict, warn, if not.
         SoftAssert.failOrWarning(isMeasurementTestStrict(),
-                "Insufficient GnssMeasurementEvent's found before location event.",
+                "Location was received before " + events.size() +
+                        " GnssMeasurementEvents with measurements were reported. " +
+                        "Test expects at least " + EVENTS_COUNT +
+                        " GnssMeasurementEvents before a location, given the cold start start. " +
+                        "Ensure no other active GPS apps (so the cold start command works) " +
+                        "and retry?",
                 !mLocationListener.isLocationReceived());
+        if (mLocationListener.isLocationReceived() && !isMeasurementTestStrict()) {
+            return; // allow a (passing) return, if not strict, otherwise continue
+        }
 
-        // If device is not indoor, verify that we receive GPS measurements before being able to
-        // calculate the position solution and verify that mandatory fields of GnssMeasurement are
-        // in expected ranges.
+        // If device is not indoors, verify
+        // 1) that we receive GPS measurements before being able to calculate the position solution
+        // 2) that mandatory fields of GnssMeasurement are in expected ranges.
         GnssMeasurementsEvent firstEvent = events.get(0);
         Collection<GnssMeasurement> gpsMeasurements = firstEvent.getMeasurements();
         int satelliteCount = gpsMeasurements.size();
@@ -159,8 +161,8 @@
             gpsPrns[i] = measurement.getSvid();
             ++i;
         }
+        Log.i(TAG, "First GnssMeasurementsEvent with PRNs=" + Arrays.toString(gpsPrns));
 
-        Log.i(TAG, "Gps Measurements 1st Event PRNs=" + Arrays.toString(gpsPrns));
         SoftAssert softAssert = new SoftAssert(TAG);
         long timeInNs = firstEvent.getClock().getTimeNanos();
         softAssert.assertTrue("GPS measurement satellite count check: ",
diff --git a/tests/tests/location/src/android/location/cts/GnssMeasurementsConstellationTest.java b/tests/tests/location/src/android/location/cts/GnssMeasurementsConstellationTest.java
index 201c692..4f125fc 100644
--- a/tests/tests/location/src/android/location/cts/GnssMeasurementsConstellationTest.java
+++ b/tests/tests/location/src/android/location/cts/GnssMeasurementsConstellationTest.java
@@ -22,7 +22,6 @@
 import android.util.Log;
 
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 import junit.framework.Assert;
 
@@ -90,7 +89,7 @@
         mTestLocationManager.requestLocationUpdates(mLocationListener);
 
         mMeasurementListener.await();
-        if (!mMeasurementListener.verifyState(isMeasurementTestStrict())) {
+        if (!mMeasurementListener.verifyStatus(isMeasurementTestStrict())) {
             return;
         }
 
diff --git a/tests/tests/location/src/android/location/cts/TestGnssMeasurementListener.java b/tests/tests/location/src/android/location/cts/TestGnssMeasurementListener.java
index e7e2958..1809bfb 100644
--- a/tests/tests/location/src/android/location/cts/TestGnssMeasurementListener.java
+++ b/tests/tests/location/src/android/location/cts/TestGnssMeasurementListener.java
@@ -28,17 +28,19 @@
 /**
  * Used for receiving GPS satellite measurements from the GPS engine.
  * Each measurement contains raw and computed data identifying a satellite.
+ * Only counts measurement events with more than one actual Measurement in them (not just clock)
  */
 class TestGnssMeasurementListener extends GnssMeasurementsEvent.Callback {
     // Timeout in sec for count down latch wait
-    private static final int TIMEOUT_IN_SEC = 90;
+    private static final int STATUS_TIMEOUT_IN_SEC = 10;
+    private static final int MEAS_TIMEOUT_IN_SEC = 60;
 
     private volatile int mStatus = -1;
 
     private final String mTag;
-    private final int mEventsToCollect;
     private final List<GnssMeasurementsEvent> mMeasurementsEvents;
     private final CountDownLatch mCountDownLatch;
+    private final CountDownLatch mCountDownLatchStatus;
 
     TestGnssMeasurementListener(String tag) {
         this(tag, 0);
@@ -47,14 +49,16 @@
     TestGnssMeasurementListener(String tag, int eventsToCollect) {
         mTag = tag;
         mCountDownLatch = new CountDownLatch(eventsToCollect);
-        mEventsToCollect = eventsToCollect;
+        mCountDownLatchStatus = new CountDownLatch(1);
         mMeasurementsEvents = new ArrayList<>(eventsToCollect);
     }
 
     @Override
     public void onGnssMeasurementsReceived(GnssMeasurementsEvent event) {
-        mMeasurementsEvents.add(event);
-        if (mMeasurementsEvents.size() >= mEventsToCollect) {
+        // Only count measurement events with more than one actual Measurement in them
+        // (not just clock)
+        if (event.getMeasurements().size() > 0) {
+            mMeasurementsEvents.add(event);
             mCountDownLatch.countDown();
         }
     }
@@ -62,20 +66,23 @@
     @Override
     public void onStatusChanged(int status) {
         mStatus = status;
-        if (mStatus != GnssMeasurementsEvent.Callback.STATUS_READY) {
-            mCountDownLatch.countDown();
-        }
+        mCountDownLatchStatus.countDown();
+    }
+
+    public boolean awaitStatus() throws InterruptedException {
+        return TestUtils.waitFor(mCountDownLatchStatus, STATUS_TIMEOUT_IN_SEC);
     }
 
     public boolean await() throws InterruptedException {
-        return TestUtils.waitFor(mCountDownLatch);
+        return TestUtils.waitFor(mCountDownLatch, MEAS_TIMEOUT_IN_SEC);
     }
 
+
     /**
      * @return {@code true} if the state of the test ensures that data is expected to be collected,
      *         {@code false} otherwise.
      */
-    public boolean verifyState(boolean testIsStrict) {
+    public boolean verifyStatus(boolean testIsStrict) {
         switch (getStatus()) {
             case GnssMeasurementsEvent.Callback.STATUS_NOT_SUPPORTED:
                 String message = "GnssMeasurements is not supported in the device:"
diff --git a/tests/tests/location/src/android/location/cts/TestGnssNavigationMessageListener.java b/tests/tests/location/src/android/location/cts/TestGnssNavigationMessageListener.java
index 3765f3c..068c4cb 100644
--- a/tests/tests/location/src/android/location/cts/TestGnssNavigationMessageListener.java
+++ b/tests/tests/location/src/android/location/cts/TestGnssNavigationMessageListener.java
@@ -32,7 +32,7 @@
 class TestGnssNavigationMessageListener extends GnssNavigationMessage.Callback {
 
     // Timeout in sec for count down latch wait
-    private static final long TIMEOUT_IN_SEC = 90L;
+    private static final int TIMEOUT_IN_SEC = 90;
 
     private volatile int mStatus = -1;
 
@@ -66,7 +66,7 @@
 
     public boolean await() throws InterruptedException {
         Log.i(mTag, "Number of GPS Navigation Message received = " + getEvents().size());
-        return TestUtils.waitFor(mCountDownLatch);
+        return TestUtils.waitFor(mCountDownLatch, TIMEOUT_IN_SEC);
     }
 
     /**
diff --git a/tests/tests/location/src/android/location/cts/TestGnssStatusCallback.java b/tests/tests/location/src/android/location/cts/TestGnssStatusCallback.java
index b5e102e..cc4c930 100644
--- a/tests/tests/location/src/android/location/cts/TestGnssStatusCallback.java
+++ b/tests/tests/location/src/android/location/cts/TestGnssStatusCallback.java
@@ -87,6 +87,6 @@
     }
 
     public boolean await() throws InterruptedException {
-        return TestUtils.waitFor(mCountDownLatch);
+        return TestUtils.waitFor(mCountDownLatch, TIMEOUT_IN_SEC);
     }
 }
diff --git a/tests/tests/location/src/android/location/cts/TestGpsStatusListener.java b/tests/tests/location/src/android/location/cts/TestGpsStatusListener.java
index 7f2b6d3c..bd114c1 100644
--- a/tests/tests/location/src/android/location/cts/TestGpsStatusListener.java
+++ b/tests/tests/location/src/android/location/cts/TestGpsStatusListener.java
@@ -91,6 +91,6 @@
     }
 
     public boolean await() throws InterruptedException {
-        return TestUtils.waitFor(mCountDownLatch);
+        return TestUtils.waitFor(mCountDownLatch, TIMEOUT_IN_SEC);
     }
 }
diff --git a/tests/tests/location/src/android/location/cts/TestLocationListener.java b/tests/tests/location/src/android/location/cts/TestLocationListener.java
index 7681ec4..f266d5a 100644
--- a/tests/tests/location/src/android/location/cts/TestLocationListener.java
+++ b/tests/tests/location/src/android/location/cts/TestLocationListener.java
@@ -30,7 +30,7 @@
     private volatile boolean mProviderEnabled;
     private volatile boolean mLocationReceived;
     // Timeout in sec for count down latch wait
-    private static final int TIMEOUT_IN_SEC = 300;
+    private static final int TIMEOUT_IN_SEC = 120;
     private final CountDownLatch mCountDownLatch;
 
     TestLocationListener(int locationToCollect) {
@@ -62,7 +62,7 @@
     }
 
     public boolean await() throws InterruptedException {
-        return TestUtils.waitFor(mCountDownLatch);
+        return TestUtils.waitFor(mCountDownLatch, TIMEOUT_IN_SEC);
     }
 
     /**
diff --git a/tests/tests/location/src/android/location/cts/TestUtils.java b/tests/tests/location/src/android/location/cts/TestUtils.java
index 82d644e..a038457 100644
--- a/tests/tests/location/src/android/location/cts/TestUtils.java
+++ b/tests/tests/location/src/android/location/cts/TestUtils.java
@@ -22,9 +22,8 @@
 public class TestUtils {
     private static final long STANDARD_WAIT_TIME_MS = 50;
     private static final long STANDARD_SLEEP_TIME_MS = 50;
-    private static final long STANDARD_WAIT_TIME_ROUNDS = 1200;
 
-    public static boolean waitFor(CountDownLatch latch) throws InterruptedException {
+    public static boolean waitFor(CountDownLatch latch, int timeInSec) throws InterruptedException {
         // Since late 2014, if the main thread has been occupied for long enough, Android will
         // increase its priority. Such new behavior can causes starvation to the background thread -
         // even if the main thread has called await() to yield its execution, the background thread
@@ -37,7 +36,9 @@
         // hack isn't ideal, but at least it can work.
         //
         // See also: b/17423027
-        for (int i = 0; i < STANDARD_WAIT_TIME_ROUNDS; ++i) {
+        long waitTimeRounds = (TimeUnit.SECONDS.toMillis(timeInSec)) /
+                (STANDARD_WAIT_TIME_MS + STANDARD_SLEEP_TIME_MS);
+        for (int i = 0; i < waitTimeRounds; ++i) {
             Thread.sleep(STANDARD_SLEEP_TIME_MS);
             if (latch.await(STANDARD_WAIT_TIME_MS, TimeUnit.MILLISECONDS)) {
                 return true;