diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
commit | 72231250ed81e10d66bfe70701e64fa5fe50f712 (patch) | |
tree | 2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /storageframework/src/tests/thread/taskthreadtest.cpp |
Publish
Diffstat (limited to 'storageframework/src/tests/thread/taskthreadtest.cpp')
-rw-r--r-- | storageframework/src/tests/thread/taskthreadtest.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/storageframework/src/tests/thread/taskthreadtest.cpp b/storageframework/src/tests/thread/taskthreadtest.cpp new file mode 100644 index 00000000000..6b524f10cf5 --- /dev/null +++ b/storageframework/src/tests/thread/taskthreadtest.cpp @@ -0,0 +1,69 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include <vespa/fastos/fastos.h> +#include <vespa/storageframework/generic/thread/taskthread.h> +#include <vespa/vdstestlib/cppunit/macros.h> + +namespace storage { +namespace framework { + +struct TaskThreadTest : public CppUnit::TestFixture +{ + + void testNormalUsage(); + + CPPUNIT_TEST_SUITE(TaskThreadTest); + CPPUNIT_TEST(testNormalUsage); + CPPUNIT_TEST_SUITE_END(); +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(TaskThreadTest); + +namespace { + struct Task { + std::string _name; + uint8_t _priority; + + Task(const std::string& name, uint8_t priority) + : _name(name), _priority(priority) {} + + bool operator<(const Task& other) const { + return (_priority > other._priority); + } + uint8_t getPriority() const { return _priority; } + }; + + struct MyThread : public TaskThread<Task> { + MyThread(ThreadLock& lock) : TaskThread<Task>(lock) {} + virtual ThreadWaitInfo doNonCriticalTick(ThreadIndex) { + return ThreadWaitInfo::NO_MORE_CRITICAL_WORK_KNOWN; + } + }; +} + +void +TaskThreadTest::testNormalUsage() +{ + TickingThreadPool::UP pool(TickingThreadPool::createDefault("testApp")); + + MyThread t(*pool); + t.addTask(Task("a", 6)); + t.addTask(Task("b", 3)); + t.addTask(Task("c", 8)); + t.addTask(Task("d", 4)); + CPPUNIT_ASSERT(t.empty()); // Still empty before critical tick has run + dynamic_cast<TickingThread&>(t).doCriticalTick(0); + CPPUNIT_ASSERT(!t.empty()); + CPPUNIT_ASSERT_EQUAL(3, (int) t.peek().getPriority()); + std::ostringstream ost; + while (!t.empty()) { + Task task(t.peek()); + ost << task._name << '(' << ((int) task.getPriority()) << ") "; + t.pop(); + } + CPPUNIT_ASSERT_EQUAL(std::string("b(3) d(4) a(6) c(8) "), ost.str()); +} + + +} // framework +} // storage |