OLD | NEW |
---|---|
(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 | |
OLD | NEW |