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

Side by Side Diff: metadata_unittest.cc

Issue 5684002: Add support for bsdiff of file system metadata blocks (Closed) Base URL: http://git.chromium.org/git/update_engine.git@master
Patch Set: Forgot newly added metadata processing files. Created 10 years 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8
9 #include <string>
10 #include <vector>
11
12 #include <gtest/gtest.h>
13
14 #include "update_engine/graph_types.h"
15 #include "update_engine/delta_diff_generator.h"
16 #include "update_engine/metadata.h"
17 #include "update_engine/test_utils.h"
18 #include "update_engine/utils.h"
19
20 using std::string;
21 using std::vector;
22
23 namespace chromeos_update_engine {
24
25 typedef DeltaDiffGenerator::Block Block;
26
27 class MetadataTest : public ::testing::Test {
28 };
29
30 TEST_F(MetadataTest, RunAsRootReadMetadataDissimilarFileSystems) {
31 string a_img, b_img;
32 EXPECT_TRUE(utils::MakeTempFile("/tmp/a_img.XXXXXX", &a_img, NULL));
33 ScopedPathUnlinker a_img_unlinker(a_img);
34 EXPECT_TRUE(utils::MakeTempFile("/tmp/b_img.XXXXXX", &b_img, NULL));
35 ScopedPathUnlinker b_img_unlinker(b_img);
36
37 CreateEmptyExtImageAtPath(a_img, 10485759, 4096);
38 CreateEmptyExtImageAtPath(b_img, 11534336, 4096);
39
40 Graph graph;
41 vector<Block> blocks;
42 EXPECT_TRUE(DeltaReadMetadata(&graph,
43 &blocks,
44 a_img,
45 b_img,
46 0,
47 NULL));
48 EXPECT_EQ(graph.size(), 0);
49
50 CreateEmptyExtImageAtPath(a_img, 10485759, 4096);
51 CreateEmptyExtImageAtPath(b_img, 10485759, 8192);
52
53 graph.clear();
54 blocks.clear();
55 EXPECT_TRUE(DeltaReadMetadata(&graph,
56 &blocks,
57 a_img,
58 b_img,
59 0,
60 NULL));
61 EXPECT_EQ(graph.size(), 0);
62 }
63
64 TEST_F(MetadataTest, RunAsRootReadMetadata) {
65 string a_img, b_img, data_file;
66 EXPECT_TRUE(utils::MakeTempFile("/tmp/a_img.XXXXXX", &a_img, NULL));
67 ScopedPathUnlinker a_img_unlinker(a_img);
68 EXPECT_TRUE(utils::MakeTempFile("/tmp/b_img.XXXXXX", &b_img, NULL));
69 ScopedPathUnlinker b_img_unlinker(b_img);
70 EXPECT_TRUE(utils::MakeTempFile("/tmp/data_file.XXXXXX", &data_file, NULL));
71 ScopedPathUnlinker data_file_unlinker(data_file);
72
73 const size_t image_size = (256 * 1024 * 1024); // Enough for 2 block groups
adlr 2010/12/15 03:11:23 extra space before //
thieule 2010/12/15 19:57:01 Done.
74 const int block_size = 4096;
75 CreateEmptyExtImageAtPath(a_img, image_size, block_size);
76
77 // Create a file large enough to create an indirect block
78 {
79 string a_img_mnt;
80 ScopedLoopMounter a_img_mount(a_img, &a_img_mnt, 0);
81 System(StringPrintf("dd if=/dev/zero of=%s/test_file bs=%d count=%d",
82 a_img_mnt.c_str(), block_size, EXT2_NDIR_BLOCKS + 1));
83 }
84
85 System(StringPrintf("cp %s %s", a_img.c_str(), b_img.c_str()));
86
87 int fd = open(data_file.c_str(), O_RDWR | O_CREAT, S_IRWXU);
88 EXPECT_NE(fd, -1);
89 ScopedFdCloser fd_closer(&fd);
90
91 Graph graph;
92 vector<Block> blocks(image_size / block_size);
93 off_t data_file_size;
94 EXPECT_TRUE(DeltaReadMetadata(&graph,
95 &blocks,
96 a_img,
97 b_img,
98 fd,
99 &data_file_size));
100
101 // There are 12 metadata that we look for:
102 // - Block group 0 metadata (superblock, group descriptor, bitmaps, etc)
103 // - Chunk 0, 1, 2, 3
104 // - Block group 1 metadata
105 // - Chunk 0, 1, 2, 3
106 // - Root directory (inode 2)
107 // - Journal (inode 8)
108 // - lost+found directory (inode 11)
109 // - test_file indirect block (inode 12)
110 struct {
111 string metadata_name;
112 off_t start_block; // Set to -1 to skip start block verification
113 off_t num_blocks; // Set to -1 to skip num blocks verification
114 } exp_results[] =
115 {{"<rootfs-bg-0-0-metadata>", 0, 260},
116 {"<rootfs-bg-0-1-metadata>", 260, 260},
117 {"<rootfs-bg-0-2-metadata>", 520, 260},
118 {"<rootfs-bg-0-3-metadata>", 780, 263},
119 {"<rootfs-bg-1-0-metadata>", 32768, 260},
120 {"<rootfs-bg-1-1-metadata>", 33028, 260},
121 {"<rootfs-bg-1-2-metadata>", 33288, 260},
122 {"<rootfs-bg-1-3-metadata>", 33548, 263},
123 {"<rootfs-inode-2-metadata>", -1, 1},
124 {"<rootfs-inode-8-metadata>", -1, 4101},
125 {"<rootfs-inode-11-metadata>", -1, 4},
126 {"<rootfs-inode-12-metadata>", -1, 1}};
127
128 int num_exp_results = sizeof(exp_results) / sizeof(exp_results[0]);
129 EXPECT_EQ(graph.size(), num_exp_results);
130
131 for (int i = 0; i < num_exp_results; i++) {
132 Vertex& vertex = graph[i];
133 DeltaArchiveManifest_InstallOperation& op = vertex.op;
134
135 EXPECT_STRCASEEQ(vertex.file_name.c_str(),
136 exp_results[i].metadata_name.c_str());
137
138 EXPECT_EQ(op.src_extents().size(), op.dst_extents().size());
139 for (int e = 0; e < op.src_extents().size(); e++) {
140 EXPECT_EQ(op.src_extents(e).start_block(),
141 op.dst_extents(e).start_block());
142 EXPECT_EQ(op.src_extents(e).num_blocks(),
143 op.dst_extents(e).num_blocks());
144 }
145
146 if (exp_results[i].start_block != -1) {
147 EXPECT_EQ(op.src_extents(0).start_block(), exp_results[i].start_block);
148 }
149
150 if (exp_results[i].num_blocks != -1) {
151 EXPECT_EQ(op.src_extents(0).num_blocks(), exp_results[i].num_blocks);
152 }
153 }
154 }
155
156 } // namespace chromeos_update_engine
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698