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/testing/test_case.hh>
25 #include <seastar/core/future-util.hh>
26 #include <seastar/core/expiring_fifo.hh>
27 #include <boost/range/irange.hpp>
29 using namespace seastar
;
30 using namespace std::chrono_literals
;
32 SEASTAR_TEST_CASE(test_no_expiry_operations
) {
33 expiring_fifo
<int> fifo
;
35 BOOST_REQUIRE(fifo
.empty());
36 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
37 BOOST_REQUIRE(!bool(fifo
));
41 BOOST_REQUIRE(!fifo
.empty());
42 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
43 BOOST_REQUIRE(bool(fifo
));
44 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
49 BOOST_REQUIRE(!fifo
.empty());
50 BOOST_REQUIRE_EQUAL(fifo
.size(), 3u);
51 BOOST_REQUIRE(bool(fifo
));
52 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
56 BOOST_REQUIRE(!fifo
.empty());
57 BOOST_REQUIRE_EQUAL(fifo
.size(), 2u);
58 BOOST_REQUIRE(bool(fifo
));
59 BOOST_REQUIRE_EQUAL(fifo
.front(), 2);
63 BOOST_REQUIRE(!fifo
.empty());
64 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
65 BOOST_REQUIRE(bool(fifo
));
66 BOOST_REQUIRE_EQUAL(fifo
.front(), 3);
70 BOOST_REQUIRE(fifo
.empty());
71 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
72 BOOST_REQUIRE(!bool(fifo
));
74 return make_ready_future
<>();
77 SEASTAR_TEST_CASE(test_expiry_operations
) {
78 return seastar::async([] {
79 std::vector
<int> expired
;
82 void operator()(int& v
) { e
.push_back(v
); }
85 expiring_fifo
<int, my_expiry
, manual_clock
> fifo(my_expiry
{expired
});
87 fifo
.push_back(1, manual_clock::now() + 1s
);
89 BOOST_REQUIRE(!fifo
.empty());
90 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
91 BOOST_REQUIRE(bool(fifo
));
92 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
94 manual_clock::advance(1s
);
97 BOOST_REQUIRE(fifo
.empty());
98 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
99 BOOST_REQUIRE(!bool(fifo
));
100 BOOST_REQUIRE_EQUAL(expired
.size(), 1u);
101 BOOST_REQUIRE_EQUAL(expired
[0], 1);
106 fifo
.push_back(2, manual_clock::now() + 1s
);
109 manual_clock::advance(1s
);
112 BOOST_REQUIRE(!fifo
.empty());
113 BOOST_REQUIRE_EQUAL(fifo
.size(), 2u);
114 BOOST_REQUIRE(bool(fifo
));
115 BOOST_REQUIRE_EQUAL(expired
.size(), 1u);
116 BOOST_REQUIRE_EQUAL(expired
[0], 2);
117 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
119 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
120 BOOST_REQUIRE_EQUAL(fifo
.front(), 3);
122 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
126 fifo
.push_back(1, manual_clock::now() + 1s
);
127 fifo
.push_back(2, manual_clock::now() + 1s
);
129 fifo
.push_back(4, manual_clock::now() + 2s
);
131 manual_clock::advance(1s
);
134 BOOST_REQUIRE(!fifo
.empty());
135 BOOST_REQUIRE_EQUAL(fifo
.size(), 2u);
136 BOOST_REQUIRE(bool(fifo
));
137 BOOST_REQUIRE_EQUAL(expired
.size(), 2u);
138 std::sort(expired
.begin(), expired
.end());
139 BOOST_REQUIRE_EQUAL(expired
[0], 1);
140 BOOST_REQUIRE_EQUAL(expired
[1], 2);
141 BOOST_REQUIRE_EQUAL(fifo
.front(), 3);
143 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
144 BOOST_REQUIRE_EQUAL(fifo
.front(), 4);
146 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
151 fifo
.push_back(2, manual_clock::now() + 1s
);
152 fifo
.push_back(3, manual_clock::now() + 1s
);
153 fifo
.push_back(4, manual_clock::now() + 1s
);
155 manual_clock::advance(1s
);
158 BOOST_REQUIRE(!fifo
.empty());
159 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
160 BOOST_REQUIRE(bool(fifo
));
161 BOOST_REQUIRE_EQUAL(expired
.size(), 3u);
162 std::sort(expired
.begin(), expired
.end());
163 BOOST_REQUIRE_EQUAL(expired
[0], 2);
164 BOOST_REQUIRE_EQUAL(expired
[1], 3);
165 BOOST_REQUIRE_EQUAL(expired
[2], 4);
166 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
168 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);
173 fifo
.push_back(2, manual_clock::now() + 1s
);
174 fifo
.push_back(3, manual_clock::now() + 1s
);
175 fifo
.push_back(4, manual_clock::now() + 1s
);
178 manual_clock::advance(1s
);
181 BOOST_REQUIRE_EQUAL(fifo
.size(), 2u);
182 BOOST_REQUIRE_EQUAL(fifo
.front(), 1);
184 BOOST_REQUIRE_EQUAL(fifo
.size(), 1u);
185 BOOST_REQUIRE_EQUAL(fifo
.front(), 5);
187 BOOST_REQUIRE_EQUAL(fifo
.size(), 0u);