Add tests for data partition sizes

Bug: 111752559
Test: cts-tradefed run commandAndExit cts-dev -m CtsHardwareTestCases
-t android.hardware.cts.LowRamDeviceTest

Change-Id: I45b633075d58aee9d6a911237a7c31a27d4f9a74
diff --git a/tests/tests/hardware/src/android/hardware/cts/LowRamDeviceTest.java b/tests/tests/hardware/src/android/hardware/cts/LowRamDeviceTest.java
index 9916dbb..82756d1 100644
--- a/tests/tests/hardware/src/android/hardware/cts/LowRamDeviceTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/LowRamDeviceTest.java
@@ -37,16 +37,21 @@
 import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.os.Build;
+import android.os.StatFs;
 import android.support.test.runner.AndroidJUnit4;
 import android.support.test.InstrumentationRegistry;
 import android.util.DisplayMetrics;
 import android.view.WindowManager;
 import android.util.Log;
 
+import com.android.compatibility.common.util.CddTest;
+
 import org.junit.runner.RunWith;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.io.File;
+
 /**
  * Tests that devices with low RAM specify themselves as Low RAM devices
  */
@@ -56,6 +61,10 @@
     private static final long ONE_MEGABYTE = 1048576L;
     private static final String TAG = "LowRamDeviceTest";
     private static final long LOW_RAM_MAX = 1024;
+    private static final float MIN_APP_DATA_PARTITION_SIZE_GB = 4f;
+    private static final float MIN_APP_DATA_PARTITION_SIZE_LOW_RAM_GB = 1.1f;
+    private static final float MIN_SHARED_DATA_PARTITION_SIZE_GB = 1f;
+    private static final long GB_TO_BYTES_MULTIPLIER = 1024 * 1024 * 1024;
 
     private Context mContext;
     private PackageManager mPackageManager;
@@ -80,6 +89,7 @@
      * in CDD 7.6.1.
      */
     @Test
+    @CddTest(requirement="7.6.1")
     public void testMinimumMemory() {
         int density = mDisplayMetrics.densityDpi;
         Boolean supports64Bit = supportsSixtyFourBit();
@@ -136,6 +146,32 @@
         }
     }
 
+    @Test
+    @CddTest(requirement="7.6.2")
+    public void testMinSharedDataPartitionSize() {
+        assertDataPartitionMinimumSize(
+                "Shared data",
+                mContext.getExternalFilesDir(null),
+                MIN_SHARED_DATA_PARTITION_SIZE_GB);
+    }
+
+    @Test
+    @CddTest(requirement="7.6.1/H-9-2,7.6.1/H-10-1")
+    public void testMinDataPartitionSize() {
+        long totalMemoryMb = getTotalMemory() / ONE_MEGABYTE;
+        boolean lowRam = totalMemoryMb <= LOW_RAM_MAX;
+
+        if (lowRam) {
+            assertDataPartitionMinimumSize(
+                    "Application data",
+                    mContext.getFilesDir(),
+                    MIN_APP_DATA_PARTITION_SIZE_LOW_RAM_GB);
+        } else {
+            assertDataPartitionMinimumSize(
+                    "Application data", mContext.getFilesDir(), MIN_APP_DATA_PARTITION_SIZE_GB);
+        }
+    }
+
     /**
      * @return the total memory accessible by the kernel as defined by
      * {@code ActivityManager.MemoryInfo}.
@@ -197,4 +233,16 @@
         }
         return false;
     }
+
+    private void assertDataPartitionMinimumSize(
+            String partitionName, File fileInPartition, float minPartitionSizeGb) {
+        StatFs statFs = new StatFs(fileInPartition.getAbsolutePath());
+        long size = statFs.getTotalBytes();
+        long minSizeBytes = (long) minPartitionSizeGb * GB_TO_BYTES_MULTIPLIER;
+
+        assertTrue(
+                String.format("%s partition size does not meet requirement. "
+                        + "Found = %d, Minimum = %d", partitionName, size, minSizeBytes),
+                size > minSizeBytes);
+    }
 }