Merge "Changing Requirement#checkPerformanceClass to ignore if given devicePerfClass is not handled by a required meausrement" am: c8048b1933 am: 0a79c3ec4f

Bug: 228566023
Original change: https://android-review.googlesource.com/c/platform/cts/+/2076101

Change-Id: I977514205865ccae8c2cc41b93ed8951e1fe9dce
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
(cherry picked from commit cc5b9ff46c66484026c3c2a4e272625612c21099)
diff --git a/tests/mediapc/common/src/android/mediapc/cts/common/RequiredMeasurement.java b/tests/mediapc/common/src/android/mediapc/cts/common/RequiredMeasurement.java
index 92d3bff..c5cee03 100644
--- a/tests/mediapc/common/src/android/mediapc/cts/common/RequiredMeasurement.java
+++ b/tests/mediapc/common/src/android/mediapc/cts/common/RequiredMeasurement.java
@@ -73,7 +73,7 @@
         public abstract RequiredMeasurement<T> build();
     }
 
-    private final RequirementConstants.Result meetsPerformanceClass(int mediaPerformanceClass) {
+    public final RequirementConstants.Result meetsPerformanceClass(int mediaPerformanceClass) {
         if (!this.expectedValues().containsKey(mediaPerformanceClass)) {
             return RequirementConstants.Result.NA;
         } else if (this.measuredValue == null || !this.predicate().test(this.measuredValue,
diff --git a/tests/mediapc/common/src/android/mediapc/cts/common/Requirement.java b/tests/mediapc/common/src/android/mediapc/cts/common/Requirement.java
index 9f0bc44..d6cf8d4 100644
--- a/tests/mediapc/common/src/android/mediapc/cts/common/Requirement.java
+++ b/tests/mediapc/common/src/android/mediapc/cts/common/Requirement.java
@@ -26,6 +26,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -89,35 +90,18 @@
     }
 
     @VisibleForTesting
-    protected boolean checkPerformanceClass(String testName, int reportPerfClass,
-            int expectedPerfClass) {
-        if (reportPerfClass < expectedPerfClass) {
-            Log.w(Requirement.TAG, "Test: " + testName + " reporting invalid performance class " +
-                reportPerfClass + " for requirement " + this.id + " performance class should at " +
-                "least be: " + expectedPerfClass);
-            for (RequiredMeasurement<?> rm: this.mRequiredMeasurements.values()) {
-                Map<Integer, RequirementConstants.Result> perfClasses = rm.getPerformanceClass();
-                int maxMetPerformanceClass = 0;
-                for (int pc: perfClasses.keySet()) {
-                    if (perfClasses.get(pc) == RequirementConstants.Result.MET) {
-                        maxMetPerformanceClass = Math.max(maxMetPerformanceClass, pc);
-                    }
-                }
-
-                if (maxMetPerformanceClass < expectedPerfClass) {
-                    Log.w(Requirement.TAG, rm.toString());
-                } else {
-                    Log.i(Requirement.TAG, rm.toString());
-                }
+    protected boolean checkPerformanceClass(int devicePerfClass) {
+        boolean noResultsUnment = true;
+        for (RequiredMeasurement<?> rm: this.mRequiredMeasurements.values()) {
+            RequirementConstants.Result res = rm.meetsPerformanceClass(devicePerfClass);
+            if (res == RequirementConstants.Result.UNMET) {
+                Log.w(Requirement.TAG, rm.toString());
+                noResultsUnment = false;
+            } else {
+                Log.i(Requirement.TAG, rm.toString());
             }
-            return false;
-        } else {
-            return true;
         }
-    }
-
-    private boolean checkPerformanceClass(String testName, int reportPerfClass) {
-        return this.checkPerformanceClass(testName, reportPerfClass, Utils.getPerfClass());
+        return noResultsUnment;
     }
 
     protected <T> void setMeasuredValue(String measurement, T measuredValue) {
@@ -142,6 +126,6 @@
             ResultUnit.NONE);
         log.submit(InstrumentationRegistry.getInstrumentation());
 
-        return this.checkPerformanceClass(testName, perfClass);
+        return this.checkPerformanceClass(Utils.getPerfClass());
     }
 }
diff --git a/tests/mediapc/common/tests/src/android/mediapc/cts/common/RequirementTest.java b/tests/mediapc/common/tests/src/android/mediapc/cts/common/RequirementTest.java
index b330724..04dd6f0e 100644
--- a/tests/mediapc/common/tests/src/android/mediapc/cts/common/RequirementTest.java
+++ b/tests/mediapc/common/tests/src/android/mediapc/cts/common/RequirementTest.java
@@ -28,103 +28,158 @@
             super(id, reqs);
         }
 
-        public void setGTEMeasurement(int measure) {
+        public void setMeasurement1(int measure) {
             this.<Integer>setMeasuredValue("test_measurement_1", measure);
         }
 
-        public void setLTEMeasurement(int measure) {
-            this.<Integer>setMeasuredValue("test_measurement_2", measure);
-        }
-
         public static TestReq create() {
             RequiredMeasurement<Integer> measurement1 = RequiredMeasurement
                 .<Integer>builder()
                 .setId("test_measurement_1")
                 .setPredicate(RequirementConstants.INTEGER_GTE)
-                .addRequiredValue(Build.VERSION_CODES.R, 200)
-                .addRequiredValue(Build.VERSION_CODES.S, 300)
+                .addRequiredValue(30, 200)
+                .addRequiredValue(31, 300)
+                .addRequiredValue(32, 400)
+                .build();
+
+            return new TestReq("TestReq", measurement1);
+        }
+    }
+
+    public static class TestReqWith2Measures extends Requirement {
+        private TestReqWith2Measures(String id, RequiredMeasurement<?> ... reqs) {
+            super(id, reqs);
+        }
+
+        public void setMeasurement1(int measure) {
+            this.<Integer>setMeasuredValue("test_measurement_1", measure);
+        }
+
+        public void setMeasurement2(int measure) {
+            this.<Integer>setMeasuredValue("test_measurement_2", measure);
+        }
+
+        public static TestReqWith2Measures create() {
+            RequiredMeasurement<Integer> measurement1 = RequiredMeasurement
+                .<Integer>builder()
+                .setId("test_measurement_1")
+                .setPredicate(RequirementConstants.INTEGER_GTE)
+                .addRequiredValue(30, 200)
+                .addRequiredValue(31, 300)
+                .addRequiredValue(32, 400)
                 .build();
             RequiredMeasurement<Integer> measurement2 = RequiredMeasurement
                 .<Integer>builder()
                 .setId("test_measurement_2")
-                .setPredicate(RequirementConstants.INTEGER_LTE)
-                .addRequiredValue(Build.VERSION_CODES.R, 500)
-                .addRequiredValue(Build.VERSION_CODES.S, 300)
+                .setPredicate(RequirementConstants.INTEGER_GTE)
+                .addRequiredValue(30, 200)
+                .addRequiredValue(31, 300)
+                .addRequiredValue(32, 400)
                 .build();
 
-            return new TestReq("TestReq", measurement1, measurement2);
+            return new TestReqWith2Measures("TestReqWith2Measures", measurement1, measurement2);
         }
     }
 
-    // used as a base for computePerformanceClass_testCase methods
-    private void testComputePerformanceClass(int gteMeasure, int lteMeasure, int expectedPC) {
+    @Test
+    public void computePerformanceClass_0() {
         TestReq testReq = TestReq.create();
         int pc;
 
-        // both measurements do not meet R
-        testReq.setGTEMeasurement(gteMeasure);
-        testReq.setLTEMeasurement(lteMeasure);
+        testReq.setMeasurement1(100);
         pc = testReq.computePerformanceClass();
-        assertThat(pc).isEqualTo(expectedPC);
+        assertThat(pc).isEqualTo(0);
     }
 
     @Test
-    public void computePerformanceClass_bothNotR() {
-        // both measurements do not meet R
-        this.testComputePerformanceClass(100, 600, 0);
-    }
-
-    @Test
-    public void computePerformanceClass_onlyOneR() {
-        // one measurement does not meet R
-        this.testComputePerformanceClass(200, 600, 0);
-    }
-
-    @Test
-    public void computePerformanceClass_bothR() {
-        // both measurements meet R
-        this.testComputePerformanceClass(200, 500, Build.VERSION_CODES.R);
-    }
-
-    @Test
-    public void computePerformanceClass_onlyOneS() {
-        // one measurements does not meet S
-        this.testComputePerformanceClass(200, 100, Build.VERSION_CODES.R);
-    }
-
-    @Test
-    public void computePerformanceClass_bothS() {
-        // both measurements meet S
-        this.testComputePerformanceClass(500, 100, Build.VERSION_CODES.S);
-    }
-
-    // used as a base for checkPerformanceClass_testCase methods
-    private void testCheckPerformanceClass(int testPerfClass, boolean expectedResult) {
+    public void computePerformanceClass_30() {
         TestReq testReq = TestReq.create();
-        boolean perfClassMet;
+        int pc;
 
-        perfClassMet = testReq.checkPerformanceClass("checkPerformanceClass", testPerfClass, 31);
-        assertThat(perfClassMet).isEqualTo(expectedResult);
+        testReq.setMeasurement1(200);
+        pc = testReq.computePerformanceClass();
+        assertThat(pc).isEqualTo(30);
+    }
+
+    @Test
+    public void computePerformanceClass_31() {
+       TestReq testReq = TestReq.create();
+        int pc;
+
+        testReq.setMeasurement1(300);
+        pc = testReq.computePerformanceClass();
+        assertThat(pc).isEqualTo(31);
+    }
+
+    @Test
+    public void computePerformanceClass_32() {
+        TestReq testReq = TestReq.create();
+        int pc;
+
+        testReq.setMeasurement1(400);
+        pc = testReq.computePerformanceClass();
+        assertThat(pc).isEqualTo(32);
+    }
+
+    @Test
+    public void computePerformanceClass_PicksLower() {
+        TestReqWith2Measures testReq = TestReqWith2Measures.create();
+        int pc;
+
+        // measure1 meets 32, but measure2 only meets 30
+        testReq.setMeasurement1(401);
+        testReq.setMeasurement2(201);
+
+        pc = testReq.computePerformanceClass();
+        assertThat(pc).isEqualTo(30);
     }
 
     @Test
     public void checkPerformanceClass_justBelow() {
-        // just below required perfClass
-        int testPerfClass = 30;
-        this.testCheckPerformanceClass(testPerfClass, false);
+        TestReq testReq = TestReq.create();
+        boolean perfClassMet;
+
+        // setting measurements to meet pc 31
+        testReq.setMeasurement1(300);
+
+        perfClassMet = testReq.checkPerformanceClass(32);
+        assertThat(perfClassMet).isEqualTo(false);
     }
 
     @Test
     public void checkPerformanceClass_justAt() {
-        // just at required perfClass
-        int testPerfClass = 31;
-        this.testCheckPerformanceClass(testPerfClass, true);
+        TestReq testReq = TestReq.create();
+        boolean perfClassMet;
+
+        // setting measurements to meet pc 31
+        testReq.setMeasurement1(300);
+
+        perfClassMet = testReq.checkPerformanceClass(31);
+        assertThat(perfClassMet).isEqualTo(true);
     }
 
     @Test
     public void checkPerformanceClass_justAbove() {
-        // just above required perfClass
-        int testPerfClass = 32;
-        this.testCheckPerformanceClass(testPerfClass, true);
+        TestReq testReq = TestReq.create();
+        boolean perfClassMet;
+
+        // setting measurements to meet pc 31
+        testReq.setMeasurement1(301);
+
+        perfClassMet = testReq.checkPerformanceClass(30);
+        assertThat(perfClassMet).isEqualTo(true);
+    }
+
+    @Test
+    public void checkPerformanceClass_OutOfRange() {
+        TestReq testReq = TestReq.create();
+        boolean perfClassMet;
+
+        // setting measurements to meet pc 31
+        testReq.setMeasurement1(300);
+
+        // performance class 33 not handled by testReq, so expected result is true
+        perfClassMet = testReq.checkPerformanceClass(33);
+        assertThat(perfClassMet).isEqualTo(true);
     }
 }
\ No newline at end of file