Check super size for factory OTA at build time

For VAB launched device, factory OTA will write system_other
partition to the super image. So we want to check that
sum(dynamic partitions) + system_other + overhead <= super at
build time.

Since we don't know the overhead at build time, we might instead
check sum(all partitions) < super.

Bug: 185809374
Test: m check-all-partition-sizes, unittests
Change-Id: Ia7ba5999d23924a1927e9a9463856a4d0ea90c20
diff --git a/tools/releasetools/check_partition_sizes.py b/tools/releasetools/check_partition_sizes.py
index 3047ddb..eaed07e 100644
--- a/tools/releasetools/check_partition_sizes.py
+++ b/tools/releasetools/check_partition_sizes.py
@@ -223,9 +223,15 @@
       error_limit = Expression(
           "BOARD_SUPER_PARTITION_ERROR_LIMIT{}".format(size_limit_suffix),
           int(info_dict["super_partition_error_limit"]) // num_slots)
-      self._CheckSumOfPartitionSizes(
-          max_size, info_dict["dynamic_partition_list"].strip().split(),
-          warn_limit, error_limit)
+      partitions_in_super = info_dict["dynamic_partition_list"].strip().split()
+      # In the vab case, factory OTA will allocate space on super to install
+      # the system_other partition. So add system_other to the partition list.
+      if DeviceType.Get(self.info_dict) == DeviceType.VAB and (
+          "system_other_image" in info_dict or
+          "system_other_image_size" in info_dict):
+        partitions_in_super.append("system_other")
+      self._CheckSumOfPartitionSizes(max_size, partitions_in_super,
+                                     warn_limit, error_limit)
 
     groups = info_dict.get("super_partition_groups", "").strip().split()
 
diff --git a/tools/releasetools/test_check_partition_sizes.py b/tools/releasetools/test_check_partition_sizes.py
index 073d229..88cf60f 100644
--- a/tools/releasetools/test_check_partition_sizes.py
+++ b/tools/releasetools/test_check_partition_sizes.py
@@ -33,6 +33,7 @@
         system_image_size=50
         vendor_image_size=20
         product_image_size=20
+        system_other_image_size=10
         """.split("\n"))
 
   def test_ab(self):
@@ -126,3 +127,13 @@
         """.split("\n")))
     with self.assertRaises(RuntimeError):
       CheckPartitionSizes(self.info_dict)
+
+  def test_vab_too_big_with_system_other(self):
+    self.info_dict.update(common.LoadDictionaryFromLines("""
+        virtual_ab=true
+        system_other_image_size=20
+        super_partition_size=101
+        super_super_device_size=101
+        """.split("\n")))
+    with self.assertRaises(RuntimeError):
+      CheckPartitionSizes(self.info_dict)