Set src_extents before calling PopulateXorOps

PopulateXorOps needs to read aop.op.src_extents(), so set that before
calling

Test: ota_from_target_files --enable_vabc_xor
Change-Id: Id2207cf44868d22ee9fe2e5c1a2bf45fc7f6185b
diff --git a/payload_generator/delta_diff_utils.cc b/payload_generator/delta_diff_utils.cc
index 077fbfe..b4b49e6 100644
--- a/payload_generator/delta_diff_utils.cc
+++ b/payload_generator/delta_diff_utils.cc
@@ -155,6 +155,8 @@
                            size_t src_block,
                            size_t dst_block,
                            size_t src_offset) {
+  CHECK_NE(src_block, std::numeric_limits<uint64_t>::max());
+  CHECK_NE(dst_block, std::numeric_limits<uint64_t>::max());
   if (ShouldCreateNewOp(*ops, src_block, dst_block, src_offset)) {
     auto& op = ops->emplace_back();
     op.mutable_src_extent()->set_start_block(src_block);
@@ -162,6 +164,7 @@
     op.mutable_dst_extent()->set_start_block(dst_block);
     op.mutable_dst_extent()->set_num_blocks(1);
     op.set_src_offset(src_offset);
+    op.set_type(CowMergeOperation::COW_XOR);
   } else {
     auto& op = ops->back();
     auto& src_extent = *op.mutable_src_extent();
@@ -902,6 +905,7 @@
                                   bsdiff_delta.size(),
                                   src_extents.size())) {
           if (config.enable_vabc_xor) {
+            StoreExtents(src_extents, operation.mutable_src_extents());
             PopulateXorOps(&aop, bsdiff_delta);
           }
           operation.set_type(operation_type);
@@ -971,7 +975,11 @@
   // Embed extents in the operation. Replace (all variants), zero and discard
   // operations should not have source extents.
   if (!IsNoSourceOperation(operation.type())) {
-    StoreExtents(src_extents, operation.mutable_src_extents());
+    if (operation.src_extents_size() == 0) {
+      StoreExtents(src_extents, operation.mutable_src_extents());
+    }
+  } else {
+    operation.clear_src_extents();
   }
 
   *out_data = std::move(data_blob);
diff --git a/payload_generator/delta_diff_utils_unittest.cc b/payload_generator/delta_diff_utils_unittest.cc
index 436e265..5e7d6f0 100644
--- a/payload_generator/delta_diff_utils_unittest.cc
+++ b/payload_generator/delta_diff_utils_unittest.cc
@@ -614,6 +614,9 @@
       &aop,
       reinterpret_cast<const uint8_t*>(patch_data.data()),
       patch_data.size());
+  for (const auto& op : aop.xor_ops) {
+    ASSERT_EQ(op.type(), CowMergeOperation::COW_XOR);
+  }
   ASSERT_EQ(aop.xor_ops.size(), 1UL) << "Only 1 block can possibly be XORed";
   ASSERT_EQ(aop.xor_ops[0].src_extent().num_blocks(), 1UL);
   ASSERT_EQ(aop.xor_ops[0].src_extent().start_block(), 51UL);
@@ -643,6 +646,9 @@
       &aop,
       reinterpret_cast<const uint8_t*>(patch_data.data()),
       patch_data.size());
+  for (const auto& op : aop.xor_ops) {
+    ASSERT_EQ(op.type(), CowMergeOperation::COW_XOR);
+  }
   ASSERT_EQ(aop.xor_ops.size(), 1UL) << "Only 1 block can possibly be XORed";
   ASSERT_EQ(aop.xor_ops[0].src_extent().num_blocks(), 1UL);
   ASSERT_EQ(aop.xor_ops[0].src_extent().start_block(), 51UL);
@@ -678,6 +684,9 @@
       patch_data.size());
   ASSERT_EQ(aop.xor_ops.size(), 4UL);
   for (const auto& op : aop.xor_ops) {
+    ASSERT_EQ(op.type(), CowMergeOperation::COW_XOR);
+  }
+  for (const auto& op : aop.xor_ops) {
     ASSERT_EQ(op.src_offset(), 123UL + 456UL);
     LOG(INFO) << op.src_extent() << ", " << op.dst_extent();
   }
diff --git a/payload_generator/merge_sequence_generator.cc b/payload_generator/merge_sequence_generator.cc
index c5fd988..7f5032b 100644
--- a/payload_generator/merge_sequence_generator.cc
+++ b/payload_generator/merge_sequence_generator.cc
@@ -129,6 +129,8 @@
           CHECK_EQ(op.src_extent().num_blocks(),
                    op.dst_extent().num_blocks() + 1);
         }
+        CHECK_NE(op.src_extent().start_block(),
+                 std::numeric_limits<uint64_t>::max());
       });
   return true;
 }