blob: e7972cd58c9f987f93575f2891465d80499b2478 [file] [log] [blame]
Kelvin Zhangd567c8b2021-07-08 14:10:23 -04001//
2// Copyright (C) 2021 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 <gtest/gtest.h>
18#include <optional>
19
20#include "update_engine/payload_consumer/extent_map.h"
21#include "update_engine/payload_generator/extent_ranges.h"
22#include "update_engine/payload_generator/extent_utils.h"
23
24namespace chromeos_update_engine {
25
26class ExtentMapTest : public ::testing::Test {
27 public:
28 ExtentMap<int> map_;
29};
30
31TEST_F(ExtentMapTest, QueryExactExtent) {
32 ASSERT_TRUE(map_.AddExtent(ExtentForRange(0, 5), 7));
33 ASSERT_TRUE(map_.AddExtent(ExtentForRange(10, 5), 1));
34 auto ret = map_.Get(ExtentForRange(0, 5));
35 ASSERT_NE(ret, std::nullopt);
36 ASSERT_EQ(*ret, 7);
37}
38
39TEST_F(ExtentMapTest, QuerySubset) {
40 ASSERT_TRUE(map_.AddExtent(ExtentForRange(0, 5), 7));
41 ASSERT_TRUE(map_.AddExtent(ExtentForRange(10, 5), 1));
42 auto ret = map_.Get(ExtentForRange(1, 2));
43 ASSERT_EQ(ret, std::nullopt);
44}
45
46TEST_F(ExtentMapTest, QueryTouching) {
47 ASSERT_TRUE(map_.AddExtent(ExtentForRange(0, 5), 7));
48 ASSERT_TRUE(map_.AddExtent(ExtentForRange(10, 5), 1));
49 auto ret = map_.Get(ExtentForRange(3, 2));
50 ASSERT_EQ(ret, std::nullopt);
51 ret = map_.Get(ExtentForRange(4, 1));
52 ASSERT_EQ(ret, std::nullopt);
53 ret = map_.Get(ExtentForRange(5, 5));
54 ASSERT_EQ(ret, std::nullopt);
55 ret = map_.Get(ExtentForRange(5, 6));
56 ASSERT_EQ(ret, std::nullopt);
57}
58
59TEST_F(ExtentMapTest, GetIntersectingExtents) {
60 ASSERT_TRUE(map_.AddExtent(ExtentForRange(0, 5), 7));
61 ASSERT_TRUE(map_.AddExtent(ExtentForRange(10, 5), 7));
62 auto ret = std::vector<Extent>{};
63 ret = map_.GetIntersectingExtents(ExtentForRange(2, 10));
64 ASSERT_EQ(ret.size(), 2U);
65 ASSERT_EQ(ret[0].start_block(), 2U);
66 ASSERT_EQ(ret[0].num_blocks(), 3U);
67
68 ASSERT_EQ(ret[1].start_block(), 10U);
69 ASSERT_EQ(ret[1].num_blocks(), 2U);
70
71 ret = map_.GetIntersectingExtents(ExtentForRange(2, 17));
72 ASSERT_EQ(ret.size(), 2U);
73 ASSERT_EQ(ret[0].start_block(), 2U);
74 ASSERT_EQ(ret[0].num_blocks(), 3U);
75
76 ASSERT_EQ(ret[1].start_block(), 10U);
77 ASSERT_EQ(ret[1].num_blocks(), 5U);
78
79 ret = map_.GetIntersectingExtents(ExtentForRange(2, 2));
80 ASSERT_EQ(ret, std::vector<Extent>{ExtentForRange(2, 2)});
81
82 ret = map_.GetIntersectingExtents(ExtentForRange(10, 5));
83 ASSERT_EQ(ret, std::vector<Extent>{ExtentForRange(10, 5)});
84
85 ASSERT_TRUE(map_.AddExtent(ExtentForRange(20, 5), 7));
86 ret = map_.GetIntersectingExtents(ExtentForRange(0, 30));
87 ASSERT_EQ(ret.size(), 3U);
88 ASSERT_EQ(ret[0].start_block(), 0U);
89 ASSERT_EQ(ret[0].num_blocks(), 5U);
90
91 ASSERT_EQ(ret[1].start_block(), 10U);
92 ASSERT_EQ(ret[1].num_blocks(), 5U);
93
94 ASSERT_EQ(ret[2].start_block(), 20U);
95 ASSERT_EQ(ret[2].num_blocks(), 5U);
96}
97
98TEST_F(ExtentMapTest, GetNonIntersectingExtents) {
99 ASSERT_TRUE(map_.AddExtent(ExtentForRange(0, 5), 7));
100 ASSERT_TRUE(map_.AddExtent(ExtentForRange(10, 5), 7));
101 ASSERT_TRUE(map_.AddExtent(ExtentForRange(20, 5), 7));
102
103 auto ret = std::vector<Extent>{};
104 ret = map_.GetNonIntersectingExtents(ExtentForRange(2, 13));
105
106 ASSERT_EQ(ret.size(), 1U);
107 ASSERT_EQ(ret[0].start_block(), 5U);
108 ASSERT_EQ(ret[0].num_blocks(), 5U);
109
110 ret = map_.GetNonIntersectingExtents(ExtentForRange(7, 20));
111 ASSERT_EQ(ret.size(), 3U);
112 ASSERT_EQ(ret[0].start_block(), 7U);
113 ASSERT_EQ(ret[0].num_blocks(), 3U);
114
115 ASSERT_EQ(ret[1].start_block(), 15U);
116 ASSERT_EQ(ret[1].num_blocks(), 5U);
117
118 ASSERT_EQ(ret[2].start_block(), 25U);
119 ASSERT_EQ(ret[2].num_blocks(), 2U);
120}
121
122} // namespace chromeos_update_engine