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