Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(617)

Side by Side Diff: delta_diff_generator_unittest.cc

Issue 3767002: AU: Really delta compress the kernel if an old kernel is provided. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/update_engine.git
Patch Set: Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « delta_diff_generator.cc ('k') | delta_performer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/types.h> 5 #include <sys/types.h>
6 #include <sys/stat.h> 6 #include <sys/stat.h>
7 #include <fcntl.h> 7 #include <fcntl.h>
8 #include <unistd.h> 8 #include <unistd.h>
9 #include <set> 9 #include <set>
10 #include <sstream> 10 #include <sstream>
11 #include <string> 11 #include <string>
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 reinterpret_cast<const char*>(kRandomString), 60 reinterpret_cast<const char*>(kRandomString),
61 sizeof(kRandomString))); 61 sizeof(kRandomString)));
62 EXPECT_TRUE(utils::WriteFile(new_path().c_str(), 62 EXPECT_TRUE(utils::WriteFile(new_path().c_str(),
63 reinterpret_cast<const char*>(kRandomString), 63 reinterpret_cast<const char*>(kRandomString),
64 sizeof(kRandomString))); 64 sizeof(kRandomString)));
65 vector<char> data; 65 vector<char> data;
66 DeltaArchiveManifest_InstallOperation op; 66 DeltaArchiveManifest_InstallOperation op;
67 EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path(), 67 EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path(),
68 new_path(), 68 new_path(),
69 &data, 69 &data,
70 &op)); 70 &op,
71 true));
71 EXPECT_TRUE(data.empty()); 72 EXPECT_TRUE(data.empty());
72 73
73 EXPECT_TRUE(op.has_type()); 74 EXPECT_TRUE(op.has_type());
74 EXPECT_EQ(DeltaArchiveManifest_InstallOperation_Type_MOVE, op.type()); 75 EXPECT_EQ(DeltaArchiveManifest_InstallOperation_Type_MOVE, op.type());
75 EXPECT_FALSE(op.has_data_offset()); 76 EXPECT_FALSE(op.has_data_offset());
76 EXPECT_FALSE(op.has_data_length()); 77 EXPECT_FALSE(op.has_data_length());
77 EXPECT_EQ(1, op.src_extents_size()); 78 EXPECT_EQ(1, op.src_extents_size());
78 EXPECT_EQ(sizeof(kRandomString), op.src_length()); 79 EXPECT_EQ(sizeof(kRandomString), op.src_length());
79 EXPECT_EQ(1, op.dst_extents_size()); 80 EXPECT_EQ(1, op.dst_extents_size());
80 EXPECT_EQ(sizeof(kRandomString), op.dst_length()); 81 EXPECT_EQ(sizeof(kRandomString), op.dst_length());
81 EXPECT_EQ(BlocksInExtents(op.src_extents()), 82 EXPECT_EQ(BlocksInExtents(op.src_extents()),
82 BlocksInExtents(op.dst_extents())); 83 BlocksInExtents(op.dst_extents()));
83 EXPECT_EQ(1, BlocksInExtents(op.dst_extents())); 84 EXPECT_EQ(1, BlocksInExtents(op.dst_extents()));
84 } 85 }
85 86
86 TEST_F(DeltaDiffGeneratorTest, RunAsRootBsdiffSmallTest) { 87 TEST_F(DeltaDiffGeneratorTest, RunAsRootBsdiffSmallTest) {
87 EXPECT_TRUE(utils::WriteFile(old_path().c_str(), 88 EXPECT_TRUE(utils::WriteFile(old_path().c_str(),
88 reinterpret_cast<const char*>(kRandomString), 89 reinterpret_cast<const char*>(kRandomString),
89 sizeof(kRandomString) - 1)); 90 sizeof(kRandomString) - 1));
90 EXPECT_TRUE(utils::WriteFile(new_path().c_str(), 91 EXPECT_TRUE(utils::WriteFile(new_path().c_str(),
91 reinterpret_cast<const char*>(kRandomString), 92 reinterpret_cast<const char*>(kRandomString),
92 sizeof(kRandomString))); 93 sizeof(kRandomString)));
93 vector<char> data; 94 vector<char> data;
94 DeltaArchiveManifest_InstallOperation op; 95 DeltaArchiveManifest_InstallOperation op;
95 EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path(), 96 EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path(),
96 new_path(), 97 new_path(),
97 &data, 98 &data,
98 &op)); 99 &op,
100 true));
99 EXPECT_FALSE(data.empty()); 101 EXPECT_FALSE(data.empty());
100 102
101 EXPECT_TRUE(op.has_type()); 103 EXPECT_TRUE(op.has_type());
102 EXPECT_EQ(DeltaArchiveManifest_InstallOperation_Type_BSDIFF, op.type()); 104 EXPECT_EQ(DeltaArchiveManifest_InstallOperation_Type_BSDIFF, op.type());
103 EXPECT_FALSE(op.has_data_offset()); 105 EXPECT_FALSE(op.has_data_offset());
104 EXPECT_FALSE(op.has_data_length()); 106 EXPECT_FALSE(op.has_data_length());
105 EXPECT_EQ(1, op.src_extents_size()); 107 EXPECT_EQ(1, op.src_extents_size());
106 EXPECT_EQ(sizeof(kRandomString) - 1, op.src_length()); 108 EXPECT_EQ(sizeof(kRandomString) - 1, op.src_length());
107 EXPECT_EQ(1, op.dst_extents_size()); 109 EXPECT_EQ(1, op.dst_extents_size());
108 EXPECT_EQ(sizeof(kRandomString), op.dst_length()); 110 EXPECT_EQ(sizeof(kRandomString), op.dst_length());
109 EXPECT_EQ(BlocksInExtents(op.src_extents()), 111 EXPECT_EQ(BlocksInExtents(op.src_extents()),
110 BlocksInExtents(op.dst_extents())); 112 BlocksInExtents(op.dst_extents()));
111 EXPECT_EQ(1, BlocksInExtents(op.dst_extents())); 113 EXPECT_EQ(1, BlocksInExtents(op.dst_extents()));
112 } 114 }
113 115
114 TEST_F(DeltaDiffGeneratorTest, RunAsRootReplaceSmallTest) { 116 TEST_F(DeltaDiffGeneratorTest, RunAsRootReplaceSmallTest) {
115 vector<char> new_data; 117 vector<char> new_data;
116 for (int i = 0; i < 2; i++) { 118 for (int i = 0; i < 2; i++) {
117 new_data.insert(new_data.end(), 119 new_data.insert(new_data.end(),
118 kRandomString, 120 kRandomString,
119 kRandomString + sizeof(kRandomString)); 121 kRandomString + sizeof(kRandomString));
120 EXPECT_TRUE(utils::WriteFile(new_path().c_str(), 122 EXPECT_TRUE(utils::WriteFile(new_path().c_str(),
121 &new_data[0], 123 &new_data[0],
122 new_data.size())); 124 new_data.size()));
123 vector<char> data; 125 vector<char> data;
124 DeltaArchiveManifest_InstallOperation op; 126 DeltaArchiveManifest_InstallOperation op;
125 EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path(), 127 EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path(),
126 new_path(), 128 new_path(),
127 &data, 129 &data,
128 &op)); 130 &op,
131 true));
129 EXPECT_FALSE(data.empty()); 132 EXPECT_FALSE(data.empty());
130 133
131 EXPECT_TRUE(op.has_type()); 134 EXPECT_TRUE(op.has_type());
132 const DeltaArchiveManifest_InstallOperation_Type expected_type = 135 const DeltaArchiveManifest_InstallOperation_Type expected_type =
133 (i == 0 ? DeltaArchiveManifest_InstallOperation_Type_REPLACE : 136 (i == 0 ? DeltaArchiveManifest_InstallOperation_Type_REPLACE :
134 DeltaArchiveManifest_InstallOperation_Type_REPLACE_BZ); 137 DeltaArchiveManifest_InstallOperation_Type_REPLACE_BZ);
135 EXPECT_EQ(expected_type, op.type()); 138 EXPECT_EQ(expected_type, op.type());
136 EXPECT_FALSE(op.has_data_offset()); 139 EXPECT_FALSE(op.has_data_offset());
137 EXPECT_FALSE(op.has_data_length()); 140 EXPECT_FALSE(op.has_data_length());
138 EXPECT_EQ(0, op.src_extents_size()); 141 EXPECT_EQ(0, op.src_extents_size());
139 EXPECT_FALSE(op.has_src_length()); 142 EXPECT_FALSE(op.has_src_length());
140 EXPECT_EQ(1, op.dst_extents_size()); 143 EXPECT_EQ(1, op.dst_extents_size());
141 EXPECT_EQ(new_data.size(), op.dst_length()); 144 EXPECT_EQ(new_data.size(), op.dst_length());
142 EXPECT_EQ(1, BlocksInExtents(op.dst_extents())); 145 EXPECT_EQ(1, BlocksInExtents(op.dst_extents()));
143 } 146 }
144 } 147 }
145 148
149 TEST_F(DeltaDiffGeneratorTest, RunAsRootBsdiffNoGatherExtentsSmallTest) {
150 EXPECT_TRUE(utils::WriteFile(old_path().c_str(),
151 reinterpret_cast<const char*>(kRandomString),
152 sizeof(kRandomString) - 1));
153 EXPECT_TRUE(utils::WriteFile(new_path().c_str(),
154 reinterpret_cast<const char*>(kRandomString),
155 sizeof(kRandomString)));
156 vector<char> data;
157 DeltaArchiveManifest_InstallOperation op;
158 EXPECT_TRUE(DeltaDiffGenerator::ReadFileToDiff(old_path(),
159 new_path(),
160 &data,
161 &op,
162 false));
163 EXPECT_FALSE(data.empty());
164
165 EXPECT_TRUE(op.has_type());
166 EXPECT_EQ(DeltaArchiveManifest_InstallOperation_Type_BSDIFF, op.type());
167 EXPECT_FALSE(op.has_data_offset());
168 EXPECT_FALSE(op.has_data_length());
169 EXPECT_EQ(1, op.src_extents_size());
170 EXPECT_EQ(0, op.src_extents().Get(0).start_block());
171 EXPECT_EQ(1, op.src_extents().Get(0).num_blocks());
172 EXPECT_EQ(sizeof(kRandomString) - 1, op.src_length());
173 EXPECT_EQ(1, op.dst_extents_size());
174 EXPECT_EQ(0, op.dst_extents().Get(0).start_block());
175 EXPECT_EQ(1, op.dst_extents().Get(0).num_blocks());
176 EXPECT_EQ(sizeof(kRandomString), op.dst_length());
177 }
178
146 namespace { 179 namespace {
147 void AppendExtent(vector<Extent>* vect, uint64_t start, uint64_t length) { 180 void AppendExtent(vector<Extent>* vect, uint64_t start, uint64_t length) {
148 vect->resize(vect->size() + 1); 181 vect->resize(vect->size() + 1);
149 vect->back().set_start_block(start); 182 vect->back().set_start_block(start);
150 vect->back().set_num_blocks(length); 183 vect->back().set_num_blocks(length);
151 } 184 }
152 void OpAppendExtent(DeltaArchiveManifest_InstallOperation* op, 185 void OpAppendExtent(DeltaArchiveManifest_InstallOperation* op,
153 uint64_t start, 186 uint64_t start,
154 uint64_t length) { 187 uint64_t length) {
155 Extent* extent = op->add_src_extents(); 188 Extent* extent = op->add_src_extents();
156 extent->set_start_block(start); 189 extent->set_start_block(start);
157 extent->set_num_blocks(length); 190 extent->set_num_blocks(length);
158 } 191 }
159 } 192 }
160 193
161 TEST_F(DeltaDiffGeneratorTest, SubstituteBlocksTest) { 194 TEST_F(DeltaDiffGeneratorTest, SubstituteBlocksTest) {
162 vector<Extent> remove_blocks; 195 vector<Extent> remove_blocks;
163 AppendExtent(&remove_blocks, 3, 3); 196 AppendExtent(&remove_blocks, 3, 3);
164 AppendExtent(&remove_blocks, 7, 1); 197 AppendExtent(&remove_blocks, 7, 1);
165 vector<Extent> replace_blocks; 198 vector<Extent> replace_blocks;
166 AppendExtent(&replace_blocks, 10, 2); 199 AppendExtent(&replace_blocks, 10, 2);
167 AppendExtent(&replace_blocks, 13, 2); 200 AppendExtent(&replace_blocks, 13, 2);
168 Vertex vertex; 201 Vertex vertex;
169 DeltaArchiveManifest_InstallOperation& op = vertex.op; 202 DeltaArchiveManifest_InstallOperation& op = vertex.op;
170 OpAppendExtent(&op, 4, 3); 203 OpAppendExtent(&op, 4, 3);
171 OpAppendExtent(&op, kSparseHole, 4); // Sparse hole in file 204 OpAppendExtent(&op, kSparseHole, 4); // Sparse hole in file
172 OpAppendExtent(&op, 3, 1); 205 OpAppendExtent(&op, 3, 1);
173 OpAppendExtent(&op, 7, 3); 206 OpAppendExtent(&op, 7, 3);
174 207
175 DeltaDiffGenerator::SubstituteBlocks(&vertex, remove_blocks, replace_blocks); 208 DeltaDiffGenerator::SubstituteBlocks(&vertex, remove_blocks, replace_blocks);
176 209
177 EXPECT_EQ(7, op.src_extents_size()); 210 EXPECT_EQ(7, op.src_extents_size());
178 EXPECT_EQ(11, op.src_extents(0).start_block()); 211 EXPECT_EQ(11, op.src_extents(0).start_block());
179 EXPECT_EQ(1, op.src_extents(0).num_blocks()); 212 EXPECT_EQ(1, op.src_extents(0).num_blocks());
180 EXPECT_EQ(13, op.src_extents(1).start_block()); 213 EXPECT_EQ(13, op.src_extents(1).start_block());
181 EXPECT_EQ(1, op.src_extents(1).num_blocks()); 214 EXPECT_EQ(1, op.src_extents(1).num_blocks());
182 EXPECT_EQ(6, op.src_extents(2).start_block()); 215 EXPECT_EQ(6, op.src_extents(2).start_block());
183 EXPECT_EQ(1, op.src_extents(2).num_blocks()); 216 EXPECT_EQ(1, op.src_extents(2).num_blocks());
184 EXPECT_EQ(kSparseHole, op.src_extents(3).start_block()); 217 EXPECT_EQ(kSparseHole, op.src_extents(3).start_block());
185 EXPECT_EQ(4, op.src_extents(3).num_blocks()); 218 EXPECT_EQ(4, op.src_extents(3).num_blocks());
186 EXPECT_EQ(10, op.src_extents(4).start_block()); 219 EXPECT_EQ(10, op.src_extents(4).start_block());
187 EXPECT_EQ(1, op.src_extents(4).num_blocks()); 220 EXPECT_EQ(1, op.src_extents(4).num_blocks());
188 EXPECT_EQ(14, op.src_extents(5).start_block()); 221 EXPECT_EQ(14, op.src_extents(5).start_block());
189 EXPECT_EQ(1, op.src_extents(5).num_blocks()); 222 EXPECT_EQ(1, op.src_extents(5).num_blocks());
190 EXPECT_EQ(8, op.src_extents(6).start_block()); 223 EXPECT_EQ(8, op.src_extents(6).start_block());
191 EXPECT_EQ(2, op.src_extents(6).num_blocks()); 224 EXPECT_EQ(2, op.src_extents(6).num_blocks());
192 } 225 }
193 226
194 TEST_F(DeltaDiffGeneratorTest, CutEdgesTest) { 227 TEST_F(DeltaDiffGeneratorTest, CutEdgesTest) {
195 Graph graph; 228 Graph graph;
196 vector<Block> blocks(9); 229 vector<Block> blocks(9);
197 230
198 // Create nodes in graph 231 // Create nodes in graph
199 { 232 {
200 graph.resize(graph.size() + 1); 233 graph.resize(graph.size() + 1);
201 graph.back().op.set_type(DeltaArchiveManifest_InstallOperation_Type_MOVE); 234 graph.back().op.set_type(DeltaArchiveManifest_InstallOperation_Type_MOVE);
202 // Reads from blocks 3, 5, 7 235 // Reads from blocks 3, 5, 7
203 vector<Extent> extents; 236 vector<Extent> extents;
204 graph_utils::AppendBlockToExtents(&extents, 3); 237 graph_utils::AppendBlockToExtents(&extents, 3);
205 graph_utils::AppendBlockToExtents(&extents, 5); 238 graph_utils::AppendBlockToExtents(&extents, 5);
206 graph_utils::AppendBlockToExtents(&extents, 7); 239 graph_utils::AppendBlockToExtents(&extents, 7);
207 DeltaDiffGenerator::StoreExtents(extents, 240 DeltaDiffGenerator::StoreExtents(extents,
208 graph.back().op.mutable_src_extents()); 241 graph.back().op.mutable_src_extents());
209 blocks[3].reader = graph.size() - 1; 242 blocks[3].reader = graph.size() - 1;
210 blocks[5].reader = graph.size() - 1; 243 blocks[5].reader = graph.size() - 1;
211 blocks[7].reader = graph.size() - 1; 244 blocks[7].reader = graph.size() - 1;
212 245
213 // Writes to blocks 1, 2, 4 246 // Writes to blocks 1, 2, 4
214 extents.clear(); 247 extents.clear();
215 graph_utils::AppendBlockToExtents(&extents, 1); 248 graph_utils::AppendBlockToExtents(&extents, 1);
216 graph_utils::AppendBlockToExtents(&extents, 2); 249 graph_utils::AppendBlockToExtents(&extents, 2);
217 graph_utils::AppendBlockToExtents(&extents, 4); 250 graph_utils::AppendBlockToExtents(&extents, 4);
218 DeltaDiffGenerator::StoreExtents(extents, 251 DeltaDiffGenerator::StoreExtents(extents,
219 graph.back().op.mutable_dst_extents()); 252 graph.back().op.mutable_dst_extents());
220 blocks[1].writer = graph.size() - 1; 253 blocks[1].writer = graph.size() - 1;
221 blocks[2].writer = graph.size() - 1; 254 blocks[2].writer = graph.size() - 1;
222 blocks[4].writer = graph.size() - 1; 255 blocks[4].writer = graph.size() - 1;
223 } 256 }
224 { 257 {
225 graph.resize(graph.size() + 1); 258 graph.resize(graph.size() + 1);
226 graph.back().op.set_type(DeltaArchiveManifest_InstallOperation_Type_MOVE); 259 graph.back().op.set_type(DeltaArchiveManifest_InstallOperation_Type_MOVE);
227 // Reads from blocks 1, 2, 4 260 // Reads from blocks 1, 2, 4
228 vector<Extent> extents; 261 vector<Extent> extents;
229 graph_utils::AppendBlockToExtents(&extents, 1); 262 graph_utils::AppendBlockToExtents(&extents, 1);
230 graph_utils::AppendBlockToExtents(&extents, 2); 263 graph_utils::AppendBlockToExtents(&extents, 2);
231 graph_utils::AppendBlockToExtents(&extents, 4); 264 graph_utils::AppendBlockToExtents(&extents, 4);
232 DeltaDiffGenerator::StoreExtents(extents, 265 DeltaDiffGenerator::StoreExtents(extents,
233 graph.back().op.mutable_src_extents()); 266 graph.back().op.mutable_src_extents());
234 blocks[1].reader = graph.size() - 1; 267 blocks[1].reader = graph.size() - 1;
235 blocks[2].reader = graph.size() - 1; 268 blocks[2].reader = graph.size() - 1;
236 blocks[4].reader = graph.size() - 1; 269 blocks[4].reader = graph.size() - 1;
237 270
238 // Writes to blocks 3, 5, 6 271 // Writes to blocks 3, 5, 6
239 extents.clear(); 272 extents.clear();
240 graph_utils::AppendBlockToExtents(&extents, 3); 273 graph_utils::AppendBlockToExtents(&extents, 3);
241 graph_utils::AppendBlockToExtents(&extents, 5); 274 graph_utils::AppendBlockToExtents(&extents, 5);
242 graph_utils::AppendBlockToExtents(&extents, 6); 275 graph_utils::AppendBlockToExtents(&extents, 6);
243 DeltaDiffGenerator::StoreExtents(extents, 276 DeltaDiffGenerator::StoreExtents(extents,
244 graph.back().op.mutable_dst_extents()); 277 graph.back().op.mutable_dst_extents());
245 blocks[3].writer = graph.size() - 1; 278 blocks[3].writer = graph.size() - 1;
246 blocks[5].writer = graph.size() - 1; 279 blocks[5].writer = graph.size() - 1;
247 blocks[6].writer = graph.size() - 1; 280 blocks[6].writer = graph.size() - 1;
248 } 281 }
249 282
250 // Create edges 283 // Create edges
251 DeltaDiffGenerator::CreateEdges(&graph, blocks); 284 DeltaDiffGenerator::CreateEdges(&graph, blocks);
252 285
253 // Find cycles 286 // Find cycles
254 CycleBreaker cycle_breaker; 287 CycleBreaker cycle_breaker;
255 set<Edge> cut_edges; 288 set<Edge> cut_edges;
256 cycle_breaker.BreakCycles(graph, &cut_edges); 289 cycle_breaker.BreakCycles(graph, &cut_edges);
257 290
258 EXPECT_EQ(1, cut_edges.size()); 291 EXPECT_EQ(1, cut_edges.size());
259 EXPECT_TRUE(cut_edges.end() != cut_edges.find(make_pair<Vertex::Index>(1, 292 EXPECT_TRUE(cut_edges.end() != cut_edges.find(make_pair<Vertex::Index>(1,
260 0))); 293 0)));
261 294
262 vector<CutEdgeVertexes> cuts; 295 vector<CutEdgeVertexes> cuts;
263 EXPECT_TRUE(DeltaDiffGenerator::CutEdges(&graph, cut_edges, &cuts)); 296 EXPECT_TRUE(DeltaDiffGenerator::CutEdges(&graph, cut_edges, &cuts));
264 297
265 EXPECT_EQ(3, graph.size()); 298 EXPECT_EQ(3, graph.size());
266 299
267 // Check new node in graph: 300 // Check new node in graph:
268 EXPECT_EQ(DeltaArchiveManifest_InstallOperation_Type_MOVE, 301 EXPECT_EQ(DeltaArchiveManifest_InstallOperation_Type_MOVE,
269 graph.back().op.type()); 302 graph.back().op.type());
270 EXPECT_EQ(2, graph.back().op.src_extents_size()); 303 EXPECT_EQ(2, graph.back().op.src_extents_size());
271 EXPECT_EQ(1, graph.back().op.dst_extents_size()); 304 EXPECT_EQ(1, graph.back().op.dst_extents_size());
272 EXPECT_EQ(kTempBlockStart, graph.back().op.dst_extents(0).start_block()); 305 EXPECT_EQ(kTempBlockStart, graph.back().op.dst_extents(0).start_block());
273 EXPECT_EQ(2, graph.back().op.dst_extents(0).num_blocks()); 306 EXPECT_EQ(2, graph.back().op.dst_extents(0).num_blocks());
274 EXPECT_TRUE(graph.back().out_edges.empty()); 307 EXPECT_TRUE(graph.back().out_edges.empty());
275 308
276 // Check that old node reads from new blocks 309 // Check that old node reads from new blocks
277 EXPECT_EQ(2, graph[0].op.src_extents_size()); 310 EXPECT_EQ(2, graph[0].op.src_extents_size());
278 EXPECT_EQ(kTempBlockStart, graph[0].op.src_extents(0).start_block()); 311 EXPECT_EQ(kTempBlockStart, graph[0].op.src_extents(0).start_block());
279 EXPECT_EQ(2, graph[0].op.src_extents(0).num_blocks()); 312 EXPECT_EQ(2, graph[0].op.src_extents(0).num_blocks());
280 EXPECT_EQ(7, graph[0].op.src_extents(1).start_block()); 313 EXPECT_EQ(7, graph[0].op.src_extents(1).start_block());
281 EXPECT_EQ(1, graph[0].op.src_extents(1).num_blocks()); 314 EXPECT_EQ(1, graph[0].op.src_extents(1).num_blocks());
282 315
283 // And that the old dst extents haven't changed 316 // And that the old dst extents haven't changed
284 EXPECT_EQ(2, graph[0].op.dst_extents_size()); 317 EXPECT_EQ(2, graph[0].op.dst_extents_size());
285 EXPECT_EQ(1, graph[0].op.dst_extents(0).start_block()); 318 EXPECT_EQ(1, graph[0].op.dst_extents(0).start_block());
(...skipping 12 matching lines...) Expand all
298 EXPECT_EQ(1, graph[1].op.src_extents(0).start_block()); 331 EXPECT_EQ(1, graph[1].op.src_extents(0).start_block());
299 EXPECT_EQ(2, graph[1].op.src_extents(0).num_blocks()); 332 EXPECT_EQ(2, graph[1].op.src_extents(0).num_blocks());
300 EXPECT_EQ(4, graph[1].op.src_extents(1).start_block()); 333 EXPECT_EQ(4, graph[1].op.src_extents(1).start_block());
301 EXPECT_EQ(1, graph[1].op.src_extents(1).num_blocks()); 334 EXPECT_EQ(1, graph[1].op.src_extents(1).num_blocks());
302 335
303 EXPECT_EQ(2, graph[1].op.dst_extents_size()); 336 EXPECT_EQ(2, graph[1].op.dst_extents_size());
304 EXPECT_EQ(3, graph[1].op.dst_extents(0).start_block()); 337 EXPECT_EQ(3, graph[1].op.dst_extents(0).start_block());
305 EXPECT_EQ(1, graph[1].op.dst_extents(0).num_blocks()); 338 EXPECT_EQ(1, graph[1].op.dst_extents(0).num_blocks());
306 EXPECT_EQ(5, graph[1].op.dst_extents(1).start_block()); 339 EXPECT_EQ(5, graph[1].op.dst_extents(1).start_block());
307 EXPECT_EQ(2, graph[1].op.dst_extents(1).num_blocks()); 340 EXPECT_EQ(2, graph[1].op.dst_extents(1).num_blocks());
308 341
309 // Ensure it only depends on the next node 342 // Ensure it only depends on the next node
310 EXPECT_EQ(1, graph[1].out_edges.size()); 343 EXPECT_EQ(1, graph[1].out_edges.size());
311 EXPECT_TRUE(graph[1].out_edges.end() != graph[1].out_edges.find(2)); 344 EXPECT_TRUE(graph[1].out_edges.end() != graph[1].out_edges.find(2));
312 } 345 }
313 346
314 TEST_F(DeltaDiffGeneratorTest, ReorderBlobsTest) { 347 TEST_F(DeltaDiffGeneratorTest, ReorderBlobsTest) {
315 string orig_blobs; 348 string orig_blobs;
316 EXPECT_TRUE( 349 EXPECT_TRUE(
317 utils::MakeTempFile("ReorderBlobsTest.orig.XXXXXX", &orig_blobs, NULL)); 350 utils::MakeTempFile("ReorderBlobsTest.orig.XXXXXX", &orig_blobs, NULL));
318 351
319 string orig_data = "abcd"; 352 string orig_data = "abcd";
320 EXPECT_TRUE( 353 EXPECT_TRUE(
321 utils::WriteFile(orig_blobs.c_str(), orig_data.data(), orig_data.size())); 354 utils::WriteFile(orig_blobs.c_str(), orig_data.data(), orig_data.size()));
322 355
323 string new_blobs; 356 string new_blobs;
324 EXPECT_TRUE( 357 EXPECT_TRUE(
325 utils::MakeTempFile("ReorderBlobsTest.new.XXXXXX", &new_blobs, NULL)); 358 utils::MakeTempFile("ReorderBlobsTest.new.XXXXXX", &new_blobs, NULL));
326 359
327 DeltaArchiveManifest manifest; 360 DeltaArchiveManifest manifest;
328 DeltaArchiveManifest_InstallOperation* op = 361 DeltaArchiveManifest_InstallOperation* op =
329 manifest.add_install_operations(); 362 manifest.add_install_operations();
330 op->set_data_offset(1); 363 op->set_data_offset(1);
331 op->set_data_length(3); 364 op->set_data_length(3);
332 op = manifest.add_install_operations(); 365 op = manifest.add_install_operations();
333 op->set_data_offset(0); 366 op->set_data_offset(0);
334 op->set_data_length(1); 367 op->set_data_length(1);
335 368
336 EXPECT_TRUE(DeltaDiffGenerator::ReorderDataBlobs(&manifest, 369 EXPECT_TRUE(DeltaDiffGenerator::ReorderDataBlobs(&manifest,
337 orig_blobs, 370 orig_blobs,
338 new_blobs)); 371 new_blobs));
339 372
340 string new_data; 373 string new_data;
341 EXPECT_TRUE(utils::ReadFileToString(new_blobs, &new_data)); 374 EXPECT_TRUE(utils::ReadFileToString(new_blobs, &new_data));
342 EXPECT_EQ("bcda", new_data); 375 EXPECT_EQ("bcda", new_data);
343 EXPECT_EQ(2, manifest.install_operations_size()); 376 EXPECT_EQ(2, manifest.install_operations_size());
344 EXPECT_EQ(0, manifest.install_operations(0).data_offset()); 377 EXPECT_EQ(0, manifest.install_operations(0).data_offset());
345 EXPECT_EQ(3, manifest.install_operations(0).data_length()); 378 EXPECT_EQ(3, manifest.install_operations(0).data_length());
346 EXPECT_EQ(3, manifest.install_operations(1).data_offset()); 379 EXPECT_EQ(3, manifest.install_operations(1).data_offset());
347 EXPECT_EQ(1, manifest.install_operations(1).data_length()); 380 EXPECT_EQ(1, manifest.install_operations(1).data_length());
348 381
349 unlink(orig_blobs.c_str()); 382 unlink(orig_blobs.c_str());
350 unlink(new_blobs.c_str()); 383 unlink(new_blobs.c_str());
351 } 384 }
352 385
353 TEST_F(DeltaDiffGeneratorTest, MoveFullOpsToBackTest) { 386 TEST_F(DeltaDiffGeneratorTest, MoveFullOpsToBackTest) {
354 Graph graph(4); 387 Graph graph(4);
355 graph[0].file_name = "A"; 388 graph[0].file_name = "A";
356 graph[0].op.set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE); 389 graph[0].op.set_type(DeltaArchiveManifest_InstallOperation_Type_REPLACE);
357 graph[1].file_name = "B"; 390 graph[1].file_name = "B";
358 graph[1].op.set_type(DeltaArchiveManifest_InstallOperation_Type_BSDIFF); 391 graph[1].op.set_type(DeltaArchiveManifest_InstallOperation_Type_BSDIFF);
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 } 450 }
418 LOG(INFO) << "{" << ss.str() << "}"; 451 LOG(INFO) << "{" << ss.str() << "}";
419 } 452 }
420 453
421 } // namespace {} 454 } // namespace {}
422 455
423 TEST_F(DeltaDiffGeneratorTest, RunAsRootAssignTempBlocksTest) { 456 TEST_F(DeltaDiffGeneratorTest, RunAsRootAssignTempBlocksTest) {
424 Graph graph(9); 457 Graph graph(9);
425 const vector<Extent> empt; // empty 458 const vector<Extent> empt; // empty
426 const string kFilename = "/foo"; 459 const string kFilename = "/foo";
427 460
428 // Some scratch space: 461 // Some scratch space:
429 GenVertex(&graph[0], empt, VectOfExt(200, 1), "", OP_REPLACE); 462 GenVertex(&graph[0], empt, VectOfExt(200, 1), "", OP_REPLACE);
430 GenVertex(&graph[1], empt, VectOfExt(210, 10), "", OP_REPLACE); 463 GenVertex(&graph[1], empt, VectOfExt(210, 10), "", OP_REPLACE);
431 GenVertex(&graph[2], empt, VectOfExt(220, 1), "", OP_REPLACE); 464 GenVertex(&graph[2], empt, VectOfExt(220, 1), "", OP_REPLACE);
432 465
433 // A cycle that requires 10 blocks to break: 466 // A cycle that requires 10 blocks to break:
434 GenVertex(&graph[3], VectOfExt(10, 11), VectOfExt(0, 9), "", OP_BSDIFF); 467 GenVertex(&graph[3], VectOfExt(10, 11), VectOfExt(0, 9), "", OP_BSDIFF);
435 graph[3].out_edges[4] = EdgeWithReadDep(VectOfExt(0, 9)); 468 graph[3].out_edges[4] = EdgeWithReadDep(VectOfExt(0, 9));
436 GenVertex(&graph[4], VectOfExt(0, 9), VectOfExt(10, 11), "", OP_BSDIFF); 469 GenVertex(&graph[4], VectOfExt(0, 9), VectOfExt(10, 11), "", OP_BSDIFF);
437 graph[4].out_edges[3] = EdgeWithReadDep(VectOfExt(10, 11)); 470 graph[4].out_edges[3] = EdgeWithReadDep(VectOfExt(10, 11));
(...skipping 10 matching lines...) Expand all
448 VectOfExt(60, 40), 481 VectOfExt(60, 40),
449 "", 482 "",
450 OP_BSDIFF); 483 OP_BSDIFF);
451 graph[7].out_edges[8] = EdgeWithReadDep(VectOfExt(60, 40)); 484 graph[7].out_edges[8] = EdgeWithReadDep(VectOfExt(60, 40));
452 GenVertex(&graph[8], 485 GenVertex(&graph[8],
453 VectOfExt(60, 40), 486 VectOfExt(60, 40),
454 VectOfExt(120, 50), 487 VectOfExt(120, 50),
455 kFilename, 488 kFilename,
456 OP_BSDIFF); 489 OP_BSDIFF);
457 graph[8].out_edges[7] = EdgeWithReadDep(VectOfExt(120, 50)); 490 graph[8].out_edges[7] = EdgeWithReadDep(VectOfExt(120, 50));
458 491
459 graph_utils::DumpGraph(graph); 492 graph_utils::DumpGraph(graph);
460 493
461 vector<Vertex::Index> final_order; 494 vector<Vertex::Index> final_order;
462 495
463 496
464 // Prepare the filesystem with the minimum required for this to work 497 // Prepare the filesystem with the minimum required for this to work
465 string temp_dir; 498 string temp_dir;
466 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/AssignTempBlocksTest.XXXXXX", 499 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/AssignTempBlocksTest.XXXXXX",
467 &temp_dir)); 500 &temp_dir));
468 ScopedDirRemover temp_dir_remover(temp_dir); 501 ScopedDirRemover temp_dir_remover(temp_dir);
469 502
470 const size_t kBlockSize = 4096; 503 const size_t kBlockSize = 4096;
471 vector<char> temp_data(kBlockSize * 50); 504 vector<char> temp_data(kBlockSize * 50);
472 FillWithData(&temp_data); 505 FillWithData(&temp_data);
473 EXPECT_TRUE(WriteFileVector(temp_dir + kFilename, temp_data)); 506 EXPECT_TRUE(WriteFileVector(temp_dir + kFilename, temp_data));
474 ScopedPathUnlinker filename_unlinker(temp_dir + kFilename); 507 ScopedPathUnlinker filename_unlinker(temp_dir + kFilename);
475 508
476 int fd; 509 int fd;
477 EXPECT_TRUE(utils::MakeTempFile("/tmp/AssignTempBlocksTestData.XXXXXX", 510 EXPECT_TRUE(utils::MakeTempFile("/tmp/AssignTempBlocksTestData.XXXXXX",
478 NULL, 511 NULL,
479 &fd)); 512 &fd));
480 ScopedFdCloser fd_closer(&fd); 513 ScopedFdCloser fd_closer(&fd);
481 off_t data_file_size = 0; 514 off_t data_file_size = 0;
482 515
483 516
484 EXPECT_TRUE(DeltaDiffGenerator::ConvertGraphToDag(&graph, 517 EXPECT_TRUE(DeltaDiffGenerator::ConvertGraphToDag(&graph,
485 temp_dir, 518 temp_dir,
486 fd, 519 fd,
487 &data_file_size, 520 &data_file_size,
488 &final_order)); 521 &final_order));
489 522
490 523
491 Graph expected_graph(12); 524 Graph expected_graph(12);
492 GenVertex(&expected_graph[0], empt, VectOfExt(200, 1), "", OP_REPLACE); 525 GenVertex(&expected_graph[0], empt, VectOfExt(200, 1), "", OP_REPLACE);
493 GenVertex(&expected_graph[1], empt, VectOfExt(210, 10), "", OP_REPLACE); 526 GenVertex(&expected_graph[1], empt, VectOfExt(210, 10), "", OP_REPLACE);
494 GenVertex(&expected_graph[2], empt, VectOfExt(220, 1), "", OP_REPLACE); 527 GenVertex(&expected_graph[2], empt, VectOfExt(220, 1), "", OP_REPLACE);
495 GenVertex(&expected_graph[3], 528 GenVertex(&expected_graph[3],
496 VectOfExt(10, 11), 529 VectOfExt(10, 11),
497 VectOfExt(0, 9), 530 VectOfExt(0, 9),
498 "", 531 "",
499 OP_BSDIFF); 532 OP_BSDIFF);
500 expected_graph[3].out_edges[9] = EdgeWithReadDep(VectOfExt(0, 9)); 533 expected_graph[3].out_edges[9] = EdgeWithReadDep(VectOfExt(0, 9));
(...skipping 11 matching lines...) Expand all
512 OP_BSDIFF); 545 OP_BSDIFF);
513 expected_graph[5].out_edges[10] = EdgeWithReadDep(VectOfExt(30, 10)); 546 expected_graph[5].out_edges[10] = EdgeWithReadDep(VectOfExt(30, 10));
514 547
515 GenVertex(&expected_graph[6], 548 GenVertex(&expected_graph[6],
516 VectOfExt(60, 10), 549 VectOfExt(60, 10),
517 VectOfExt(40, 11), 550 VectOfExt(40, 11),
518 "", 551 "",
519 OP_BSDIFF); 552 OP_BSDIFF);
520 expected_graph[6].out_edges[5] = EdgeWithReadDep(VectOfExt(40, 11)); 553 expected_graph[6].out_edges[5] = EdgeWithReadDep(VectOfExt(40, 11));
521 expected_graph[6].out_edges[10] = EdgeWithWriteDep(VectOfExt(60, 10)); 554 expected_graph[6].out_edges[10] = EdgeWithWriteDep(VectOfExt(60, 10));
522 555
523 GenVertex(&expected_graph[7], 556 GenVertex(&expected_graph[7],
524 VectOfExt(120, 50), 557 VectOfExt(120, 50),
525 VectOfExt(60, 40), 558 VectOfExt(60, 40),
526 "", 559 "",
527 OP_BSDIFF); 560 OP_BSDIFF);
528 expected_graph[7].out_edges[6] = EdgeWithReadDep(VectOfExt(60, 10)); 561 expected_graph[7].out_edges[6] = EdgeWithReadDep(VectOfExt(60, 10));
529 562
530 GenVertex(&expected_graph[8], empt, VectOfExt(0, 50), "/foo", OP_REPLACE_BZ); 563 GenVertex(&expected_graph[8], empt, VectOfExt(0, 50), "/foo", OP_REPLACE_BZ);
531 expected_graph[8].out_edges[7] = EdgeWithReadDep(VectOfExt(120, 50)); 564 expected_graph[8].out_edges[7] = EdgeWithReadDep(VectOfExt(120, 50));
532 565
533 GenVertex(&expected_graph[9], 566 GenVertex(&expected_graph[9],
534 VectOfExt(0, 9), 567 VectOfExt(0, 9),
535 VectOfExt(60, 9), 568 VectOfExt(60, 9),
536 "", 569 "",
537 OP_MOVE); 570 OP_MOVE);
538 571
539 GenVertex(&expected_graph[10], 572 GenVertex(&expected_graph[10],
540 VectOfExt(30, 10), 573 VectOfExt(30, 10),
541 VectOfExt(60, 10), 574 VectOfExt(60, 10),
542 "", 575 "",
543 OP_MOVE); 576 OP_MOVE);
544 expected_graph[10].out_edges[4] = EdgeWithReadDep(VectOfExt(60, 9)); 577 expected_graph[10].out_edges[4] = EdgeWithReadDep(VectOfExt(60, 9));
545 578
546 EXPECT_EQ(12, graph.size()); 579 EXPECT_EQ(12, graph.size());
547 EXPECT_FALSE(graph.back().valid); 580 EXPECT_FALSE(graph.back().valid);
548 for (Graph::size_type i = 0; i < graph.size() - 1; i++) { 581 for (Graph::size_type i = 0; i < graph.size() - 1; i++) {
549 EXPECT_TRUE(graph[i].out_edges == expected_graph[i].out_edges); 582 EXPECT_TRUE(graph[i].out_edges == expected_graph[i].out_edges);
550 if (i == 8) { 583 if (i == 8) {
551 // special case 584 // special case
552 } else { 585 } else {
553 // EXPECT_TRUE(graph[i] == expected_graph[i]) << "i = " << i; 586 // EXPECT_TRUE(graph[i] == expected_graph[i]) << "i = " << i;
554 } 587 }
555 } 588 }
556 } 589 }
557 590
558 } // namespace chromeos_update_engine 591 } // namespace chromeos_update_engine
OLDNEW
« no previous file with comments | « delta_diff_generator.cc ('k') | delta_performer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698