blob: 78363351d3a2606fba9743364ed736a47be5d5b8 [file] [log] [blame]
Mike Frysinger8155d082012-04-06 15:23:18 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Andrew de los Reyes09e56d62010-04-23 13:45:53 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <sys/mount.h>
6#include <inttypes.h>
7
8#include <algorithm>
9#include <string>
10#include <vector>
11
Darin Petkov9fa7ec52010-10-18 11:45:23 -070012#include <base/file_util.h>
Chris Masoned903c3b2011-05-12 15:35:46 -070013#include <base/memory/scoped_ptr.h>
Darin Petkov73058b42010-10-06 16:32:19 -070014#include <base/string_util.h>
Mike Frysinger8155d082012-04-06 15:23:18 -040015#include <base/stringprintf.h>
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070016#include <google/protobuf/repeated_field.h>
17#include <gtest/gtest.h>
18
Jay Srinivasand29695d2013-04-08 15:08:05 -070019#include "update_engine/constants.h"
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070020#include "update_engine/delta_diff_generator.h"
21#include "update_engine/delta_performer.h"
Andrew de los Reyes353777c2010-10-08 10:34:30 -070022#include "update_engine/extent_ranges.h"
Darin Petkov7a22d792010-11-08 14:10:00 -080023#include "update_engine/full_update_generator.h"
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070024#include "update_engine/graph_types.h"
Jay Srinivasanf0572052012-10-23 18:12:56 -070025#include "update_engine/mock_system_state.h"
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070026#include "update_engine/payload_signer.h"
Darin Petkov73058b42010-10-06 16:32:19 -070027#include "update_engine/prefs_mock.h"
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070028#include "update_engine/test_utils.h"
29#include "update_engine/update_metadata.pb.h"
30#include "update_engine/utils.h"
31
32namespace chromeos_update_engine {
33
34using std::min;
35using std::string;
36using std::vector;
Darin Petkov73058b42010-10-06 16:32:19 -070037using testing::_;
38using testing::Return;
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070039
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070040extern const char* kUnittestPrivateKeyPath;
Darin Petkovd7061ab2010-10-06 14:37:09 -070041extern const char* kUnittestPublicKeyPath;
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -070042extern const char* kUnittestPrivateKey2Path;
43extern const char* kUnittestPublicKey2Path;
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -070044
Jay Srinivasan738fdf32012-12-07 17:40:54 -080045static const size_t kBlockSize = 4096;
46static const char* kBogusMetadataSignature1 = "awSFIUdUZz2VWFiR+ku0Pj00V7bPQPQFYQSXjEXr3vaw3TE4xHV5CraY3/YrZpBvJ5z4dSBskoeuaO1TNC/S6E05t+yt36tE4Fh79tMnJ/z9fogBDXWgXLEUyG78IEQrYH6/eBsQGT2RJtBgXIXbZ9W+5G9KmGDoPOoiaeNsDuqHiBc/58OFsrxskH8E6vMSBmMGGk82mvgzic7ApcoURbCGey1b3Mwne/hPZ/bb9CIyky8Og9IfFMdL2uAweOIRfjoTeLYZpt+WN65Vu7jJ0cQN8e1y+2yka5112wpRf/LLtPgiAjEZnsoYpLUd7CoVpLRtClp97kN2+tXGNBQqkA==";
47
48static const int kDefaultKernelSize = 4096; // Something small for a test
49static const char* kNewDataString = "This is new data.";
50
Andrew de los Reyes27f7d372010-10-07 11:26:07 -070051namespace {
Jay Srinivasan738fdf32012-12-07 17:40:54 -080052struct DeltaState {
53 string a_img;
54 string b_img;
55 int image_size;
Andrew de los Reyes27f7d372010-10-07 11:26:07 -070056
Jay Srinivasan738fdf32012-12-07 17:40:54 -080057 string delta_path;
58 uint64_t metadata_size;
Andrew de los Reyes27f7d372010-10-07 11:26:07 -070059
Jay Srinivasan738fdf32012-12-07 17:40:54 -080060 string old_kernel;
61 vector<char> old_kernel_data;
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070062
Jay Srinivasan738fdf32012-12-07 17:40:54 -080063 string new_kernel;
64 vector<char> new_kernel_data;
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070065
Jay Srinivasan738fdf32012-12-07 17:40:54 -080066 // The in-memory copy of delta file.
67 vector<char> delta;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080068
69 // The mock system state object with which we initialize the
70 // delta performer.
71 MockSystemState mock_system_state;
Jay Srinivasan738fdf32012-12-07 17:40:54 -080072};
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070073
Jay Srinivasan738fdf32012-12-07 17:40:54 -080074enum SignatureTest {
75 kSignatureNone, // No payload signing.
76 kSignatureGenerator, // Sign the payload at generation time.
77 kSignatureGenerated, // Sign the payload after it's generated.
Don Garrett2ae37872013-10-25 13:33:20 -070078 kSignatureGeneratedPlaceholder, // Insert placeholder signatures, then real.
79 kSignatureGeneratedPlaceholderMismatch, // Insert a wrong sized placeholder.
Jay Srinivasan738fdf32012-12-07 17:40:54 -080080 kSignatureGeneratedShell, // Sign the generated payload through shell cmds.
81 kSignatureGeneratedShellBadKey, // Sign with a bad key through shell cmds.
82 kSignatureGeneratedShellRotateCl1, // Rotate key, test client v1
83 kSignatureGeneratedShellRotateCl2, // Rotate key, test client v2
84};
Andrew de los Reyes09e56d62010-04-23 13:45:53 -070085
Jay Srinivasan738fdf32012-12-07 17:40:54 -080086// Different options that determine what we should fill into the
87// install_plan.metadata_signature to simulate the contents received in the
88// Omaha response.
89enum MetadataSignatureTest {
90 kEmptyMetadataSignature,
91 kInvalidMetadataSignature,
92 kValidMetadataSignature,
93};
94
95enum OperationHashTest {
96 kInvalidOperationData,
97 kValidOperationData,
98};
99
100} // namespace {}
101
102static void CompareFilesByBlock(const string& a_file, const string& b_file) {
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700103 vector<char> a_data, b_data;
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700104 EXPECT_TRUE(utils::ReadFile(a_file, &a_data)) << "file failed: " << a_file;
105 EXPECT_TRUE(utils::ReadFile(b_file, &b_data)) << "file failed: " << b_file;
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700106
107 EXPECT_EQ(a_data.size(), b_data.size());
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700108 EXPECT_EQ(0, a_data.size() % kBlockSize);
109 for (size_t i = 0; i < a_data.size(); i += kBlockSize) {
110 EXPECT_EQ(0, i % kBlockSize);
111 vector<char> a_sub(&a_data[i], &a_data[i + kBlockSize]);
112 vector<char> b_sub(&b_data[i], &b_data[i + kBlockSize]);
113 EXPECT_TRUE(a_sub == b_sub) << "Block " << (i/kBlockSize) << " differs";
114 }
115}
116
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800117static bool WriteSparseFile(const string& path, off_t size) {
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700118 int fd = open(path.c_str(), O_CREAT | O_TRUNC | O_WRONLY, 0644);
119 TEST_AND_RETURN_FALSE_ERRNO(fd >= 0);
120 ScopedFdCloser fd_closer(&fd);
121 off_t rc = lseek(fd, size + 1, SEEK_SET);
122 TEST_AND_RETURN_FALSE_ERRNO(rc != static_cast<off_t>(-1));
123 int return_code = ftruncate(fd, size);
124 TEST_AND_RETURN_FALSE_ERRNO(return_code == 0);
125 return true;
126}
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700127
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800128static size_t GetSignatureSize(const string& private_key_path) {
Darin Petkovcbfb0172011-01-14 15:24:45 -0800129 const vector<char> data(1, 'x');
130 vector<char> hash;
131 EXPECT_TRUE(OmahaHashCalculator::RawHashOfData(data, &hash));
132 vector<char> signature;
133 EXPECT_TRUE(PayloadSigner::SignHash(hash,
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800134 private_key_path,
Darin Petkovcbfb0172011-01-14 15:24:45 -0800135 &signature));
136 return signature.size();
137}
138
Don Garrett2ae37872013-10-25 13:33:20 -0700139static bool InsertSignaturePlaceholder(int signature_size,
140 const string& payload_path,
141 uint64_t* out_metadata_size) {
142 vector<vector<char> > signatures;
143 signatures.push_back(vector<char>(signature_size, 0));
144
145 return PayloadSigner::AddSignatureToPayload(
146 payload_path,
147 signatures,
148 payload_path,
149 out_metadata_size);
150}
151
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800152static void SignGeneratedPayload(const string& payload_path,
153 uint64_t* out_metadata_size) {
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800154 int signature_size = GetSignatureSize(kUnittestPrivateKeyPath);
Darin Petkovcbfb0172011-01-14 15:24:45 -0800155 vector<char> hash;
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700156 ASSERT_TRUE(PayloadSigner::HashPayloadForSigning(
157 payload_path,
158 vector<int>(1, signature_size),
159 &hash));
Darin Petkovcbfb0172011-01-14 15:24:45 -0800160 vector<char> signature;
161 ASSERT_TRUE(PayloadSigner::SignHash(hash,
162 kUnittestPrivateKeyPath,
163 &signature));
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700164 ASSERT_TRUE(PayloadSigner::AddSignatureToPayload(
165 payload_path,
166 vector<vector<char> >(1, signature),
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800167 payload_path,
168 out_metadata_size));
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700169 EXPECT_TRUE(PayloadSigner::VerifySignedPayload(
170 payload_path,
171 kUnittestPublicKeyPath,
172 kSignatureMessageOriginalVersion));
Darin Petkovcbfb0172011-01-14 15:24:45 -0800173}
174
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800175static void SignGeneratedShellPayload(SignatureTest signature_test,
176 const string& payload_path) {
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800177 string private_key_path = kUnittestPrivateKeyPath;
178 if (signature_test == kSignatureGeneratedShellBadKey) {
179 ASSERT_TRUE(utils::MakeTempFile("/tmp/key.XXXXXX",
180 &private_key_path,
181 NULL));
182 } else {
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700183 ASSERT_TRUE(signature_test == kSignatureGeneratedShell ||
184 signature_test == kSignatureGeneratedShellRotateCl1 ||
185 signature_test == kSignatureGeneratedShellRotateCl2);
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800186 }
187 ScopedPathUnlinker key_unlinker(private_key_path);
188 key_unlinker.set_should_remove(signature_test ==
189 kSignatureGeneratedShellBadKey);
190 // Generates a new private key that will not match the public key.
191 if (signature_test == kSignatureGeneratedShellBadKey) {
192 LOG(INFO) << "Generating a mismatched private key.";
193 ASSERT_EQ(0,
194 System(StringPrintf(
Mike Frysinger2149be42012-03-12 19:23:47 -0400195 "openssl genrsa -out %s 2048",
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800196 private_key_path.c_str())));
197 }
198 int signature_size = GetSignatureSize(private_key_path);
Darin Petkovcbfb0172011-01-14 15:24:45 -0800199 string hash_file;
200 ASSERT_TRUE(utils::MakeTempFile("/tmp/hash.XXXXXX", &hash_file, NULL));
201 ScopedPathUnlinker hash_unlinker(hash_file);
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700202 string signature_size_string;
203 if (signature_test == kSignatureGeneratedShellRotateCl1 ||
204 signature_test == kSignatureGeneratedShellRotateCl2)
205 signature_size_string = StringPrintf("%d:%d",
206 signature_size, signature_size);
207 else
208 signature_size_string = StringPrintf("%d", signature_size);
Darin Petkovcbfb0172011-01-14 15:24:45 -0800209 ASSERT_EQ(0,
210 System(StringPrintf(
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700211 "./delta_generator -in_file %s -signature_size %s "
Darin Petkovcbfb0172011-01-14 15:24:45 -0800212 "-out_hash_file %s",
213 payload_path.c_str(),
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700214 signature_size_string.c_str(),
Darin Petkovcbfb0172011-01-14 15:24:45 -0800215 hash_file.c_str())));
216
Andrew de los Reyesbdfaaf02011-03-30 10:35:12 -0700217 // Pad the hash
218 vector<char> hash;
219 ASSERT_TRUE(utils::ReadFile(hash_file, &hash));
220 ASSERT_TRUE(PayloadSigner::PadRSA2048SHA256Hash(&hash));
221 ASSERT_TRUE(WriteFileVector(hash_file, hash));
222
Darin Petkovcbfb0172011-01-14 15:24:45 -0800223 string sig_file;
224 ASSERT_TRUE(utils::MakeTempFile("/tmp/signature.XXXXXX", &sig_file, NULL));
225 ScopedPathUnlinker sig_unlinker(sig_file);
226 ASSERT_EQ(0,
227 System(StringPrintf(
Mike Frysinger2149be42012-03-12 19:23:47 -0400228 "openssl rsautl -raw -sign -inkey %s -in %s -out %s",
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800229 private_key_path.c_str(),
Darin Petkovcbfb0172011-01-14 15:24:45 -0800230 hash_file.c_str(),
231 sig_file.c_str())));
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700232 string sig_file2;
233 ASSERT_TRUE(utils::MakeTempFile("/tmp/signature.XXXXXX", &sig_file2, NULL));
234 ScopedPathUnlinker sig2_unlinker(sig_file2);
235 if (signature_test == kSignatureGeneratedShellRotateCl1 ||
236 signature_test == kSignatureGeneratedShellRotateCl2) {
237 ASSERT_EQ(0,
238 System(StringPrintf(
Mike Frysinger2149be42012-03-12 19:23:47 -0400239 "openssl rsautl -raw -sign -inkey %s -in %s -out %s",
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700240 kUnittestPrivateKey2Path,
241 hash_file.c_str(),
242 sig_file2.c_str())));
243 // Append second sig file to first path
244 sig_file += ":" + sig_file2;
245 }
246
Darin Petkovcbfb0172011-01-14 15:24:45 -0800247 ASSERT_EQ(0,
248 System(StringPrintf(
249 "./delta_generator -in_file %s -signature_file %s "
250 "-out_file %s",
251 payload_path.c_str(),
252 sig_file.c_str(),
253 payload_path.c_str())));
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800254 int verify_result =
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700255 System(StringPrintf(
256 "./delta_generator -in_file %s -public_key %s -public_key_version %d",
257 payload_path.c_str(),
258 signature_test == kSignatureGeneratedShellRotateCl2 ?
259 kUnittestPublicKey2Path : kUnittestPublicKeyPath,
260 signature_test == kSignatureGeneratedShellRotateCl2 ? 2 : 1));
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800261 if (signature_test == kSignatureGeneratedShellBadKey) {
262 ASSERT_NE(0, verify_result);
263 } else {
264 ASSERT_EQ(0, verify_result);
265 }
Darin Petkovcbfb0172011-01-14 15:24:45 -0800266}
267
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800268static void GenerateDeltaFile(bool full_kernel,
269 bool full_rootfs,
270 bool noop,
Darin Petkov8e447e02013-04-16 16:23:50 +0200271 off_t chunk_size,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800272 SignatureTest signature_test,
273 DeltaState *state) {
274 EXPECT_TRUE(utils::MakeTempFile("/tmp/a_img.XXXXXX", &state->a_img, NULL));
275 EXPECT_TRUE(utils::MakeTempFile("/tmp/b_img.XXXXXX", &state->b_img, NULL));
276 CreateExtImageAtPath(state->a_img, NULL);
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700277
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800278 state->image_size = static_cast<int>(utils::FileSize(state->a_img));
Darin Petkov7ea32332010-10-13 10:46:11 -0700279
280 // Extend the "partitions" holding the file system a bit.
281 EXPECT_EQ(0, System(base::StringPrintf(
282 "dd if=/dev/zero of=%s seek=%d bs=1 count=1",
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800283 state->a_img.c_str(),
284 state->image_size + 1024 * 1024 - 1)));
285 EXPECT_EQ(state->image_size + 1024 * 1024, utils::FileSize(state->a_img));
Darin Petkov7ea32332010-10-13 10:46:11 -0700286
Don Garrett0dd39852013-04-03 16:55:42 -0700287 // Create ImageInfo A & B
288 ImageInfo old_image_info;
289 ImageInfo new_image_info;
290
291 if (!full_rootfs) {
292 old_image_info.set_channel("src-channel");
293 old_image_info.set_board("src-board");
294 old_image_info.set_version("src-version");
295 old_image_info.set_key("src-key");
296 old_image_info.set_build_channel("src-build-channel");
297 old_image_info.set_build_version("src-build-version");
298 }
299
300 new_image_info.set_channel("test-channel");
301 new_image_info.set_board("test-board");
302 new_image_info.set_version("test-version");
303 new_image_info.set_key("test-key");
304 new_image_info.set_build_channel("test-build-channel");
305 new_image_info.set_build_version("test-build-version");
306
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700307 // Make some changes to the A image.
308 {
309 string a_mnt;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800310 ScopedLoopMounter b_mounter(state->a_img, &a_mnt, 0);
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700311
Darin Petkov8e447e02013-04-16 16:23:50 +0200312 vector<char> hardtocompress;
313 while (hardtocompress.size() < 3 * kBlockSize) {
314 hardtocompress.insert(hardtocompress.end(),
315 kRandomString,
316 kRandomString + sizeof(kRandomString) - 1);
317 }
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700318 EXPECT_TRUE(utils::WriteFile(StringPrintf("%s/hardtocompress",
319 a_mnt.c_str()).c_str(),
Darin Petkov8e447e02013-04-16 16:23:50 +0200320 &hardtocompress[0],
321 hardtocompress.size()));
322
Darin Petkov8a075a72013-04-25 14:46:09 +0200323 vector<char> zeros(16 * 1024, 0);
324 EXPECT_EQ(zeros.size(),
325 file_util::WriteFile(
326 FilePath(StringPrintf("%s/move-to-sparse", a_mnt.c_str())),
327 &zeros[0], zeros.size()));
328
329 EXPECT_TRUE(
330 WriteSparseFile(StringPrintf("%s/move-from-sparse", a_mnt.c_str()),
331 16 * 1024));
332
333 EXPECT_EQ(0, system(StringPrintf("dd if=/dev/zero of=%s/move-semi-sparse "
334 "bs=1 seek=4096 count=1",
335 a_mnt.c_str()).c_str()));
336
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700337 // Write 1 MiB of 0xff to try to catch the case where writing a bsdiff
338 // patch fails to zero out the final block.
339 vector<char> ones(1024 * 1024, 0xff);
340 EXPECT_TRUE(utils::WriteFile(StringPrintf("%s/ones",
341 a_mnt.c_str()).c_str(),
342 &ones[0],
343 ones.size()));
344 }
345
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700346 if (noop) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800347 EXPECT_TRUE(file_util::CopyFile(FilePath(state->a_img),
348 FilePath(state->b_img)));
Don Garrett0dd39852013-04-03 16:55:42 -0700349 old_image_info = new_image_info;
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700350 } else {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800351 CreateExtImageAtPath(state->b_img, NULL);
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700352 EXPECT_EQ(0, System(base::StringPrintf(
353 "dd if=/dev/zero of=%s seek=%d bs=1 count=1",
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800354 state->b_img.c_str(),
355 state->image_size + 1024 * 1024 - 1)));
356 EXPECT_EQ(state->image_size + 1024 * 1024, utils::FileSize(state->b_img));
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700357
358 // Make some changes to the B image.
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700359 string b_mnt;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800360 ScopedLoopMounter b_mounter(state->b_img, &b_mnt, 0);
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700361
362 EXPECT_EQ(0, system(StringPrintf("cp %s/hello %s/hello2", b_mnt.c_str(),
363 b_mnt.c_str()).c_str()));
364 EXPECT_EQ(0, system(StringPrintf("rm %s/hello", b_mnt.c_str()).c_str()));
365 EXPECT_EQ(0, system(StringPrintf("mv %s/hello2 %s/hello", b_mnt.c_str(),
366 b_mnt.c_str()).c_str()));
367 EXPECT_EQ(0, system(StringPrintf("echo foo > %s/foo",
368 b_mnt.c_str()).c_str()));
369 EXPECT_EQ(0, system(StringPrintf("touch %s/emptyfile",
370 b_mnt.c_str()).c_str()));
371 EXPECT_TRUE(WriteSparseFile(StringPrintf("%s/fullsparse", b_mnt.c_str()),
372 1024 * 1024));
Darin Petkov8a075a72013-04-25 14:46:09 +0200373
374 EXPECT_TRUE(
375 WriteSparseFile(StringPrintf("%s/move-to-sparse", b_mnt.c_str()),
376 16 * 1024));
377
378 vector<char> zeros(16 * 1024, 0);
379 EXPECT_EQ(zeros.size(),
380 file_util::WriteFile(
381 FilePath(StringPrintf("%s/move-from-sparse", b_mnt.c_str())),
382 &zeros[0], zeros.size()));
383
384 EXPECT_EQ(0, system(StringPrintf("dd if=/dev/zero of=%s/move-semi-sparse "
385 "bs=1 seek=4096 count=1",
386 b_mnt.c_str()).c_str()));
387
388 EXPECT_EQ(0, system(StringPrintf("dd if=/dev/zero of=%s/partsparse bs=1 "
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700389 "seek=4096 count=1",
390 b_mnt.c_str()).c_str()));
Andrew de los Reyes29da8aa2011-02-15 13:34:57 -0800391 EXPECT_EQ(0, system(StringPrintf("cp %s/srchardlink0 %s/tmp && "
392 "mv %s/tmp %s/srchardlink1",
393 b_mnt.c_str(), b_mnt.c_str(),
394 b_mnt.c_str(), b_mnt.c_str()).c_str()));
Andrew de los Reyes48a0a482011-02-22 15:32:11 -0800395 EXPECT_EQ(0, system(StringPrintf("rm %s/boguslink && "
396 "echo foobar > %s/boguslink",
397 b_mnt.c_str(), b_mnt.c_str()).c_str()));
Darin Petkov8e447e02013-04-16 16:23:50 +0200398
399 vector<char> hardtocompress;
400 while (hardtocompress.size() < 3 * kBlockSize) {
401 hardtocompress.insert(hardtocompress.end(),
402 kRandomString,
403 kRandomString + sizeof(kRandomString));
404 }
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700405 EXPECT_TRUE(utils::WriteFile(StringPrintf("%s/hardtocompress",
406 b_mnt.c_str()).c_str(),
Darin Petkov8e447e02013-04-16 16:23:50 +0200407 &hardtocompress[0],
408 hardtocompress.size()));
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700409 }
410
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700411 string old_kernel;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800412 EXPECT_TRUE(utils::MakeTempFile("/tmp/old_kernel.XXXXXX",
413 &state->old_kernel,
414 NULL));
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700415
416 string new_kernel;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800417 EXPECT_TRUE(utils::MakeTempFile("/tmp/new_kernel.XXXXXX",
418 &state->new_kernel,
419 NULL));
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700420
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800421 state->old_kernel_data.resize(kDefaultKernelSize);
422 state->new_kernel_data.resize(state->old_kernel_data.size());
423 FillWithData(&state->old_kernel_data);
424 FillWithData(&state->new_kernel_data);
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700425
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700426 // change the new kernel data
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800427 strcpy(&state->new_kernel_data[0], kNewDataString);
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700428
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700429 if (noop) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800430 state->old_kernel_data = state->new_kernel_data;
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700431 }
432
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700433 // Write kernels to disk
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800434 EXPECT_TRUE(utils::WriteFile(state->old_kernel.c_str(),
435 &state->old_kernel_data[0],
436 state->old_kernel_data.size()));
437 EXPECT_TRUE(utils::WriteFile(state->new_kernel.c_str(),
438 &state->new_kernel_data[0],
439 state->new_kernel_data.size()));
Andrew de los Reyesf4c7ef12010-04-30 10:37:00 -0700440
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800441 EXPECT_TRUE(utils::MakeTempFile("/tmp/delta.XXXXXX",
442 &state->delta_path,
443 NULL));
444 LOG(INFO) << "delta path: " << state->delta_path;
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700445 {
446 string a_mnt, b_mnt;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800447 ScopedLoopMounter a_mounter(state->a_img, &a_mnt, MS_RDONLY);
448 ScopedLoopMounter b_mounter(state->b_img, &b_mnt, MS_RDONLY);
Darin Petkovcbfb0172011-01-14 15:24:45 -0800449 const string private_key =
450 signature_test == kSignatureGenerator ? kUnittestPrivateKeyPath : "";
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700451 EXPECT_TRUE(
Darin Petkov68c10d12010-10-14 09:24:37 -0700452 DeltaDiffGenerator::GenerateDeltaUpdateFile(
Darin Petkov7a22d792010-11-08 14:10:00 -0800453 full_rootfs ? "" : a_mnt,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800454 full_rootfs ? "" : state->a_img,
Darin Petkov68c10d12010-10-14 09:24:37 -0700455 b_mnt,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800456 state->b_img,
457 full_kernel ? "" : state->old_kernel,
458 state->new_kernel,
459 state->delta_path,
460 private_key,
Darin Petkov8e447e02013-04-16 16:23:50 +0200461 chunk_size,
Chris Sosad5ae1562013-04-23 13:20:18 -0700462 kRootFSPartitionSize,
Don Garrett0dd39852013-04-03 16:55:42 -0700463 full_rootfs ? NULL : &old_image_info,
464 &new_image_info,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800465 &state->metadata_size));
Darin Petkov9574f7e2011-01-13 10:48:12 -0800466 }
467
Don Garrett2ae37872013-10-25 13:33:20 -0700468 if (signature_test == kSignatureGeneratedPlaceholder ||
469 signature_test == kSignatureGeneratedPlaceholderMismatch) {
470
471 int signature_size = GetSignatureSize(kUnittestPrivateKeyPath);
472 LOG(INFO) << "Inserting placeholder signature.";
473 ASSERT_TRUE(InsertSignaturePlaceholder(signature_size, state->delta_path,
474 &state->metadata_size));
475
476 if (signature_test == kSignatureGeneratedPlaceholderMismatch) {
477 signature_size -= 1;
478 LOG(INFO) << "Inserting mismatched placeholder signature.";
479 ASSERT_FALSE(InsertSignaturePlaceholder(signature_size, state->delta_path,
480 &state->metadata_size));
481 return;
482 }
483 }
484
485 if (signature_test == kSignatureGenerated ||
486 signature_test == kSignatureGeneratedPlaceholder ||
487 signature_test == kSignatureGeneratedPlaceholderMismatch) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800488 // Generate the signed payload and update the metadata size in state to
489 // reflect the new size after adding the signature operation to the
490 // manifest.
Don Garrett2ae37872013-10-25 13:33:20 -0700491 LOG(INFO) << "Signing payload.";
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800492 SignGeneratedPayload(state->delta_path, &state->metadata_size);
Darin Petkov52dcaeb2011-01-14 15:33:06 -0800493 } else if (signature_test == kSignatureGeneratedShell ||
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700494 signature_test == kSignatureGeneratedShellBadKey ||
495 signature_test == kSignatureGeneratedShellRotateCl1 ||
496 signature_test == kSignatureGeneratedShellRotateCl2) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800497 SignGeneratedShellPayload(signature_test, state->delta_path);
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700498 }
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800499}
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700500
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800501static void ApplyDeltaFile(bool full_kernel, bool full_rootfs, bool noop,
502 SignatureTest signature_test, DeltaState* state,
503 bool hash_checks_mandatory,
504 OperationHashTest op_hash_test,
505 DeltaPerformer** performer) {
Darin Petkov36a58222010-10-07 22:00:09 -0700506 // Check the metadata.
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700507 {
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700508 DeltaArchiveManifest manifest;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800509 EXPECT_TRUE(PayloadSigner::LoadPayload(state->delta_path,
510 &state->delta,
511 &manifest,
512 &state->metadata_size));
513 LOG(INFO) << "Metadata size: " << state->metadata_size;
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700514
Don Garrett0dd39852013-04-03 16:55:42 -0700515
516
Darin Petkovcbfb0172011-01-14 15:24:45 -0800517 if (signature_test == kSignatureNone) {
518 EXPECT_FALSE(manifest.has_signatures_offset());
519 EXPECT_FALSE(manifest.has_signatures_size());
520 } else {
521 EXPECT_TRUE(manifest.has_signatures_offset());
522 EXPECT_TRUE(manifest.has_signatures_size());
523 Signatures sigs_message;
524 EXPECT_TRUE(sigs_message.ParseFromArray(
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800525 &state->delta[state->metadata_size + manifest.signatures_offset()],
Darin Petkovcbfb0172011-01-14 15:24:45 -0800526 manifest.signatures_size()));
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700527 if (signature_test == kSignatureGeneratedShellRotateCl1 ||
528 signature_test == kSignatureGeneratedShellRotateCl2)
529 EXPECT_EQ(2, sigs_message.signatures_size());
530 else
531 EXPECT_EQ(1, sigs_message.signatures_size());
Darin Petkovcbfb0172011-01-14 15:24:45 -0800532 const Signatures_Signature& signature = sigs_message.signatures(0);
533 EXPECT_EQ(1, signature.version());
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700534
Darin Petkovcbfb0172011-01-14 15:24:45 -0800535 uint64_t expected_sig_data_length = 0;
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700536 vector<string> key_paths (1, kUnittestPrivateKeyPath);
537 if (signature_test == kSignatureGeneratedShellRotateCl1 ||
538 signature_test == kSignatureGeneratedShellRotateCl2) {
539 key_paths.push_back(kUnittestPrivateKey2Path);
540 }
Darin Petkovcbfb0172011-01-14 15:24:45 -0800541 EXPECT_TRUE(PayloadSigner::SignatureBlobLength(
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -0700542 key_paths,
543 &expected_sig_data_length));
Darin Petkovcbfb0172011-01-14 15:24:45 -0800544 EXPECT_EQ(expected_sig_data_length, manifest.signatures_size());
545 EXPECT_FALSE(signature.data().empty());
546 }
Darin Petkov36a58222010-10-07 22:00:09 -0700547
Darin Petkov9fa7ec52010-10-18 11:45:23 -0700548 if (noop) {
549 EXPECT_EQ(1, manifest.install_operations_size());
550 EXPECT_EQ(1, manifest.kernel_install_operations_size());
551 }
552
Darin Petkovd43d6902010-10-14 11:17:50 -0700553 if (full_kernel) {
554 EXPECT_FALSE(manifest.has_old_kernel_info());
555 } else {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800556 EXPECT_EQ(state->old_kernel_data.size(),
557 manifest.old_kernel_info().size());
Darin Petkovd43d6902010-10-14 11:17:50 -0700558 EXPECT_FALSE(manifest.old_kernel_info().hash().empty());
559 }
Darin Petkov698d0412010-10-13 10:59:44 -0700560
Don Garrett0dd39852013-04-03 16:55:42 -0700561 EXPECT_EQ(manifest.new_image_info().channel(), "test-channel");
562 EXPECT_EQ(manifest.new_image_info().board(), "test-board");
563 EXPECT_EQ(manifest.new_image_info().version(), "test-version");
564 EXPECT_EQ(manifest.new_image_info().key(), "test-key");
565 EXPECT_EQ(manifest.new_image_info().build_channel(), "test-build-channel");
566 EXPECT_EQ(manifest.new_image_info().build_version(), "test-build-version");
567
568 if (!full_rootfs) {
569
570 if (noop) {
571 EXPECT_EQ(manifest.old_image_info().channel(), "test-channel");
572 EXPECT_EQ(manifest.old_image_info().board(), "test-board");
573 EXPECT_EQ(manifest.old_image_info().version(), "test-version");
574 EXPECT_EQ(manifest.old_image_info().key(), "test-key");
575 EXPECT_EQ(manifest.old_image_info().build_channel(),
576 "test-build-channel");
577 EXPECT_EQ(manifest.old_image_info().build_version(),
578 "test-build-version");
579 } else {
580 EXPECT_EQ(manifest.old_image_info().channel(), "src-channel");
581 EXPECT_EQ(manifest.old_image_info().board(), "src-board");
582 EXPECT_EQ(manifest.old_image_info().version(), "src-version");
583 EXPECT_EQ(manifest.old_image_info().key(), "src-key");
584 EXPECT_EQ(manifest.old_image_info().build_channel(),
585 "src-build-channel");
586 EXPECT_EQ(manifest.old_image_info().build_version(),
587 "src-build-version");
588 }
589 }
590
591
Darin Petkov7a22d792010-11-08 14:10:00 -0800592 if (full_rootfs) {
593 EXPECT_FALSE(manifest.has_old_rootfs_info());
Don Garrett0dd39852013-04-03 16:55:42 -0700594 EXPECT_FALSE(manifest.has_old_image_info());
595 EXPECT_TRUE(manifest.has_new_image_info());
Darin Petkov7a22d792010-11-08 14:10:00 -0800596 } else {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800597 EXPECT_EQ(state->image_size, manifest.old_rootfs_info().size());
Darin Petkov7a22d792010-11-08 14:10:00 -0800598 EXPECT_FALSE(manifest.old_rootfs_info().hash().empty());
599 }
600
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800601 EXPECT_EQ(state->new_kernel_data.size(), manifest.new_kernel_info().size());
602 EXPECT_EQ(state->image_size, manifest.new_rootfs_info().size());
Darin Petkov36a58222010-10-07 22:00:09 -0700603
Darin Petkov36a58222010-10-07 22:00:09 -0700604 EXPECT_FALSE(manifest.new_kernel_info().hash().empty());
Darin Petkov36a58222010-10-07 22:00:09 -0700605 EXPECT_FALSE(manifest.new_rootfs_info().hash().empty());
Andrew de los Reyes932bc4c2010-08-23 18:14:09 -0700606 }
607
Darin Petkov73058b42010-10-06 16:32:19 -0700608 PrefsMock prefs;
609 EXPECT_CALL(prefs, SetInt64(kPrefsManifestMetadataSize,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800610 state->metadata_size)).WillOnce(Return(true));
Darin Petkov73058b42010-10-06 16:32:19 -0700611 EXPECT_CALL(prefs, SetInt64(kPrefsUpdateStateNextOperation, _))
612 .WillRepeatedly(Return(true));
Darin Petkov9b230572010-10-08 10:20:09 -0700613 EXPECT_CALL(prefs, GetInt64(kPrefsUpdateStateNextOperation, _))
614 .WillOnce(Return(false));
Darin Petkov73058b42010-10-06 16:32:19 -0700615 EXPECT_CALL(prefs, SetInt64(kPrefsUpdateStateNextDataOffset, _))
616 .WillRepeatedly(Return(true));
David Zeuthen41996ad2013-09-24 15:43:24 -0700617 EXPECT_CALL(prefs, SetInt64(kPrefsUpdateStateNextDataLength, _))
618 .WillRepeatedly(Return(true));
Darin Petkov437adc42010-10-07 13:12:24 -0700619 EXPECT_CALL(prefs, SetString(kPrefsUpdateStateSHA256Context, _))
Darin Petkov73058b42010-10-06 16:32:19 -0700620 .WillRepeatedly(Return(true));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800621 if (op_hash_test == kValidOperationData && signature_test != kSignatureNone) {
Darin Petkovcbfb0172011-01-14 15:24:45 -0800622 EXPECT_CALL(prefs, SetString(kPrefsUpdateStateSignedSHA256Context, _))
623 .WillOnce(Return(true));
Darin Petkov4f0a07b2011-05-25 16:47:20 -0700624 EXPECT_CALL(prefs, SetString(kPrefsUpdateStateSignatureBlob, _))
625 .WillOnce(Return(true));
Darin Petkovcbfb0172011-01-14 15:24:45 -0800626 }
Darin Petkov73058b42010-10-06 16:32:19 -0700627
Andrew de los Reyes09e56d62010-04-23 13:45:53 -0700628 // Update the A image in place.
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700629 InstallPlan install_plan;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800630 install_plan.hash_checks_mandatory = hash_checks_mandatory;
631 install_plan.metadata_size = state->metadata_size;
632 LOG(INFO) << "Setting payload metadata size in Omaha = "
633 << state->metadata_size;
Jay Srinivasanf4318702012-09-24 11:56:24 -0700634 ASSERT_TRUE(PayloadSigner::GetMetadataSignature(
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800635 &state->delta[0],
636 state->metadata_size,
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700637 kUnittestPrivateKeyPath,
Jay Srinivasanf4318702012-09-24 11:56:24 -0700638 &install_plan.metadata_signature));
639 EXPECT_FALSE(install_plan.metadata_signature.empty());
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700640
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800641 *performer = new DeltaPerformer(&prefs,
642 &state->mock_system_state,
643 &install_plan);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700644 EXPECT_TRUE(utils::FileExists(kUnittestPublicKeyPath));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800645 (*performer)->set_public_key_path(kUnittestPublicKeyPath);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700646
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800647 EXPECT_EQ(state->image_size,
648 OmahaHashCalculator::RawHashOfFile(state->a_img,
649 state->image_size,
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700650 &install_plan.rootfs_hash));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800651 EXPECT_TRUE(OmahaHashCalculator::RawHashOfData(state->old_kernel_data,
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700652 &install_plan.kernel_hash));
653
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800654 EXPECT_EQ(0, (*performer)->Open(state->a_img.c_str(), 0, 0));
655 EXPECT_TRUE((*performer)->OpenKernel(state->old_kernel.c_str()));
656
David Zeuthena99981f2013-04-29 13:42:47 -0700657 ErrorCode expected_error, actual_error;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800658 bool continue_writing;
659 switch(op_hash_test) {
660 case kInvalidOperationData: {
661 // Muck with some random offset post the metadata size so that
662 // some operation hash will result in a mismatch.
663 int some_offset = state->metadata_size + 300;
664 LOG(INFO) << "Tampered value at offset: " << some_offset;
665 state->delta[some_offset]++;
David Zeuthena99981f2013-04-29 13:42:47 -0700666 expected_error = kErrorCodeDownloadOperationHashMismatch;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800667 continue_writing = false;
668 break;
669 }
670
671 case kValidOperationData:
672 default:
673 // no change.
David Zeuthena99981f2013-04-29 13:42:47 -0700674 expected_error = kErrorCodeSuccess;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800675 continue_writing = true;
676 break;
677 }
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700678
679 // Write at some number of bytes per operation. Arbitrarily chose 5.
680 const size_t kBytesPerWrite = 5;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800681 for (size_t i = 0; i < state->delta.size(); i += kBytesPerWrite) {
682 size_t count = min(state->delta.size() - i, kBytesPerWrite);
683 bool write_succeeded = ((*performer)->Write(&state->delta[i],
684 count,
685 &actual_error));
686 // Normally write_succeeded should be true every time and
David Zeuthena99981f2013-04-29 13:42:47 -0700687 // actual_error should be kErrorCodeSuccess. If so, continue the loop.
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800688 // But if we seeded an operation hash error above, then write_succeeded
689 // will be false. The failure may happen at any operation n. So, all
690 // Writes until n-1 should succeed and the nth operation will fail with
691 // actual_error. In this case, we should bail out of the loop because
692 // we cannot proceed applying the delta.
693 if (!write_succeeded) {
694 LOG(INFO) << "Write failed. Checking if it failed with expected error";
695 EXPECT_EQ(expected_error, actual_error);
696 if (!continue_writing) {
697 LOG(INFO) << "Cannot continue writing. Bailing out.";
698 break;
699 }
700 }
701
David Zeuthena99981f2013-04-29 13:42:47 -0700702 EXPECT_EQ(kErrorCodeSuccess, actual_error);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700703 }
704
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800705 // If we had continued all the way through, Close should succeed.
706 // Otherwise, it should fail. Check appropriately.
707 bool close_result = (*performer)->Close();
708 if (continue_writing)
709 EXPECT_EQ(0, close_result);
710 else
711 EXPECT_LE(0, close_result);
712}
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700713
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800714void VerifyPayloadResult(DeltaPerformer* performer,
715 DeltaState* state,
David Zeuthena99981f2013-04-29 13:42:47 -0700716 ErrorCode expected_result) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800717 if (!performer) {
718 EXPECT_TRUE(!"Skipping payload verification since performer is NULL.");
719 return;
720 }
721
David Zeuthena99981f2013-04-29 13:42:47 -0700722 int expected_times = (expected_result == kErrorCodeSuccess) ? 1 : 0;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800723 EXPECT_CALL(*(state->mock_system_state.mock_payload_state()),
724 DownloadComplete()).Times(expected_times);
725
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800726 LOG(INFO) << "Verifying payload for expected result "
727 << expected_result;
728 EXPECT_EQ(expected_result, performer->VerifyPayload(
729 OmahaHashCalculator::OmahaHashOfData(state->delta),
730 state->delta.size()));
731 LOG(INFO) << "Verified payload.";
732
David Zeuthena99981f2013-04-29 13:42:47 -0700733 if (expected_result != kErrorCodeSuccess) {
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800734 // no need to verify new partition if VerifyPayload failed.
735 return;
736 }
737
738 CompareFilesByBlock(state->old_kernel, state->new_kernel);
739 CompareFilesByBlock(state->a_img, state->b_img);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700740
741 vector<char> updated_kernel_partition;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800742 EXPECT_TRUE(utils::ReadFile(state->old_kernel, &updated_kernel_partition));
743 EXPECT_EQ(0, strncmp(&updated_kernel_partition[0], kNewDataString,
744 strlen(kNewDataString)));
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700745
746 uint64_t new_kernel_size;
747 vector<char> new_kernel_hash;
748 uint64_t new_rootfs_size;
749 vector<char> new_rootfs_hash;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800750 EXPECT_TRUE(performer->GetNewPartitionInfo(&new_kernel_size,
Don Garrett0dd39852013-04-03 16:55:42 -0700751 &new_kernel_hash,
752 &new_rootfs_size,
753 &new_rootfs_hash));
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800754 EXPECT_EQ(kDefaultKernelSize, new_kernel_size);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700755 vector<char> expected_new_kernel_hash;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800756 EXPECT_TRUE(OmahaHashCalculator::RawHashOfData(state->new_kernel_data,
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700757 &expected_new_kernel_hash));
758 EXPECT_TRUE(expected_new_kernel_hash == new_kernel_hash);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800759 EXPECT_EQ(state->image_size, new_rootfs_size);
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700760 vector<char> expected_new_rootfs_hash;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800761 EXPECT_EQ(state->image_size,
762 OmahaHashCalculator::RawHashOfFile(state->b_img,
763 state->image_size,
Jay Srinivasan51dcf262012-09-13 17:24:32 -0700764 &expected_new_rootfs_hash));
765 EXPECT_TRUE(expected_new_rootfs_hash == new_rootfs_hash);
766}
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800767
768void VerifyPayload(DeltaPerformer* performer,
769 DeltaState* state,
770 SignatureTest signature_test) {
David Zeuthena99981f2013-04-29 13:42:47 -0700771 ErrorCode expected_result = kErrorCodeSuccess;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800772 switch (signature_test) {
773 case kSignatureNone:
David Zeuthena99981f2013-04-29 13:42:47 -0700774 expected_result = kErrorCodeSignedDeltaPayloadExpectedError;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800775 break;
776 case kSignatureGeneratedShellBadKey:
David Zeuthena99981f2013-04-29 13:42:47 -0700777 expected_result = kErrorCodeDownloadPayloadPubKeyVerificationError;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800778 break;
779 default: break; // appease gcc
780 }
781
782 VerifyPayloadResult(performer, state, expected_result);
783}
784
785void DoSmallImageTest(bool full_kernel, bool full_rootfs, bool noop,
Darin Petkov8e447e02013-04-16 16:23:50 +0200786 off_t chunk_size,
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800787 SignatureTest signature_test,
788 bool hash_checks_mandatory) {
789 DeltaState state;
790 DeltaPerformer *performer;
Darin Petkov8e447e02013-04-16 16:23:50 +0200791 GenerateDeltaFile(full_kernel, full_rootfs, noop, chunk_size,
792 signature_test, &state);
Don Garrett0dd39852013-04-03 16:55:42 -0700793
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800794 ScopedPathUnlinker a_img_unlinker(state.a_img);
795 ScopedPathUnlinker b_img_unlinker(state.b_img);
796 ScopedPathUnlinker delta_unlinker(state.delta_path);
797 ScopedPathUnlinker old_kernel_unlinker(state.old_kernel);
798 ScopedPathUnlinker new_kernel_unlinker(state.new_kernel);
799 ApplyDeltaFile(full_kernel, full_rootfs, noop, signature_test,
800 &state, hash_checks_mandatory, kValidOperationData,
801 &performer);
802 VerifyPayload(performer, &state, signature_test);
803}
804
805// Calls delta performer's Write method by pretending to pass in bytes from a
806// delta file whose metadata size is actual_metadata_size and tests if all
807// checks are correctly performed if the install plan contains
808// expected_metadata_size and that the result of the parsing are as per
809// hash_checks_mandatory flag.
810void DoMetadataSizeTest(uint64_t expected_metadata_size,
811 uint64_t actual_metadata_size,
812 bool hash_checks_mandatory) {
813 PrefsMock prefs;
814 InstallPlan install_plan;
815 install_plan.hash_checks_mandatory = hash_checks_mandatory;
816 MockSystemState mock_system_state;
817 DeltaPerformer performer(&prefs, &mock_system_state, &install_plan);
818 EXPECT_EQ(0, performer.Open("/dev/null", 0, 0));
819 EXPECT_TRUE(performer.OpenKernel("/dev/null"));
820
821 // Set a valid magic string and version number 1.
822 EXPECT_TRUE(performer.Write("CrAU", 4));
823 uint64_t version = htobe64(1);
824 EXPECT_TRUE(performer.Write(&version, 8));
825
826 install_plan.metadata_size = expected_metadata_size;
David Zeuthena99981f2013-04-29 13:42:47 -0700827 ErrorCode error_code;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800828 // When filling in size in manifest, exclude the size of the 20-byte header.
829 uint64_t size_in_manifest = htobe64(actual_metadata_size - 20);
830 bool result = performer.Write(&size_in_manifest, 8, &error_code);
831 if (expected_metadata_size == actual_metadata_size ||
832 !hash_checks_mandatory) {
833 EXPECT_TRUE(result);
834 } else {
835 EXPECT_FALSE(result);
David Zeuthena99981f2013-04-29 13:42:47 -0700836 EXPECT_EQ(kErrorCodeDownloadInvalidMetadataSize, error_code);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800837 }
838
839 EXPECT_LT(performer.Close(), 0);
840}
841
842// Generates a valid delta file but tests the delta performer by suppling
843// different metadata signatures as per omaha_metadata_signature flag and
844// sees if the result of the parsing are as per hash_checks_mandatory flag.
845void DoMetadataSignatureTest(MetadataSignatureTest metadata_signature_test,
846 SignatureTest signature_test,
847 bool hash_checks_mandatory) {
848 DeltaState state;
849
850 // Using kSignatureNone since it doesn't affect the results of our test.
851 // If we've to use other signature options, then we'd have to get the
852 // metadata size again after adding the signing operation to the manifest.
Darin Petkov8e447e02013-04-16 16:23:50 +0200853 GenerateDeltaFile(true, true, false, -1, signature_test, &state);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800854
855 ScopedPathUnlinker a_img_unlinker(state.a_img);
856 ScopedPathUnlinker b_img_unlinker(state.b_img);
857 ScopedPathUnlinker delta_unlinker(state.delta_path);
858 ScopedPathUnlinker old_kernel_unlinker(state.old_kernel);
859 ScopedPathUnlinker new_kernel_unlinker(state.new_kernel);
860
861 // Loads the payload and parses the manifest.
862 vector<char> payload;
863 EXPECT_TRUE(utils::ReadFile(state.delta_path, &payload));
864 LOG(INFO) << "Payload size: " << payload.size();
865
866 InstallPlan install_plan;
867 install_plan.hash_checks_mandatory = hash_checks_mandatory;
868 install_plan.metadata_size = state.metadata_size;
869
870 DeltaPerformer::MetadataParseResult expected_result, actual_result;
David Zeuthena99981f2013-04-29 13:42:47 -0700871 ErrorCode expected_error, actual_error;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800872
873 // Fill up the metadata signature in install plan according to the test.
874 switch (metadata_signature_test) {
875 case kEmptyMetadataSignature:
876 install_plan.metadata_signature.clear();
877 expected_result = DeltaPerformer::kMetadataParseError;
David Zeuthena99981f2013-04-29 13:42:47 -0700878 expected_error = kErrorCodeDownloadMetadataSignatureMissingError;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800879 break;
880
881 case kInvalidMetadataSignature:
882 install_plan.metadata_signature = kBogusMetadataSignature1;
883 expected_result = DeltaPerformer::kMetadataParseError;
David Zeuthena99981f2013-04-29 13:42:47 -0700884 expected_error = kErrorCodeDownloadMetadataSignatureMismatch;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800885 break;
886
887 case kValidMetadataSignature:
888 default:
889 // Set the install plan's metadata size to be the same as the one
890 // in the manifest so that we pass the metadata size checks. Only
891 // then we can get to manifest signature checks.
892 ASSERT_TRUE(PayloadSigner::GetMetadataSignature(
893 &payload[0],
894 state.metadata_size,
895 kUnittestPrivateKeyPath,
896 &install_plan.metadata_signature));
897 EXPECT_FALSE(install_plan.metadata_signature.empty());
898 expected_result = DeltaPerformer::kMetadataParseSuccess;
David Zeuthena99981f2013-04-29 13:42:47 -0700899 expected_error = kErrorCodeSuccess;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800900 break;
901 }
902
903 // Ignore the expected result/error if hash checks are not mandatory.
904 if (!hash_checks_mandatory) {
905 expected_result = DeltaPerformer::kMetadataParseSuccess;
David Zeuthena99981f2013-04-29 13:42:47 -0700906 expected_error = kErrorCodeSuccess;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800907 }
908
909 // Create the delta performer object.
910 PrefsMock prefs;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800911 DeltaPerformer delta_performer(&prefs,
912 &state.mock_system_state,
913 &install_plan);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800914
915 // Use the public key corresponding to the private key used above to
916 // sign the metadata.
917 EXPECT_TRUE(utils::FileExists(kUnittestPublicKeyPath));
918 delta_performer.set_public_key_path(kUnittestPublicKeyPath);
919
920 // Parse the delta payload we created.
921 DeltaArchiveManifest manifest;
922 uint64_t parsed_metadata_size;
923
924 // Init actual_error with an invalid value so that we make sure
925 // ParsePayloadMetadata properly populates it in all cases.
David Zeuthena99981f2013-04-29 13:42:47 -0700926 actual_error = kErrorCodeUmaReportedMax;
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800927 actual_result = delta_performer.ParsePayloadMetadata(payload, &manifest,
928 &parsed_metadata_size, &actual_error);
929
930 EXPECT_EQ(expected_result, actual_result);
931 EXPECT_EQ(expected_error, actual_error);
932
933 // Check that the parsed metadata size is what's expected. This test
934 // implicitly confirms that the metadata signature is valid, if required.
935 EXPECT_EQ(state.metadata_size, parsed_metadata_size);
936}
937
938void DoOperationHashMismatchTest(OperationHashTest op_hash_test,
939 bool hash_checks_mandatory) {
940 DeltaState state;
Darin Petkov8e447e02013-04-16 16:23:50 +0200941 GenerateDeltaFile(true, true, false, -1, kSignatureGenerated, &state);
Jay Srinivasan738fdf32012-12-07 17:40:54 -0800942 ScopedPathUnlinker a_img_unlinker(state.a_img);
943 ScopedPathUnlinker b_img_unlinker(state.b_img);
944 ScopedPathUnlinker delta_unlinker(state.delta_path);
945 ScopedPathUnlinker old_kernel_unlinker(state.old_kernel);
946 ScopedPathUnlinker new_kernel_unlinker(state.new_kernel);
947 DeltaPerformer *performer;
948 ApplyDeltaFile(true, true, false, kSignatureGenerated,
949 &state, hash_checks_mandatory, op_hash_test, &performer);
950}
951
952class DeltaPerformerTest : public ::testing::Test { };
953
954TEST(DeltaPerformerTest, ExtentsToByteStringTest) {
955 uint64_t test[] = {1, 1, 4, 2, kSparseHole, 1, 0, 1};
956 COMPILE_ASSERT(arraysize(test) % 2 == 0, array_size_uneven);
957 const uint64_t block_size = 4096;
958 const uint64_t file_length = 5 * block_size - 13;
959
960 google::protobuf::RepeatedPtrField<Extent> extents;
961 for (size_t i = 0; i < arraysize(test); i += 2) {
962 Extent* extent = extents.Add();
963 extent->set_start_block(test[i]);
964 extent->set_num_blocks(test[i + 1]);
965 }
966
967 string expected_output = "4096:4096,16384:8192,-1:4096,0:4083";
968 string actual_output;
969 EXPECT_TRUE(DeltaPerformer::ExtentsToBsdiffPositionsString(extents,
970 block_size,
971 file_length,
972 &actual_output));
973 EXPECT_EQ(expected_output, actual_output);
974}
Darin Petkov68c10d12010-10-14 09:24:37 -0700975
976TEST(DeltaPerformerTest, RunAsRootSmallImageTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +0200977 DoSmallImageTest(false, false, false, -1, kSignatureGenerator,
Gilad Arnold434eb0c2013-07-22 06:47:52 -0700978 false);
Darin Petkov8e447e02013-04-16 16:23:50 +0200979}
980
Don Garrett2ae37872013-10-25 13:33:20 -0700981TEST(DeltaPerformerTest, RunAsRootSmallImageSignaturePlaceholderTest) {
982 DoSmallImageTest(false, false, false, -1, kSignatureGeneratedPlaceholder,
983 false);
984}
985
986TEST(DeltaPerformerTest, RunAsRootSmallImageSignaturePlaceholderMismatchTest) {
987 DeltaState state;
988 GenerateDeltaFile(false, false, false, -1,
989 kSignatureGeneratedPlaceholderMismatch, &state);
990}
991
Darin Petkov8e447e02013-04-16 16:23:50 +0200992TEST(DeltaPerformerTest, RunAsRootSmallImageChunksTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +0200993 DoSmallImageTest(false, false, false, kBlockSize, kSignatureGenerator,
Gilad Arnold434eb0c2013-07-22 06:47:52 -0700994 false);
Darin Petkov68c10d12010-10-14 09:24:37 -0700995}
996
997TEST(DeltaPerformerTest, RunAsRootFullKernelSmallImageTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +0200998 DoSmallImageTest(true, false, false, -1, kSignatureGenerator,
Gilad Arnold434eb0c2013-07-22 06:47:52 -0700999 false);
Darin Petkov7a22d792010-11-08 14:10:00 -08001000}
1001
1002TEST(DeltaPerformerTest, RunAsRootFullSmallImageTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001003 DoSmallImageTest(true, true, false, -1, kSignatureGenerator,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001004 true);
Darin Petkov9fa7ec52010-10-18 11:45:23 -07001005}
1006
1007TEST(DeltaPerformerTest, RunAsRootNoopSmallImageTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001008 DoSmallImageTest(false, false, true, -1, kSignatureGenerator,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001009 false);
Darin Petkov9574f7e2011-01-13 10:48:12 -08001010}
1011
Darin Petkovcbfb0172011-01-14 15:24:45 -08001012TEST(DeltaPerformerTest, RunAsRootSmallImageSignNoneTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001013 DoSmallImageTest(false, false, false, -1, kSignatureNone,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001014 false);
Darin Petkovcbfb0172011-01-14 15:24:45 -08001015}
1016
1017TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001018 DoSmallImageTest(false, false, false, -1, kSignatureGenerated,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001019 true);
Darin Petkovcbfb0172011-01-14 15:24:45 -08001020}
1021
1022TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedShellTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001023 DoSmallImageTest(false, false, false, -1, kSignatureGeneratedShell,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001024 false);
Andrew de los Reyes27f7d372010-10-07 11:26:07 -07001025}
1026
Darin Petkov52dcaeb2011-01-14 15:33:06 -08001027TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedShellBadKeyTest) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001028 DoSmallImageTest(false, false, false, -1, kSignatureGeneratedShellBadKey,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001029 false);
Darin Petkov52dcaeb2011-01-14 15:33:06 -08001030}
1031
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -07001032TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedShellRotateCl1Test) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001033 DoSmallImageTest(false, false, false, -1, kSignatureGeneratedShellRotateCl1,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001034 false);
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -07001035}
1036
1037TEST(DeltaPerformerTest, RunAsRootSmallImageSignGeneratedShellRotateCl2Test) {
Darin Petkov8e447e02013-04-16 16:23:50 +02001038 DoSmallImageTest(false, false, false, -1, kSignatureGeneratedShellRotateCl2,
Gilad Arnold434eb0c2013-07-22 06:47:52 -07001039 false);
Andrew de los Reyesc24e3f32011-08-30 15:45:20 -07001040}
1041
Darin Petkov934bb412010-11-18 11:21:35 -08001042TEST(DeltaPerformerTest, BadDeltaMagicTest) {
1043 PrefsMock prefs;
Jay Srinivasan51dcf262012-09-13 17:24:32 -07001044 InstallPlan install_plan;
Jay Srinivasanf0572052012-10-23 18:12:56 -07001045 MockSystemState mock_system_state;
1046 DeltaPerformer performer(&prefs, &mock_system_state, &install_plan);
Darin Petkov934bb412010-11-18 11:21:35 -08001047 EXPECT_EQ(0, performer.Open("/dev/null", 0, 0));
1048 EXPECT_TRUE(performer.OpenKernel("/dev/null"));
Don Garrette410e0f2011-11-10 15:39:01 -08001049 EXPECT_TRUE(performer.Write("junk", 4));
1050 EXPECT_TRUE(performer.Write("morejunk", 8));
1051 EXPECT_FALSE(performer.Write("morejunk", 8));
Darin Petkov934bb412010-11-18 11:21:35 -08001052 EXPECT_LT(performer.Close(), 0);
1053}
1054
Andrew de los Reyes353777c2010-10-08 10:34:30 -07001055TEST(DeltaPerformerTest, IsIdempotentOperationTest) {
1056 DeltaArchiveManifest_InstallOperation op;
1057 EXPECT_TRUE(DeltaPerformer::IsIdempotentOperation(op));
1058 *(op.add_dst_extents()) = ExtentForRange(0, 5);
1059 EXPECT_TRUE(DeltaPerformer::IsIdempotentOperation(op));
1060 *(op.add_src_extents()) = ExtentForRange(4, 1);
1061 EXPECT_FALSE(DeltaPerformer::IsIdempotentOperation(op));
1062 op.clear_src_extents();
1063 *(op.add_src_extents()) = ExtentForRange(5, 3);
1064 EXPECT_TRUE(DeltaPerformer::IsIdempotentOperation(op));
1065 *(op.add_dst_extents()) = ExtentForRange(20, 6);
1066 EXPECT_TRUE(DeltaPerformer::IsIdempotentOperation(op));
1067 *(op.add_src_extents()) = ExtentForRange(19, 2);
1068 EXPECT_FALSE(DeltaPerformer::IsIdempotentOperation(op));
1069}
1070
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -08001071TEST(DeltaPerformerTest, WriteUpdatesPayloadState) {
1072 PrefsMock prefs;
1073 InstallPlan install_plan;
1074 MockSystemState mock_system_state;
1075 DeltaPerformer performer(&prefs, &mock_system_state, &install_plan);
1076 EXPECT_EQ(0, performer.Open("/dev/null", 0, 0));
1077 EXPECT_TRUE(performer.OpenKernel("/dev/null"));
1078
1079 EXPECT_CALL(*(mock_system_state.mock_payload_state()),
1080 DownloadProgress(4)).Times(1);
1081 EXPECT_CALL(*(mock_system_state.mock_payload_state()),
1082 DownloadProgress(8)).Times(2);
1083
1084 EXPECT_TRUE(performer.Write("junk", 4));
1085 EXPECT_TRUE(performer.Write("morejunk", 8));
1086 EXPECT_FALSE(performer.Write("morejunk", 8));
1087 EXPECT_LT(performer.Close(), 0);
1088}
1089
Jay Srinivasan738fdf32012-12-07 17:40:54 -08001090TEST(DeltaPerformerTest, MissingMandatoryMetadataSizeTest) {
1091 DoMetadataSizeTest(0, 75456, true);
Jay Srinivasan51dcf262012-09-13 17:24:32 -07001092}
1093
Jay Srinivasan738fdf32012-12-07 17:40:54 -08001094TEST(DeltaPerformerTest, MissingNonMandatoryMetadataSizeTest) {
1095 DoMetadataSizeTest(0, 123456, false);
1096}
1097
1098TEST(DeltaPerformerTest, InvalidMandatoryMetadataSizeTest) {
1099 DoMetadataSizeTest(13000, 140000, true);
1100}
1101
1102TEST(DeltaPerformerTest, InvalidNonMandatoryMetadataSizeTest) {
1103 DoMetadataSizeTest(40000, 50000, false);
1104}
1105
1106TEST(DeltaPerformerTest, ValidMandatoryMetadataSizeTest) {
1107 DoMetadataSizeTest(85376, 85376, true);
1108}
1109
1110TEST(DeltaPerformerTest, RunAsRootMandatoryEmptyMetadataSignatureTest) {
1111 DoMetadataSignatureTest(kEmptyMetadataSignature, kSignatureGenerated, true);
1112}
1113
1114TEST(DeltaPerformerTest, RunAsRootNonMandatoryEmptyMetadataSignatureTest) {
1115 DoMetadataSignatureTest(kEmptyMetadataSignature, kSignatureGenerated, false);
1116}
1117
1118TEST(DeltaPerformerTest, RunAsRootMandatoryInvalidMetadataSignatureTest) {
1119 DoMetadataSignatureTest(kInvalidMetadataSignature, kSignatureGenerated, true);
1120}
1121
1122TEST(DeltaPerformerTest, RunAsRootNonMandatoryInvalidMetadataSignatureTest) {
1123 DoMetadataSignatureTest(kInvalidMetadataSignature, kSignatureGenerated,
1124 false);
1125}
1126
1127TEST(DeltaPerformerTest, RunAsRootMandatoryValidMetadataSignature1Test) {
1128 DoMetadataSignatureTest(kValidMetadataSignature, kSignatureNone, true);
1129}
1130
1131TEST(DeltaPerformerTest, RunAsRootMandatoryValidMetadataSignature2Test) {
1132 DoMetadataSignatureTest(kValidMetadataSignature, kSignatureGenerated, true);
1133}
1134
1135TEST(DeltaPerformerTest, RunAsRootNonMandatoryValidMetadataSignatureTest) {
1136 DoMetadataSignatureTest(kValidMetadataSignature, kSignatureGenerated, false);
1137}
1138
1139TEST(DeltaPerformerTest, RunAsRootMandatoryOperationHashMismatchTest) {
1140 DoOperationHashMismatchTest(kInvalidOperationData, true);
1141}
Jay Srinivasan51dcf262012-09-13 17:24:32 -07001142
Andrew de los Reyes09e56d62010-04-23 13:45:53 -07001143} // namespace chromeos_update_engine