blob: 77b60a5495bfb26cca991678545709b2756d2296 [file] [log] [blame]
Alexander Afanasyevc169a812014-05-20 20:37:29 -04001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento0f830802018-01-16 23:58:58 -05002/*
Junxiao Shi07115cc2019-01-23 19:00:59 +00003 * Copyright (c) 2013-2019 Regents of the University of California.
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
Alexander Afanasyevdfa52c42014-04-24 21:10:11 -07006 *
Alexander Afanasyevc169a812014-05-20 20:37:29 -04007 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
Alexander Afanasyevf6468892014-01-29 01:04:14 -080020 */
21
Davide Pesavento7e780642018-11-24 15:51:34 -050022#include "ndn-cxx/util/scheduler.hpp"
Alexander Afanasyevf6468892014-01-29 01:04:14 -080023
Davide Pesavento7e780642018-11-24 15:51:34 -050024#include "tests/boost-test.hpp"
25#include "tests/unit/unit-test-time-fixture.hpp"
Davide Pesavento3a3e1882018-07-17 14:49:15 -040026
Junxiao Shid50f2b42016-08-10 02:59:59 +000027#include <boost/lexical_cast.hpp>
Alexander Afanasyevf6468892014-01-29 01:04:14 -080028
29namespace ndn {
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -080030namespace util {
31namespace scheduler {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080032namespace tests {
Alexander Afanasyevf6468892014-01-29 01:04:14 -080033
Davide Pesaventofd612312019-03-15 18:45:46 -040034class SchedulerFixture : public ndn::tests::UnitTestTimeFixture
Junxiao Shid50f2b42016-08-10 02:59:59 +000035{
36public:
37 SchedulerFixture()
38 : scheduler(io)
39 {
40 }
41
42public:
43 Scheduler scheduler;
44};
45
46BOOST_AUTO_TEST_SUITE(Util)
47BOOST_FIXTURE_TEST_SUITE(TestScheduler, SchedulerFixture)
Alexander Afanasyevf6468892014-01-29 01:04:14 -080048
Davide Pesaventoeee3e822016-11-26 19:19:34 +010049BOOST_AUTO_TEST_SUITE(General)
50
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080051BOOST_AUTO_TEST_CASE(Events)
Alexander Afanasyevf6468892014-01-29 01:04:14 -080052{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080053 size_t count1 = 0;
54 size_t count2 = 0;
Alexander Afanasyevf6468892014-01-29 01:04:14 -080055
Davide Pesavento0f830802018-01-16 23:58:58 -050056 scheduler.scheduleEvent(500_ms, [&] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080057 ++count1;
58 BOOST_CHECK_EQUAL(count2, 1);
59 });
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070060
Davide Pesavento0f830802018-01-16 23:58:58 -050061 EventId i = scheduler.scheduleEvent(1_s, [&] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080062 BOOST_ERROR("This event should not have been fired");
63 });
Alexander Afanasyevf6468892014-01-29 01:04:14 -080064 scheduler.cancelEvent(i);
65
Davide Pesavento0f830802018-01-16 23:58:58 -050066 scheduler.scheduleEvent(250_ms, [&] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080067 BOOST_CHECK_EQUAL(count1, 0);
68 ++count2;
69 });
Alexander Afanasyevf6468892014-01-29 01:04:14 -080070
Davide Pesavento0f830802018-01-16 23:58:58 -050071 i = scheduler.scheduleEvent(50_ms, [&] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080072 BOOST_ERROR("This event should not have been fired");
73 });
Alexander Afanasyevf6468892014-01-29 01:04:14 -080074 scheduler.cancelEvent(i);
75
Davide Pesavento0f830802018-01-16 23:58:58 -050076 advanceClocks(25_ms, 1000_ms);
Alexander Afanasyevf6468892014-01-29 01:04:14 -080077 BOOST_CHECK_EQUAL(count1, 1);
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080078 BOOST_CHECK_EQUAL(count2, 1);
Alexander Afanasyevf6468892014-01-29 01:04:14 -080079}
80
Junxiao Shi86dfa532016-08-10 03:00:11 +000081BOOST_AUTO_TEST_CASE(CallbackException)
82{
83 class MyException : public std::exception
84 {
85 };
Davide Pesavento923ba442019-02-12 22:00:38 -050086 scheduler.scheduleEvent(10_ms, [] {
87 // use plain 'throw' to ensure that Scheduler does not depend on the
88 // internal machinery of NDN_THROW and that it can catch all exceptions
89 // regardless of how they are thrown by the application
90 throw MyException{};
91 });
Junxiao Shi86dfa532016-08-10 03:00:11 +000092
93 bool isCallbackInvoked = false;
Davide Pesavento0f830802018-01-16 23:58:58 -050094 scheduler.scheduleEvent(20_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
Junxiao Shi86dfa532016-08-10 03:00:11 +000095
Davide Pesavento0f830802018-01-16 23:58:58 -050096 BOOST_CHECK_THROW(this->advanceClocks(6_ms, 2), MyException);
97 this->advanceClocks(6_ms, 2);
Junxiao Shi86dfa532016-08-10 03:00:11 +000098 BOOST_CHECK(isCallbackInvoked);
99}
100
Yingdi Yuf2a82092014-02-03 16:49:15 -0800101BOOST_AUTO_TEST_CASE(CancelEmptyEvent)
102{
Yingdi Yuf2a82092014-02-03 16:49:15 -0800103 EventId i;
104 scheduler.cancelEvent(i);
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100105
106 // avoid "test case [...] did not check any assertions" message from Boost.Test
107 BOOST_CHECK(true);
Yingdi Yuf2a82092014-02-03 16:49:15 -0800108}
109
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800110BOOST_AUTO_TEST_CASE(SelfCancel)
Yingdi Yuf2a82092014-02-03 16:49:15 -0800111{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800112 EventId selfEventId;
Davide Pesavento0f830802018-01-16 23:58:58 -0500113 selfEventId = scheduler.scheduleEvent(100_ms, [&] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800114 scheduler.cancelEvent(selfEventId);
115 });
Yingdi Yuf2a82092014-02-03 16:49:15 -0800116
Davide Pesavento0f830802018-01-16 23:58:58 -0500117 BOOST_REQUIRE_NO_THROW(advanceClocks(100_ms, 10));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800118}
119
Junxiao Shid50f2b42016-08-10 02:59:59 +0000120class SelfRescheduleFixture : public SchedulerFixture
Yingdi Yuf2a82092014-02-03 16:49:15 -0800121{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800122public:
Yingdi Yuf2a82092014-02-03 16:49:15 -0800123 SelfRescheduleFixture()
Junxiao Shid50f2b42016-08-10 02:59:59 +0000124 : count(0)
Yingdi Yuf2a82092014-02-03 16:49:15 -0800125 {
126 }
127
128 void
129 reschedule()
130 {
Davide Pesavento0f830802018-01-16 23:58:58 -0500131 EventId eventId = scheduler.scheduleEvent(100_ms,
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800132 bind(&SelfRescheduleFixture::reschedule, this));
133 scheduler.cancelEvent(selfEventId);
134 selfEventId = eventId;
Yingdi Yuf2a82092014-02-03 16:49:15 -0800135
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800136 if (count < 5)
137 count++;
Yingdi Yuf2a82092014-02-03 16:49:15 -0800138 else
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800139 scheduler.cancelEvent(selfEventId);
Yingdi Yuf2a82092014-02-03 16:49:15 -0800140 }
141
142 void
143 reschedule2()
144 {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800145 scheduler.cancelEvent(selfEventId);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700146
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800147 if (count < 5) {
Davide Pesavento0f830802018-01-16 23:58:58 -0500148 selfEventId = scheduler.scheduleEvent(100_ms,
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800149 bind(&SelfRescheduleFixture::reschedule2, this));
150 count++;
151 }
Yingdi Yuf2a82092014-02-03 16:49:15 -0800152 }
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700153
Yingdi Yuf2a82092014-02-03 16:49:15 -0800154 void
155 reschedule3()
156 {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800157 scheduler.cancelEvent(selfEventId);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700158
Davide Pesavento0f830802018-01-16 23:58:58 -0500159 scheduler.scheduleEvent(100_ms, [&] { ++count; });
160 scheduler.scheduleEvent(100_ms, [&] { ++count; });
161 scheduler.scheduleEvent(100_ms, [&] { ++count; });
162 scheduler.scheduleEvent(100_ms, [&] { ++count; });
163 scheduler.scheduleEvent(100_ms, [&] { ++count; });
164 scheduler.scheduleEvent(100_ms, [&] { ++count; });
Yingdi Yuf2a82092014-02-03 16:49:15 -0800165 }
166
Junxiao Shid50f2b42016-08-10 02:59:59 +0000167public:
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800168 EventId selfEventId;
169 size_t count;
Yingdi Yuf2a82092014-02-03 16:49:15 -0800170};
171
172BOOST_FIXTURE_TEST_CASE(Reschedule, SelfRescheduleFixture)
173{
Davide Pesavento0f830802018-01-16 23:58:58 -0500174 selfEventId = scheduler.scheduleEvent(0_s,
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800175 bind(&SelfRescheduleFixture::reschedule, this));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800176
Davide Pesavento0f830802018-01-16 23:58:58 -0500177 BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800178
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800179 BOOST_CHECK_EQUAL(count, 5);
Yingdi Yuf2a82092014-02-03 16:49:15 -0800180}
181
182BOOST_FIXTURE_TEST_CASE(Reschedule2, SelfRescheduleFixture)
183{
Davide Pesavento0f830802018-01-16 23:58:58 -0500184 selfEventId = scheduler.scheduleEvent(0_s,
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800185 bind(&SelfRescheduleFixture::reschedule2, this));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800186
Davide Pesavento0f830802018-01-16 23:58:58 -0500187 BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800188
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800189 BOOST_CHECK_EQUAL(count, 5);
Yingdi Yuf2a82092014-02-03 16:49:15 -0800190}
191
192BOOST_FIXTURE_TEST_CASE(Reschedule3, SelfRescheduleFixture)
193{
Davide Pesavento0f830802018-01-16 23:58:58 -0500194 selfEventId = scheduler.scheduleEvent(0_s,
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800195 bind(&SelfRescheduleFixture::reschedule3, this));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800196
Davide Pesavento0f830802018-01-16 23:58:58 -0500197 BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800198
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800199 BOOST_CHECK_EQUAL(count, 6);
Yingdi Yuf2a82092014-02-03 16:49:15 -0800200}
201
Junxiao Shid50f2b42016-08-10 02:59:59 +0000202class CancelAllFixture : public SchedulerFixture
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700203{
Junxiao Shid50f2b42016-08-10 02:59:59 +0000204public:
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700205 CancelAllFixture()
Junxiao Shid50f2b42016-08-10 02:59:59 +0000206 : count(0)
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700207 {
208 }
209
210 void
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700211 event()
212 {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800213 ++count;
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700214
Davide Pesavento0f830802018-01-16 23:58:58 -0500215 scheduler.scheduleEvent(1_s, [&] { event(); });
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700216 }
217
Junxiao Shid50f2b42016-08-10 02:59:59 +0000218public:
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800219 uint32_t count;
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700220};
221
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700222BOOST_FIXTURE_TEST_CASE(CancelAll, CancelAllFixture)
223{
Davide Pesavento0f830802018-01-16 23:58:58 -0500224 scheduler.scheduleEvent(500_ms, [&] { scheduler.cancelAllEvents(); });
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700225
Davide Pesavento0f830802018-01-16 23:58:58 -0500226 scheduler.scheduleEvent(1_s, [&] { event(); });
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700227
Davide Pesavento0f830802018-01-16 23:58:58 -0500228 scheduler.scheduleEvent(3_s, [] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800229 BOOST_ERROR("This event should have been cancelled" );
230 });
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700231
Davide Pesavento0f830802018-01-16 23:58:58 -0500232 advanceClocks(100_ms, 100);
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700233
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800234 BOOST_CHECK_EQUAL(count, 0);
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700235}
236
Junxiao Shid50f2b42016-08-10 02:59:59 +0000237BOOST_AUTO_TEST_CASE(CancelAllWithScopedEventId) // Bug 3691
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800238{
Junxiao Shid50f2b42016-08-10 02:59:59 +0000239 Scheduler sched(io);
Junxiao Shi07115cc2019-01-23 19:00:59 +0000240 ScopedEventId eid = sched.scheduleEvent(10_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000241 sched.cancelAllEvents();
242 eid.cancel(); // should not crash
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100243
244 // avoid "test case [...] did not check any assertions" message from Boost.Test
245 BOOST_CHECK(true);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000246}
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700247
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100248BOOST_AUTO_TEST_SUITE_END() // General
249
Junxiao Shid50f2b42016-08-10 02:59:59 +0000250BOOST_AUTO_TEST_SUITE(EventId)
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800251
Junxiao Shid50f2b42016-08-10 02:59:59 +0000252using scheduler::EventId;
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800253
Junxiao Shid50f2b42016-08-10 02:59:59 +0000254BOOST_AUTO_TEST_CASE(ConstructEmpty)
255{
256 EventId eid;
Junxiao Shi07115cc2019-01-23 19:00:59 +0000257 BOOST_CHECK(!eid);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000258}
259
260BOOST_AUTO_TEST_CASE(Compare)
261{
262 EventId eid, eid2;
263 BOOST_CHECK_EQUAL(eid == eid2, true);
264 BOOST_CHECK_EQUAL(eid != eid2, false);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000265
Davide Pesavento0f830802018-01-16 23:58:58 -0500266 eid = scheduler.scheduleEvent(10_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000267 BOOST_CHECK_EQUAL(eid == eid2, false);
268 BOOST_CHECK_EQUAL(eid != eid2, true);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000269
270 eid2 = eid;
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400271 BOOST_CHECK_EQUAL(eid, eid2);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000272 BOOST_CHECK_EQUAL(eid != eid2, false);
273
Davide Pesavento0f830802018-01-16 23:58:58 -0500274 eid2 = scheduler.scheduleEvent(10_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000275 BOOST_CHECK_EQUAL(eid == eid2, false);
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400276 BOOST_CHECK_NE(eid, eid2);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000277}
278
279BOOST_AUTO_TEST_CASE(Valid)
280{
281 EventId eid;
282 BOOST_CHECK_EQUAL(static_cast<bool>(eid), false);
283 BOOST_CHECK_EQUAL(!eid, true);
284
Davide Pesavento0f830802018-01-16 23:58:58 -0500285 eid = scheduler.scheduleEvent(10_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000286 BOOST_CHECK_EQUAL(static_cast<bool>(eid), true);
287 BOOST_CHECK_EQUAL(!eid, false);
288
289 EventId eid2 = eid;
290 scheduler.cancelEvent(eid2);
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400291 BOOST_CHECK(!eid);
292 BOOST_CHECK(!eid2);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000293}
294
295BOOST_AUTO_TEST_CASE(DuringCallback)
296{
297 EventId eid;
Davide Pesavento0f830802018-01-16 23:58:58 -0500298 EventId eid2 = scheduler.scheduleEvent(20_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000299
300 bool isCallbackInvoked = false;
Davide Pesavento0f830802018-01-16 23:58:58 -0500301 eid = scheduler.scheduleEvent(10_ms, [this, &eid, &eid2, &isCallbackInvoked] {
Junxiao Shid50f2b42016-08-10 02:59:59 +0000302 isCallbackInvoked = true;
303
304 // eid is "expired" during callback execution
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400305 BOOST_CHECK(!eid);
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400306 BOOST_CHECK_NE(eid, eid2);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000307
308 scheduler.cancelEvent(eid2);
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400309 BOOST_CHECK_EQUAL(eid, eid2);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000310 });
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400311
Davide Pesavento0f830802018-01-16 23:58:58 -0500312 this->advanceClocks(6_ms, 2);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000313 BOOST_CHECK(isCallbackInvoked);
314}
315
316BOOST_AUTO_TEST_CASE(Reset)
317{
318 bool isCallbackInvoked = false;
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400319 EventId eid = scheduler.scheduleEvent(10_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
Junxiao Shid50f2b42016-08-10 02:59:59 +0000320 eid.reset();
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400321 BOOST_CHECK(!eid);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000322
Davide Pesavento0f830802018-01-16 23:58:58 -0500323 this->advanceClocks(6_ms, 2);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000324 BOOST_CHECK(isCallbackInvoked);
325}
326
327BOOST_AUTO_TEST_CASE(ToString)
328{
329 std::string nullString = boost::lexical_cast<std::string>(shared_ptr<int>());
330
331 EventId eid;
332 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(eid), nullString);
333
Davide Pesavento0f830802018-01-16 23:58:58 -0500334 eid = scheduler.scheduleEvent(10_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000335 BOOST_TEST_MESSAGE("eid=" << eid);
336 BOOST_CHECK_NE(boost::lexical_cast<std::string>(eid), nullString);
337}
338
339BOOST_AUTO_TEST_SUITE_END() // EventId
340
341BOOST_AUTO_TEST_SUITE(ScopedEventId)
342
343using scheduler::ScopedEventId;
344
345BOOST_AUTO_TEST_CASE(Destruct)
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800346{
347 int hit = 0;
348 {
Junxiao Shi07115cc2019-01-23 19:00:59 +0000349 ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800350 } // se goes out of scope
Davide Pesavento0f830802018-01-16 23:58:58 -0500351 this->advanceClocks(1_ms, 15);
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800352 BOOST_CHECK_EQUAL(hit, 0);
353}
354
Junxiao Shid50f2b42016-08-10 02:59:59 +0000355BOOST_AUTO_TEST_CASE(Assign)
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800356{
357 int hit1 = 0, hit2 = 0;
Junxiao Shi07115cc2019-01-23 19:00:59 +0000358 ScopedEventId se1 = scheduler.scheduleEvent(10_ms, [&] { ++hit1; });
Davide Pesavento0f830802018-01-16 23:58:58 -0500359 se1 = scheduler.scheduleEvent(10_ms, [&] { ++hit2; });
360 this->advanceClocks(1_ms, 15);
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800361 BOOST_CHECK_EQUAL(hit1, 0);
362 BOOST_CHECK_EQUAL(hit2, 1);
363}
364
Junxiao Shid50f2b42016-08-10 02:59:59 +0000365BOOST_AUTO_TEST_CASE(Release)
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800366{
367 int hit = 0;
368 {
Junxiao Shi07115cc2019-01-23 19:00:59 +0000369 ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800370 se.release();
371 } // se goes out of scope
Davide Pesavento0f830802018-01-16 23:58:58 -0500372 this->advanceClocks(1_ms, 15);
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800373 BOOST_CHECK_EQUAL(hit, 1);
374}
375
Junxiao Shid50f2b42016-08-10 02:59:59 +0000376BOOST_AUTO_TEST_CASE(Move)
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800377{
378 int hit = 0;
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400379 unique_ptr<ScopedEventId> se2;
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800380 {
Junxiao Shi07115cc2019-01-23 19:00:59 +0000381 ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400382 se2 = make_unique<ScopedEventId>(std::move(se)); // move constructor
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800383 } // se goes out of scope
Davide Pesavento0f830802018-01-16 23:58:58 -0500384 this->advanceClocks(1_ms, 15);
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800385 BOOST_CHECK_EQUAL(hit, 1);
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400386
Junxiao Shi07115cc2019-01-23 19:00:59 +0000387 ScopedEventId se3;
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400388 {
Junxiao Shi07115cc2019-01-23 19:00:59 +0000389 ScopedEventId se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
Davide Pesavento3a3e1882018-07-17 14:49:15 -0400390 se3 = std::move(se); // move assignment
391 } // se goes out of scope
392 this->advanceClocks(1_ms, 15);
393 BOOST_CHECK_EQUAL(hit, 2);
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800394}
395
396BOOST_AUTO_TEST_SUITE_END() // ScopedEventId
397
Junxiao Shid50f2b42016-08-10 02:59:59 +0000398BOOST_AUTO_TEST_SUITE_END() // TestScheduler
399BOOST_AUTO_TEST_SUITE_END() // Util
Alexander Afanasyevf6468892014-01-29 01:04:14 -0800400
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800401} // namespace tests
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800402} // namespace scheduler
403} // namespace util
Alexander Afanasyevf6468892014-01-29 01:04:14 -0800404} // namespace ndn