[REFACTOR] DynamicPartitionControl: Add GetSuperPartitionName

fs_mgr_get_super_partition_name() should be mocked because
it is an external dependency to libfs_mgr.

In tests, deliberately make GetSuperDevice() to return "fake_super"
instead of "super" to make sure it is mocked properly.

Test: run unittests
Test: manually apply OTA

Change-Id: I0f05d99bf168b6e658052b4bd67dc1e82ab36471
diff --git a/boot_control_android.cc b/boot_control_android.cc
index 44fc0fa..ce86666 100644
--- a/boot_control_android.cc
+++ b/boot_control_android.cc
@@ -24,8 +24,8 @@
 #include <base/logging.h>
 #include <bootloader_message/bootloader_message.h>
 #include <brillo/message_loops/message_loop.h>
-#include <fs_mgr.h>
 #include <fs_mgr_overlayfs.h>
+#include <libdm/dm.h>
 
 #include "update_engine/common/utils.h"
 #include "update_engine/dynamic_partition_control_android.h"
@@ -109,7 +109,7 @@
     Slot slot,
     const string& partition_name_suffix) const {
   string source_device =
-      device_dir.Append(fs_mgr_get_super_partition_name(slot)).value();
+      device_dir.Append(dynamic_control_->GetSuperPartitionName(slot)).value();
   auto source_metadata =
       dynamic_control_->LoadMetadataBuilder(source_device, slot);
   return source_metadata->HasBlockDevice(partition_name_suffix);
@@ -122,7 +122,7 @@
     Slot slot,
     string* device) const {
   string super_device =
-      device_dir.Append(fs_mgr_get_super_partition_name(slot)).value();
+      device_dir.Append(dynamic_control_->GetSuperPartitionName(slot)).value();
 
   auto builder = dynamic_control_->LoadMetadataBuilder(super_device, slot);
 
@@ -140,8 +140,8 @@
     if (IsSuperBlockDevice(device_dir, current_slot, partition_name_suffix)) {
       LOG(ERROR) << "The static partition " << partition_name_suffix
                  << " is a block device for current metadata ("
-                 << fs_mgr_get_super_partition_name(current_slot) << ", slot "
-                 << BootControlInterface::SlotName(current_slot)
+                 << dynamic_control_->GetSuperPartitionName(current_slot)
+                 << ", slot " << BootControlInterface::SlotName(current_slot)
                  << "). It cannot be used as a logical partition.";
       return DynamicPartitionDeviceStatus::ERROR;
     }
diff --git a/boot_control_android_unittest.cc b/boot_control_android_unittest.cc
index 1a87547..6f02a07 100644
--- a/boot_control_android_unittest.cc
+++ b/boot_control_android_unittest.cc
@@ -73,6 +73,13 @@
           *device = GetDmDevice(partition_name_suffix);
           return true;
         }));
+
+    ON_CALL(dynamicControl(), GetSuperPartitionName(_))
+        .WillByDefault(Return(kFakeSuper));
+  }
+
+  std::string GetSuperDevice(uint32_t slot) {
+    return GetDevice(dynamicControl().GetSuperPartitionName(slot));
   }
 
   // Return the mocked HAL module.
diff --git a/dynamic_partition_control_android.cc b/dynamic_partition_control_android.cc
index 329ddd3..1a1e021 100644
--- a/dynamic_partition_control_android.cc
+++ b/dynamic_partition_control_android.cc
@@ -309,7 +309,7 @@
   }
   base::FilePath device_dir(device_dir_str);
   auto source_device =
-      device_dir.Append(fs_mgr_get_super_partition_name(source_slot)).value();
+      device_dir.Append(GetSuperPartitionName(source_slot)).value();
 
   auto builder = LoadMetadataBuilder(source_device, source_slot, target_slot);
   if (builder == nullptr) {
@@ -324,10 +324,15 @@
   }
 
   auto target_device =
-      device_dir.Append(fs_mgr_get_super_partition_name(target_slot)).value();
+      device_dir.Append(GetSuperPartitionName(target_slot)).value();
   return StoreMetadata(target_device, builder.get(), target_slot);
 }
 
