From f4367dedecfef432263c9d9c29d25da9b1e31a13 Mon Sep 17 00:00:00 2001 From: Benoit Foucher Date: Tue, 28 Aug 2007 14:29:40 +0200 Subject: Added new IceUtil::Timer class --- cpp/test/IceUtil/timer/Client.cpp | 163 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 cpp/test/IceUtil/timer/Client.cpp (limited to 'cpp/test/IceUtil/timer/Client.cpp') diff --git a/cpp/test/IceUtil/timer/Client.cpp b/cpp/test/IceUtil/timer/Client.cpp new file mode 100644 index 00000000000..013e33277e1 --- /dev/null +++ b/cpp/test/IceUtil/timer/Client.cpp @@ -0,0 +1,163 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +#include +#include + +#include + +using namespace IceUtil; +using namespace std; + +class TestTask : public IceUtil::TimerTask, IceUtil::Monitor +{ +public: + + TestTask() + { + } + + TestTask(const IceUtil::Time& scheduledTime) : _scheduledTime(scheduledTime) + { + } + + virtual void + run() + { + Lock sync(*this); + ++_count; + _run = IceUtil::Time::now(); + //cerr << "run: " << _scheduledTime.toMicroSeconds() << " " << _run.toMicroSeconds() << endl; + notifyAll(); + } + + virtual bool + operator<(const TestTask& r) const + { + return _scheduledTime < r._scheduledTime; + } + + virtual bool + hasRun() const + { + Lock sync(*this); + return _run != IceUtil::Time(); + } + + int + getCount() const + { + Lock sync(*this); + return _count; + } + + virtual IceUtil::Time + getRunTime() const + { + Lock sync(*this); + return _run; + } + + IceUtil::Time + getScheduledTime() const + { + return _scheduledTime; + } + + virtual void + waitForRun() + { + Lock sync(*this); + while(_run == IceUtil::Time()) + { + if(!timedWait(IceUtil::Time::seconds(10))) + { + test(false); // Timeout. + } + } + } + +private: + + IceUtil::Time _run; + IceUtil::Time _scheduledTime; + int _count; +}; +typedef IceUtil::Handle TestTaskPtr; + +int main(int argc, char* argv[]) +{ + cout << "testing timer... " << flush; + { + IceUtil::TimerPtr timer = new IceUtil::Timer(); + + { + TestTaskPtr task = new TestTask(); + timer->schedule(task, IceUtil::Time::now()); + task->waitForRun(); + } + + { + TestTaskPtr task = new TestTask(); + test(!timer->cancel(task)); + timer->schedule(task, IceUtil::Time::now() + IceUtil::Time::seconds(1)); + test(!task->hasRun() && timer->cancel(task) && !task->hasRun()); + test(!timer->cancel(task)); + IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(1100)); + test(!task->hasRun()); + } + + { + vector tasks; + IceUtil::Time start = IceUtil::Time::now() + IceUtil::Time::milliSeconds(100); + for(int i = 0; i < 100; ++i) + { + tasks.push_back(new TestTask(start + IceUtil::Time::milliSeconds(i))); + } + + random_shuffle(tasks.begin(), tasks.end()); + + for(vector::const_iterator p = tasks.begin(); p != tasks.end(); ++p) + { + timer->schedule(*p, (*p)->getScheduledTime()); + } + + for(vector::const_iterator p = tasks.begin(); p != tasks.end(); ++p) + { + (*p)->waitForRun(); + } + + test(IceUtil::Time::now() - start > IceUtil::Time::milliSeconds(99)); + + sort(tasks.begin(), tasks.end()); + for(vector::const_iterator p = tasks.begin(); p + 1 != tasks.end(); ++p) + { + if((*p)->getRunTime() > (*(p + 1))->getRunTime()) + { + test(false); + } + } + } + + { + TestTaskPtr task = new TestTask(); + timer->scheduleRepeated(task, IceUtil::Time::milliSeconds(20)); + IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(500)); + test(task->hasRun() && task->getCount() > 15 && task->getCount() < 26); + test(timer->cancel(task)); + int count = task->getCount(); + IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(100)); + test(count == task->getCount()); + } + + timer->destroy(); + } + cout << "ok" << endl; + return EXIT_SUCCESS; +} -- cgit v1.2.3