diff options
Diffstat (limited to 'vbench/src/tests/dispatcher/dispatcher_test.cpp')
-rw-r--r-- | vbench/src/tests/dispatcher/dispatcher_test.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/vbench/src/tests/dispatcher/dispatcher_test.cpp b/vbench/src/tests/dispatcher/dispatcher_test.cpp new file mode 100644 index 00000000000..b4afafdaed5 --- /dev/null +++ b/vbench/src/tests/dispatcher/dispatcher_test.cpp @@ -0,0 +1,60 @@ +// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/vespalib/testkit/testapp.h> +#include <vbench/test/all.h> + +using namespace vbench; + +struct MyHandler : public Handler<int> { + int value; + MyHandler() : value(-1) {} + virtual void handle(std::unique_ptr<int> v) { value = (v.get() != 0) ? *v : 0; } +}; + +struct Fetcher : public vespalib::Runnable { + Provider<int> &provider; + Handler<int> &handler; + Fetcher(Provider<int> &p, Handler<int> &h) : provider(p), handler(h) {} + virtual void run() { handler.handle(provider.provide()); } +}; + +TEST("dispatcher") { + MyHandler dropped; + MyHandler handler1; + MyHandler handler2; + Dispatcher<int> dispatcher(dropped); + Fetcher fetcher1(dispatcher, handler1); + Fetcher fetcher2(dispatcher, handler2); + vespalib::Thread thread1(fetcher1); + vespalib::Thread thread2(fetcher2); + thread1.start(); + EXPECT_TRUE(dispatcher.waitForThreads(1, 512)); + thread2.start(); + EXPECT_TRUE(dispatcher.waitForThreads(2, 512)); + EXPECT_EQUAL(-1, dropped.value); + EXPECT_EQUAL(-1, handler1.value); + EXPECT_EQUAL(-1, handler2.value); + dispatcher.handle(std::unique_ptr<int>(new int(1))); + dispatcher.handle(std::unique_ptr<int>(new int(2))); + dispatcher.handle(std::unique_ptr<int>(new int(3))); + thread1.join(); + thread2.join(); + EXPECT_EQUAL(3, dropped.value); + EXPECT_EQUAL(2, handler1.value); + EXPECT_EQUAL(1, handler2.value); + dispatcher.close(); + { + dispatcher.handle(std::unique_ptr<int>(new int(4))); + EXPECT_EQUAL(3, dropped.value); + MyHandler handler3; + Fetcher fetcher3(dispatcher, handler3); + EXPECT_EQUAL(-1, handler3.value); + fetcher3.run(); + EXPECT_EQUAL(0, handler3.value); + } +} + +TEST_FF("dispatcher poll timeout", MyHandler(), Dispatcher<int>(f1)) { + EXPECT_FALSE(f2.waitForThreads(1, 2)); +} + +TEST_MAIN() { TEST_RUN_ALL(); } |