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