summaryrefslogtreecommitdiffstats
path: root/vbench/src/tests/dispatcher/dispatcher_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vbench/src/tests/dispatcher/dispatcher_test.cpp')
-rw-r--r--vbench/src/tests/dispatcher/dispatcher_test.cpp60
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(); }