extent_utils_unittest.cc revision 14158570d3995008dc93a628004118b87a6bca01
1// Copyright 2015 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 "update_engine/payload_generator/extent_utils.h" 6 7#include <utility> 8#include <vector> 9 10#include <gtest/gtest.h> 11 12#include "update_engine/payload_constants.h" 13#include "update_engine/payload_generator/extent_ranges.h" 14#include "update_engine/test_utils.h" 15 16using std::vector; 17 18namespace chromeos_update_engine { 19 20class ExtentUtilsTest : public ::testing::Test {}; 21 22TEST(ExtentUtilsTest, AppendSparseToExtentsTest) { 23 vector<Extent> extents; 24 25 EXPECT_EQ(0, extents.size()); 26 AppendBlockToExtents(&extents, kSparseHole); 27 EXPECT_EQ(1, extents.size()); 28 AppendBlockToExtents(&extents, 0); 29 EXPECT_EQ(2, extents.size()); 30 AppendBlockToExtents(&extents, kSparseHole); 31 AppendBlockToExtents(&extents, kSparseHole); 32 33 ASSERT_EQ(3, extents.size()); 34 EXPECT_EQ(kSparseHole, extents[0].start_block()); 35 EXPECT_EQ(1, extents[0].num_blocks()); 36 EXPECT_EQ(0, extents[1].start_block()); 37 EXPECT_EQ(1, extents[1].num_blocks()); 38 EXPECT_EQ(kSparseHole, extents[2].start_block()); 39 EXPECT_EQ(2, extents[2].num_blocks()); 40} 41 42TEST(ExtentUtilsTest, BlocksInExtentsTest) { 43 { 44 vector<Extent> extents; 45 EXPECT_EQ(0, BlocksInExtents(extents)); 46 extents.push_back(ExtentForRange(0, 1)); 47 EXPECT_EQ(1, BlocksInExtents(extents)); 48 extents.push_back(ExtentForRange(23, 55)); 49 EXPECT_EQ(56, BlocksInExtents(extents)); 50 extents.push_back(ExtentForRange(1, 2)); 51 EXPECT_EQ(58, BlocksInExtents(extents)); 52 } 53 { 54 google::protobuf::RepeatedPtrField<Extent> extents; 55 EXPECT_EQ(0, BlocksInExtents(extents)); 56 *extents.Add() = ExtentForRange(0, 1); 57 EXPECT_EQ(1, BlocksInExtents(extents)); 58 *extents.Add() = ExtentForRange(23, 55); 59 EXPECT_EQ(56, BlocksInExtents(extents)); 60 *extents.Add() = ExtentForRange(1, 2); 61 EXPECT_EQ(58, BlocksInExtents(extents)); 62 } 63} 64 65TEST(ExtentUtilsTest, ExtendExtentsTest) { 66 DeltaArchiveManifest_InstallOperation first_op; 67 *(first_op.add_src_extents()) = ExtentForRange(1, 1); 68 *(first_op.add_src_extents()) = ExtentForRange(3, 1); 69 70 DeltaArchiveManifest_InstallOperation second_op; 71 *(second_op.add_src_extents()) = ExtentForRange(4, 2); 72 *(second_op.add_src_extents()) = ExtentForRange(8, 2); 73 74 ExtendExtents(first_op.mutable_src_extents(), second_op.src_extents()); 75 vector<Extent> first_op_vec; 76 ExtentsToVector(first_op.src_extents(), &first_op_vec); 77 EXPECT_EQ((vector<Extent>{ 78 ExtentForRange(1, 1), 79 ExtentForRange(3, 3), 80 ExtentForRange(8, 2)}), first_op_vec); 81} 82 83TEST(ExtentUtilsTest, NormalizeExtentsSimpleList) { 84 // Make sure it works when there's just one extent. 85 vector<Extent> extents; 86 NormalizeExtents(&extents); 87 EXPECT_EQ(0, extents.size()); 88 89 extents = { ExtentForRange(0, 3) }; 90 NormalizeExtents(&extents); 91 EXPECT_EQ(1, extents.size()); 92 EXPECT_EQ(ExtentForRange(0, 3), extents[0]); 93} 94 95TEST(ExtentUtilsTest, NormalizeExtentsTest) { 96 vector<Extent> extents = { 97 ExtentForRange(0, 3), 98 ExtentForRange(3, 2), 99 ExtentForRange(5, 1), 100 ExtentForRange(8, 4), 101 ExtentForRange(13, 1), 102 ExtentForRange(14, 2) 103 }; 104 NormalizeExtents(&extents); 105 EXPECT_EQ(3, extents.size()); 106 EXPECT_EQ(ExtentForRange(0, 6), extents[0]); 107 EXPECT_EQ(ExtentForRange(8, 4), extents[1]); 108 EXPECT_EQ(ExtentForRange(13, 3), extents[2]); 109} 110 111TEST(ExtentUtilsTest, ExtentsSublistTest) { 112 vector<Extent> extents = { 113 ExtentForRange(10, 10), 114 ExtentForRange(30, 10), 115 ExtentForRange(50, 10) 116 }; 117 118 // Simple empty result cases. 119 EXPECT_EQ(vector<Extent>(), 120 ExtentsSublist(extents, 1000, 20)); 121 EXPECT_EQ(vector<Extent>(), 122 ExtentsSublist(extents, 5, 0)); 123 EXPECT_EQ(vector<Extent>(), 124 ExtentsSublist(extents, 30, 1)); 125 126 // Normal test cases. 127 EXPECT_EQ(vector<Extent>{ ExtentForRange(13, 2) }, 128 ExtentsSublist(extents, 3, 2)); 129 EXPECT_EQ(vector<Extent>{ ExtentForRange(15, 5) }, 130 ExtentsSublist(extents, 5, 5)); 131 EXPECT_EQ((vector<Extent>{ ExtentForRange(15, 5), ExtentForRange(30, 5) }), 132 ExtentsSublist(extents, 5, 10)); 133 EXPECT_EQ((vector<Extent>{ 134 ExtentForRange(13, 7), 135 ExtentForRange(30, 10), 136 ExtentForRange(50, 3), }), 137 ExtentsSublist(extents, 3, 20)); 138 139 // Extact match case. 140 EXPECT_EQ(vector<Extent>{ ExtentForRange(30, 10) }, 141 ExtentsSublist(extents, 10, 10)); 142 EXPECT_EQ(vector<Extent>{ ExtentForRange(50, 10) }, 143 ExtentsSublist(extents, 20, 10)); 144 145 // Cases where the requested num_blocks is too big. 146 EXPECT_EQ(vector<Extent>{ ExtentForRange(53, 7) }, 147 ExtentsSublist(extents, 23, 100)); 148 EXPECT_EQ((vector<Extent>{ ExtentForRange(34, 6), ExtentForRange(50, 10) }), 149 ExtentsSublist(extents, 14, 100)); 150} 151 152} // namespace chromeos_update_engine 153