Setting up hardware tests to use PerformanceClassEvaluator

Test: atest
Change-Id: I0f1cc94868a5d47e3e582761b22f7d85acb0bdb8
diff --git a/tests/mediapc/common/src/android/mediapc/cts/common/PerformanceClassEvaluator.java b/tests/mediapc/common/src/android/mediapc/cts/common/PerformanceClassEvaluator.java
index f4b6d8b..ac1905c 100644
--- a/tests/mediapc/common/src/android/mediapc/cts/common/PerformanceClassEvaluator.java
+++ b/tests/mediapc/common/src/android/mediapc/cts/common/PerformanceClassEvaluator.java
@@ -50,6 +50,151 @@
         this.mRequirements = new HashSet<Requirement>();
     }
 
+    // used for requirements [7.1.1.1/H-1-1], [7.1.1.1/H-2-1]
+    public static class ResolutionRequirement extends Requirement {
+        private static final String TAG = ResolutionRequirement.class.getSimpleName();
+
+        private ResolutionRequirement(String id, RequiredMeasurement<?> ... reqs) {
+            super(id, reqs);
+        }
+
+        public void setLongResolution(int longResolution) {
+            this.<Integer>setMeasuredValue(RequirementConstants.LONG_RESOLUTION, longResolution);
+        }
+
+        public void setShortResolution(int shortResolution) {
+            this.<Integer>setMeasuredValue(RequirementConstants.SHORT_RESOLUTION, shortResolution);
+        }
+
+        /**
+         * [7.1.1.1/H-1-1] MUST have screen resolution of at least 1080p.
+         */
+        public static ResolutionRequirement createR7_1_1_1__H_1_1() {
+            RequiredMeasurement<Integer> long_resolution = RequiredMeasurement
+                .<Integer>builder()
+                .setId(RequirementConstants.LONG_RESOLUTION)
+                .setPredicate(RequirementConstants.INTEGER_GTE)
+                .addRequiredValue(Build.VERSION_CODES.R, 1920)
+                .build();
+            RequiredMeasurement<Integer> short_resolution = RequiredMeasurement
+                .<Integer>builder()
+                .setId(RequirementConstants.SHORT_RESOLUTION)
+                .setPredicate(RequirementConstants.INTEGER_GTE)
+                .addRequiredValue(Build.VERSION_CODES.R, 1080)
+                .build();
+
+            return new ResolutionRequirement(RequirementConstants.R7_1_1_1__H_1_1, long_resolution,
+                short_resolution);
+        }
+
+        /**
+         * [7.1.1.1/H-2-1] MUST have screen resolution of at least 1080p.
+         */
+        public static ResolutionRequirement createR7_1_1_1__H_2_1() {
+            RequiredMeasurement<Integer> long_resolution = RequiredMeasurement
+                .<Integer>builder()
+                .setId(RequirementConstants.LONG_RESOLUTION)
+                .setPredicate(RequirementConstants.INTEGER_GTE)
+                .addRequiredValue(Build.VERSION_CODES.S, 1920)
+                .build();
+            RequiredMeasurement<Integer> short_resolution = RequiredMeasurement
+                .<Integer>builder()
+                .setId(RequirementConstants.SHORT_RESOLUTION)
+                .setPredicate(RequirementConstants.INTEGER_GTE)
+                .addRequiredValue(Build.VERSION_CODES.S, 1080)
+                .build();
+
+            return new ResolutionRequirement(RequirementConstants.R7_1_1_1__H_2_1, long_resolution,
+                short_resolution);
+        }
+    }
+
+    // used for requirements [7.1.1.3/H-1-1], [7.1.1.3/H-2-1]
+    public static class DensityRequirement extends Requirement {
+        private static final String TAG = DensityRequirement.class.getSimpleName();
+
+        private DensityRequirement(String id, RequiredMeasurement<?> ... reqs) {
+            super(id, reqs);
+        }
+
+        public void setDisplayDensity(int displayDensity) {
+            this.<Integer>setMeasuredValue(RequirementConstants.DISPLAY_DENSITY, displayDensity);
+        }
+
+        /**
+         * [7.1.1.3/H-1-1] MUST have screen density of at least 400 dpi.
+         */
+        public static DensityRequirement createR7_1_1_3__H_1_1() {
+            RequiredMeasurement<Integer> display_density = RequiredMeasurement
+                .<Integer>builder()
+                .setId(RequirementConstants.DISPLAY_DENSITY)
+                .setPredicate(RequirementConstants.INTEGER_GTE)
+                .addRequiredValue(Build.VERSION_CODES.R, 400)
+                .build();
+
+            return new DensityRequirement(RequirementConstants.R7_1_1_3__H_1_1, display_density);
+        }
+
+        /**
+         * [7.1.1.3/H-2-1] MUST have screen density of at least 400 dpi.
+         */
+        public static DensityRequirement createR7_1_1_3__H_2_1() {
+            RequiredMeasurement<Integer> display_density = RequiredMeasurement
+                .<Integer>builder()
+                .setId(RequirementConstants.DISPLAY_DENSITY)
+                .setPredicate(RequirementConstants.INTEGER_GTE)
+                .addRequiredValue(Build.VERSION_CODES.S, 400)
+                .build();
+
+            return new DensityRequirement(RequirementConstants.R7_1_1_3__H_2_1, display_density);
+        }
+    }
+
+    // used for requirements [7.6.1/H-1-1], [7.6.1/H-2-1], [7.6.1/H-3-1]
+    public static class MemoryRequirement extends Requirement {
+        private static final String TAG = MemoryRequirement.class.getSimpleName();
+
+        private MemoryRequirement(String id, RequiredMeasurement<?> ... reqs) {
+            super(id, reqs);
+        }
+
+        public void setPhysicalMemory(long physicalMemory) {
+            this.<Long>setMeasuredValue(RequirementConstants.PHYSICAL_MEMORY, physicalMemory);
+        }
+
+        /**
+         * [7.6.1/H-1-1] MUST have at least 6 GB of physical memory.
+         */
+        public static MemoryRequirement createR7_6_1__H_1_1() {
+            RequiredMeasurement<Long> physical_memory = RequiredMeasurement
+                .<Long>builder()
+                .setId(RequirementConstants.PHYSICAL_MEMORY)
+                .setPredicate(RequirementConstants.LONG_GTE)
+                // Media performance requires 6 GB minimum RAM, but keeping the following to 5 GB
+                // as activityManager.getMemoryInfo() returns around 5.4 GB on a 6 GB device.
+                .addRequiredValue(Build.VERSION_CODES.R, 5L * 1024L)
+                .build();
+
+            return new MemoryRequirement(RequirementConstants.R7_6_1__H_1_1, physical_memory);
+        }
+
+        /**
+         * [7.6.1/H-2-1] MUST have at least 6 GB of physical memory.
+         */
+        public static MemoryRequirement createR7_6_1__H_2_1() {
+            RequiredMeasurement<Long> physical_memory = RequiredMeasurement
+                .<Long>builder()
+                .setId(RequirementConstants.PHYSICAL_MEMORY)
+                .setPredicate(RequirementConstants.LONG_GTE)
+                // Media performance requires 6 GB minimum RAM, but keeping the following to 5 GB
+                // as activityManager.getMemoryInfo() returns around 5.4 GB on a 6 GB device.
+                .addRequiredValue(Build.VERSION_CODES.S, 5L * 1024L)
+                .build();
+
+            return new MemoryRequirement(RequirementConstants.R7_6_1__H_2_1, physical_memory);
+        }
+    }
+
     private <R extends Requirement> R addRequirement(R req) {
         if (!this.mRequirements.add(req)) {
             throw new IllegalStateException("Requirement " + req.id() + " already added");
@@ -57,6 +202,32 @@
         return req;
     }
 
+    public ResolutionRequirement addR7_1_1_1__H_1_1() {
+        return this.<ResolutionRequirement>addRequirement(
+            ResolutionRequirement.createR7_1_1_1__H_1_1());
+    }
+
+    public DensityRequirement addR7_1_1_3__H_1_1() {
+        return this.<DensityRequirement>addRequirement(DensityRequirement.createR7_1_1_3__H_1_1());
+    }
+
+    public MemoryRequirement addR7_6_1__H_1_1() {
+        return this.<MemoryRequirement>addRequirement(MemoryRequirement.createR7_6_1__H_1_1());
+    }
+
+    public ResolutionRequirement addR7_1_1_1__H_2_1() {
+        return this.<ResolutionRequirement>addRequirement(
+            ResolutionRequirement.createR7_1_1_1__H_2_1());
+    }
+
+    public DensityRequirement addR7_1_1_3__H_2_1() {
+        return this.<DensityRequirement>addRequirement(DensityRequirement.createR7_1_1_3__H_2_1());
+    }
+
+    public MemoryRequirement addR7_6_1__H_2_1() {
+        return this.<MemoryRequirement>addRequirement(MemoryRequirement.createR7_6_1__H_2_1());
+    }
+
     public void submitAndCheck() {
         boolean perfClassMet = true;
         for (Requirement req: this.mRequirements) {
diff --git a/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java b/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
index 54791bf..b84955c 100644
--- a/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
+++ b/tests/mediapc/src/android/mediapc/cts/PerformanceClassTest.java
@@ -21,6 +21,8 @@
 import static android.mediapc.cts.common.Utils.MIN_MEMORY_PERF_CLASS_T_MB;
 import static android.util.DisplayMetrics.DENSITY_400;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import static org.junit.Assert.assertTrue;
 
 import android.app.ActivityManager;
@@ -31,6 +33,7 @@
 import android.media.MediaDrm;
 import android.media.MediaFormat;
 import android.media.UnsupportedSchemeException;
+import android.mediapc.cts.common.PerformanceClassEvaluator;
 import android.mediapc.cts.common.Utils;
 import android.os.Build;
 import android.util.DisplayMetrics;
@@ -46,7 +49,9 @@
 import com.android.compatibility.common.util.ResultUnit;
 
 import org.junit.Assume;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestName;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -60,6 +65,9 @@
     private static final UUID WIDEVINE_UUID = new UUID(0xEDEF8BA979D64ACEL, 0xA3C827DCD51D21EDL);
     static ArrayList<String> mMimeSecureSupport = new ArrayList<>();
 
+    @Rule
+    public final TestName mTestName = new TestName();
+
     static {
         mMimeSecureSupport.add(MediaFormat.MIMETYPE_VIDEO_AVC);
         mMimeSecureSupport.add(MediaFormat.MIMETYPE_VIDEO_HEVC);
@@ -186,7 +194,14 @@
     }
 
     @Test
-    @CddTest(requirement="2.2.7.3/7.1.1.1,7.1.1.3,7.6.1/H-1-1,H-2-1")
+    @CddTest(requirements={
+        "2.2.7.3/7.1.1.1/H-1-1",
+        "2.2.7.3/7.1.1.1/H-2-1",
+        "2.2.7.3/7.1.1.3/H-1-1",
+        "2.2.7.3/7.1.1.3/H-2-1",
+        "2.2.7.3/7.6.1/H-1-1",
+        "2.2.7.3/7.6.1/H-2-1",
+        "2.2.7.3/7.6.1/H-3-1"})
     public void testMinimumMemory() {
         Context context = InstrumentationRegistry.getInstrumentation().getContext();
 
@@ -210,23 +225,21 @@
         Log.i(TAG, String.format("minDpi=%d minSize=%dx%dpix", minDpi, minLong, minShort));
         Log.i(TAG, String.format("dpi=%d size=%dx%dpix", density, longPix, shortPix));
 
-        if (Utils.isPerfClass()) {
-            assertTrue("Display density " + density + " must be at least " + minDpi + "dpi",
-                    density >= minDpi);
-            assertTrue("Display resolution " + longPix + "x" + shortPix + "pix must be at least " +
-                            minLong + "x" + minShort + "pix",
-                    longPix >= minLong && shortPix >= minShort);
-        } else {
-            int pc = density >= minDpi && longPix >= minLong && shortPix >= minShort
-                    ? Build.VERSION_CODES.S : 0;
-            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs",  "Display");
-            log.addValue("DisplayDensity", density, ResultType.HIGHER_BETTER, ResultUnit.NONE);
-            log.addValue("ResolutionLong", longPix, ResultType.HIGHER_BETTER, ResultUnit.NONE);
-            log.addValue("ResolutionShort", shortPix, ResultType.HIGHER_BETTER, ResultUnit.NONE);
-            log.setSummary("CDD 2.2.7.3/7.1.1.1,7.1.1.3/H-1-1,H-2-1 performance_class", pc,
-                    ResultType.HIGHER_BETTER, ResultUnit.NONE);
-            log.submit(InstrumentationRegistry.getInstrumentation());
-        }
+        PerformanceClassEvaluator pce = new PerformanceClassEvaluator(this.mTestName);
+        PerformanceClassEvaluator.ResolutionRequirement r7_1_1_1__h_1_1 = pce.addR7_1_1_1__H_1_1();
+        PerformanceClassEvaluator.DensityRequirement r7_1_1_3__h_1_1 = pce.addR7_1_1_3__H_1_1();
+        PerformanceClassEvaluator.ResolutionRequirement r7_1_1_1__h_2_1 = pce.addR7_1_1_1__H_2_1();
+        PerformanceClassEvaluator.DensityRequirement r7_1_1_3__h_2_1 = pce.addR7_1_1_3__H_2_1();
+
+        r7_1_1_1__h_1_1.setLongResolution(longPix);
+        r7_1_1_1__h_2_1.setLongResolution(longPix);
+        r7_1_1_1__h_1_1.setShortResolution(shortPix);
+        r7_1_1_1__h_2_1.setShortResolution(shortPix);
+
+        r7_1_1_3__h_1_1.setDisplayDensity(density);
+        r7_1_1_3__h_2_1.setDisplayDensity(density);
+
+        pce.submitAndCheck();
     }
 
     /** Asserts that the given values conform to the specs in CDD 7.6.1 */
@@ -235,24 +248,15 @@
         long totalMemoryMb = getTotalMemory(activityManager) / 1024 / 1024;
 
         Log.i(TAG, String.format("Total device memory = %,d MB", totalMemoryMb));
-        if (Utils.isPerfClass()) {
-            long minMb = Utils.isTPerfClass() ? MIN_MEMORY_PERF_CLASS_T_MB :
-                    Utils.MIN_MEMORY_PERF_CLASS_CANDIDATE_MB;
-            Log.i(TAG, String.format("Minimum required memory = %,d MB", minMb));
-            assertTrue(String.format("Does not meet minimum memory requirements (CDD 7.6.1)."
-                    + "Found = %d, Minimum = %d", totalMemoryMb, minMb), totalMemoryMb >= minMb);
-        } else {
-            int pc = 0;
-            if (totalMemoryMb >= MIN_MEMORY_PERF_CLASS_T_MB)
-                pc = Build.VERSION_CODES.TIRAMISU;
-            else if (totalMemoryMb >= MIN_MEMORY_PERF_CLASS_CANDIDATE_MB)
-                pc = Build.VERSION_CODES.S;
-            DeviceReportLog log = new DeviceReportLog("MediaPerformanceClassLogs", "MinMemory");
-            log.addValue("MemoryMB", totalMemoryMb, ResultType.HIGHER_BETTER, ResultUnit.NONE);
-            log.setSummary("CDD 2.2.7.3/7.6.1/H-1-1,H-2-1  performance_class", pc,
-                    ResultType.HIGHER_BETTER, ResultUnit.NONE);
-            log.submit(InstrumentationRegistry.getInstrumentation());
-        }
+
+        PerformanceClassEvaluator pce = new PerformanceClassEvaluator(this.mTestName);
+        PerformanceClassEvaluator.MemoryRequirement r7_6_1_h_1_1 = pce.addR7_6_1__H_1_1();
+        PerformanceClassEvaluator.MemoryRequirement r7_6_1_h_2_1 = pce.addR7_6_1__H_2_1();
+
+        r7_6_1_h_1_1.setPhysicalMemory(totalMemoryMb);
+        r7_6_1_h_2_1.setPhysicalMemory(totalMemoryMb);
+
+        pce.submitAndCheck();
     }
 
     /**