extent_utils_unittest.cc revision 1beda780333ce51d7872603b70712772eb2383fb
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, NormalizeExtentsSimpleList) { 66 // Make sure it works when there's just one extent. 67 vector<Extent> extents; 68 NormalizeExtents(&extents); 69 EXPECT_EQ(0, extents.size()); 70 71 extents = { ExtentForRange(0, 3) }; 72 NormalizeExtents(&extents); 73 EXPECT_EQ(1, extents.size()); 74 EXPECT_EQ(ExtentForRange(0, 3), extents[0]); 75} 76 77TEST(ExtentUtilsTest, NormalizeExtentsTest) { 78 vector<Extent> extents = { 79 ExtentForRange(0, 3), 80 ExtentForRange(3, 2), 81 ExtentForRange(5, 1), 82 ExtentForRange(8, 4), 83 ExtentForRange(13, 1), 84 ExtentForRange(14, 2) 85 }; 86 NormalizeExtents(&extents); 87 EXPECT_EQ(3, extents.size()); 88 EXPECT_EQ(ExtentForRange(0, 6), extents[0]); 89 EXPECT_EQ(ExtentForRange(8, 4), extents[1]); 90 EXPECT_EQ(ExtentForRange(13, 3), extents[2]); 91} 92 93TEST(ExtentUtilsTest, ExtentsSublistTest) { 94 vector<Extent> extents = { 95 ExtentForRange(10, 10), 96 ExtentForRange(30, 10), 97 ExtentForRange(50, 10) 98 }; 99 100 // Simple empty result cases. 101 EXPECT_EQ(vector<Extent>(), 102 ExtentsSublist(extents, 1000, 20)); 103 EXPECT_EQ(vector<Extent>(), 104 ExtentsSublist(extents, 5, 0)); 105 EXPECT_EQ(vector<Extent>(), 106 ExtentsSublist(extents, 30, 1)); 107 108 // Normal test cases. 109 EXPECT_EQ(vector<Extent>{ ExtentForRange(13, 2) }, 110 ExtentsSublist(extents, 3, 2)); 111 EXPECT_EQ(vector<Extent>{ ExtentForRange(15, 5) }, 112 ExtentsSublist(extents, 5, 5)); 113 EXPECT_EQ((vector<Extent>{ ExtentForRange(15, 5), ExtentForRange(30, 5) }), 114 ExtentsSublist(extents, 5, 10)); 115 EXPECT_EQ((vector<Extent>{ 116 ExtentForRange(13, 7), 117 ExtentForRange(30, 10), 118 ExtentForRange(50, 3), }), 119 ExtentsSublist(extents, 3, 20)); 120 121 // Extact match case. 122 EXPECT_EQ(vector<Extent>{ ExtentForRange(30, 10) }, 123 ExtentsSublist(extents, 10, 10)); 124 EXPECT_EQ(vector<Extent>{ ExtentForRange(50, 10) }, 125 ExtentsSublist(extents, 20, 10)); 126 127 // Cases where the requested num_blocks is too big. 128 EXPECT_EQ(vector<Extent>{ ExtentForRange(53, 7) }, 129 ExtentsSublist(extents, 23, 100)); 130 EXPECT_EQ((vector<Extent>{ ExtentForRange(34, 6), ExtentForRange(50, 10) }), 131 ExtentsSublist(extents, 14, 100)); 132} 133 134} // namespace chromeos_update_engine 135