OLD | NEW |
1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <sys/mount.h> | 5 #include <sys/mount.h> |
6 #include <inttypes.h> | 6 #include <inttypes.h> |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
| 12 #include <base/scoped_ptr.h> |
| 13 #include <base/string_util.h> |
12 #include <google/protobuf/repeated_field.h> | 14 #include <google/protobuf/repeated_field.h> |
13 #include <gtest/gtest.h> | 15 #include <gtest/gtest.h> |
14 | 16 |
15 #include "base/scoped_ptr.h" | |
16 #include "base/string_util.h" | |
17 #include "update_engine/delta_diff_generator.h" | 17 #include "update_engine/delta_diff_generator.h" |
18 #include "update_engine/delta_performer.h" | 18 #include "update_engine/delta_performer.h" |
19 #include "update_engine/graph_types.h" | 19 #include "update_engine/graph_types.h" |
20 #include "update_engine/payload_signer.h" | 20 #include "update_engine/payload_signer.h" |
| 21 #include "update_engine/prefs_mock.h" |
21 #include "update_engine/test_utils.h" | 22 #include "update_engine/test_utils.h" |
22 #include "update_engine/update_metadata.pb.h" | 23 #include "update_engine/update_metadata.pb.h" |
23 #include "update_engine/utils.h" | 24 #include "update_engine/utils.h" |
24 | 25 |
25 namespace chromeos_update_engine { | 26 namespace chromeos_update_engine { |
26 | 27 |
27 using std::min; | 28 using std::min; |
28 using std::string; | 29 using std::string; |
29 using std::vector; | 30 using std::vector; |
| 31 using testing::_; |
| 32 using testing::Return; |
30 | 33 |
31 extern const char* kUnittestPrivateKeyPath; | 34 extern const char* kUnittestPrivateKeyPath; |
32 extern const char* kUnittestPublicKeyPath; | 35 extern const char* kUnittestPublicKeyPath; |
33 | 36 |
34 class DeltaPerformerTest : public ::testing::Test { }; | 37 class DeltaPerformerTest : public ::testing::Test { }; |
35 | 38 |
36 TEST(DeltaPerformerTest, ExtentsToByteStringTest) { | 39 TEST(DeltaPerformerTest, ExtentsToByteStringTest) { |
37 uint64_t test[] = {1, 1, 4, 2, kSparseHole, 1, 0, 1}; | 40 uint64_t test[] = {1, 1, 4, 2, kSparseHole, 1, 0, 1}; |
38 COMPILE_ASSERT(arraysize(test) % 2 == 0, array_size_uneven); | 41 COMPILE_ASSERT(arraysize(test) % 2 == 0, array_size_uneven); |
39 const uint64_t block_size = 4096; | 42 const uint64_t block_size = 4096; |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 old_kernel, | 201 old_kernel, |
199 new_kernel, | 202 new_kernel, |
200 delta_path, | 203 delta_path, |
201 kUnittestPrivateKeyPath)); | 204 kUnittestPrivateKeyPath)); |
202 } | 205 } |
203 | 206 |
204 // Read delta into memory. | 207 // Read delta into memory. |
205 vector<char> delta; | 208 vector<char> delta; |
206 EXPECT_TRUE(utils::ReadFile(delta_path, &delta)); | 209 EXPECT_TRUE(utils::ReadFile(delta_path, &delta)); |
207 | 210 |
| 211 uint64_t manifest_metadata_size; |
| 212 |
208 // Check that the null signature blob exists | 213 // Check that the null signature blob exists |
209 { | 214 { |
210 LOG(INFO) << "delta size: " << delta.size(); | 215 LOG(INFO) << "delta size: " << delta.size(); |
211 DeltaArchiveManifest manifest; | 216 DeltaArchiveManifest manifest; |
212 const int kManifestSizeOffset = 12; | 217 const int kManifestSizeOffset = 12; |
213 const int kManifestOffset = 20; | 218 const int kManifestOffset = 20; |
214 uint64_t manifest_size = 0; | 219 uint64_t manifest_size = 0; |
215 memcpy(&manifest_size, &delta[kManifestSizeOffset], sizeof(manifest_size)); | 220 memcpy(&manifest_size, &delta[kManifestSizeOffset], sizeof(manifest_size)); |
216 manifest_size = be64toh(manifest_size); | 221 manifest_size = be64toh(manifest_size); |
217 LOG(INFO) << "manifest size: " << manifest_size; | 222 LOG(INFO) << "manifest size: " << manifest_size; |
218 EXPECT_TRUE(manifest.ParseFromArray(&delta[kManifestOffset], | 223 EXPECT_TRUE(manifest.ParseFromArray(&delta[kManifestOffset], |
219 manifest_size)); | 224 manifest_size)); |
220 EXPECT_TRUE(manifest.has_signatures_offset()); | 225 EXPECT_TRUE(manifest.has_signatures_offset()); |
| 226 manifest_metadata_size = kManifestOffset + manifest_size; |
221 | 227 |
222 Signatures sigs_message; | 228 Signatures sigs_message; |
223 EXPECT_TRUE(sigs_message.ParseFromArray( | 229 EXPECT_TRUE(sigs_message.ParseFromArray( |
224 &delta[kManifestOffset + manifest_size + manifest.signatures_offset()], | 230 &delta[manifest_metadata_size + manifest.signatures_offset()], |
225 manifest.signatures_size())); | 231 manifest.signatures_size())); |
226 EXPECT_EQ(1, sigs_message.signatures_size()); | 232 EXPECT_EQ(1, sigs_message.signatures_size()); |
227 const Signatures_Signature& signature = sigs_message.signatures(0); | 233 const Signatures_Signature& signature = sigs_message.signatures(0); |
228 EXPECT_EQ(1, signature.version()); | 234 EXPECT_EQ(1, signature.version()); |
229 | 235 |
230 uint64_t expected_sig_data_length = 0; | 236 uint64_t expected_sig_data_length = 0; |
231 EXPECT_TRUE(PayloadSigner::SignatureBlobLength(kUnittestPrivateKeyPath, | 237 EXPECT_TRUE(PayloadSigner::SignatureBlobLength(kUnittestPrivateKeyPath, |
232 &expected_sig_data_length)); | 238 &expected_sig_data_length)); |
233 EXPECT_EQ(expected_sig_data_length, manifest.signatures_size()); | 239 EXPECT_EQ(expected_sig_data_length, manifest.signatures_size()); |
234 EXPECT_FALSE(signature.data().empty()); | 240 EXPECT_FALSE(signature.data().empty()); |
235 } | 241 } |
236 | 242 |
| 243 PrefsMock prefs; |
| 244 EXPECT_CALL(prefs, SetInt64(kPrefsManifestMetadataSize, |
| 245 manifest_metadata_size)).WillOnce(Return(true)); |
| 246 EXPECT_CALL(prefs, SetInt64(kPrefsUpdateStateNextOperation, _)) |
| 247 .WillRepeatedly(Return(true)); |
| 248 EXPECT_CALL(prefs, SetInt64(kPrefsUpdateStateNextDataOffset, _)) |
| 249 .WillRepeatedly(Return(true)); |
| 250 EXPECT_CALL(prefs, SetString(kPrefsUpdateStateSignedSHA256Context, _)) |
| 251 .WillRepeatedly(Return(true)); |
| 252 |
237 // Update the A image in place. | 253 // Update the A image in place. |
238 DeltaPerformer performer; | 254 DeltaPerformer performer(&prefs); |
239 | 255 |
240 EXPECT_EQ(0, performer.Open(a_img.c_str(), 0, 0)); | 256 EXPECT_EQ(0, performer.Open(a_img.c_str(), 0, 0)); |
241 EXPECT_TRUE(performer.OpenKernel(old_kernel.c_str())); | 257 EXPECT_TRUE(performer.OpenKernel(old_kernel.c_str())); |
242 | 258 |
243 // Write at some number of bytes per operation. Arbitrarily chose 5. | 259 // Write at some number of bytes per operation. Arbitrarily chose 5. |
244 const size_t kBytesPerWrite = 5; | 260 const size_t kBytesPerWrite = 5; |
245 for (size_t i = 0; i < delta.size(); i += kBytesPerWrite) { | 261 for (size_t i = 0; i < delta.size(); i += kBytesPerWrite) { |
246 size_t count = min(delta.size() - i, kBytesPerWrite); | 262 size_t count = min(delta.size() - i, kBytesPerWrite); |
247 EXPECT_EQ(count, performer.Write(&delta[i], count)); | 263 EXPECT_EQ(count, performer.Write(&delta[i], count)); |
248 } | 264 } |
249 | 265 |
250 // Wrapper around close. Returns 0 on success or -errno on error. | 266 // Wrapper around close. Returns 0 on success or -errno on error. |
251 EXPECT_EQ(0, performer.Close()); | 267 EXPECT_EQ(0, performer.Close()); |
252 | 268 |
253 CompareFilesByBlock(old_kernel, new_kernel); | 269 CompareFilesByBlock(old_kernel, new_kernel); |
254 | 270 |
255 vector<char> updated_kernel_partition; | 271 vector<char> updated_kernel_partition; |
256 EXPECT_TRUE(utils::ReadFile(old_kernel, &updated_kernel_partition)); | 272 EXPECT_TRUE(utils::ReadFile(old_kernel, &updated_kernel_partition)); |
257 EXPECT_EQ(0, strncmp(&updated_kernel_partition[0], new_data_string, | 273 EXPECT_EQ(0, strncmp(&updated_kernel_partition[0], new_data_string, |
258 strlen(new_data_string))); | 274 strlen(new_data_string))); |
259 | 275 |
260 EXPECT_TRUE(utils::FileExists(kUnittestPublicKeyPath)); | 276 EXPECT_TRUE(utils::FileExists(kUnittestPublicKeyPath)); |
261 EXPECT_TRUE(performer.VerifyPayload(kUnittestPublicKeyPath)); | 277 EXPECT_TRUE(performer.VerifyPayload(kUnittestPublicKeyPath)); |
262 } | 278 } |
263 | 279 |
264 } // namespace chromeos_update_engine | 280 } // namespace chromeos_update_engine |
OLD | NEW |