Avoid conflict of self-overlapping ops

When generating OTA, self-overlapping SOURCE_COPY operations are
allowed.(such as [20-30] -> [25-35]) These operations might cause
conflicts during merge, handle them in ConvertToCowOperations.

Test: treehugger
Change-Id: I4df9ce9e54f8512cae0aa0f4bcf9bcf8c01fd254
diff --git a/common/cow_operation_convert_unittest.cc b/common/cow_operation_convert_unittest.cc
index b70dcdf..93173fe 100644
--- a/common/cow_operation_convert_unittest.cc
+++ b/common/cow_operation_convert_unittest.cc
@@ -68,7 +68,6 @@
         EXPECT_FALSE(modified_extents.ContainsBlock(cow_op.src_block))
             << "SOURCE_COPY operation " << cow_op
             << " read from a modified block";
-        src_extent_set.SubtractExtent(ExtentForRange(cow_op.src_block, 1));
       }
       EXPECT_TRUE(dst_extent_set.ContainsBlock(cow_op.dst_block));
       dst_extent_set.SubtractExtent(ExtentForRange(cow_op.dst_block, 1));
@@ -217,4 +216,21 @@
   }));
   VerifyCowMergeOp(cow_ops);
 }
+
+TEST_F(CowOperationConvertTest, SelfOverlappingOperation) {
+  AddOperation(
+      &operations_, InstallOperation::SOURCE_COPY, {{20, 10}}, {{25, 10}});
+
+  AddMergeOperation(
+      &merge_operations_, CowMergeOperation::COW_COPY, {20, 10}, {25, 10});
+
+  auto cow_ops = ConvertToCowOperations(operations_, merge_operations_);
+  // Expect 10 COW_COPY
+  ASSERT_EQ(cow_ops.size(), 10UL);
+  ASSERT_TRUE(std::all_of(cow_ops.begin(), cow_ops.end(), [](auto&& cow_op) {
+    return cow_op.op == CowOperation::CowCopy;
+  }));
+  VerifyCowMergeOp(cow_ops);
+}
+
 }  // namespace chromeos_update_engine