blob: ef6e7b18b1a54b35908d7fed24f9f2c669461a61 [file] [log] [blame]
adlr@google.com3defe6a2009-12-04 20:57:17 +00001// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2// 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/types.h>
6#include <sys/stat.h>
7#include <fcntl.h>
8#include <unistd.h>
9#include <string>
10#include <vector>
11#include "base/string_util.h"
12#include <gtest/gtest.h>
13#include "chromeos/obsolete_logging.h"
14#include "update_engine/decompressing_file_writer.h"
15#include "update_engine/delta_diff_generator.h"
16#include "update_engine/delta_diff_parser.h"
17#include "update_engine/gzip.h"
18#include "update_engine/mock_file_writer.h"
19#include "update_engine/subprocess.h"
20#include "update_engine/test_utils.h"
21#include "update_engine/utils.h"
22
23namespace chromeos_update_engine {
24
25using std::string;
26using std::vector;
27
28class DeltaDiffGeneratorTest : public ::testing::Test {};
29
30namespace {
31void DumpProto(const DeltaArchiveManifest* archive) {
32 for (int i = 0; i < archive->files_size(); i++) {
33 printf("Node %d\n", i);
34 const DeltaArchiveManifest_File& file = archive->files(i);
35 for (int j = 0; j < file.children_size(); j++) {
36 const DeltaArchiveManifest_File_Child& child = file.children(j);
37 printf(" %d %s\n", child.index(), child.name().c_str());
38 }
39 }
40}
41
Andrew de los Reyese5733992009-12-08 13:34:00 -080042const char* const kWellCompressingFilename =
43 "this_compresses_well_xxxxxxxxxxxxxxxxx"
44 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
45 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
46 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
47 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
adlr@google.com3defe6a2009-12-04 20:57:17 +000048// The following files are generated at the path 'base':
49// /
50// cdev (c 2 1)
51// dir/
52// bdev (b 3 1)
53// emptydir/ (owner:group = 501:503)
54// hello ("hello")
55// newempty ("")
56// subdir/
57// fifo
58// link -> /target
59// encoding/
60// long_new
61// long_small_change
62// nochange
63// onebyte
64// hi ("hi")
65void GenerateFilesAtPath(const string& base) {
66 const char* base_c = base.c_str();
67 EXPECT_EQ(0, System(StringPrintf("echo hi > '%s/hi'", base_c)));
68 EXPECT_EQ(0, System(StringPrintf("mkdir -p '%s/dir'", base_c)));
69 EXPECT_EQ(0, System(StringPrintf("rm -f '%s/dir/bdev'", base_c)));
70 EXPECT_EQ(0, System(StringPrintf("mknod '%s/dir/bdev' b 3 1", base_c)));
71 EXPECT_EQ(0, System(StringPrintf("rm -f '%s/cdev'", base_c)));
72 EXPECT_EQ(0, System(StringPrintf("mknod '%s/cdev' c 2 1", base_c)));
73 EXPECT_EQ(0, System(StringPrintf("mkdir -p '%s/dir/subdir'", base_c)));
74 EXPECT_EQ(0, System(StringPrintf("mkdir -p '%s/dir/emptydir'", base_c)));
75 EXPECT_EQ(0, System(StringPrintf("chown 501:503 '%s/dir/emptydir'", base_c)));
76 EXPECT_EQ(0, System(StringPrintf("rm -f '%s/dir/subdir/fifo'", base_c)));
77 EXPECT_EQ(0, System(StringPrintf("mkfifo '%s/dir/subdir/fifo'", base_c)));
78 EXPECT_EQ(0, System(StringPrintf("ln -f -s /target '%s/dir/subdir/link'",
79 base_c)));
Andrew de los Reyese5733992009-12-08 13:34:00 -080080 EXPECT_EQ(0, System(StringPrintf("rm -f '%s/hard_link'", base_c)));
81 EXPECT_EQ(0, System(StringPrintf("ln '%s/hi' '%s/hard_link'",
82 base_c, base_c)));
83 EXPECT_EQ(0, System(StringPrintf(
84 "ln -f -s '%s' '%s/compress_link'", kWellCompressingFilename, base_c)));
adlr@google.com3defe6a2009-12-04 20:57:17 +000085
Andrew de los Reyese5733992009-12-08 13:34:00 -080086// Things that will encode differently:
87EXPECT_EQ(0, System(StringPrintf("mkdir -p '%s/encoding'", base_c)));
88EXPECT_EQ(0, System(StringPrintf("echo nochange > '%s/encoding/nochange'",
89 base_c)));
90EXPECT_EQ(0, System(StringPrintf("echo -n > '%s/encoding/onebyte'", base_c)));
91EXPECT_EQ(0, System(StringPrintf("echo -n > '%s/encoding/long_new'",
92 base_c)));
93// Random 1 MiB byte length file
94EXPECT_TRUE(WriteFile((base +
95 "/encoding/long_small_change").c_str(),
96 reinterpret_cast<const char*>(kRandomString),
97 sizeof(kRandomString)));
adlr@google.com3defe6a2009-12-04 20:57:17 +000098}
99// base points to a folder that was passed to GenerateFilesAtPath().
100// This edits some, so that one can make a diff from the original data
101// and the edited data.
102void EditFilesAtPath(const string& base) {
103 CHECK_EQ(0, System(string("echo hello > ") + base + "/dir/hello"));
104 CHECK_EQ(0, System(string("echo -n > ") + base + "/dir/newempty"));
105 CHECK_EQ(0, System(string("echo newhi > ") + base + "/hi"));
106 CHECK_EQ(0, System(string("echo -n h >> ") + base +
107 "/encoding/onebyte"));
108 CHECK_EQ(0, System(string("echo -n h >> ") + base +
109 "/encoding/long_small_change"));
110 CHECK_EQ(0, System(string("echo -n This is a pice of text that should "
111 "compress well since it is just ascii and it "
112 "has repetition xxxxxxxxxxxxxxxxxxxxx"
113 "xxxxxxxxxxxxxxxxxxxx > ") + base +
114 "/encoding/long_new"));
115}
116
117} // namespace {}
118
119TEST_F(DeltaDiffGeneratorTest, FakerootEncodeMetadataToProtoBufferTest) {
120 char cwd[1000];
121 ASSERT_EQ(cwd, getcwd(cwd, sizeof(cwd))) << "cwd buf possibly too small";
122 ASSERT_EQ(0, System(string("mkdir -p ") + cwd + "/diff-gen-test"));
123 ASSERT_EQ(0, System(string("mkdir -p ") + cwd + "/diff-gen-test/old"));
124 ASSERT_EQ(0, System(string("mkdir -p ") + cwd + "/diff-gen-test/new"));
125 GenerateFilesAtPath(string(cwd) + "/diff-gen-test/old");
126 GenerateFilesAtPath(string(cwd) + "/diff-gen-test/new");
127 EditFilesAtPath(string(cwd) + "/diff-gen-test/new");
128
129 DeltaArchiveManifest* archive =
130 DeltaDiffGenerator::EncodeMetadataToProtoBuffer(
131 (string(cwd) + "/diff-gen-test/new").c_str());
132 EXPECT_TRUE(NULL != archive);
133
Andrew de los Reyese5733992009-12-08 13:34:00 -0800134 EXPECT_EQ(18, archive->files_size());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000135 //DumpProto(archive);
136 const DeltaArchiveManifest_File& root = archive->files(0);
137 EXPECT_TRUE(S_ISDIR(root.mode()));
138 EXPECT_EQ(0, root.uid());
139 EXPECT_EQ(0, root.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800140 ASSERT_EQ(6, root.children_size());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000141 EXPECT_EQ("cdev", root.children(0).name());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800142 EXPECT_EQ("compress_link", root.children(1).name());
143 EXPECT_EQ("dir", root.children(2).name());
144 EXPECT_EQ("encoding", root.children(3).name());
145 EXPECT_EQ("hard_link", root.children(4).name());
146 EXPECT_EQ("hi", root.children(5).name());
147 EXPECT_FALSE(root.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000148 EXPECT_FALSE(root.has_data_format());
149 EXPECT_FALSE(root.has_data_offset());
150 EXPECT_FALSE(root.has_data_length());
151
152 const DeltaArchiveManifest_File& cdev =
153 archive->files(root.children(0).index());
154 EXPECT_EQ(0, cdev.children_size());
155 EXPECT_TRUE(S_ISCHR(cdev.mode()));
156 EXPECT_EQ(0, cdev.uid());
157 EXPECT_EQ(0, cdev.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800158 EXPECT_FALSE(cdev.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000159 EXPECT_FALSE(cdev.has_data_format());
160 EXPECT_FALSE(cdev.has_data_offset());
161 EXPECT_FALSE(cdev.has_data_length());
162
Andrew de los Reyese5733992009-12-08 13:34:00 -0800163 const DeltaArchiveManifest_File& compress_link =
164 archive->files(root.children(1).index());
165 EXPECT_EQ(0, compress_link.children_size());
166 EXPECT_TRUE(S_ISLNK(compress_link.mode()));
167 EXPECT_EQ(0, compress_link.uid());
168 EXPECT_EQ(0, compress_link.gid());
169 EXPECT_FALSE(compress_link.has_hardlink_path());
170 EXPECT_FALSE(compress_link.has_data_format());
171 EXPECT_FALSE(compress_link.has_data_offset());
172 EXPECT_FALSE(compress_link.has_data_length());
173
174 const DeltaArchiveManifest_File& hard_link =
175 archive->files(root.children(4).index());
176 EXPECT_EQ(0, hard_link.children_size());
177 EXPECT_TRUE(S_ISREG(hard_link.mode()));
178 EXPECT_EQ(0, hard_link.uid());
179 EXPECT_EQ(0, hard_link.gid());
180 EXPECT_FALSE(hard_link.has_hardlink_path());
181 EXPECT_FALSE(hard_link.has_data_format());
182 EXPECT_FALSE(hard_link.has_data_offset());
183 EXPECT_FALSE(hard_link.has_data_length());
184
adlr@google.com3defe6a2009-12-04 20:57:17 +0000185 const DeltaArchiveManifest_File& hi =
Andrew de los Reyese5733992009-12-08 13:34:00 -0800186 archive->files(root.children(5).index());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000187 EXPECT_EQ(0, hi.children_size());
188 EXPECT_TRUE(S_ISREG(hi.mode()));
189 EXPECT_EQ(0, hi.uid());
190 EXPECT_EQ(0, hi.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800191 EXPECT_TRUE(hi.has_hardlink_path());
192 EXPECT_EQ("/hard_link", hi.hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000193 EXPECT_FALSE(hi.has_data_format());
194 EXPECT_FALSE(hi.has_data_offset());
195 EXPECT_FALSE(hi.has_data_length());
196
197 const DeltaArchiveManifest_File& encoding =
Andrew de los Reyese5733992009-12-08 13:34:00 -0800198 archive->files(root.children(3).index());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000199 EXPECT_TRUE(S_ISDIR(encoding.mode()));
200 EXPECT_EQ(0, encoding.uid());
201 EXPECT_EQ(0, encoding.gid());
202 EXPECT_EQ(4, encoding.children_size());
203 EXPECT_EQ("long_new", encoding.children(0).name());
204 EXPECT_EQ("long_small_change", encoding.children(1).name());
205 EXPECT_EQ("nochange", encoding.children(2).name());
206 EXPECT_EQ("onebyte", encoding.children(3).name());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800207 EXPECT_FALSE(encoding.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000208 EXPECT_FALSE(encoding.has_data_format());
209 EXPECT_FALSE(encoding.has_data_offset());
210 EXPECT_FALSE(encoding.has_data_length());
211
212 const DeltaArchiveManifest_File& long_new =
213 archive->files(encoding.children(0).index());
214 EXPECT_EQ(0, long_new.children_size());
215 EXPECT_TRUE(S_ISREG(long_new.mode()));
216 EXPECT_EQ(0, long_new.uid());
217 EXPECT_EQ(0, long_new.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800218 EXPECT_FALSE(long_new.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000219 EXPECT_FALSE(long_new.has_data_format());
220 EXPECT_FALSE(long_new.has_data_offset());
221 EXPECT_FALSE(long_new.has_data_length());
222
223 const DeltaArchiveManifest_File& long_small_change =
224 archive->files(encoding.children(1).index());
225 EXPECT_EQ(0, long_small_change.children_size());
226 EXPECT_TRUE(S_ISREG(long_small_change.mode()));
227 EXPECT_EQ(0, long_small_change.uid());
228 EXPECT_EQ(0, long_small_change.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800229 EXPECT_FALSE(long_small_change.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000230 EXPECT_FALSE(long_small_change.has_data_format());
231 EXPECT_FALSE(long_small_change.has_data_offset());
232 EXPECT_FALSE(long_small_change.has_data_length());
233
234 const DeltaArchiveManifest_File& nochange =
235 archive->files(encoding.children(2).index());
236 EXPECT_EQ(0, nochange.children_size());
237 EXPECT_TRUE(S_ISREG(nochange.mode()));
238 EXPECT_EQ(0, nochange.uid());
239 EXPECT_EQ(0, nochange.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800240 EXPECT_FALSE(nochange.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000241 EXPECT_FALSE(nochange.has_data_format());
242 EXPECT_FALSE(nochange.has_data_offset());
243 EXPECT_FALSE(nochange.has_data_length());
244
245 const DeltaArchiveManifest_File& onebyte =
246 archive->files(encoding.children(3).index());
247 EXPECT_EQ(0, onebyte.children_size());
248 EXPECT_TRUE(S_ISREG(onebyte.mode()));
249 EXPECT_EQ(0, onebyte.uid());
250 EXPECT_EQ(0, onebyte.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800251 EXPECT_FALSE(onebyte.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000252 EXPECT_FALSE(onebyte.has_data_format());
253 EXPECT_FALSE(onebyte.has_data_offset());
254 EXPECT_FALSE(onebyte.has_data_length());
255
256 const DeltaArchiveManifest_File& dir =
Andrew de los Reyese5733992009-12-08 13:34:00 -0800257 archive->files(root.children(2).index());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000258 EXPECT_TRUE(S_ISDIR(dir.mode()));
259 EXPECT_EQ(0, dir.uid());
260 EXPECT_EQ(0, dir.gid());
261 ASSERT_EQ(5, dir.children_size());
262 EXPECT_EQ("bdev", dir.children(0).name());
263 EXPECT_EQ("emptydir", dir.children(1).name());
264 EXPECT_EQ("hello", dir.children(2).name());
265 EXPECT_EQ("newempty", dir.children(3).name());
266 EXPECT_EQ("subdir", dir.children(4).name());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800267 EXPECT_FALSE(dir.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000268 EXPECT_FALSE(dir.has_data_format());
269 EXPECT_FALSE(dir.has_data_offset());
270 EXPECT_FALSE(dir.has_data_length());
271
272 const DeltaArchiveManifest_File& bdev =
273 archive->files(dir.children(0).index());
274 EXPECT_EQ(0, bdev.children_size());
275 EXPECT_TRUE(S_ISBLK(bdev.mode()));
276 EXPECT_EQ(0, bdev.uid());
277 EXPECT_EQ(0, bdev.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800278 EXPECT_FALSE(bdev.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000279 EXPECT_FALSE(bdev.has_data_format());
280 EXPECT_FALSE(bdev.has_data_offset());
281 EXPECT_FALSE(bdev.has_data_length());
282
283 const DeltaArchiveManifest_File& emptydir =
284 archive->files(dir.children(1).index());
285 EXPECT_EQ(0, emptydir.children_size());
286 EXPECT_TRUE(S_ISDIR(emptydir.mode()));
287 EXPECT_EQ(501, emptydir.uid());
288 EXPECT_EQ(503, emptydir.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800289 EXPECT_FALSE(emptydir.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000290 EXPECT_FALSE(emptydir.has_data_format());
291 EXPECT_FALSE(emptydir.has_data_offset());
292 EXPECT_FALSE(emptydir.has_data_length());
293
294 const DeltaArchiveManifest_File& hello =
295 archive->files(dir.children(2).index());
296 EXPECT_EQ(0, hello.children_size());
297 EXPECT_TRUE(S_ISREG(hello.mode()));
298 EXPECT_EQ(0, hello.uid());
299 EXPECT_EQ(0, hello.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800300 EXPECT_FALSE(hello.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000301 EXPECT_FALSE(hello.has_data_format());
302 EXPECT_FALSE(hello.has_data_offset());
303 EXPECT_FALSE(hello.has_data_length());
304
305 const DeltaArchiveManifest_File& newempty =
306 archive->files(dir.children(3).index());
307 EXPECT_EQ(0, newempty.children_size());
308 EXPECT_TRUE(S_ISREG(newempty.mode()));
309 EXPECT_EQ(0, newempty.uid());
310 EXPECT_EQ(0, newempty.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800311 EXPECT_FALSE(newempty.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000312 EXPECT_FALSE(newempty.has_data_format());
313 EXPECT_FALSE(newempty.has_data_offset());
314 EXPECT_FALSE(newempty.has_data_length());
315
316 const DeltaArchiveManifest_File& subdir =
317 archive->files(dir.children(4).index());
318 EXPECT_EQ(2, subdir.children_size());
319 EXPECT_EQ("fifo", subdir.children(0).name());
320 EXPECT_EQ("link", subdir.children(1).name());
321 EXPECT_TRUE(S_ISDIR(subdir.mode()));
322 EXPECT_EQ(0, subdir.uid());
323 EXPECT_EQ(0, subdir.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800324 EXPECT_FALSE(subdir.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000325 EXPECT_FALSE(subdir.has_data_format());
326 EXPECT_FALSE(subdir.has_data_offset());
327 EXPECT_FALSE(subdir.has_data_length());
328
329 const DeltaArchiveManifest_File& fifo =
330 archive->files(subdir.children(0).index());
331 EXPECT_EQ(0, fifo.children_size());
332 EXPECT_TRUE(S_ISFIFO(fifo.mode()));
333 EXPECT_EQ(0, fifo.uid());
334 EXPECT_EQ(0, fifo.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800335 EXPECT_FALSE(fifo.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000336 EXPECT_FALSE(fifo.has_data_format());
337 EXPECT_FALSE(fifo.has_data_offset());
338 EXPECT_FALSE(fifo.has_data_length());
339
340 const DeltaArchiveManifest_File& link =
341 archive->files(subdir.children(1).index());
342 EXPECT_EQ(0, link.children_size());
343 EXPECT_TRUE(S_ISLNK(link.mode()));
344 EXPECT_EQ(0, link.uid());
345 EXPECT_EQ(0, link.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800346 EXPECT_FALSE(link.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000347 EXPECT_FALSE(link.has_data_format());
348 EXPECT_FALSE(link.has_data_offset());
349 EXPECT_FALSE(link.has_data_length());
350}
351
352TEST_F(DeltaDiffGeneratorTest, FakerootEncodeDataToDeltaFileTest) {
353 char cwd[1000];
354 ASSERT_EQ(cwd, getcwd(cwd, sizeof(cwd))) << "cwd buf possibly too small";
355 ASSERT_EQ(0, System(string("mkdir -p ") + cwd + "/diff-gen-test"));
356 ASSERT_EQ(0, System(string("mkdir -p ") + cwd + "/diff-gen-test/old"));
357 ASSERT_EQ(0, System(string("mkdir -p ") + cwd + "/diff-gen-test/new"));
358 GenerateFilesAtPath(string(cwd) + "/diff-gen-test/old");
359 GenerateFilesAtPath(string(cwd) + "/diff-gen-test/new");
360 EditFilesAtPath(string(cwd) + "/diff-gen-test/new");
361
362 DeltaArchiveManifest* archive =
363 DeltaDiffGenerator::EncodeMetadataToProtoBuffer(
364 (string(cwd) + "/diff-gen-test/new").c_str());
365 EXPECT_TRUE(NULL != archive);
366
367 EXPECT_TRUE(DeltaDiffGenerator::EncodeDataToDeltaFile(
368 archive,
369 string(cwd) + "/diff-gen-test/old",
370 string(cwd) + "/diff-gen-test/new",
Andrew de los Reyese5733992009-12-08 13:34:00 -0800371 string(cwd) + "/diff-gen-test/out.dat",
372 ""));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000373
Andrew de los Reyese5733992009-12-08 13:34:00 -0800374 EXPECT_EQ(18, archive->files_size());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000375
376 const DeltaArchiveManifest_File& root = archive->files(0);
377 EXPECT_TRUE(S_ISDIR(root.mode()));
378 EXPECT_EQ(0, root.uid());
379 EXPECT_EQ(0, root.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800380 ASSERT_EQ(6, root.children_size());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000381 EXPECT_EQ("cdev", root.children(0).name());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800382 EXPECT_EQ("compress_link", root.children(1).name());
383 EXPECT_EQ("dir", root.children(2).name());
384 EXPECT_EQ("encoding", root.children(3).name());
385 EXPECT_EQ("hard_link", root.children(4).name());
386 EXPECT_EQ("hi", root.children(5).name());
387 EXPECT_FALSE(root.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000388 EXPECT_FALSE(root.has_data_format());
389 EXPECT_FALSE(root.has_data_offset());
390 EXPECT_FALSE(root.has_data_length());
391
392 const DeltaArchiveManifest_File& cdev =
393 archive->files(root.children(0).index());
394 EXPECT_EQ(0, cdev.children_size());
395 EXPECT_TRUE(S_ISCHR(cdev.mode()));
396 EXPECT_EQ(0, cdev.uid());
397 EXPECT_EQ(0, cdev.gid());
398 ASSERT_TRUE(cdev.has_data_format());
399 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, cdev.data_format());
400 EXPECT_TRUE(cdev.has_data_offset());
401 ASSERT_TRUE(cdev.has_data_length());
402 EXPECT_GT(cdev.data_length(), 0);
Andrew de los Reyese5733992009-12-08 13:34:00 -0800403 EXPECT_FALSE(cdev.has_hardlink_path());
404
405 const DeltaArchiveManifest_File& compress_link =
406 archive->files(root.children(1).index());
407 EXPECT_EQ(0, compress_link.children_size());
408 EXPECT_TRUE(S_ISLNK(compress_link.mode()));
409 EXPECT_EQ(0, compress_link.uid());
410 EXPECT_EQ(0, compress_link.gid());
411 ASSERT_TRUE(compress_link.has_data_format());
412 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL_GZ,
413 compress_link.data_format());
414 EXPECT_TRUE(compress_link.has_data_offset());
415 ASSERT_TRUE(compress_link.has_data_length());
416 EXPECT_GT(compress_link.data_length(), 0);
417 EXPECT_FALSE(compress_link.has_hardlink_path());
418
419 const DeltaArchiveManifest_File& hard_link =
420 archive->files(root.children(4).index());
421 EXPECT_EQ(0, hard_link.children_size());
422 EXPECT_TRUE(S_ISREG(hard_link.mode()));
423 EXPECT_EQ(0, hard_link.uid());
424 EXPECT_EQ(0, hard_link.gid());
425 ASSERT_TRUE(hard_link.has_data_format());
426 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, hard_link.data_format());
427 EXPECT_TRUE(hard_link.has_data_offset());
428 ASSERT_TRUE(hard_link.has_data_length());
429 EXPECT_GT(hard_link.data_length(), 0);
430 EXPECT_FALSE(hard_link.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000431
432 const DeltaArchiveManifest_File& hi =
Andrew de los Reyese5733992009-12-08 13:34:00 -0800433 archive->files(root.children(5).index());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000434 EXPECT_EQ(0, hi.children_size());
435 EXPECT_TRUE(S_ISREG(hi.mode()));
436 EXPECT_EQ(0, hi.uid());
437 EXPECT_EQ(0, hi.gid());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800438 EXPECT_FALSE(hi.has_data_format());
439 EXPECT_FALSE(hi.has_data_offset());
440 EXPECT_FALSE(hi.has_data_length());
441 EXPECT_TRUE(hi.has_hardlink_path());
442 EXPECT_EQ("/hard_link", hi.hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000443
444 const DeltaArchiveManifest_File& encoding =
Andrew de los Reyese5733992009-12-08 13:34:00 -0800445 archive->files(root.children(3).index());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000446 EXPECT_TRUE(S_ISDIR(encoding.mode()));
447 EXPECT_EQ(0, encoding.uid());
448 EXPECT_EQ(0, encoding.gid());
449 EXPECT_EQ(4, encoding.children_size());
450 EXPECT_EQ("long_new", encoding.children(0).name());
451 EXPECT_EQ("long_small_change", encoding.children(1).name());
452 EXPECT_EQ("nochange", encoding.children(2).name());
453 EXPECT_EQ("onebyte", encoding.children(3).name());
454 EXPECT_FALSE(encoding.has_data_format());
455 EXPECT_FALSE(encoding.has_data_offset());
456 EXPECT_FALSE(encoding.has_data_length());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800457 EXPECT_FALSE(encoding.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000458
459 const DeltaArchiveManifest_File& long_new =
460 archive->files(encoding.children(0).index());
461 EXPECT_EQ(0, long_new.children_size());
462 EXPECT_TRUE(S_ISREG(long_new.mode()));
463 EXPECT_EQ(0, long_new.uid());
464 EXPECT_EQ(0, long_new.gid());
465 EXPECT_TRUE(long_new.has_data_format());
466 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL_GZ,
467 long_new.data_format());
468 EXPECT_TRUE(long_new.has_data_offset());
469 EXPECT_TRUE(long_new.has_data_length());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800470 EXPECT_FALSE(long_new.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000471
472 const DeltaArchiveManifest_File& long_small_change =
473 archive->files(encoding.children(1).index());
474 EXPECT_EQ(0, long_small_change.children_size());
475 EXPECT_TRUE(S_ISREG(long_small_change.mode()));
476 EXPECT_EQ(0, long_small_change.uid());
477 EXPECT_EQ(0, long_small_change.gid());
478 EXPECT_TRUE(long_small_change.has_data_format());
479 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_BSDIFF,
480 long_small_change.data_format());
481 EXPECT_TRUE(long_small_change.has_data_offset());
482 EXPECT_TRUE(long_small_change.has_data_length());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800483 EXPECT_FALSE(long_small_change.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000484
485 const DeltaArchiveManifest_File& nochange =
486 archive->files(encoding.children(2).index());
487 EXPECT_EQ(0, nochange.children_size());
488 EXPECT_TRUE(S_ISREG(nochange.mode()));
489 EXPECT_EQ(0, nochange.uid());
490 EXPECT_EQ(0, nochange.gid());
491 EXPECT_TRUE(nochange.has_data_format());
492 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, nochange.data_format());
493 EXPECT_TRUE(nochange.has_data_offset());
494 EXPECT_TRUE(nochange.has_data_length());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800495 EXPECT_FALSE(nochange.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000496
497 const DeltaArchiveManifest_File& onebyte =
498 archive->files(encoding.children(3).index());
499 EXPECT_EQ(0, onebyte.children_size());
500 EXPECT_TRUE(S_ISREG(onebyte.mode()));
501 EXPECT_EQ(0, onebyte.uid());
502 EXPECT_EQ(0, onebyte.gid());
503 EXPECT_TRUE(onebyte.has_data_format());
504 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, onebyte.data_format());
505 EXPECT_TRUE(onebyte.has_data_offset());
506 EXPECT_TRUE(onebyte.has_data_length());
507 EXPECT_EQ(1, onebyte.data_length());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800508 EXPECT_FALSE(onebyte.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000509
510 const DeltaArchiveManifest_File& dir =
Andrew de los Reyese5733992009-12-08 13:34:00 -0800511 archive->files(root.children(2).index());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000512 EXPECT_TRUE(S_ISDIR(dir.mode()));
513 EXPECT_EQ(0, dir.uid());
514 EXPECT_EQ(0, dir.gid());
515 ASSERT_EQ(5, dir.children_size());
516 EXPECT_EQ("bdev", dir.children(0).name());
517 EXPECT_EQ("emptydir", dir.children(1).name());
518 EXPECT_EQ("hello", dir.children(2).name());
519 EXPECT_EQ("newempty", dir.children(3).name());
520 EXPECT_EQ("subdir", dir.children(4).name());
521 EXPECT_FALSE(dir.has_data_format());
522 EXPECT_FALSE(dir.has_data_offset());
523 EXPECT_FALSE(dir.has_data_length());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800524 EXPECT_FALSE(dir.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000525
526 const DeltaArchiveManifest_File& bdev =
527 archive->files(dir.children(0).index());
528 EXPECT_EQ(0, bdev.children_size());
529 EXPECT_TRUE(S_ISBLK(bdev.mode()));
530 EXPECT_EQ(0, bdev.uid());
531 EXPECT_EQ(0, bdev.gid());
532 ASSERT_TRUE(bdev.has_data_format());
533 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, bdev.data_format());
534 EXPECT_TRUE(bdev.has_data_offset());
535 ASSERT_TRUE(bdev.has_data_length());
536 EXPECT_GT(bdev.data_length(), 0);
Andrew de los Reyese5733992009-12-08 13:34:00 -0800537 EXPECT_FALSE(bdev.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000538
539 const DeltaArchiveManifest_File& emptydir =
540 archive->files(dir.children(1).index());
541 EXPECT_EQ(0, emptydir.children_size());
542 EXPECT_TRUE(S_ISDIR(emptydir.mode()));
543 EXPECT_EQ(501, emptydir.uid());
544 EXPECT_EQ(503, emptydir.gid());
545 EXPECT_FALSE(emptydir.has_data_format());
546 EXPECT_FALSE(emptydir.has_data_offset());
547 EXPECT_FALSE(emptydir.has_data_length());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800548 EXPECT_FALSE(emptydir.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000549
550 const DeltaArchiveManifest_File& hello =
551 archive->files(dir.children(2).index());
552 EXPECT_EQ(0, hello.children_size());
553 EXPECT_TRUE(S_ISREG(hello.mode()));
554 EXPECT_EQ(0, hello.uid());
555 EXPECT_EQ(0, hello.gid());
556 ASSERT_TRUE(hello.has_data_format());
557 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, hello.data_format());
558 EXPECT_TRUE(hello.has_data_offset());
559 ASSERT_TRUE(hello.has_data_length());
560 EXPECT_GT(hello.data_length(), 0);
Andrew de los Reyese5733992009-12-08 13:34:00 -0800561 EXPECT_FALSE(hello.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000562
563 const DeltaArchiveManifest_File& newempty =
564 archive->files(dir.children(3).index());
565 EXPECT_EQ(0, newempty.children_size());
566 EXPECT_TRUE(S_ISREG(newempty.mode()));
567 EXPECT_EQ(0, newempty.uid());
568 EXPECT_EQ(0, newempty.gid());
569 EXPECT_FALSE(newempty.has_data_format());
570 EXPECT_FALSE(newempty.has_data_offset());
571 EXPECT_FALSE(newempty.has_data_length());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800572 EXPECT_FALSE(newempty.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000573
574 const DeltaArchiveManifest_File& subdir =
575 archive->files(dir.children(4).index());
576 EXPECT_EQ(2, subdir.children_size());
577 EXPECT_EQ("fifo", subdir.children(0).name());
578 EXPECT_EQ("link", subdir.children(1).name());
579 EXPECT_TRUE(S_ISDIR(subdir.mode()));
580 EXPECT_EQ(0, subdir.uid());
581 EXPECT_EQ(0, subdir.gid());
582 EXPECT_FALSE(subdir.has_data_format());
583 EXPECT_FALSE(subdir.has_data_offset());
584 EXPECT_FALSE(subdir.has_data_length());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800585 EXPECT_FALSE(subdir.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000586
587 const DeltaArchiveManifest_File& fifo =
588 archive->files(subdir.children(0).index());
589 EXPECT_EQ(0, fifo.children_size());
590 EXPECT_TRUE(S_ISFIFO(fifo.mode()));
591 EXPECT_EQ(0, fifo.uid());
592 EXPECT_EQ(0, fifo.gid());
593 EXPECT_FALSE(fifo.has_data_format());
594 EXPECT_FALSE(fifo.has_data_offset());
595 EXPECT_FALSE(fifo.has_data_length());
Andrew de los Reyese5733992009-12-08 13:34:00 -0800596 EXPECT_FALSE(fifo.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000597
598 const DeltaArchiveManifest_File& link =
599 archive->files(subdir.children(1).index());
600 EXPECT_EQ(0, link.children_size());
601 EXPECT_TRUE(S_ISLNK(link.mode()));
602 EXPECT_EQ(0, link.uid());
603 EXPECT_EQ(0, link.gid());
604 ASSERT_TRUE(link.has_data_format());
605 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, link.data_format());
606 EXPECT_TRUE(link.has_data_offset());
607 ASSERT_TRUE(link.has_data_length());
608 EXPECT_GT(link.data_length(), 0);
Andrew de los Reyese5733992009-12-08 13:34:00 -0800609 EXPECT_FALSE(link.has_hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000610}
611
612class DeltaDiffParserTest : public ::testing::Test {
613 virtual void TearDown() {
614 EXPECT_EQ(0, system("rm -rf diff-gen-test"));
615 }
616};
617
618namespace {
619// Reads part of a file into memory
620vector<char> ReadFilePart(const string& path, off_t start, off_t size) {
621 vector<char> ret;
622 int fd = open(path.c_str(), O_RDONLY, 0);
623 if (fd < 0)
624 return ret;
625 ret.resize(size);
626 EXPECT_EQ(size, pread(fd, &ret[0], size, start));
627 close(fd);
628 return ret;
629}
630
631string ReadFilePartToString(const string& path, off_t start, off_t size) {
632 vector<char> bytes = ReadFilePart(path, start, size);
633 string ret;
634 ret.append(&bytes[0], bytes.size());
635 return ret;
636}
637
638string StringFromVectorChar(const vector<char>& in) {
639 return string(&in[0], in.size());
640}
641
642string GzipDecompressToString(const vector<char>& in) {
643 vector<char> out;
644 EXPECT_TRUE(GzipDecompress(in, &out));
645 return StringFromVectorChar(out);
646}
647
648}
649
650TEST_F(DeltaDiffParserTest, FakerootDecodeDataFromDeltaFileTest) {
651 char cwd[1000];
652 ASSERT_EQ(cwd, getcwd(cwd, sizeof(cwd))) << "cwd buf possibly too small";
653 ASSERT_EQ(0, System(string("mkdir -p ") + cwd + "/diff-gen-test"));
654 ASSERT_EQ(0, System(string("mkdir -p ") + cwd + "/diff-gen-test/old"));
655 ASSERT_EQ(0, System(string("mkdir -p ") + cwd + "/diff-gen-test/new"));
656 GenerateFilesAtPath(string(cwd) + "/diff-gen-test/old");
657 GenerateFilesAtPath(string(cwd) + "/diff-gen-test/new");
658 EditFilesAtPath(string(cwd) + "/diff-gen-test/new");
659
660 DeltaArchiveManifest* archive =
661 DeltaDiffGenerator::EncodeMetadataToProtoBuffer(
662 (string(cwd) + "/diff-gen-test/new").c_str());
663 EXPECT_TRUE(NULL != archive);
664
665 EXPECT_TRUE(DeltaDiffGenerator::EncodeDataToDeltaFile(
666 archive,
667 string(cwd) + "/diff-gen-test/old",
668 string(cwd) + "/diff-gen-test/new",
Andrew de los Reyese5733992009-12-08 13:34:00 -0800669 string(cwd) + "/diff-gen-test/out.dat",
670 ""));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000671 // parse the file
672
673 DeltaDiffParser parser(string(cwd) + "/diff-gen-test/out.dat");
674 ASSERT_TRUE(parser.valid());
675 DeltaDiffParser::Iterator it = parser.Begin();
676 string expected_paths[] = {
677 "",
678 "/cdev",
Andrew de los Reyese5733992009-12-08 13:34:00 -0800679 "/compress_link",
adlr@google.com3defe6a2009-12-04 20:57:17 +0000680 "/dir",
681 "/dir/bdev",
682 "/dir/emptydir",
683 "/dir/hello",
684 "/dir/newempty",
685 "/dir/subdir",
686 "/dir/subdir/fifo",
687 "/dir/subdir/link",
688 "/encoding",
689 "/encoding/long_new",
690 "/encoding/long_small_change",
691 "/encoding/nochange",
692 "/encoding/onebyte",
Andrew de los Reyese5733992009-12-08 13:34:00 -0800693 "/hard_link",
adlr@google.com3defe6a2009-12-04 20:57:17 +0000694 "/hi"
695 };
696 for (unsigned int i = 0;
697 i < (sizeof(expected_paths)/sizeof(expected_paths[0])); i++) {
698 ASSERT_TRUE(it != parser.End());
699 ASSERT_TRUE(parser.ContainsPath(expected_paths[i]));
700 EXPECT_EQ(expected_paths[i], it.path());
701 EXPECT_EQ(expected_paths[i].substr(expected_paths[i].find_last_of('/') + 1),
702 it.GetName());
703 DeltaArchiveManifest_File f1 = parser.GetFileAtPath(expected_paths[i]);
704 DeltaArchiveManifest_File f2 = it.GetFile();
705 EXPECT_EQ(f1.mode(), f2.mode()) << it.path();
706 EXPECT_EQ(f1.uid(), f2.uid());
707 EXPECT_EQ(f1.gid(), f2.gid());
708 EXPECT_EQ(f1.has_data_format(), f2.has_data_format());
709 if (f1.has_data_format()) {
710 EXPECT_EQ(f1.data_format(), f2.data_format());
711 EXPECT_TRUE(f1.has_data_offset());
712 EXPECT_TRUE(f2.has_data_offset());
713 EXPECT_EQ(f1.data_offset(), f2.data_offset());
714 } else {
715 EXPECT_FALSE(f2.has_data_format());
716 EXPECT_FALSE(f1.has_data_offset());
717 EXPECT_FALSE(f2.has_data_offset());
718 }
719 EXPECT_EQ(f1.children_size(), f2.children_size());
720 for (int j = 0; j < f1.children_size(); j++) {
721 EXPECT_EQ(f1.children(j).name(), f2.children(j).name());
722 EXPECT_EQ(f1.children(j).index(), f2.children(j).index());
723 }
724 it.Increment();
725 }
726 EXPECT_TRUE(it == parser.End());
727 EXPECT_FALSE(parser.ContainsPath("/cdew"));
728 EXPECT_FALSE(parser.ContainsPath("/hi/hi"));
729 EXPECT_FALSE(parser.ContainsPath("/dir/newempty/hi"));
730 EXPECT_TRUE(parser.ContainsPath("/dir/"));
731
732 // Check the data
733 // root
734 DeltaArchiveManifest_File file = parser.GetFileAtPath("");
735 EXPECT_TRUE(S_ISDIR(file.mode()));
736 EXPECT_FALSE(file.has_data_format());
737
738 // cdev
739 file = parser.GetFileAtPath("/cdev");
740 EXPECT_TRUE(S_ISCHR(file.mode()));
741 EXPECT_TRUE(file.has_data_format());
742 vector<char> data = ReadFilePart(string(cwd) + "/diff-gen-test/out.dat",
743 file.data_offset(), file.data_length());
744 LinuxDevice linux_device;
745 linux_device.ParseFromArray(&data[0], data.size());
746 EXPECT_EQ(linux_device.major(), 2);
747 EXPECT_EQ(linux_device.minor(), 1);
748
Andrew de los Reyese5733992009-12-08 13:34:00 -0800749 // compress_link
750 file = parser.GetFileAtPath("/compress_link");
751 EXPECT_TRUE(S_ISLNK(file.mode()));
752 EXPECT_TRUE(file.has_data_format());
753 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL_GZ, file.data_format());
754 EXPECT_EQ(kWellCompressingFilename,
755 GzipDecompressToString(ReadFilePart(string(cwd) +
756 "/diff-gen-test/out.dat",
757 file.data_offset(),
758 file.data_length())));
adlr@google.com3defe6a2009-12-04 20:57:17 +0000759 // dir
760 file = parser.GetFileAtPath("/dir");
761 EXPECT_TRUE(S_ISDIR(file.mode()));
762 EXPECT_FALSE(file.has_data_format());
763
764 // bdev
765 file = parser.GetFileAtPath("/dir/bdev");
766 EXPECT_TRUE(S_ISBLK(file.mode()));
767 EXPECT_TRUE(file.has_data_format());
768 data = ReadFilePart(string(cwd) + "/diff-gen-test/out.dat",
769 file.data_offset(), file.data_length());
770 linux_device.ParseFromArray(&data[0], data.size());
771 EXPECT_EQ(linux_device.major(), 3);
772 EXPECT_EQ(linux_device.minor(), 1);
773
774 // emptydir
775 file = parser.GetFileAtPath("/dir/emptydir");
776 EXPECT_TRUE(S_ISDIR(file.mode()));
777 EXPECT_FALSE(file.has_data_format());
778
779 // hello
780 file = parser.GetFileAtPath("/dir/hello");
781 EXPECT_TRUE(S_ISREG(file.mode()));
782 EXPECT_TRUE(file.has_data_format());
783 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, file.data_format());
784 EXPECT_EQ("hello\n", ReadFilePartToString(string(cwd) +
785 "/diff-gen-test/out.dat",
786 file.data_offset(),
787 file.data_length()));
788
789 // newempty
790 file = parser.GetFileAtPath("/dir/newempty");
791 EXPECT_TRUE(S_ISREG(file.mode()));
792 EXPECT_FALSE(file.has_data_format());
793
794 // subdir
795 file = parser.GetFileAtPath("/dir/subdir");
796 EXPECT_TRUE(S_ISDIR(file.mode()));
797 EXPECT_FALSE(file.has_data_format());
798
799 // fifo
800 file = parser.GetFileAtPath("/dir/subdir/fifo");
801 EXPECT_TRUE(S_ISFIFO(file.mode()));
802 EXPECT_FALSE(file.has_data_format());
803
804 // link
805 file = parser.GetFileAtPath("/dir/subdir/link");
806 EXPECT_TRUE(S_ISLNK(file.mode()));
807 EXPECT_TRUE(file.has_data_format());
808 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, file.data_format());
809 EXPECT_EQ("/target", ReadFilePartToString(string(cwd) +
810 "/diff-gen-test/out.dat",
811 file.data_offset(),
812 file.data_length()));
813
814 // encoding
815 file = parser.GetFileAtPath("/encoding");
816 EXPECT_TRUE(S_ISDIR(file.mode()));
817 EXPECT_FALSE(file.has_data_format());
818
819 // long_new
820 file = parser.GetFileAtPath("/encoding/long_new");
821 EXPECT_TRUE(S_ISREG(file.mode()));
822 EXPECT_TRUE(file.has_data_format());
823 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL_GZ, file.data_format());
824 EXPECT_EQ("This is a pice of text that should "
825 "compress well since it is just ascii and it "
826 "has repetition xxxxxxxxxxxxxxxxxxxxx"
827 "xxxxxxxxxxxxxxxxxxxx",
828 GzipDecompressToString(ReadFilePart(string(cwd) +
829 "/diff-gen-test/out.dat",
830 file.data_offset(),
831 file.data_length())));
832
833 // long_small_change
834 file = parser.GetFileAtPath("/encoding/long_small_change");
835 EXPECT_TRUE(S_ISREG(file.mode()));
836 EXPECT_TRUE(file.has_data_format());
837 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_BSDIFF, file.data_format());
838 data = ReadFilePart(string(cwd) + "/diff-gen-test/out.dat",
839 file.data_offset(), file.data_length());
840 WriteFileVector(string(cwd) + "/diff-gen-test/patch", data);
841 int rc = 1;
842 vector<string> cmd;
843 cmd.push_back("/usr/bin/bspatch");
844 cmd.push_back(string(cwd) + "/diff-gen-test/old/encoding/long_small_change");
845 cmd.push_back(string(cwd) + "/diff-gen-test/patch_result");
846 cmd.push_back(string(cwd) + "/diff-gen-test/patch");
847 Subprocess::SynchronousExec(cmd, &rc);
848 EXPECT_EQ(0, rc);
849 vector<char> patch_result;
850 EXPECT_TRUE(utils::ReadFile(string(cwd) + "/diff-gen-test/patch_result",
851 &patch_result));
852 vector<char> expected_data(sizeof(kRandomString) + 1);
853 memcpy(&expected_data[0], kRandomString, sizeof(kRandomString));
854 expected_data[expected_data.size() - 1] = 'h';
855 ExpectVectorsEq(expected_data, patch_result);
856
857 // nochange
858 file = parser.GetFileAtPath("/encoding/nochange");
859 EXPECT_TRUE(S_ISREG(file.mode()));
860 EXPECT_TRUE(file.has_data_format());
861 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, file.data_format());
862 EXPECT_EQ("nochange\n", ReadFilePartToString(string(cwd) +
863 "/diff-gen-test/out.dat",
864 file.data_offset(),
865 file.data_length()));
866
867 // onebyte
868 file = parser.GetFileAtPath("/encoding/onebyte");
869 EXPECT_TRUE(S_ISREG(file.mode()));
870 EXPECT_TRUE(file.has_data_format());
871 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, file.data_format());
872 EXPECT_EQ("h", ReadFilePartToString(string(cwd) +
873 "/diff-gen-test/out.dat",
874 file.data_offset(),
875 file.data_length()));
876
Andrew de los Reyese5733992009-12-08 13:34:00 -0800877 // hard_link
878 file = parser.GetFileAtPath("/hard_link");
adlr@google.com3defe6a2009-12-04 20:57:17 +0000879 EXPECT_TRUE(S_ISREG(file.mode()));
880 EXPECT_TRUE(file.has_data_format());
881 EXPECT_EQ(DeltaArchiveManifest_File_DataFormat_FULL, file.data_format());
882 EXPECT_EQ("newhi\n", ReadFilePartToString(string(cwd) +
883 "/diff-gen-test/out.dat",
884 file.data_offset(),
885 file.data_length()));
Andrew de los Reyese5733992009-12-08 13:34:00 -0800886
887 // hi
888 file = parser.GetFileAtPath("/hi");
889 EXPECT_TRUE(S_ISREG(file.mode()));
890 EXPECT_FALSE(file.has_data_format());
891 EXPECT_TRUE(file.has_hardlink_path());
892 EXPECT_EQ("/hard_link", file.hardlink_path());
adlr@google.com3defe6a2009-12-04 20:57:17 +0000893}
894
895TEST_F(DeltaDiffParserTest, FakerootInvalidTest) {
896 ASSERT_EQ(0, mkdir("diff-gen-test", 0777));
897 {
898 DeltaDiffParser parser("/no/such/file");
899 EXPECT_FALSE(parser.valid());
900 }
901 {
902 vector<char> data(3);
903 memcpy(&data[0], "CrA", 3);
904 WriteFileVector("diff-gen-test/baddelta", data);
905 DeltaDiffParser parser("diff-gen-test/baddelta");
906 EXPECT_FALSE(parser.valid());
907 }
908 {
909 vector<char> data(5);
910 memcpy(&data[0], "CrAPx", 5);
911 WriteFileVector("diff-gen-test/baddelta", data);
912 DeltaDiffParser parser("diff-gen-test/baddelta");
913 EXPECT_FALSE(parser.valid());
914 }
915 {
916 vector<char> data(5);
917 memcpy(&data[0], "CrAU\0", 5);
918 WriteFileVector("diff-gen-test/baddelta", data);
919 DeltaDiffParser parser("diff-gen-test/baddelta");
920 EXPECT_FALSE(parser.valid());
921 }
922 {
923 vector<char> data(14);
924 memcpy(&data[0], "CrAU\0\0\0\0\0\0\0\x0cxx", 12);
925 WriteFileVector("diff-gen-test/baddelta", data);
926 DeltaDiffParser parser("diff-gen-test/baddelta");
927 EXPECT_FALSE(parser.valid());
928 }
929}
930
931} // namespace chromeos_update_engine