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