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> |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 1024 * 1024)); | 147 1024 * 1024)); |
148 EXPECT_EQ(0, system(StringPrintf("dd if=/dev/zero of=%s/partsparese bs=1 " | 148 EXPECT_EQ(0, system(StringPrintf("dd if=/dev/zero of=%s/partsparese bs=1 " |
149 "seek=4096 count=1", | 149 "seek=4096 count=1", |
150 b_mnt.c_str()).c_str())); | 150 b_mnt.c_str()).c_str())); |
151 EXPECT_TRUE(utils::WriteFile(StringPrintf("%s/hardtocompress", | 151 EXPECT_TRUE(utils::WriteFile(StringPrintf("%s/hardtocompress", |
152 b_mnt.c_str()).c_str(), | 152 b_mnt.c_str()).c_str(), |
153 reinterpret_cast<const char*>(kRandomString), | 153 reinterpret_cast<const char*>(kRandomString), |
154 sizeof(kRandomString))); | 154 sizeof(kRandomString))); |
155 } | 155 } |
156 | 156 |
| 157 string old_kernel; |
| 158 EXPECT_TRUE(utils::MakeTempFile("/tmp/old_kernel.XXXXXX", &old_kernel, NULL)); |
| 159 ScopedPathUnlinker old_kernel_unlinker(old_kernel); |
| 160 |
| 161 string new_kernel; |
| 162 EXPECT_TRUE(utils::MakeTempFile("/tmp/new_kernel.XXXXXX", &new_kernel, NULL)); |
| 163 ScopedPathUnlinker new_kernel_unlinker(new_kernel); |
| 164 |
| 165 vector<char> old_kernel_data(4096); // Something small for a test |
| 166 vector<char> new_kernel_data(old_kernel_data.size()); |
| 167 FillWithData(&old_kernel_data); |
| 168 FillWithData(&new_kernel_data); |
| 169 |
| 170 // change the new kernel data |
| 171 const char* new_data_string = "This is new data."; |
| 172 strcpy(&new_kernel_data[0], new_data_string); |
| 173 |
| 174 // Write kernels to disk |
| 175 EXPECT_TRUE(utils::WriteFile( |
| 176 old_kernel.c_str(), &old_kernel_data[0], old_kernel_data.size())); |
| 177 EXPECT_TRUE(utils::WriteFile( |
| 178 new_kernel.c_str(), &new_kernel_data[0], new_kernel_data.size())); |
| 179 |
157 string delta_path; | 180 string delta_path; |
158 EXPECT_TRUE(utils::MakeTempFile("/tmp/delta.XXXXXX", &delta_path, NULL)); | 181 EXPECT_TRUE(utils::MakeTempFile("/tmp/delta.XXXXXX", &delta_path, NULL)); |
159 ScopedPathUnlinker delta_path_unlinker(delta_path); | 182 ScopedPathUnlinker delta_path_unlinker(delta_path); |
160 { | 183 { |
161 string a_mnt, b_mnt; | 184 string a_mnt, b_mnt; |
162 ScopedLoopMounter a_mounter(a_img, &a_mnt, MS_RDONLY); | 185 ScopedLoopMounter a_mounter(a_img, &a_mnt, MS_RDONLY); |
163 ScopedLoopMounter b_mounter(b_img, &b_mnt, MS_RDONLY); | 186 ScopedLoopMounter b_mounter(b_img, &b_mnt, MS_RDONLY); |
164 | 187 |
165 EXPECT_TRUE(DeltaDiffGenerator::GenerateDeltaUpdateFile(a_mnt, | 188 EXPECT_TRUE(DeltaDiffGenerator::GenerateDeltaUpdateFile(a_mnt, |
166 a_img, | 189 a_img, |
167 b_mnt, | 190 b_mnt, |
168 b_img, | 191 b_img, |
| 192 old_kernel, |
| 193 new_kernel, |
169 delta_path)); | 194 delta_path)); |
170 } | 195 } |
171 | 196 |
172 // Read delta into memory. | 197 // Read delta into memory. |
173 vector<char> delta; | 198 vector<char> delta; |
174 EXPECT_TRUE(utils::ReadFile(delta_path, &delta)); | 199 EXPECT_TRUE(utils::ReadFile(delta_path, &delta)); |
175 | 200 |
176 // Update the A image in place. | 201 // Update the A image in place. |
177 DeltaPerformer performer; | 202 DeltaPerformer performer; |
178 | 203 |
179 EXPECT_EQ(0, performer.Open(a_img.c_str(), 0, 0)); | 204 EXPECT_EQ(0, performer.Open(a_img.c_str(), 0, 0)); |
| 205 EXPECT_TRUE(performer.OpenKernel(old_kernel.c_str())); |
180 | 206 |
181 // Write at some number of bytes per operation. Arbitrarily chose 5. | 207 // Write at some number of bytes per operation. Arbitrarily chose 5. |
182 const size_t kBytesPerWrite = 5; | 208 const size_t kBytesPerWrite = 5; |
183 for (size_t i = 0; i < delta.size(); i += kBytesPerWrite) { | 209 for (size_t i = 0; i < delta.size(); i += kBytesPerWrite) { |
184 size_t count = min(delta.size() - i, kBytesPerWrite); | 210 size_t count = min(delta.size() - i, kBytesPerWrite); |
185 EXPECT_EQ(count, performer.Write(&delta[i], count)); | 211 EXPECT_EQ(count, performer.Write(&delta[i], count)); |
186 } | 212 } |
187 | 213 |
188 // Wrapper around close. Returns 0 on success or -errno on error. | 214 // Wrapper around close. Returns 0 on success or -errno on error. |
189 EXPECT_EQ(0, performer.Close()); | 215 EXPECT_EQ(0, performer.Close()); |
190 | 216 |
191 CompareFilesByBlock("/tmp/a_ref", "/tmp/b_ref"); | 217 CompareFilesByBlock("/tmp/a_ref", "/tmp/b_ref"); |
| 218 CompareFilesByBlock(old_kernel, new_kernel); |
| 219 |
| 220 vector<char> updated_kernel_partition; |
| 221 EXPECT_TRUE(utils::ReadFile(old_kernel, &updated_kernel_partition)); |
| 222 EXPECT_EQ(0, strncmp(&updated_kernel_partition[0], new_data_string, |
| 223 strlen(new_data_string))); |
192 } | 224 } |
193 | 225 |
194 } // namespace chromeos_update_engine | 226 } // namespace chromeos_update_engine |
OLD | NEW |