Check continuous prop send updates for all areaIds

Test: atest CarPropertyManagerTest
Fix: 236395411
Change-Id: Ic1719ca9f18d853921c7f28060df9f3c2eb84abe
diff --git a/tests/tests/car/src/android/car/cts/utils/VehiclePropertyVerifier.java b/tests/tests/car/src/android/car/cts/utils/VehiclePropertyVerifier.java
index 2ec5a22..43bb312 100644
--- a/tests/tests/car/src/android/car/cts/utils/VehiclePropertyVerifier.java
+++ b/tests/tests/car/src/android/car/cts/utils/VehiclePropertyVerifier.java
@@ -171,11 +171,18 @@
                             Collectors.toList()));
 
         } else if (mChangeMode == CarPropertyConfig.VEHICLE_PROPERTY_CHANGE_MODE_CONTINUOUS) {
-            CarPropertyValueCallback carPropertyValueCallback =
-                    new CarPropertyValueCallback(mPropertyName, 1);
+            int updatesPerAreaId = 2;
+            int minimumTotalUpdates = updatesPerAreaId * carPropertyConfig.getAreaIds().length;
+            float secondsToMillis = 1_000;
+            long bufferMillis = 1_000; // 1 second
+            long timeoutMillis =
+                    ((long) ((1.0f / carPropertyConfig.getMinSampleRate()) * secondsToMillis
+                            * minimumTotalUpdates)) + bufferMillis;
+            CarPropertyValueCallback carPropertyValueCallback = new CarPropertyValueCallback(
+                    mPropertyName, minimumTotalUpdates, timeoutMillis);
             assertWithMessage("Failed to register callback for " + mPropertyName).that(
                     carPropertyManager.registerCallback(carPropertyValueCallback, mPropertyId,
-                            CarPropertyManager.SENSOR_RATE_FASTEST)).isTrue();
+                            carPropertyConfig.getMaxSampleRate())).isTrue();
             List<CarPropertyValue<?>> carPropertyValues =
                     carPropertyValueCallback.getCarPropertyValues();
             carPropertyManager.unregisterCallback(carPropertyValueCallback, mPropertyId);
@@ -184,6 +191,15 @@
                 verifyCarPropertyValue(carPropertyConfig, carPropertyValue,
                         carPropertyValue.getAreaId(), CAR_PROPERTY_VALUE_SOURCE_CALLBACK);
             }
+
+            for (int areaId : carPropertyConfig.getAreaIds()) {
+                assertWithMessage(
+                        mPropertyName + " callback values did not receive " + updatesPerAreaId
+                                + " updates for area ID: " + areaId).that(
+                        carPropertyValues.stream().filter(
+                                carPropertyValue -> carPropertyValue.getAreaId()
+                                        == areaId).count()).isAtLeast(updatesPerAreaId);
+            }
         }
     }
 
@@ -324,6 +340,10 @@
                         + areaId)
                 .that(carPropertyValue.getAreaId())
                 .isEqualTo(areaId);
+        assertWithMessage(mPropertyName + " - areaId: " + areaId + " - source: " + source
+                + " area ID must be in carPropertyConfig#getAreaIds()").that(Arrays.stream(
+                carPropertyConfig.getAreaIds()).boxed().collect(Collectors.toList()).contains(
+                carPropertyValue.getAreaId())).isTrue();
         assertWithMessage(
                 mPropertyName + " - areaId: " + areaId + " - source: " + source
                         + " value's status must be valid")
@@ -461,19 +481,27 @@
         private final int mTotalOnChangeEvents;
         private final CountDownLatch mCountDownLatch;
         private final List<CarPropertyValue<?>> mCarPropertyValues = new ArrayList<>();
+        private final long mTimeoutMillis;
 
-        public CarPropertyValueCallback(String propertyName, int totalOnChangeEvents) {
+        CarPropertyValueCallback(String propertyName, int totalOnChangeEvents) {
+            this(propertyName, totalOnChangeEvents, 1500);
+        }
+
+        CarPropertyValueCallback(String propertyName, int totalOnChangeEvents,
+                long timeoutMillis) {
             mPropertyName = propertyName;
             mTotalOnChangeEvents = totalOnChangeEvents;
             mCountDownLatch = new CountDownLatch(totalOnChangeEvents);
+            mTimeoutMillis = timeoutMillis;
         }
 
         public List<CarPropertyValue<?>> getCarPropertyValues() {
             try {
                 assertWithMessage(
                         "Never received " + mTotalOnChangeEvents + "  onChangeEvent(s) for "
-                                + mPropertyName + " callback before 1500ms timeout").that(
-                        mCountDownLatch.await(1500, TimeUnit.MILLISECONDS)).isTrue();
+                                + mPropertyName + " callback before " + mTimeoutMillis
+                                + " ms timeout").that(
+                        mCountDownLatch.await(mTimeoutMillis, TimeUnit.MILLISECONDS)).isTrue();
             } catch (InterruptedException e) {
                 assertWithMessage("Waiting for onChangeEvent callback(s) for " + mPropertyName
                         + " threw an exception: " + e).fail();