+std::string DynamicPartitionControlAndroid::GetSuperPartitionName(
+    uint32_t slot) {
+  return fs_mgr_get_super_partition_name(slot);
+}
+
 bool DynamicPartitionControlAndroid::UpdatePartitionMetadata(
     MetadataBuilder* builder,
     uint32_t target_slot,
diff --git a/dynamic_partition_control_android.h b/dynamic_partition_control_android.h
index dc152cc..062a2d1 100644
--- a/dynamic_partition_control_android.h
+++ b/dynamic_partition_control_android.h
@@ -48,6 +48,7 @@
                                   const BootControlInterface::PartitionMetadata&
                                       partition_metadata) override;
   bool GetDeviceDir(std::string* path) override;
+  std::string GetSuperPartitionName(uint32_t slot) override;
 
  protected:
   // These functions are exposed for testing.
diff --git a/dynamic_partition_control_android_unittest.cc b/dynamic_partition_control_android_unittest.cc
index 2fa0f16..5b3dfe3 100644
--- a/dynamic_partition_control_android_unittest.cc
+++ b/dynamic_partition_control_android_unittest.cc
@@ -50,6 +50,9 @@
           *path = kFakeDevicePath;
           return true;
         }));
+
+    ON_CALL(dynamicControl(), GetSuperPartitionName(_))
+        .WillByDefault(Return(kFakeSuper));
   }
 
   // Return the mocked DynamicPartitionControlInterface.
@@ -57,6 +60,10 @@
     return static_cast<NiceMock<MockDynamicPartitionControlAndroid>&>(*module_);
   }
 
+  std::string GetSuperDevice(uint32_t slot) {
+    return GetDevice(dynamicControl().GetSuperPartitionName(slot));
+  }
+
   uint32_t source() { return slots_.source; }
   uint32_t target() { return slots_.target; }
 
diff --git a/dynamic_partition_control_interface.h b/dynamic_partition_control_interface.h
index 32fbbe4..b3ce4ea 100644
--- a/dynamic_partition_control_interface.h
+++ b/dynamic_partition_control_interface.h
@@ -95,6 +95,10 @@
 
   // Return a possible location for devices listed by name.
   virtual bool GetDeviceDir(std::string* path) = 0;
+
+  // Return the name of the super partition (which stores super partition
+  // metadata) for a given slot.
+  virtual std::string GetSuperPartitionName(uint32_t slot) = 0;
 };
 
 }  // namespace chromeos_update_engine
diff --git a/dynamic_partition_test_utils.h b/dynamic_partition_test_utils.h
index 2cfdff5..574d30e 100644
--- a/dynamic_partition_test_utils.h
+++ b/dynamic_partition_test_utils.h
@@ -48,6 +48,7 @@
 constexpr const char* kFakeDmDevicePath = "/fake/dm/dev/path/";
 constexpr const uint32_t kFakeMetadataSize = 65536;
 constexpr const char* kDefaultGroup = "foo";
+constexpr const char* kFakeSuper = "fake_super";
 
 // A map describing the size of each partition.
 // "{name, size}"
@@ -121,11 +122,6 @@
   return kFakeDmDevicePath + name;
 }
 
-// TODO(elsk): fs_mgr_get_super_partition_name should be mocked.
-inline std::string GetSuperDevice(uint32_t slot) {
-  return GetDevice(fs_mgr_get_super_partition_name(slot));
-}
-
 // To support legacy tests, auto-convert {name_a: size} map to
 // PartitionMetadata.
 inline PartitionMetadata PartitionSuffixSizesToMetadata(
diff --git a/mock_dynamic_partition_control.h b/mock_dynamic_partition_control.h
index 72eb030..26fc246 100644
--- a/mock_dynamic_partition_control.h
+++ b/mock_dynamic_partition_control.h
@@ -74,6 +74,7 @@
                     uint32_t));
   MOCK_METHOD1(GetDeviceDir, bool(std::string*));
   MOCK_METHOD0(GetDynamicPartitionsFeatureFlag, FeatureFlag());
+  MOCK_METHOD1(GetSuperPartitionName, std::string(uint32_t));
 };
 
 }  // namespace chromeos_update_engine