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