AU: Include old kernel hash for source partition verification.

The hash is included (and, consequently, check by the client) only if a true
delta kernel update is generated.

BUG=7705
TEST=unit tests, generated delta and installed on device

Change-Id: I4483a176b177f3068d699dc962255c92ca601156

Review URL: http://codereview.chromium.org/3762007
diff --git a/delta_diff_generator.cc b/delta_diff_generator.cc
index 3dcd2cb..3011026 100644
--- a/delta_diff_generator.cc
+++ b/delta_diff_generator.cc
@@ -446,7 +446,7 @@
         type(in_type),
         size(in_size) {}
   bool operator <(const DeltaObject& object) const {
-    return size < object.size;
+    return (size != object.size) ? (size < object.size) : (name < object.name);
   }
   string name;
   int type;
@@ -618,7 +618,7 @@
   TEST_AND_RETURN_FALSE(hasher.Finalize());
   const vector<char>& hash = hasher.raw_hash();
   info->set_hash(hash.data(), hash.size());
-  LOG(INFO) << "hash: " << hasher.hash();
+  LOG(INFO) << partition << ": size=" << size << " hash=" << hasher.hash();
   return true;
 }
 
@@ -627,8 +627,12 @@
                               const string& old_rootfs,
                               const string& new_rootfs,
                               DeltaArchiveManifest* manifest) {
-  // TODO(petkov): Generate the old kernel info when we stop generating full
-  // updates for the kernel partition.
+  if (!old_kernel.empty()) {
+    TEST_AND_RETURN_FALSE(
+        InitializePartitionInfo(true,
+                                old_kernel,
+                                manifest->mutable_old_kernel_info()));
+  }
   TEST_AND_RETURN_FALSE(
       InitializePartitionInfo(true,
                               new_kernel,
diff --git a/delta_performer_unittest.cc b/delta_performer_unittest.cc
index 5a48441..e9d44fa 100755
--- a/delta_performer_unittest.cc
+++ b/delta_performer_unittest.cc
@@ -258,9 +258,12 @@
     EXPECT_EQ(expected_sig_data_length, manifest.signatures_size());
     EXPECT_FALSE(signature.data().empty());
 
-    // TODO(petkov): Add a test once the generator start sending old kernel
-    // info.
-    EXPECT_FALSE(manifest.has_old_kernel_info());
+    if (full_kernel) {
+      EXPECT_FALSE(manifest.has_old_kernel_info());
+    } else {
+      EXPECT_EQ(old_kernel_data.size(), manifest.old_kernel_info().size());
+      EXPECT_FALSE(manifest.old_kernel_info().hash().empty());
+    }
 
     EXPECT_EQ(new_kernel_data.size(), manifest.new_kernel_info().size());
     EXPECT_EQ(image_size, manifest.old_rootfs_info().size());
@@ -288,14 +291,20 @@
   // Update the A image in place.
   DeltaPerformer performer(&prefs);
 
+  vector<char> rootfs_hash;
+  EXPECT_EQ(image_size,
+            OmahaHashCalculator::RawHashOfFile(a_img,
+                                               image_size,
+                                               &rootfs_hash));
+  performer.set_current_rootfs_hash(&rootfs_hash);
+  vector<char> kernel_hash;
+  EXPECT_TRUE(OmahaHashCalculator::RawHashOfData(old_kernel_data,
+                                                 &kernel_hash));
+  performer.set_current_kernel_hash(&kernel_hash);
+
   EXPECT_EQ(0, performer.Open(a_img.c_str(), 0, 0));
   EXPECT_TRUE(performer.OpenKernel(old_kernel.c_str()));
 
-  vector<char> rootfs_hash;
-  CHECK_EQ(image_size,
-           OmahaHashCalculator::RawHashOfFile(a_img, image_size, &rootfs_hash));
-  performer.set_current_rootfs_hash(&rootfs_hash);
-
   // Write at some number of bytes per operation. Arbitrarily chose 5.
   const size_t kBytesPerWrite = 5;
   for (size_t i = 0; i < delta.size(); i += kBytesPerWrite) {