Alex Deymo | aea4c1c | 2015-08-19 20:24:43 -0700 | [diff] [blame] | 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 | // |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 16 | |
| 17 | #include "update_engine/payload_generator/extent_utils.h" |
| 18 | |
| 19 | #include <utility> |
| 20 | #include <vector> |
| 21 | |
| 22 | #include <gtest/gtest.h> |
| 23 | |
Alex Deymo | 39910dc | 2015-11-09 17:04:30 -0800 | [diff] [blame] | 24 | #include "update_engine/common/test_utils.h" |
| 25 | #include "update_engine/payload_consumer/payload_constants.h" |
Alex Deymo | 1beda78 | 2015-06-07 23:01:25 +0200 | [diff] [blame] | 26 | #include "update_engine/payload_generator/extent_ranges.h" |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 27 | |
| 28 | using std::vector; |
| 29 | |
| 30 | namespace chromeos_update_engine { |
| 31 | |
| 32 | class ExtentUtilsTest : public ::testing::Test {}; |
| 33 | |
| 34 | TEST(ExtentUtilsTest, AppendSparseToExtentsTest) { |
| 35 | vector<Extent> extents; |
| 36 | |
Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 37 | EXPECT_EQ(0U, extents.size()); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 38 | AppendBlockToExtents(&extents, kSparseHole); |
Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 39 | EXPECT_EQ(1U, extents.size()); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 40 | AppendBlockToExtents(&extents, 0); |
Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 41 | EXPECT_EQ(2U, extents.size()); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 42 | AppendBlockToExtents(&extents, kSparseHole); |
| 43 | AppendBlockToExtents(&extents, kSparseHole); |
| 44 | |
Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 45 | ASSERT_EQ(3U, extents.size()); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 46 | EXPECT_EQ(kSparseHole, extents[0].start_block()); |
Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 47 | EXPECT_EQ(1U, extents[0].num_blocks()); |
| 48 | EXPECT_EQ(0U, extents[1].start_block()); |
| 49 | EXPECT_EQ(1U, extents[1].num_blocks()); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 50 | EXPECT_EQ(kSparseHole, extents[2].start_block()); |
Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 51 | EXPECT_EQ(2U, extents[2].num_blocks()); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 52 | } |
| 53 | |
| 54 | TEST(ExtentUtilsTest, BlocksInExtentsTest) { |
| 55 | { |
| 56 | vector<Extent> extents; |
Amin Hassani | d8b67f4 | 2017-12-06 13:47:52 -0800 | [diff] [blame] | 57 | EXPECT_EQ(0U, utils::BlocksInExtents(extents)); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 58 | extents.push_back(ExtentForRange(0, 1)); |
Amin Hassani | d8b67f4 | 2017-12-06 13:47:52 -0800 | [diff] [blame] | 59 | EXPECT_EQ(1U, utils::BlocksInExtents(extents)); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 60 | extents.push_back(ExtentForRange(23, 55)); |
Amin Hassani | d8b67f4 | 2017-12-06 13:47:52 -0800 | [diff] [blame] | 61 | EXPECT_EQ(56U, utils::BlocksInExtents(extents)); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 62 | extents.push_back(ExtentForRange(1, 2)); |
Amin Hassani | d8b67f4 | 2017-12-06 13:47:52 -0800 | [diff] [blame] | 63 | EXPECT_EQ(58U, utils::BlocksInExtents(extents)); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 64 | } |
| 65 | { |
| 66 | google::protobuf::RepeatedPtrField<Extent> extents; |
Amin Hassani | d8b67f4 | 2017-12-06 13:47:52 -0800 | [diff] [blame] | 67 | EXPECT_EQ(0U, utils::BlocksInExtents(extents)); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 68 | *extents.Add() = ExtentForRange(0, 1); |
Amin Hassani | d8b67f4 | 2017-12-06 13:47:52 -0800 | [diff] [blame] | 69 | EXPECT_EQ(1U, utils::BlocksInExtents(extents)); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 70 | *extents.Add() = ExtentForRange(23, 55); |
Amin Hassani | d8b67f4 | 2017-12-06 13:47:52 -0800 | [diff] [blame] | 71 | EXPECT_EQ(56U, utils::BlocksInExtents(extents)); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 72 | *extents.Add() = ExtentForRange(1, 2); |
Amin Hassani | d8b67f4 | 2017-12-06 13:47:52 -0800 | [diff] [blame] | 73 | EXPECT_EQ(58U, utils::BlocksInExtents(extents)); |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 74 | } |
| 75 | } |
| 76 | |
Alex Deymo | 1415857 | 2015-06-13 03:37:08 -0700 | [diff] [blame] | 77 | TEST(ExtentUtilsTest, ExtendExtentsTest) { |
Alex Deymo | a12ee11 | 2015-08-12 22:19:32 -0700 | [diff] [blame] | 78 | InstallOperation first_op; |
Alex Deymo | 1415857 | 2015-06-13 03:37:08 -0700 | [diff] [blame] | 79 | *(first_op.add_src_extents()) = ExtentForRange(1, 1); |
| 80 | *(first_op.add_src_extents()) = ExtentForRange(3, 1); |
| 81 | |
Alex Deymo | a12ee11 | 2015-08-12 22:19:32 -0700 | [diff] [blame] | 82 | InstallOperation second_op; |
Alex Deymo | 1415857 | 2015-06-13 03:37:08 -0700 | [diff] [blame] | 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); |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 89 | EXPECT_EQ( |
| 90 | (vector<Extent>{ |
| 91 | ExtentForRange(1, 1), ExtentForRange(3, 3), ExtentForRange(8, 2)}), |
| 92 | first_op_vec); |
Alex Deymo | 1415857 | 2015-06-13 03:37:08 -0700 | [diff] [blame] | 93 | } |
| 94 | |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 95 | TEST(ExtentUtilsTest, NormalizeExtentsSimpleList) { |
| 96 | // Make sure it works when there's just one extent. |
| 97 | vector<Extent> extents; |
| 98 | NormalizeExtents(&extents); |
Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 99 | EXPECT_EQ(0U, extents.size()); |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 100 | |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 101 | extents = {ExtentForRange(0, 3)}; |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 102 | NormalizeExtents(&extents); |
Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 103 | EXPECT_EQ(1U, extents.size()); |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 104 | EXPECT_EQ(ExtentForRange(0, 3), extents[0]); |
| 105 | } |
| 106 | |
| 107 | TEST(ExtentUtilsTest, NormalizeExtentsTest) { |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 108 | vector<Extent> extents = {ExtentForRange(0, 3), |
| 109 | ExtentForRange(3, 2), |
| 110 | ExtentForRange(5, 1), |
| 111 | ExtentForRange(8, 4), |
| 112 | ExtentForRange(13, 1), |
| 113 | ExtentForRange(14, 2)}; |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 114 | NormalizeExtents(&extents); |
Alex Deymo | 80f70ff | 2016-02-10 16:08:11 -0800 | [diff] [blame] | 115 | EXPECT_EQ(3U, extents.size()); |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 116 | EXPECT_EQ(ExtentForRange(0, 6), extents[0]); |
| 117 | EXPECT_EQ(ExtentForRange(8, 4), extents[1]); |
| 118 | EXPECT_EQ(ExtentForRange(13, 3), extents[2]); |
| 119 | } |
| 120 | |
| 121 | TEST(ExtentUtilsTest, ExtentsSublistTest) { |
| 122 | vector<Extent> extents = { |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 123 | ExtentForRange(10, 10), ExtentForRange(30, 10), ExtentForRange(50, 10)}; |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 124 | |
| 125 | // Simple empty result cases. |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 126 | EXPECT_EQ(vector<Extent>(), ExtentsSublist(extents, 1000, 20)); |
| 127 | EXPECT_EQ(vector<Extent>(), ExtentsSublist(extents, 5, 0)); |
| 128 | EXPECT_EQ(vector<Extent>(), ExtentsSublist(extents, 30, 1)); |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 129 | |
| 130 | // Normal test cases. |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 131 | EXPECT_EQ(vector<Extent>{ExtentForRange(13, 2)}, |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 132 | ExtentsSublist(extents, 3, 2)); |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 133 | EXPECT_EQ(vector<Extent>{ExtentForRange(15, 5)}, |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 134 | ExtentsSublist(extents, 5, 5)); |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 135 | EXPECT_EQ((vector<Extent>{ExtentForRange(15, 5), ExtentForRange(30, 5)}), |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 136 | ExtentsSublist(extents, 5, 10)); |
| 137 | EXPECT_EQ((vector<Extent>{ |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 138 | ExtentForRange(13, 7), |
| 139 | ExtentForRange(30, 10), |
| 140 | ExtentForRange(50, 3), |
| 141 | }), |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 142 | ExtentsSublist(extents, 3, 20)); |
| 143 | |
| 144 | // Extact match case. |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 145 | EXPECT_EQ(vector<Extent>{ExtentForRange(30, 10)}, |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 146 | ExtentsSublist(extents, 10, 10)); |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 147 | EXPECT_EQ(vector<Extent>{ExtentForRange(50, 10)}, |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 148 | ExtentsSublist(extents, 20, 10)); |
| 149 | |
| 150 | // Cases where the requested num_blocks is too big. |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 151 | EXPECT_EQ(vector<Extent>{ExtentForRange(53, 7)}, |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 152 | ExtentsSublist(extents, 23, 100)); |
Amin Hassani | 232f8f9 | 2019-01-14 16:15:31 -0800 | [diff] [blame] | 153 | EXPECT_EQ((vector<Extent>{ExtentForRange(34, 6), ExtentForRange(50, 10)}), |
Alex Deymo | 52490e7 | 2015-06-04 14:53:44 +0200 | [diff] [blame] | 154 | ExtentsSublist(extents, 14, 100)); |
| 155 | } |
| 156 | |
Alex Deymo | 5c6c655 | 2015-06-03 19:06:50 +0200 | [diff] [blame] | 157 | } // namespace chromeos_update_engine |