paygen_payload_lib: Base json on signed_payload_file.

We were dumping the unsigned payload values into payload json
descriptions, even if signing was enabled. We should now used signed
or unsigned values correctly.

BUG=chromium:505094
TEST=Unittests + manually finding md5sums for payload files.

Change-Id: I2630fa1e6a710979fd65f006d9c852de4b3d88cc
Previous-Reviewed-on: https://chromium-review.googlesource.com/282577
(cherry picked from commit bca3be5dbad07a8028546e46b210e18eedf71c17)
Reviewed-on: https://chromium-review.googlesource.com/285155
Reviewed-by: Don Garrett <dgarrett@chromium.org>
Commit-Queue: Don Garrett <dgarrett@chromium.org>
Tested-by: Don Garrett <dgarrett@chromium.org>
diff --git a/lib/paygen/paygen_payload_lib.py b/lib/paygen/paygen_payload_lib.py
index 00233e8..e017432 100644
--- a/lib/paygen/paygen_payload_lib.py
+++ b/lib/paygen/paygen_payload_lib.py
@@ -31,7 +31,7 @@
 sys.path.insert(0, os.path.join(constants.SOURCE_ROOT, 'src', 'platform'))
 
 
-DESCRIPTION_FILE_VERSION = 1
+DESCRIPTION_FILE_VERSION = 2
 
 
 class Error(Exception):
@@ -322,18 +322,21 @@
       self._RunGeneratorCmd(cmd)
       return payload_hash_file.read()
 
-  def _MetadataSize(self):
+  def _MetadataSize(self, payload_file):
     """Discover the metadata size.
 
     The payload generator should return this information when calculating the
     metadata hash, but would require a lot of new plumbing. Instead we just
     look it up ourselves.
 
+    Args:
+      payload_file: Which payload file to extract metadata size from.
+
     Returns:
       int value of the metadata size.
     """
-    with open(self.payload_file) as payload_file:
-      payload = self._update_payload.Payload(payload_file)
+    with open(payload_file) as payload_fd:
+      payload = self._update_payload.Payload(payload_fd)
       payload.Init()
       return payload.data_offset
 
@@ -465,7 +468,7 @@
     fields populated.
 
     {
-      "version": 1,
+      "version": 2,
       "sha1_hex": <payload sha1 hash as a hex encoded string>,
       "sha256_hex": <payload sha256 hash as a hex encoded string>,
       "md5_hex": <payload md5 hash as a hex encoded string>,
@@ -476,9 +479,14 @@
     Args:
       metadata_signatures: A list of signatures in binary string format.
     """
+    # Decide if we use the signed or unsigned payload file.
+    payload_file = self.payload_file
+    if self.signer:
+      payload_file = self.signed_payload_file
+
     # Locate everything we put in the json.
-    sha1_hex, sha256_hex = filelib.ShaSums(self.payload_file)
-    md5_hex = filelib.MD5Sum(self.payload_file)
+    sha1_hex, sha256_hex = filelib.ShaSums(payload_file)
+    md5_hex = filelib.MD5Sum(payload_file)
 
     metadata_signature = None
     if metadata_signatures:
@@ -495,7 +503,7 @@
         'sha1_hex': sha1_hex,
         'sha256_hex': sha256_hex,
         'md5_hex': md5_hex,
-        'metadata_size': self._MetadataSize(),
+        'metadata_size': self._MetadataSize(payload_file),
         'metadata_signature': metadata_signature,
     }
 
diff --git a/lib/paygen/paygen_payload_lib_unittest.py b/lib/paygen/paygen_payload_lib_unittest.py
index b36cb59..66667ea 100644
--- a/lib/paygen/paygen_payload_lib_unittest.py
+++ b/lib/paygen/paygen_payload_lib_unittest.py
@@ -492,23 +492,53 @@
 
   def testPayloadJson(self):
     """Test how we store the payload description in json."""
-    gen = self._GetStdGenerator(payload=self.delta_payload)
+    gen = self._GetStdGenerator(payload=self.delta_payload, sign=False)
+    # Intentionally don't create signed file, to ensure it's never used.
     osutils.WriteFile(gen.payload_file, 'Fake payload contents.')
 
+    metadata_signatures = ()
+
+    expected_json = (
+        '{"md5_hex": "75218643432e5f621386d4ffcbedf9ba",'
+        ' "metadata_signature": null,'
+        ' "metadata_size": 10,'
+        ' "sha1_hex": "FDwoNOUO+kNwrQJMSLnLDY7iZ/E=",'
+        ' "sha256_hex": "gkm9207E7xbqpNRBFjEPO43nxyp/MNGQfyH3IYrq2kE=",'
+        ' "version": 2}')
+
+    # To really look up the metadata size, we'd need a real payload for parsing.
+    with mock.patch.object(gen, '_MetadataSize', return_value=10) as mock_size:
+      gen._StorePayloadJson(metadata_signatures)
+
+    # Validate we fetched size from the right file.
+    mock_size.assert_called_once_with(gen.payload_file)
+
+    # Validate the results.
+    self.assertEqual(osutils.ReadFile(gen.description_file), expected_json)
+
+  def testPayloadJsonSigned(self):
+    """Test how we store the payload description in json."""
+    gen = self._GetStdGenerator(payload=self.delta_payload, sign=True)
+    # Intentionally don't create unsigned file, to ensure it's never used.
+    osutils.WriteFile(gen.signed_payload_file, 'Fake signed payload contents.')
+
     metadata_signatures = ('1',)
 
     expected_json = (
-        '{"md5_hex": "75218643432e5f621386d4ffcbedf9ba",'
+        '{"md5_hex": "ad8f67319ca16e691108ca703636b3ad",'
         ' "metadata_signature": "MQ==",'
         ' "metadata_size": 10,'
-        ' "sha1_hex": "FDwoNOUO+kNwrQJMSLnLDY7iZ/E=",'
-        ' "sha256_hex": "gkm9207E7xbqpNRBFjEPO43nxyp/MNGQfyH3IYrq2kE=",'
-        ' "version": 1}')
+        ' "sha1_hex": "99zX3vZhTfwRJCi4zGK1A14AY3Y=",'
+        ' "sha256_hex": "yZjWgvsNdzclJzJOleQrTjVFBQy810ZlUAU5+i0okME=",'
+        ' "version": 2}')
 
     # To really look up the metadata size, we'd need a real payload for parsing.
-    with mock.patch.object(gen, '_MetadataSize', return_value=10):
+    with mock.patch.object(gen, '_MetadataSize', return_value=10) as mock_size:
       gen._StorePayloadJson(metadata_signatures)
 
+    # Validate we fetched size from the right file.
+    mock_size.assert_called_once_with(gen.signed_payload_file)
+
     # Validate the results.
     self.assertEqual(osutils.ReadFile(gen.description_file), expected_json)