2 * This file is open source software, licensed to you under the terms
3 * of the Apache License, Version 2.0 (the "License"). See the NOTICE file
4 * distributed with this work for additional information regarding copyright
5 * ownership. You may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing,
12 * software distributed under the License is distributed on an
13 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 * KIND, either express or implied. See the License for the
15 * specific language governing permissions and limitations
20 * Copyright (C) 2016 ScyllaDB
23 #include <seastar/core/thread.hh>
24 #include <seastar/core/manual_clock.hh>
25 #include <seastar/testing/test_case.hh>
26 #include <seastar/core/expiring_fifo.hh>
27 #include <seastar/util/later.hh>
28 #include <boost/range/irange.hpp>
30 using namespace seastar
;
31 using namespace std::chrono_literals
;
33 SEASTAR_TEST_CASE(test_no_expiry_operations
) {
34 expiring_fifo
<int> fifo
;
36 BOOST_REQUIRE(fifo
.empty());
37 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
38 BOOST_REQUIRE(!bool(fifo
));
42 BOOST_REQUIRE(!fifo
.empty());
43 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
44 BOOST_REQUIRE(bool(fifo
));
45 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
50 BOOST_REQUIRE(!fifo
.empty());
51 BOOST_REQUIRE_EQUAL(fifo
.size(), 3u);
52 BOOST_REQUIRE(bool(fifo
));
53 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
57 BOOST_REQUIRE(!fifo
.empty());
58 BOOST_REQUIRE_EQUAL(fifo
.size(), 2u);
59 BOOST_REQUIRE(bool(fifo
));
60 BOOST_REQUIRE_EQUAL(fifo
.front(), 2);
64 BOOST_REQUIRE(!fifo
.empty());
65 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
66 BOOST_REQUIRE(bool(fifo
));
67 BOOST_REQUIRE_EQUAL(fifo
.front(), 3);
71 BOOST_REQUIRE(fifo
.empty());
72 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
73 BOOST_REQUIRE(!bool(fifo
));
75 return make_ready_future
<>();
78 SEASTAR_TEST_CASE(test_expiry_operations
) {
79 return seastar::async([] {
80 std::vector
<int> expired
;
83 void operator()(int& v
) { e
.push_back(v
); }
86 expiring_fifo
<int, my_expiry
, manual_clock
> fifo(my_expiry
{expired
});
88 fifo
.push_back(1, manual_clock::now() + 1s
);
90 BOOST_REQUIRE(!fifo
.empty());
91 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
92 BOOST_REQUIRE(bool(fifo
));
93 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
95 manual_clock::advance(1s
);
98 BOOST_REQUIRE(fifo
.empty());
99 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
100 BOOST_REQUIRE(!bool(fifo
));
101 BOOST_REQUIRE_EQUAL(expired
.size(), 1u);
102 BOOST_REQUIRE_EQUAL(expired
[0], 1);
107 fifo
.push_back(2, manual_clock::now() + 1s
);
110 manual_clock::advance(1s
);
113 BOOST_REQUIRE(!fifo
.empty());
114 BOOST_REQUIRE_EQUAL(fifo
.size(), 2u);
115 BOOST_REQUIRE(bool(fifo
));
116 BOOST_REQUIRE_EQUAL(expired
.size(), 1u);
117 BOOST_REQUIRE_EQUAL(expired
[0], 2);
118 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
120 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
121 BOOST_REQUIRE_EQUAL(fifo
.front(), 3);
123 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
127 fifo
.push_back(1, manual_clock::now() + 1s
);
128 fifo
.push_back(2, manual_clock::now() + 1s
);
130 fifo
.push_back(4, manual_clock::now() + 2s
);
132 manual_clock::advance(1s
);
135 BOOST_REQUIRE(!fifo
.empty());
136 BOOST_REQUIRE_EQUAL(fifo
.size(), 2u);
137 BOOST_REQUIRE(bool(fifo
));
138 BOOST_REQUIRE_EQUAL(expired
.size(), 2u);
139 std::sort(expired
.begin(), expired
.end());
140 BOOST_REQUIRE_EQUAL(expired
[0], 1);
141 BOOST_REQUIRE_EQUAL(expired
[1], 2);
142 BOOST_REQUIRE_EQUAL(fifo
.front(), 3);
144 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
145 BOOST_REQUIRE_EQUAL(fifo
.front(), 4);
147 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
152 fifo
.push_back(2, manual_clock::now() + 1s
);
153 fifo
.push_back(3, manual_clock::now() + 1s
);
154 fifo
.push_back(4, manual_clock::now() + 1s
);
156 manual_clock::advance(1s
);
159 BOOST_REQUIRE(!fifo
.empty());
160 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
161 BOOST_REQUIRE(bool(fifo
));
162 BOOST_REQUIRE_EQUAL(expired
.size(), 3u);
163 std::sort(expired
.begin(), expired
.end());
164 BOOST_REQUIRE_EQUAL(expired
[0], 2);
165 BOOST_REQUIRE_EQUAL(expired
[1], 3);
166 BOOST_REQUIRE_EQUAL(expired
[2], 4);
167 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
169 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
174 fifo
.push_back(2, manual_clock::now() + 1s
);
175 fifo
.push_back(3, manual_clock::now() + 1s
);
176 fifo
.push_back(4, manual_clock::now() + 1s
);
179 manual_clock::advance(1s
);
182 BOOST_REQUIRE_EQUAL(fifo
.size(), 2u);
183 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
185 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
186 BOOST_REQUIRE_EQUAL(fifo
.front(), 5);
188 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);