extent_utils_unittest.cc revision 39910dcd1d68987ccee7c3031dc269233a8490bb
1// 2// Copyright (C) 2015 The Android Open Source Project 3// 4// Licensed under the Apache License, Version 2.0 (the "License"); 5// you may not use this file except in compliance with the License. 6// You may obtain a copy of the License at 7// 8// http://www.apache.org/licenses/LICENSE-2.0 9// 10// Unless required by applicable law or agreed to in writing, software 11// distributed under the License is distributed on an "AS IS" BASIS, 12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13// See the License for the specific language governing permissions and 14// limitations under the License. 15// 16 17#include "update_engine/payload_generator/extent_utils.h" 18 19#include <utility> 20#include <vector> 21 22#include <gtest/gtest.h> 23 24#include "update_engine/common/test_utils.h" 25#include "update_engine/payload_consumer/payload_constants.h" 26#include "update_engine/payload_generator/extent_ranges.h" 27 28using std::vector; 29 30namespace chromeos_update_engine { 31 32class ExtentUtilsTest : public ::testing::Test {}; 33 34TEST(ExtentUtilsTest, AppendSparseToExtentsTest) { 35 vector<Extent> extents; 36 37 EXPECT_EQ(0, extents.size()); 38 AppendBlockToExtents(&extents, kSparseHole); 39 EXPECT_EQ(1, extents.size()); 40 AppendBlockToExtents(&extents, 0); 41 EXPECT_EQ(2, extents.size()); 42 AppendBlockToExtents(&extents, kSparseHole); 43 AppendBlockToExtents(&extents, kSparseHole); 44 45 ASSERT_EQ(3, extents.size()); 46 EXPECT_EQ(kSparseHole, extents[0].start_block()); 47 EXPECT_EQ(1, extents[0].num_blocks()); 48 EXPECT_EQ(0, extents[1].start_block()); 49 EXPECT_EQ(1, extents[1].num_blocks()); 50 EXPECT_EQ(kSparseHole, extents[2].start_block()); 51 EXPECT_EQ(2, extents[2].num_blocks()); 52} 53 54TEST(ExtentUtilsTest, BlocksInExtentsTest) { 55 { 56 vector<Extent> extents; 57 EXPECT_EQ(0, BlocksInExtents(extents)); 58 extents.push_back(ExtentForRange(0, 1)); 59 EXPECT_EQ(1, BlocksInExtents(extents)); 60 extents.push_back(ExtentForRange(23, 55)); 61 EXPECT_EQ(56, BlocksInExtents(extents)); 62 extents.push_back(ExtentForRange(1, 2)); 63 EXPECT_EQ(58, BlocksInExtents(extents)); 64 } 65 { 66 google::protobuf::RepeatedPtrField<Extent> extents; 67 EXPECT_EQ(0, BlocksInExtents(extents)); 68 *extents.Add() = ExtentForRange(0, 1); 69 EXPECT_EQ(1, BlocksInExtents(extents)); 70 *extents.Add() = ExtentForRange(23, 55); 71 EXPECT_EQ(56, BlocksInExtents(extents)); 72 *extents.Add() = ExtentForRange(1, 2); 73 EXPECT_EQ(58, BlocksInExtents(extents)); 74 } 75} 76 77TEST(ExtentUtilsTest, ExtendExtentsTest) { 78 InstallOperation first_op; 79 *(first_op.add_src_extents()) = ExtentForRange(1, 1); 80 *(first_op.add_src_extents()) = ExtentForRange(3, 1); 81 82 InstallOperation second_op; 83 *(second_op.add_src_extents()) = ExtentForRange(4, 2); 84 *(second_op.add_src_extents()) = ExtentForRange(8, 2); 85 86 ExtendExtents(first_op.mutable_src_extents(), second_op.src_extents()); 87 vector<Extent> first_op_vec; 88 ExtentsToVector(first_op.src_extents(), &first_op_vec); 89 EXPECT_EQ((vector<Extent>{ 90 ExtentForRange(1, 1), 91 ExtentForRange(3, 3), 92 ExtentForRange(8, 2)}), first_op_vec); 93} 94 95TEST(ExtentUtilsTest, NormalizeExtentsSimpleList) { 96 // Make sure it works when there's just one extent. 97 vector<Extent> extents; 98 NormalizeExtents(&extents); 99 EXPECT_EQ(0, extents.size()); 100 101 extents = { ExtentForRange(0, 3) }; 102 NormalizeExtents(&extents); 103 EXPECT_EQ(1, extents.size()); 104 EXPECT_EQ(ExtentForRange(0, 3), extents[0]); 105} 106 107TEST(ExtentUtilsTest, NormalizeExtentsTest) { 108 vector<Extent> extents = { 109 ExtentForRange(0, 3), 110 ExtentForRange(3, 2), 111 ExtentForRange(5, 1), 112 ExtentForRange(8, 4), 113 ExtentForRange(13, 1), 114 ExtentForRange(14, 2) 115 }; 116 NormalizeExtents(&extents); 117 EXPECT_EQ(3, extents.size()); 118 EXPECT_EQ(ExtentForRange(0, 6), extents[0]); 119 EXPECT_EQ(ExtentForRange(8, 4), extents[1]); 120 EXPECT_EQ(ExtentForRange(13, 3), extents[2]); 121} 122 123TEST(ExtentUtilsTest, ExtentsSublistTest) { 124 vector<Extent> extents = { 125 ExtentForRange(10, 10), 126 ExtentForRange(30, 10), 127 ExtentForRange(50, 10) 128 }; 129 130 // Simple empty result cases. 131 EXPECT_EQ(vector<Extent>(), 132 ExtentsSublist(extents, 1000, 20)); 133 EXPECT_EQ(vector<Extent>(), 134 ExtentsSublist(extents, 5, 0)); 135 EXPECT_EQ(vector<Extent>(), 136 ExtentsSublist(extents, 30, 1)); 137 138 // Normal test cases. 139 EXPECT_EQ(vector<Extent>{ ExtentForRange(13, 2) }, 140 ExtentsSublist(extents, 3, 2)); 141 EXPECT_EQ(vector<Extent>{ ExtentForRange(15, 5) }, 142 ExtentsSublist(extents, 5, 5)); 143 EXPECT_EQ((vector<Extent>{ ExtentForRange(15, 5), ExtentForRange(30, 5) }), 144 ExtentsSublist(extents, 5, 10)); 145 EXPECT_EQ((vector<Extent>{ 146 ExtentForRange(13, 7), 147 ExtentForRange(30, 10), 148 ExtentForRange(50, 3), }), 149 ExtentsSublist(extents, 3, 20)); 150 151 // Extact match case. 152 EXPECT_EQ(vector<Extent>{ ExtentForRange(30, 10) }, 153 ExtentsSublist(extents, 10, 10)); 154 EXPECT_EQ(vector<Extent>{ ExtentForRange(50, 10) }, 155 ExtentsSublist(extents, 20, 10)); 156 157 // Cases where the requested num_blocks is too big. 158 EXPECT_EQ(vector<Extent>{ ExtentForRange(53, 7) }, 159 ExtentsSublist(extents, 23, 100)); 160 EXPECT_EQ((vector<Extent>{ ExtentForRange(34, 6), ExtentForRange(50, 10) }), 161 ExtentsSublist(extents, 14, 100)); 162} 163 164} // namespace chromeos_update_engine 165