[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