Implement ExtentLess correctly
If two extents start on the same block but have different number of
blocks, current impl of ExtentLess will consider them equal.
Test: th
Change-Id: Ief147f9d0a91b3dcd7f8ccc690f3aea972cbeabb
diff --git a/payload_consumer/extent_map.h b/payload_consumer/extent_map.h
index aeb7066..65f1bcd 100644
--- a/payload_consumer/extent_map.h
+++ b/payload_consumer/extent_map.h
@@ -22,6 +22,7 @@
#include <utility>
#include "update_engine/common/utils.h"
+#include "update_engine/payload_generator/extent_utils.h"
#include "update_engine/payload_generator/extent_ranges.h"
#include "update_engine/update_metadata.pb.h"
@@ -35,7 +36,7 @@
class ExtentMap {
public:
bool AddExtent(const Extent& extent, T&& value) {
- if (Get(extent)) {
+ if (set_.OverlapsWithExtent(extent)) {
return false;
}
const auto& [it, inserted] = map_.insert({extent, std::forward<T>(value)});
diff --git a/payload_consumer/extent_map_unittest.cc b/payload_consumer/extent_map_unittest.cc
index e7972cd..867038b 100644
--- a/payload_consumer/extent_map_unittest.cc
+++ b/payload_consumer/extent_map_unittest.cc
@@ -119,4 +119,17 @@
ASSERT_EQ(ret[2].num_blocks(), 2U);
}
+TEST_F(ExtentMapTest, GetSameStartBlock) {
+ ASSERT_TRUE(map_.AddExtent(ExtentForRange(0, 5), 7));
+ ASSERT_TRUE(map_.AddExtent(ExtentForRange(10, 5), 12));
+
+ const auto ret = map_.Get(ExtentForRange(0, 10));
+ // ASSERT_FALSE(ret.has_value()) << ret.value() won't work, because when |ret|
+ // doesn't have value, the part after '<<' after still evaluated, resulting in
+ // undefined behavior.
+ if (ret.has_value()) {
+ FAIL() << ret.value();
+ }
+}
+
} // namespace chromeos_update_engine