Expose logic to serialize a DeltaArchiveManifest to proper payload file

So that unittests can construct a cumstom manifest and use that logic to
create a valid payload file

Test: th
Change-Id: Ie6ba00b7fafc12eb250787295c93f966af1f376f
diff --git a/payload_generator/payload_file.cc b/payload_generator/payload_file.cc
index 6ec219f..129377a 100644
--- a/payload_generator/payload_file.cc
+++ b/payload_generator/payload_file.cc
@@ -195,14 +195,28 @@
     PayloadSigner::AddSignatureToManifest(
         next_blob_offset, signature_blob_length, &manifest_);
   }
+  WritePayload(payload_file,
+               ordered_blobs_file.path(),
+               private_key_path,
+               major_version_,
+               manifest_,
+               metadata_size_out);
 
-  // Serialize protobuf
-  string serialized_manifest;
-  TEST_AND_RETURN_FALSE(manifest_.SerializeToString(&serialized_manifest));
+  ReportPayloadUsage(*metadata_size_out);
+  return true;
+}
 
+bool PayloadFile::WritePayload(const std::string& payload_file,
+                               const std::string& ordered_blobs_file,
+                               const std::string& private_key_path,
+                               uint64_t major_version_,
+                               const DeltaArchiveManifest& manifest,
+                               uint64_t* metadata_size_out) {
+  std::string serialized_manifest;
+
+  TEST_AND_RETURN_FALSE(manifest.SerializeToString(&serialized_manifest));
   uint64_t metadata_size =
       sizeof(kDeltaMagic) + 2 * sizeof(uint64_t) + serialized_manifest.size();
-
   LOG(INFO) << "Writing final delta file header...";
   DirectFileWriter writer;
   TEST_AND_RETURN_FALSE_ERRNO(writer.Open(payload_file.c_str(),
@@ -222,12 +236,16 @@
 
   // Metadata signature has the same size as payload signature, because they
   // are both the same kind of signature for the same kind of hash.
-  uint32_t metadata_signature_size = htobe32(signature_blob_length);
-  TEST_AND_RETURN_FALSE_ERRNO(
-      writer.Write(&metadata_signature_size, sizeof(metadata_signature_size)));
-  metadata_size += sizeof(metadata_signature_size);
-  // Set correct size instead of big endian size.
-  metadata_signature_size = signature_blob_length;
+  const auto signature_blob_length = manifest.signatures_size();
+  // Adding a new scope here so code down below can't access
+  // metadata_signature_size, as the integer is in big endian, not host
+  // endianess.
+  {
+    const uint32_t metadata_signature_size = htobe32(signature_blob_length);
+    TEST_AND_RETURN_FALSE_ERRNO(writer.Write(&metadata_signature_size,
+                                             sizeof(metadata_signature_size)));
+    metadata_size += sizeof(metadata_signature_size);
+  }
 
   // Write protobuf
   LOG(INFO) << "Writing final delta file protobuf... "
@@ -249,7 +267,7 @@
 
   // Append the data blobs.
   LOG(INFO) << "Writing final delta file data blobs...";
-  int blobs_fd = open(ordered_blobs_file.path().c_str(), O_RDONLY, 0);
+  int blobs_fd = open(ordered_blobs_file.c_str(), O_RDONLY, 0);
   ScopedFdCloser blobs_fd_closer(&blobs_fd);
   TEST_AND_RETURN_FALSE(blobs_fd >= 0);
   for (;;) {
@@ -262,7 +280,6 @@
     TEST_AND_RETURN_FALSE_ERRNO(rc > 0);
     TEST_AND_RETURN_FALSE_ERRNO(writer.Write(buf.data(), rc));
   }
-
   // Write payload signature blob.
   if (!private_key_path.empty()) {
     LOG(INFO) << "Signing the update...";
@@ -271,15 +288,15 @@
         payload_file,
         {private_key_path},
         metadata_size,
-        metadata_signature_size,
-        metadata_size + metadata_signature_size + manifest_.signatures_offset(),
+        signature_blob_length,
+        metadata_size + signature_blob_length + manifest.signatures_offset(),
         &signature));
     TEST_AND_RETURN_FALSE_ERRNO(
         writer.Write(signature.data(), signature.size()));
   }
-
-  ReportPayloadUsage(metadata_size);
-  *metadata_size_out = metadata_size;
+  if (metadata_size_out) {
+    *metadata_size_out = metadata_size;
+  }
   return true;
 }