blob: 6bc56b722d7c8802373295aec6c3a41886677b4c [file] [log] [blame]
Mike Frysinger8155d082012-04-06 15:23:18 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Thieu Le5c7d9752010-12-15 16:09:28 -08002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alex Deymoaab50e32014-11-10 19:55:35 -08005#include "update_engine/payload_generator/metadata.h"
6
Alex Deymo5d527802014-07-18 14:24:13 -07007#include <ext2fs/ext2fs.h>
Thieu Le5c7d9752010-12-15 16:09:28 -08008#include <fcntl.h>
Alex Deymo161c4a12014-05-16 15:56:21 -07009#include <sys/stat.h>
10#include <sys/types.h>
Thieu Le5c7d9752010-12-15 16:09:28 -080011
12#include <string>
13#include <vector>
14
Alex Vakulenko75039d72014-03-25 12:36:28 -070015#include <base/strings/string_util.h>
16#include <base/strings/stringprintf.h>
Thieu Le5c7d9752010-12-15 16:09:28 -080017#include <gtest/gtest.h>
18
Alex Deymo161c4a12014-05-16 15:56:21 -070019#include "update_engine/payload_generator/delta_diff_generator.h"
20#include "update_engine/payload_generator/graph_types.h"
Thieu Le5c7d9752010-12-15 16:09:28 -080021#include "update_engine/test_utils.h"
22#include "update_engine/utils.h"
23
Alex Deymo10875d92014-11-10 21:52:57 -080024using chromeos_update_engine::test_utils::CreateEmptyExtImageAtPath;
Thieu Le5c7d9752010-12-15 16:09:28 -080025using std::string;
26using std::vector;
27
28namespace chromeos_update_engine {
29
30typedef DeltaDiffGenerator::Block Block;
31
32class MetadataTest : public ::testing::Test {
33};
34
35TEST_F(MetadataTest, RunAsRootReadMetadataDissimilarFileSystems) {
36 string a_img, b_img;
Alex Vakulenko88b591f2014-08-28 16:48:57 -070037 EXPECT_TRUE(utils::MakeTempFile("a_img.XXXXXX", &a_img, nullptr));
Thieu Le5c7d9752010-12-15 16:09:28 -080038 ScopedPathUnlinker a_img_unlinker(a_img);
Alex Vakulenko88b591f2014-08-28 16:48:57 -070039 EXPECT_TRUE(utils::MakeTempFile("b_img.XXXXXX", &b_img, nullptr));
Thieu Le5c7d9752010-12-15 16:09:28 -080040 ScopedPathUnlinker b_img_unlinker(b_img);
41
42 CreateEmptyExtImageAtPath(a_img, 10485759, 4096);
43 CreateEmptyExtImageAtPath(b_img, 11534336, 4096);
44
45 Graph graph;
46 vector<Block> blocks;
47 EXPECT_TRUE(Metadata::DeltaReadMetadata(&graph,
48 &blocks,
49 a_img,
50 b_img,
51 0,
Alex Vakulenko88b591f2014-08-28 16:48:57 -070052 nullptr));
Thieu Le5c7d9752010-12-15 16:09:28 -080053 EXPECT_EQ(graph.size(), 0);
54
55 CreateEmptyExtImageAtPath(a_img, 10485759, 4096);
56 CreateEmptyExtImageAtPath(b_img, 10485759, 8192);
57
58 graph.clear();
59 blocks.clear();
60 EXPECT_TRUE(Metadata::DeltaReadMetadata(&graph,
61 &blocks,
62 a_img,
63 b_img,
64 0,
Alex Vakulenko88b591f2014-08-28 16:48:57 -070065 nullptr));
Thieu Le5c7d9752010-12-15 16:09:28 -080066 EXPECT_EQ(graph.size(), 0);
67}
68
69TEST_F(MetadataTest, RunAsRootReadMetadata) {
70 string a_img, b_img, data_file;
Alex Vakulenko88b591f2014-08-28 16:48:57 -070071 EXPECT_TRUE(utils::MakeTempFile("a_img.XXXXXX", &a_img, nullptr));
Thieu Le5c7d9752010-12-15 16:09:28 -080072 ScopedPathUnlinker a_img_unlinker(a_img);
Alex Vakulenko88b591f2014-08-28 16:48:57 -070073 EXPECT_TRUE(utils::MakeTempFile("b_img.XXXXXX", &b_img, nullptr));
Thieu Le5c7d9752010-12-15 16:09:28 -080074 ScopedPathUnlinker b_img_unlinker(b_img);
Alex Vakulenko88b591f2014-08-28 16:48:57 -070075 EXPECT_TRUE(utils::MakeTempFile("data_file.XXXXXX", &data_file, nullptr));
Thieu Le5c7d9752010-12-15 16:09:28 -080076 ScopedPathUnlinker data_file_unlinker(data_file);
77
78 const size_t image_size = (256 * 1024 * 1024); // Enough for 2 block groups
79 const int block_size = 4096;
80 CreateEmptyExtImageAtPath(a_img, image_size, block_size);
81
82 // Create a file large enough to create an indirect block
83 {
84 string a_img_mnt;
Alex Deymo10875d92014-11-10 21:52:57 -080085 test_utils::ScopedLoopMounter a_img_mount(a_img, &a_img_mnt, 0);
86 test_utils::System(
87 base::StringPrintf("dd if=/dev/zero of=%s/test_file bs=%d count=%d",
88 a_img_mnt.c_str(), block_size,
89 EXT2_NDIR_BLOCKS + 1));
Thieu Le5c7d9752010-12-15 16:09:28 -080090 }
91
Alex Deymo10875d92014-11-10 21:52:57 -080092 test_utils::System(
93 base::StringPrintf("cp %s %s", a_img.c_str(), b_img.c_str()));
Thieu Le5c7d9752010-12-15 16:09:28 -080094
95 int fd = open(data_file.c_str(), O_RDWR | O_CREAT, S_IRWXU);
96 EXPECT_NE(fd, -1);
97 ScopedFdCloser fd_closer(&fd);
98
99 Graph graph;
100 vector<Block> blocks(image_size / block_size);
101 off_t data_file_size;
102 EXPECT_TRUE(Metadata::DeltaReadMetadata(&graph,
103 &blocks,
104 a_img,
105 b_img,
106 fd,
107 &data_file_size));
108
109 // There are 12 metadata that we look for:
110 // - Block group 0 metadata (superblock, group descriptor, bitmaps, etc)
111 // - Chunk 0, 1, 2, 3
112 // - Block group 1 metadata
113 // - Chunk 0, 1, 2, 3
114 // - Root directory (inode 2)
115 // - Journal (inode 8)
116 // - lost+found directory (inode 11)
117 // - test_file indirect block (inode 12)
118 struct {
119 string metadata_name;
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700120 off_t start_block; // Set to -1 to skip start block verification
121 off_t num_blocks; // Set to -1 to skip num blocks verification
Thieu Le5c7d9752010-12-15 16:09:28 -0800122 } exp_results[] =
Thieu Lef6502192011-01-05 14:34:22 -0800123 {{"<rootfs-bg-0-0-metadata>", 0, 104},
124 {"<rootfs-bg-0-1-metadata>", 104, 104},
125 {"<rootfs-bg-0-2-metadata>", 208, 104},
126 {"<rootfs-bg-0-3-metadata>", 312, 104},
127 {"<rootfs-bg-0-4-metadata>", 416, 104},
128 {"<rootfs-bg-0-5-metadata>", 520, 104},
129 {"<rootfs-bg-0-6-metadata>", 624, 104},
130 {"<rootfs-bg-0-7-metadata>", 728, 104},
131 {"<rootfs-bg-0-8-metadata>", 832, 104},
132 {"<rootfs-bg-0-9-metadata>", 936, 107},
133 {"<rootfs-bg-1-0-metadata>", 32768, 104},
134 {"<rootfs-bg-1-1-metadata>", 32872, 104},
135 {"<rootfs-bg-1-2-metadata>", 32976, 104},
136 {"<rootfs-bg-1-3-metadata>", 33080, 104},
137 {"<rootfs-bg-1-4-metadata>", 33184, 104},
138 {"<rootfs-bg-1-5-metadata>", 33288, 104},
139 {"<rootfs-bg-1-6-metadata>", 33392, 104},
140 {"<rootfs-bg-1-7-metadata>", 33496, 104},
141 {"<rootfs-bg-1-8-metadata>", 33600, 104},
142 {"<rootfs-bg-1-9-metadata>", 33704, 107},
Thieu Le5c7d9752010-12-15 16:09:28 -0800143 {"<rootfs-inode-2-metadata>", -1, 1},
144 {"<rootfs-inode-8-metadata>", -1, 4101},
145 {"<rootfs-inode-11-metadata>", -1, 4},
146 {"<rootfs-inode-12-metadata>", -1, 1}};
147
148 int num_exp_results = sizeof(exp_results) / sizeof(exp_results[0]);
149 EXPECT_EQ(graph.size(), num_exp_results);
150
151 for (int i = 0; i < num_exp_results; i++) {
152 Vertex& vertex = graph[i];
153 DeltaArchiveManifest_InstallOperation& op = vertex.op;
154
155 EXPECT_STRCASEEQ(vertex.file_name.c_str(),
156 exp_results[i].metadata_name.c_str());
157
158 EXPECT_EQ(op.src_extents().size(), op.dst_extents().size());
159 for (int e = 0; e < op.src_extents().size(); e++) {
160 EXPECT_EQ(op.src_extents(e).start_block(),
161 op.dst_extents(e).start_block());
162 EXPECT_EQ(op.src_extents(e).num_blocks(),
163 op.dst_extents(e).num_blocks());
164 }
165
166 if (exp_results[i].start_block != -1) {
167 EXPECT_EQ(op.src_extents(0).start_block(), exp_results[i].start_block);
168 }
169
170 if (exp_results[i].num_blocks != -1) {
171 EXPECT_EQ(op.src_extents(0).num_blocks(), exp_results[i].num_blocks);
172 }
173 }
174}
175
176} // namespace chromeos_update_engine