blob: de548005e79c3420bc3bb712de40bffc88d53490 [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/*
3 * Copyright (c) 2013-2018 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
22#include "util/scheduler.hpp"
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -080023#include "util/scheduler-scoped-event-id.hpp"
Alexander Afanasyevf6468892014-01-29 01:04:14 -080024
Alexander Afanasyevb1db7c62014-04-03 14:57:25 -070025#include "boost-test.hpp"
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080026#include "../unit-test-time-fixture.hpp"
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
Spyridon Mastorakis429634f2015-02-19 17:35:33 -080034using namespace ndn::tests;
35
Junxiao Shid50f2b42016-08-10 02:59:59 +000036class SchedulerFixture : public UnitTestTimeFixture
37{
38public:
39 SchedulerFixture()
40 : scheduler(io)
41 {
42 }
43
44public:
45 Scheduler scheduler;
46};
47
48BOOST_AUTO_TEST_SUITE(Util)
49BOOST_FIXTURE_TEST_SUITE(TestScheduler, SchedulerFixture)
Alexander Afanasyevf6468892014-01-29 01:04:14 -080050
Davide Pesaventoeee3e822016-11-26 19:19:34 +010051BOOST_AUTO_TEST_SUITE(General)
52
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080053BOOST_AUTO_TEST_CASE(Events)
Alexander Afanasyevf6468892014-01-29 01:04:14 -080054{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080055 size_t count1 = 0;
56 size_t count2 = 0;
Alexander Afanasyevf6468892014-01-29 01:04:14 -080057
Davide Pesavento0f830802018-01-16 23:58:58 -050058 scheduler.scheduleEvent(500_ms, [&] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080059 ++count1;
60 BOOST_CHECK_EQUAL(count2, 1);
61 });
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -070062
Davide Pesavento0f830802018-01-16 23:58:58 -050063 EventId i = scheduler.scheduleEvent(1_s, [&] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080064 BOOST_ERROR("This event should not have been fired");
65 });
Alexander Afanasyevf6468892014-01-29 01:04:14 -080066 scheduler.cancelEvent(i);
67
Davide Pesavento0f830802018-01-16 23:58:58 -050068 scheduler.scheduleEvent(250_ms, [&] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080069 BOOST_CHECK_EQUAL(count1, 0);
70 ++count2;
71 });
Alexander Afanasyevf6468892014-01-29 01:04:14 -080072
Davide Pesavento0f830802018-01-16 23:58:58 -050073 i = scheduler.scheduleEvent(50_ms, [&] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080074 BOOST_ERROR("This event should not have been fired");
75 });
Alexander Afanasyevf6468892014-01-29 01:04:14 -080076 scheduler.cancelEvent(i);
77
Davide Pesavento0f830802018-01-16 23:58:58 -050078 advanceClocks(25_ms, 1000_ms);
Alexander Afanasyevf6468892014-01-29 01:04:14 -080079 BOOST_CHECK_EQUAL(count1, 1);
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -080080 BOOST_CHECK_EQUAL(count2, 1);
Alexander Afanasyevf6468892014-01-29 01:04:14 -080081}
82
Junxiao Shi86dfa532016-08-10 03:00:11 +000083BOOST_AUTO_TEST_CASE(CallbackException)
84{
85 class MyException : public std::exception
86 {
87 };
Davide Pesavento0f830802018-01-16 23:58:58 -050088 scheduler.scheduleEvent(10_ms, [] { BOOST_THROW_EXCEPTION(MyException()); });
Junxiao Shi86dfa532016-08-10 03:00:11 +000089
90 bool isCallbackInvoked = false;
Davide Pesavento0f830802018-01-16 23:58:58 -050091 scheduler.scheduleEvent(20_ms, [&isCallbackInvoked] { isCallbackInvoked = true; });
Junxiao Shi86dfa532016-08-10 03:00:11 +000092
Davide Pesavento0f830802018-01-16 23:58:58 -050093 BOOST_CHECK_THROW(this->advanceClocks(6_ms, 2), MyException);
94 this->advanceClocks(6_ms, 2);
Junxiao Shi86dfa532016-08-10 03:00:11 +000095 BOOST_CHECK(isCallbackInvoked);
96}
97
Yingdi Yuf2a82092014-02-03 16:49:15 -080098BOOST_AUTO_TEST_CASE(CancelEmptyEvent)
99{
Yingdi Yuf2a82092014-02-03 16:49:15 -0800100 EventId i;
101 scheduler.cancelEvent(i);
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100102
103 // avoid "test case [...] did not check any assertions" message from Boost.Test
104 BOOST_CHECK(true);
Yingdi Yuf2a82092014-02-03 16:49:15 -0800105}
106
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800107BOOST_AUTO_TEST_CASE(SelfCancel)
Yingdi Yuf2a82092014-02-03 16:49:15 -0800108{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800109 EventId selfEventId;
Davide Pesavento0f830802018-01-16 23:58:58 -0500110 selfEventId = scheduler.scheduleEvent(100_ms, [&] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800111 scheduler.cancelEvent(selfEventId);
112 });
Yingdi Yuf2a82092014-02-03 16:49:15 -0800113
Davide Pesavento0f830802018-01-16 23:58:58 -0500114 BOOST_REQUIRE_NO_THROW(advanceClocks(100_ms, 10));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800115}
116
Junxiao Shid50f2b42016-08-10 02:59:59 +0000117class SelfRescheduleFixture : public SchedulerFixture
Yingdi Yuf2a82092014-02-03 16:49:15 -0800118{
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800119public:
Yingdi Yuf2a82092014-02-03 16:49:15 -0800120 SelfRescheduleFixture()
Junxiao Shid50f2b42016-08-10 02:59:59 +0000121 : count(0)
Yingdi Yuf2a82092014-02-03 16:49:15 -0800122 {
123 }
124
125 void
126 reschedule()
127 {
Davide Pesavento0f830802018-01-16 23:58:58 -0500128 EventId eventId = scheduler.scheduleEvent(100_ms,
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800129 bind(&SelfRescheduleFixture::reschedule, this));
130 scheduler.cancelEvent(selfEventId);
131 selfEventId = eventId;
Yingdi Yuf2a82092014-02-03 16:49:15 -0800132
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800133 if (count < 5)
134 count++;
Yingdi Yuf2a82092014-02-03 16:49:15 -0800135 else
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800136 scheduler.cancelEvent(selfEventId);
Yingdi Yuf2a82092014-02-03 16:49:15 -0800137 }
138
139 void
140 reschedule2()
141 {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800142 scheduler.cancelEvent(selfEventId);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700143
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800144 if (count < 5) {
Davide Pesavento0f830802018-01-16 23:58:58 -0500145 selfEventId = scheduler.scheduleEvent(100_ms,
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800146 bind(&SelfRescheduleFixture::reschedule2, this));
147 count++;
148 }
Yingdi Yuf2a82092014-02-03 16:49:15 -0800149 }
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700150
Yingdi Yuf2a82092014-02-03 16:49:15 -0800151 void
152 reschedule3()
153 {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800154 scheduler.cancelEvent(selfEventId);
Alexander Afanasyevaa0e7da2014-03-17 14:37:33 -0700155
Davide Pesavento0f830802018-01-16 23:58:58 -0500156 scheduler.scheduleEvent(100_ms, [&] { ++count; });
157 scheduler.scheduleEvent(100_ms, [&] { ++count; });
158 scheduler.scheduleEvent(100_ms, [&] { ++count; });
159 scheduler.scheduleEvent(100_ms, [&] { ++count; });
160 scheduler.scheduleEvent(100_ms, [&] { ++count; });
161 scheduler.scheduleEvent(100_ms, [&] { ++count; });
Yingdi Yuf2a82092014-02-03 16:49:15 -0800162 }
163
Junxiao Shid50f2b42016-08-10 02:59:59 +0000164public:
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800165 EventId selfEventId;
166 size_t count;
Yingdi Yuf2a82092014-02-03 16:49:15 -0800167};
168
169BOOST_FIXTURE_TEST_CASE(Reschedule, SelfRescheduleFixture)
170{
Davide Pesavento0f830802018-01-16 23:58:58 -0500171 selfEventId = scheduler.scheduleEvent(0_s,
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800172 bind(&SelfRescheduleFixture::reschedule, this));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800173
Davide Pesavento0f830802018-01-16 23:58:58 -0500174 BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800175
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800176 BOOST_CHECK_EQUAL(count, 5);
Yingdi Yuf2a82092014-02-03 16:49:15 -0800177}
178
179BOOST_FIXTURE_TEST_CASE(Reschedule2, SelfRescheduleFixture)
180{
Davide Pesavento0f830802018-01-16 23:58:58 -0500181 selfEventId = scheduler.scheduleEvent(0_s,
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800182 bind(&SelfRescheduleFixture::reschedule2, this));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800183
Davide Pesavento0f830802018-01-16 23:58:58 -0500184 BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800185
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800186 BOOST_CHECK_EQUAL(count, 5);
Yingdi Yuf2a82092014-02-03 16:49:15 -0800187}
188
189BOOST_FIXTURE_TEST_CASE(Reschedule3, SelfRescheduleFixture)
190{
Davide Pesavento0f830802018-01-16 23:58:58 -0500191 selfEventId = scheduler.scheduleEvent(0_s,
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800192 bind(&SelfRescheduleFixture::reschedule3, this));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800193
Davide Pesavento0f830802018-01-16 23:58:58 -0500194 BOOST_REQUIRE_NO_THROW(advanceClocks(50_ms, 1000_ms));
Yingdi Yuf2a82092014-02-03 16:49:15 -0800195
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800196 BOOST_CHECK_EQUAL(count, 6);
Yingdi Yuf2a82092014-02-03 16:49:15 -0800197}
198
Junxiao Shid50f2b42016-08-10 02:59:59 +0000199class CancelAllFixture : public SchedulerFixture
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700200{
Junxiao Shid50f2b42016-08-10 02:59:59 +0000201public:
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700202 CancelAllFixture()
Junxiao Shid50f2b42016-08-10 02:59:59 +0000203 : count(0)
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700204 {
205 }
206
207 void
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700208 event()
209 {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800210 ++count;
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700211
Davide Pesavento0f830802018-01-16 23:58:58 -0500212 scheduler.scheduleEvent(1_s, [&] { event(); });
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700213 }
214
Junxiao Shid50f2b42016-08-10 02:59:59 +0000215public:
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800216 uint32_t count;
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700217};
218
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700219BOOST_FIXTURE_TEST_CASE(CancelAll, CancelAllFixture)
220{
Davide Pesavento0f830802018-01-16 23:58:58 -0500221 scheduler.scheduleEvent(500_ms, [&] { scheduler.cancelAllEvents(); });
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700222
Davide Pesavento0f830802018-01-16 23:58:58 -0500223 scheduler.scheduleEvent(1_s, [&] { event(); });
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700224
Davide Pesavento0f830802018-01-16 23:58:58 -0500225 scheduler.scheduleEvent(3_s, [] {
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800226 BOOST_ERROR("This event should have been cancelled" );
227 });
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700228
Davide Pesavento0f830802018-01-16 23:58:58 -0500229 advanceClocks(100_ms, 100);
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700230
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800231 BOOST_CHECK_EQUAL(count, 0);
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700232}
233
Junxiao Shid50f2b42016-08-10 02:59:59 +0000234BOOST_AUTO_TEST_CASE(CancelAllWithScopedEventId) // Bug 3691
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800235{
Junxiao Shid50f2b42016-08-10 02:59:59 +0000236 Scheduler sched(io);
237 ScopedEventId eid(sched);
Davide Pesavento0f830802018-01-16 23:58:58 -0500238 eid = sched.scheduleEvent(10_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000239 sched.cancelAllEvents();
240 eid.cancel(); // should not crash
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100241
242 // avoid "test case [...] did not check any assertions" message from Boost.Test
243 BOOST_CHECK(true);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000244}
Alexander Afanasyev7ae4bf52014-07-11 17:12:41 -0700245
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100246BOOST_AUTO_TEST_SUITE_END() // General
247
Junxiao Shid50f2b42016-08-10 02:59:59 +0000248BOOST_AUTO_TEST_SUITE(EventId)
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800249
Junxiao Shid50f2b42016-08-10 02:59:59 +0000250using scheduler::EventId;
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800251
Junxiao Shid50f2b42016-08-10 02:59:59 +0000252BOOST_AUTO_TEST_CASE(ConstructEmpty)
253{
254 EventId eid;
255 eid = nullptr;
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100256
257 // avoid "test case [...] did not check any assertions" message from Boost.Test
258 BOOST_CHECK(true);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000259}
260
261BOOST_AUTO_TEST_CASE(Compare)
262{
263 EventId eid, eid2;
264 BOOST_CHECK_EQUAL(eid == eid2, true);
265 BOOST_CHECK_EQUAL(eid != eid2, false);
266 BOOST_CHECK_EQUAL(eid == nullptr, true);
267 BOOST_CHECK_EQUAL(eid != nullptr, false);
268
Davide Pesavento0f830802018-01-16 23:58:58 -0500269 eid = scheduler.scheduleEvent(10_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000270 BOOST_CHECK_EQUAL(eid == eid2, false);
271 BOOST_CHECK_EQUAL(eid != eid2, true);
272 BOOST_CHECK_EQUAL(eid == nullptr, false);
273 BOOST_CHECK_EQUAL(eid != nullptr, true);
274
275 eid2 = eid;
276 BOOST_CHECK_EQUAL(eid == eid2, true);
277 BOOST_CHECK_EQUAL(eid != eid2, false);
278
Davide Pesavento0f830802018-01-16 23:58:58 -0500279 eid2 = scheduler.scheduleEvent(10_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000280 BOOST_CHECK_EQUAL(eid == eid2, false);
281 BOOST_CHECK_EQUAL(eid != eid2, true);
282}
283
284BOOST_AUTO_TEST_CASE(Valid)
285{
286 EventId eid;
287 BOOST_CHECK_EQUAL(static_cast<bool>(eid), false);
288 BOOST_CHECK_EQUAL(!eid, true);
289
Davide Pesavento0f830802018-01-16 23:58:58 -0500290 eid = scheduler.scheduleEvent(10_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000291 BOOST_CHECK_EQUAL(static_cast<bool>(eid), true);
292 BOOST_CHECK_EQUAL(!eid, false);
293
294 EventId eid2 = eid;
295 scheduler.cancelEvent(eid2);
296 BOOST_CHECK_EQUAL(static_cast<bool>(eid), false);
297 BOOST_CHECK_EQUAL(!eid, true);
298 BOOST_CHECK_EQUAL(static_cast<bool>(eid2), false);
299 BOOST_CHECK_EQUAL(!eid2, true);
300}
301
302BOOST_AUTO_TEST_CASE(DuringCallback)
303{
304 EventId eid;
Davide Pesavento0f830802018-01-16 23:58:58 -0500305 EventId eid2 = scheduler.scheduleEvent(20_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000306
307 bool isCallbackInvoked = false;
Davide Pesavento0f830802018-01-16 23:58:58 -0500308 eid = scheduler.scheduleEvent(10_ms, [this, &eid, &eid2, &isCallbackInvoked] {
Junxiao Shid50f2b42016-08-10 02:59:59 +0000309 isCallbackInvoked = true;
310
311 // eid is "expired" during callback execution
312 BOOST_CHECK_EQUAL(static_cast<bool>(eid), false);
313 BOOST_CHECK_EQUAL(!eid, true);
314 BOOST_CHECK_EQUAL(eid == eid2, false);
315 BOOST_CHECK_EQUAL(eid != eid2, true);
316 BOOST_CHECK_EQUAL(eid == nullptr, true);
317 BOOST_CHECK_EQUAL(eid != nullptr, false);
318
319 scheduler.cancelEvent(eid2);
320 BOOST_CHECK_EQUAL(eid == eid2, true);
321 BOOST_CHECK_EQUAL(eid != eid2, false);
322 });
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(Reset)
328{
329 bool isCallbackInvoked = false;
Davide Pesavento0f830802018-01-16 23:58:58 -0500330 EventId eid = scheduler.scheduleEvent(10_ms,
Junxiao Shid50f2b42016-08-10 02:59:59 +0000331 [&isCallbackInvoked]{ isCallbackInvoked = true; });
332 eid.reset();
333 BOOST_CHECK_EQUAL(!eid, true);
334 BOOST_CHECK_EQUAL(eid == nullptr, true);
335
Davide Pesavento0f830802018-01-16 23:58:58 -0500336 this->advanceClocks(6_ms, 2);
Junxiao Shid50f2b42016-08-10 02:59:59 +0000337 BOOST_CHECK(isCallbackInvoked);
338}
339
340BOOST_AUTO_TEST_CASE(ToString)
341{
342 std::string nullString = boost::lexical_cast<std::string>(shared_ptr<int>());
343
344 EventId eid;
345 BOOST_CHECK_EQUAL(boost::lexical_cast<std::string>(eid), nullString);
346
Davide Pesavento0f830802018-01-16 23:58:58 -0500347 eid = scheduler.scheduleEvent(10_ms, []{});
Junxiao Shid50f2b42016-08-10 02:59:59 +0000348 BOOST_TEST_MESSAGE("eid=" << eid);
349 BOOST_CHECK_NE(boost::lexical_cast<std::string>(eid), nullString);
350}
351
352BOOST_AUTO_TEST_SUITE_END() // EventId
353
354BOOST_AUTO_TEST_SUITE(ScopedEventId)
355
356using scheduler::ScopedEventId;
357
358BOOST_AUTO_TEST_CASE(Destruct)
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800359{
360 int hit = 0;
361 {
362 ScopedEventId se(scheduler);
Davide Pesavento0f830802018-01-16 23:58:58 -0500363 se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800364 } // se goes out of scope
Davide Pesavento0f830802018-01-16 23:58:58 -0500365 this->advanceClocks(1_ms, 15);
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800366 BOOST_CHECK_EQUAL(hit, 0);
367}
368
Junxiao Shid50f2b42016-08-10 02:59:59 +0000369BOOST_AUTO_TEST_CASE(Assign)
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800370{
371 int hit1 = 0, hit2 = 0;
372 ScopedEventId se1(scheduler);
Davide Pesavento0f830802018-01-16 23:58:58 -0500373 se1 = scheduler.scheduleEvent(10_ms, [&] { ++hit1; });
374 se1 = scheduler.scheduleEvent(10_ms, [&] { ++hit2; });
375 this->advanceClocks(1_ms, 15);
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800376 BOOST_CHECK_EQUAL(hit1, 0);
377 BOOST_CHECK_EQUAL(hit2, 1);
378}
379
Junxiao Shid50f2b42016-08-10 02:59:59 +0000380BOOST_AUTO_TEST_CASE(Release)
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800381{
382 int hit = 0;
383 {
384 ScopedEventId se(scheduler);
Davide Pesavento0f830802018-01-16 23:58:58 -0500385 se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800386 se.release();
387 } // se goes out of scope
Davide Pesavento0f830802018-01-16 23:58:58 -0500388 this->advanceClocks(1_ms, 15);
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800389 BOOST_CHECK_EQUAL(hit, 1);
390}
391
Junxiao Shid50f2b42016-08-10 02:59:59 +0000392BOOST_AUTO_TEST_CASE(Move)
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800393{
394 int hit = 0;
395 unique_ptr<scheduler::ScopedEventId> se2;
396 {
397 ScopedEventId se(scheduler);
Davide Pesavento0f830802018-01-16 23:58:58 -0500398 se = scheduler.scheduleEvent(10_ms, [&] { ++hit; });
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800399 se2.reset(new ScopedEventId(std::move(se)));
400 } // se goes out of scope
Davide Pesavento0f830802018-01-16 23:58:58 -0500401 this->advanceClocks(1_ms, 15);
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800402 BOOST_CHECK_EQUAL(hit, 1);
403}
404
405BOOST_AUTO_TEST_SUITE_END() // ScopedEventId
406
Junxiao Shid50f2b42016-08-10 02:59:59 +0000407BOOST_AUTO_TEST_SUITE_END() // TestScheduler
408BOOST_AUTO_TEST_SUITE_END() // Util
Alexander Afanasyevf6468892014-01-29 01:04:14 -0800409
Alexander Afanasyevd3a55b22014-11-18 19:23:28 -0800410} // namespace tests
Alexander Afanasyev9a9952f2015-01-28 19:06:48 -0800411} // namespace scheduler
412} // namespace util
Alexander Afanasyevf6468892014-01-29 01:04:14 -0800413} // namespace ndn