summaryrefslogtreecommitdiffstats
path: root/vbench/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'vbench/src/tests')
-rw-r--r--vbench/src/tests/.gitignore3
-rw-r--r--vbench/src/tests/app_dumpurl/.gitignore1
-rw-r--r--vbench/src/tests/app_dumpurl/CMakeLists.txt9
-rw-r--r--vbench/src/tests/app_dumpurl/FILES1
-rw-r--r--vbench/src/tests/app_dumpurl/app_dumpurl_test.cpp50
-rw-r--r--vbench/src/tests/app_vbench/.gitignore3
-rw-r--r--vbench/src/tests/app_vbench/CMakeLists.txt9
-rw-r--r--vbench/src/tests/app_vbench/FILES3
-rw-r--r--vbench/src/tests/app_vbench/app_vbench_test.cpp59
-rw-r--r--vbench/src/tests/app_vbench/input.txt72
-rw-r--r--vbench/src/tests/app_vbench/vbench.cfg.template25
-rw-r--r--vbench/src/tests/benchmark_headers/.gitignore1
-rw-r--r--vbench/src/tests/benchmark_headers/CMakeLists.txt9
-rw-r--r--vbench/src/tests/benchmark_headers/FILES1
-rw-r--r--vbench/src/tests/benchmark_headers/benchmark_headers_test.cpp79
-rw-r--r--vbench/src/tests/buffered_output/.gitignore1
-rw-r--r--vbench/src/tests/buffered_output/CMakeLists.txt9
-rw-r--r--vbench/src/tests/buffered_output/FILES1
-rw-r--r--vbench/src/tests/buffered_output/buffered_output_test.cpp32
-rw-r--r--vbench/src/tests/byte_input/.gitignore1
-rw-r--r--vbench/src/tests/byte_input/CMakeLists.txt9
-rw-r--r--vbench/src/tests/byte_input/FILES1
-rw-r--r--vbench/src/tests/byte_input/byte_input_test.cpp39
-rwxr-xr-xvbench/src/tests/create-test.sh55
-rw-r--r--vbench/src/tests/dispatcher/.gitignore1
-rw-r--r--vbench/src/tests/dispatcher/CMakeLists.txt9
-rw-r--r--vbench/src/tests/dispatcher/FILES1
-rw-r--r--vbench/src/tests/dispatcher/dispatcher_test.cpp60
-rw-r--r--vbench/src/tests/dropped_tagger/.gitignore1
-rw-r--r--vbench/src/tests/dropped_tagger/CMakeLists.txt9
-rw-r--r--vbench/src/tests/dropped_tagger/FILES1
-rw-r--r--vbench/src/tests/dropped_tagger/dropped_tagger_test.cpp15
-rw-r--r--vbench/src/tests/handler_thread/.gitignore1
-rw-r--r--vbench/src/tests/handler_thread/CMakeLists.txt9
-rw-r--r--vbench/src/tests/handler_thread/FILES1
-rw-r--r--vbench/src/tests/handler_thread/handler_thread_test.cpp30
-rw-r--r--vbench/src/tests/hex_number/.gitignore1
-rw-r--r--vbench/src/tests/hex_number/CMakeLists.txt9
-rw-r--r--vbench/src/tests/hex_number/FILES1
-rw-r--r--vbench/src/tests/hex_number/hex_number_test.cpp20
-rw-r--r--vbench/src/tests/http_client/.gitignore1
-rw-r--r--vbench/src/tests/http_client/CMakeLists.txt9
-rw-r--r--vbench/src/tests/http_client/FILES1
-rw-r--r--vbench/src/tests/http_client/http_client_test.cpp119
-rw-r--r--vbench/src/tests/http_connection/.gitignore1
-rw-r--r--vbench/src/tests/http_connection/CMakeLists.txt9
-rw-r--r--vbench/src/tests/http_connection/FILES1
-rw-r--r--vbench/src/tests/http_connection/http_connection_test.cpp22
-rw-r--r--vbench/src/tests/http_connection_pool/.gitignore1
-rw-r--r--vbench/src/tests/http_connection_pool/CMakeLists.txt9
-rw-r--r--vbench/src/tests/http_connection_pool/FILES1
-rw-r--r--vbench/src/tests/http_connection_pool/http_connection_pool_test.cpp55
-rw-r--r--vbench/src/tests/input_file_reader/.gitignore1
-rw-r--r--vbench/src/tests/input_file_reader/CMakeLists.txt9
-rw-r--r--vbench/src/tests/input_file_reader/FILES3
-rw-r--r--vbench/src/tests/input_file_reader/hard_test_input.txt5
-rw-r--r--vbench/src/tests/input_file_reader/input_file_reader_test.cpp42
-rw-r--r--vbench/src/tests/input_file_reader/simple_test_input.txt3
-rw-r--r--vbench/src/tests/input_reader/.gitignore0
-rw-r--r--vbench/src/tests/latency_analyzer/.gitignore1
-rw-r--r--vbench/src/tests/latency_analyzer/CMakeLists.txt9
-rw-r--r--vbench/src/tests/latency_analyzer/FILES1
-rw-r--r--vbench/src/tests/latency_analyzer/latency_analyzer_test.cpp36
-rw-r--r--vbench/src/tests/line_reader/.gitignore1
-rw-r--r--vbench/src/tests/line_reader/CMakeLists.txt9
-rw-r--r--vbench/src/tests/line_reader/FILES1
-rw-r--r--vbench/src/tests/line_reader/line_reader_test.cpp38
-rw-r--r--vbench/src/tests/mapped_file_input/.gitignore1
-rw-r--r--vbench/src/tests/mapped_file_input/CMakeLists.txt9
-rw-r--r--vbench/src/tests/mapped_file_input/FILES2
-rw-r--r--vbench/src/tests/mapped_file_input/file.txt1
-rw-r--r--vbench/src/tests/mapped_file_input/mapped_file_input_test.cpp23
-rw-r--r--vbench/src/tests/memory/.gitignore1
-rw-r--r--vbench/src/tests/memory/CMakeLists.txt9
-rw-r--r--vbench/src/tests/memory/FILES1
-rw-r--r--vbench/src/tests/memory/memory_test.cpp40
-rw-r--r--vbench/src/tests/qps_analyzer/.gitignore1
-rw-r--r--vbench/src/tests/qps_analyzer/CMakeLists.txt9
-rw-r--r--vbench/src/tests/qps_analyzer/FILES1
-rw-r--r--vbench/src/tests/qps_analyzer/qps_analyzer_test.cpp23
-rw-r--r--vbench/src/tests/qps_tagger/.gitignore1
-rw-r--r--vbench/src/tests/qps_tagger/CMakeLists.txt9
-rw-r--r--vbench/src/tests/qps_tagger/FILES1
-rw-r--r--vbench/src/tests/qps_tagger/qps_tagger_test.cpp22
-rw-r--r--vbench/src/tests/request_dumper/.gitignore1
-rw-r--r--vbench/src/tests/request_dumper/CMakeLists.txt9
-rw-r--r--vbench/src/tests/request_dumper/FILES1
-rw-r--r--vbench/src/tests/request_dumper/request_dumper_test.cpp11
-rw-r--r--vbench/src/tests/request_generator/.gitignore1
-rw-r--r--vbench/src/tests/request_generator/CMakeLists.txt9
-rw-r--r--vbench/src/tests/request_generator/FILES2
-rw-r--r--vbench/src/tests/request_generator/input.txt1
-rw-r--r--vbench/src/tests/request_generator/request_generator_test.cpp27
-rw-r--r--vbench/src/tests/request_sink/.gitignore1
-rw-r--r--vbench/src/tests/request_sink/CMakeLists.txt9
-rw-r--r--vbench/src/tests/request_sink/FILES1
-rw-r--r--vbench/src/tests/request_sink/request_sink_test.cpp11
-rw-r--r--vbench/src/tests/runnable_pair/.gitignore0
-rw-r--r--vbench/src/tests/server_socket/.gitignore1
-rw-r--r--vbench/src/tests/server_socket/CMakeLists.txt9
-rw-r--r--vbench/src/tests/server_socket/FILES1
-rw-r--r--vbench/src/tests/server_socket/server_socket_test.cpp24
-rw-r--r--vbench/src/tests/server_spec/.gitignore1
-rw-r--r--vbench/src/tests/server_spec/CMakeLists.txt9
-rw-r--r--vbench/src/tests/server_spec/FILES1
-rw-r--r--vbench/src/tests/server_spec/server_spec_test.cpp38
-rw-r--r--vbench/src/tests/server_tagger/.gitignore1
-rw-r--r--vbench/src/tests/server_tagger/CMakeLists.txt9
-rw-r--r--vbench/src/tests/server_tagger/FILES1
-rw-r--r--vbench/src/tests/server_tagger/server_tagger_test.cpp17
-rw-r--r--vbench/src/tests/simple_buffer/.gitignore1
-rw-r--r--vbench/src/tests/simple_buffer/CMakeLists.txt9
-rw-r--r--vbench/src/tests/simple_buffer/FILES1
-rw-r--r--vbench/src/tests/simple_buffer/simple_buffer_test.cpp70
-rw-r--r--vbench/src/tests/socket/.gitignore1
-rw-r--r--vbench/src/tests/socket/CMakeLists.txt9
-rw-r--r--vbench/src/tests/socket/FILES1
-rw-r--r--vbench/src/tests/socket/socket_test.cpp72
-rw-r--r--vbench/src/tests/taint/.gitignore1
-rw-r--r--vbench/src/tests/taint/CMakeLists.txt9
-rw-r--r--vbench/src/tests/taint/FILES1
-rw-r--r--vbench/src/tests/taint/taint_test.cpp43
-rw-r--r--vbench/src/tests/thread/.gitignore0
-rw-r--r--vbench/src/tests/time_queue/.gitignore1
-rw-r--r--vbench/src/tests/time_queue/CMakeLists.txt9
-rw-r--r--vbench/src/tests/time_queue/FILES1
-rw-r--r--vbench/src/tests/time_queue/time_queue_test.cpp65
-rw-r--r--vbench/src/tests/timer/.gitignore1
-rw-r--r--vbench/src/tests/timer/CMakeLists.txt9
-rw-r--r--vbench/src/tests/timer/FILES1
-rw-r--r--vbench/src/tests/timer/timer_test.cpp16
-rw-r--r--vbench/src/tests/true/.gitignore0
-rw-r--r--vbench/src/tests/writable_memory/.gitignore1
-rw-r--r--vbench/src/tests/writable_memory/CMakeLists.txt9
-rw-r--r--vbench/src/tests/writable_memory/FILES1
-rw-r--r--vbench/src/tests/writable_memory/writable_memory_test.cpp20
136 files changed, 1732 insertions, 0 deletions
diff --git a/vbench/src/tests/.gitignore b/vbench/src/tests/.gitignore
new file mode 100644
index 00000000000..a3e9c375723
--- /dev/null
+++ b/vbench/src/tests/.gitignore
@@ -0,0 +1,3 @@
+.depend
+Makefile
+*_test
diff --git a/vbench/src/tests/app_dumpurl/.gitignore b/vbench/src/tests/app_dumpurl/.gitignore
new file mode 100644
index 00000000000..6cf8101a380
--- /dev/null
+++ b/vbench/src/tests/app_dumpurl/.gitignore
@@ -0,0 +1 @@
+vbench_app_dumpurl_test_app
diff --git a/vbench/src/tests/app_dumpurl/CMakeLists.txt b/vbench/src/tests/app_dumpurl/CMakeLists.txt
new file mode 100644
index 00000000000..2ff66e4edcd
--- /dev/null
+++ b/vbench/src/tests/app_dumpurl/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_app_dumpurl_test_app
+ SOURCES
+ app_dumpurl_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_app_dumpurl_test_app NO_VALGRIND COMMAND vbench_app_dumpurl_test_app)
diff --git a/vbench/src/tests/app_dumpurl/FILES b/vbench/src/tests/app_dumpurl/FILES
new file mode 100644
index 00000000000..54382f23234
--- /dev/null
+++ b/vbench/src/tests/app_dumpurl/FILES
@@ -0,0 +1 @@
+app_dumpurl_test.cpp
diff --git a/vbench/src/tests/app_dumpurl/app_dumpurl_test.cpp b/vbench/src/tests/app_dumpurl/app_dumpurl_test.cpp
new file mode 100644
index 00000000000..48a8ce156f0
--- /dev/null
+++ b/vbench/src/tests/app_dumpurl/app_dumpurl_test.cpp
@@ -0,0 +1,50 @@
+// 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>
+#include <vespa/vespalib/util/slaveproc.h>
+
+using namespace vbench;
+using vespalib::SlaveProc;
+
+bool endsWith(const Memory &mem, const string &str) {
+ return (mem.size < str.size()) ? false
+ : (strncmp(mem.data + mem.size - str.size(), str.data(), str.size()) == 0);
+}
+
+void readUntil(Input &input, SimpleBuffer &buffer, const string &end) {
+ ByteInput in(input, 256);
+ while (!endsWith(buffer.get(), end)) {
+ int c = in.get();
+ if (c < 0) {
+ return;
+ }
+ buffer.reserve(1).data[0] = c;
+ buffer.commit(1, 0);
+ }
+}
+
+TEST("dumpurl usage") {
+ std::string out;
+ EXPECT_FALSE(SlaveProc::run("../../apps/dumpurl/vbench_dumpurl_app", out));
+ fprintf(stderr, "%s\n", out.c_str());
+}
+
+TEST_MT_F("run dumpurl", 2, ServerSocket()) {
+ if (thread_id == 0) {
+ Stream::UP stream = f1.accept();
+ SimpleBuffer ignore;
+ readUntil(*stream, ignore, "\r\n\r\n");
+ BufferedOutput out(*stream, 256);
+ out.append("HTTP/1.1 200\r\n");
+ out.append("content-length: 4\r\n");
+ out.append("\r\n");
+ out.append("data");
+ } else {
+ std::string out;
+ EXPECT_TRUE(SlaveProc::run(strfmt("../../apps/dumpurl/vbench_dumpurl_app localhost %d /foo",
+ f1.port()).c_str(), out));
+ fprintf(stderr, "%s\n", out.c_str());
+ }
+}
+
+TEST_MAIN_WITH_PROCESS_PROXY() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/app_vbench/.gitignore b/vbench/src/tests/app_vbench/.gitignore
new file mode 100644
index 00000000000..0f290bb76ac
--- /dev/null
+++ b/vbench/src/tests/app_vbench/.gitignore
@@ -0,0 +1,3 @@
+/vbench.cfg
+/vbench.out
+vbench_app_vbench_test_app
diff --git a/vbench/src/tests/app_vbench/CMakeLists.txt b/vbench/src/tests/app_vbench/CMakeLists.txt
new file mode 100644
index 00000000000..6295571cc09
--- /dev/null
+++ b/vbench/src/tests/app_vbench/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_app_vbench_test_app
+ SOURCES
+ app_vbench_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_app_vbench_test_app NO_VALGRIND COMMAND vbench_app_vbench_test_app)
diff --git a/vbench/src/tests/app_vbench/FILES b/vbench/src/tests/app_vbench/FILES
new file mode 100644
index 00000000000..8a53b5dfde7
--- /dev/null
+++ b/vbench/src/tests/app_vbench/FILES
@@ -0,0 +1,3 @@
+app_vbench_test.cpp
+vbench.cfg
+vbench.out
diff --git a/vbench/src/tests/app_vbench/app_vbench_test.cpp b/vbench/src/tests/app_vbench/app_vbench_test.cpp
new file mode 100644
index 00000000000..87461702075
--- /dev/null
+++ b/vbench/src/tests/app_vbench/app_vbench_test.cpp
@@ -0,0 +1,59 @@
+// 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>
+#include <vespa/vespalib/util/slaveproc.h>
+
+using namespace vbench;
+using vespalib::SlaveProc;
+
+bool endsWith(const Memory &mem, const string &str) {
+ return (mem.size < str.size()) ? false
+ : (strncmp(mem.data + mem.size - str.size(), str.data(), str.size()) == 0);
+}
+
+void readUntil(Input &input, SimpleBuffer &buffer, const string &end) {
+ ByteInput in(input, 256);
+ while (!endsWith(buffer.get(), end)) {
+ int c = in.get();
+ if (c < 0) {
+ return;
+ }
+ buffer.reserve(1).data[0] = c;
+ buffer.commit(1, 0);
+ }
+}
+
+TEST("vbench usage") {
+ std::string out;
+ EXPECT_FALSE(SlaveProc::run("../../apps/vbench/vbench_app", out));
+ fprintf(stderr, "%s\n", out.c_str());
+}
+
+TEST_MT_F("run vbench", 2, ServerSocket()) {
+ if (thread_id == 0) {
+ for (;;) {
+ Stream::UP stream = f1.accept();
+ if (stream.get() == 0) {
+ break;
+ }
+ SimpleBuffer ignore;
+ readUntil(*stream, ignore, "\r\n\r\n");
+ BufferedOutput out(*stream, 256);
+ out.append("HTTP/1.1 200\r\n");
+ out.append("content-length: 4\r\n");
+ out.append("X-Yahoo-Vespa-NumHits 10\r\n");
+ out.append("X-Yahoo-Vespa-TotalHitCount 100\r\n");
+ out.append("\r\n");
+ out.append("data");
+ }
+ } else {
+ std::string out;
+ EXPECT_TRUE(SlaveProc::run("cp vbench.cfg.template vbench.cfg"));
+ EXPECT_TRUE(SlaveProc::run(strfmt("sed -i 's/_LOCAL_PORT_/%d/' vbench.cfg", f1.port()).c_str()));
+ EXPECT_TRUE(SlaveProc::run("../../apps/vbench/vbench_app run vbench.cfg 2> vbench.out", out));
+ fprintf(stderr, "%s\n", out.c_str());
+ f1.close();
+ }
+}
+
+TEST_MAIN_WITH_PROCESS_PROXY() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/app_vbench/input.txt b/vbench/src/tests/app_vbench/input.txt
new file mode 100644
index 00000000000..c9a57e7a555
--- /dev/null
+++ b/vbench/src/tests/app_vbench/input.txt
@@ -0,0 +1,72 @@
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
+/foo
diff --git a/vbench/src/tests/app_vbench/vbench.cfg.template b/vbench/src/tests/app_vbench/vbench.cfg.template
new file mode 100644
index 00000000000..de8e30a7fbe
--- /dev/null
+++ b/vbench/src/tests/app_vbench/vbench.cfg.template
@@ -0,0 +1,25 @@
+{
+ http_threads: 32,
+ inputs: [
+ {
+ source: { type: 'RequestGenerator', file: 'input.txt' },
+ prepare: [
+ { type: 'ServerTagger', host: 'localhost', port:_LOCAL_PORT_ },
+ { type: 'QpsTagger', qps: 10 }
+ ]
+ },
+ {
+ source: { type: 'RequestGenerator', file: 'input.txt' },
+ prepare: [
+ { type: 'ServerTagger', host: 'localhost', port:_LOCAL_PORT_ },
+ { type: 'QpsTagger', qps: 10 }
+ ]
+ }
+ ],
+ analyze: [
+ { type: 'IgnoreBefore', time: 1.0 },
+ { type: 'QpsAnalyzer' },
+ { type: 'LatencyAnalyzer' },
+ { type: 'RequestDumper' }
+ ]
+}
diff --git a/vbench/src/tests/benchmark_headers/.gitignore b/vbench/src/tests/benchmark_headers/.gitignore
new file mode 100644
index 00000000000..ca919fcf3e5
--- /dev/null
+++ b/vbench/src/tests/benchmark_headers/.gitignore
@@ -0,0 +1 @@
+vbench_benchmark_headers_test_app
diff --git a/vbench/src/tests/benchmark_headers/CMakeLists.txt b/vbench/src/tests/benchmark_headers/CMakeLists.txt
new file mode 100644
index 00000000000..ab8f0bce02e
--- /dev/null
+++ b/vbench/src/tests/benchmark_headers/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_benchmark_headers_test_app
+ SOURCES
+ benchmark_headers_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_benchmark_headers_test_app COMMAND vbench_benchmark_headers_test_app)
diff --git a/vbench/src/tests/benchmark_headers/FILES b/vbench/src/tests/benchmark_headers/FILES
new file mode 100644
index 00000000000..d2beb7f953f
--- /dev/null
+++ b/vbench/src/tests/benchmark_headers/FILES
@@ -0,0 +1 @@
+benchmark_headers_test.cpp
diff --git a/vbench/src/tests/benchmark_headers/benchmark_headers_test.cpp b/vbench/src/tests/benchmark_headers/benchmark_headers_test.cpp
new file mode 100644
index 00000000000..9da9a100613
--- /dev/null
+++ b/vbench/src/tests/benchmark_headers/benchmark_headers_test.cpp
@@ -0,0 +1,79 @@
+// 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;
+
+TEST("require that benchmark headers can be set") {
+ vbench::BenchmarkHeaders headers;
+ EXPECT_FALSE(headers.num_hits.is_set);
+ EXPECT_FALSE(headers.num_fasthits.is_set);
+ EXPECT_FALSE(headers.num_grouphits.is_set);
+ EXPECT_FALSE(headers.num_errors.is_set);
+ EXPECT_FALSE(headers.total_hit_count.is_set);
+ EXPECT_FALSE(headers.num_docsums.is_set);
+ EXPECT_FALSE(headers.query_hits.is_set);
+ EXPECT_FALSE(headers.query_offset.is_set);
+ EXPECT_FALSE(headers.search_time.is_set);
+ EXPECT_FALSE(headers.attr_time.is_set);
+ EXPECT_FALSE(headers.fill_time.is_set);
+ EXPECT_FALSE(headers.docs_searched.is_set);
+ EXPECT_FALSE(headers.nodes_searched.is_set);
+ EXPECT_FALSE(headers.full_coverage.is_set);
+
+ headers.handleHeader("X-Yahoo-Vespa-NumHits", "1");
+ headers.handleHeader("X-Yahoo-Vespa-NumFastHits", "2");
+ headers.handleHeader("X-Yahoo-Vespa-NumGroupHits", "3");
+ headers.handleHeader("X-Yahoo-Vespa-NumErrors", "4");
+ headers.handleHeader("X-Yahoo-Vespa-TotalHitCount", "5");
+ headers.handleHeader("X-Yahoo-Vespa-NumDocsums", "6");
+ headers.handleHeader("X-Yahoo-Vespa-QueryHits", "7");
+ headers.handleHeader("X-Yahoo-Vespa-QueryOffset", "8");
+ headers.handleHeader("X-Yahoo-Vespa-SearchTime", "9");
+ headers.handleHeader("X-Yahoo-Vespa-AttributeFetchTime" , "10");
+ headers.handleHeader("X-Yahoo-Vespa-FillTime", "11");
+ headers.handleHeader("X-Yahoo-Vespa-DocsSearched", "12");
+ headers.handleHeader("X-Yahoo-Vespa-NodesSearched", "13");
+ headers.handleHeader("X-Yahoo-Vespa-FullCoverage", "14");
+
+ EXPECT_TRUE(headers.num_hits.is_set);
+ EXPECT_TRUE(headers.num_fasthits.is_set);
+ EXPECT_TRUE(headers.num_grouphits.is_set);
+ EXPECT_TRUE(headers.num_errors.is_set);
+ EXPECT_TRUE(headers.total_hit_count.is_set);
+ EXPECT_TRUE(headers.num_docsums.is_set);
+ EXPECT_TRUE(headers.query_hits.is_set);
+ EXPECT_TRUE(headers.query_offset.is_set);
+ EXPECT_TRUE(headers.search_time.is_set);
+ EXPECT_TRUE(headers.attr_time.is_set);
+ EXPECT_TRUE(headers.fill_time.is_set);
+ EXPECT_TRUE(headers.docs_searched.is_set);
+ EXPECT_TRUE(headers.nodes_searched.is_set);
+ EXPECT_TRUE(headers.full_coverage.is_set);
+
+ EXPECT_EQUAL(headers.num_hits.value, 1.0);
+ EXPECT_EQUAL(headers.num_fasthits.value, 2.0);
+ EXPECT_EQUAL(headers.num_grouphits.value, 3.0);
+ EXPECT_EQUAL(headers.num_errors.value, 4.0);
+ EXPECT_EQUAL(headers.total_hit_count.value, 5.0);
+ EXPECT_EQUAL(headers.num_docsums.value, 6.0);
+ EXPECT_EQUAL(headers.query_hits.value, 7.0);
+ EXPECT_EQUAL(headers.query_offset.value, 8.0);
+ EXPECT_EQUAL(headers.search_time.value, 9.0);
+ EXPECT_EQUAL(headers.attr_time.value, 10.0);
+ EXPECT_EQUAL(headers.fill_time.value, 11.0);
+ EXPECT_EQUAL(headers.docs_searched.value, 12.0);
+ EXPECT_EQUAL(headers.nodes_searched.value, 13.0);
+ EXPECT_EQUAL(headers.full_coverage.value, 14.0);
+}
+
+TEST("require that benchmark headers can be converted to string") {
+ vbench::BenchmarkHeaders headers;
+ headers.handleHeader("X-Yahoo-Vespa-NumErrors", "4");
+ headers.handleHeader("X-Yahoo-Vespa-TotalHitCount", "5");
+ headers.handleHeader("X-Yahoo-Vespa-NumDocsums", "6");
+ vbench::string result = headers.toString();
+ fprintf(stderr, "%s", result.c_str());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/buffered_output/.gitignore b/vbench/src/tests/buffered_output/.gitignore
new file mode 100644
index 00000000000..ba59218c6c5
--- /dev/null
+++ b/vbench/src/tests/buffered_output/.gitignore
@@ -0,0 +1 @@
+vbench_buffered_output_test_app
diff --git a/vbench/src/tests/buffered_output/CMakeLists.txt b/vbench/src/tests/buffered_output/CMakeLists.txt
new file mode 100644
index 00000000000..7dfc6c326a7
--- /dev/null
+++ b/vbench/src/tests/buffered_output/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_buffered_output_test_app
+ SOURCES
+ buffered_output_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_buffered_output_test_app COMMAND vbench_buffered_output_test_app)
diff --git a/vbench/src/tests/buffered_output/FILES b/vbench/src/tests/buffered_output/FILES
new file mode 100644
index 00000000000..86ca0ac84c1
--- /dev/null
+++ b/vbench/src/tests/buffered_output/FILES
@@ -0,0 +1 @@
+buffered_output_test.cpp
diff --git a/vbench/src/tests/buffered_output/buffered_output_test.cpp b/vbench/src/tests/buffered_output/buffered_output_test.cpp
new file mode 100644
index 00000000000..79bd490c71c
--- /dev/null
+++ b/vbench/src/tests/buffered_output/buffered_output_test.cpp
@@ -0,0 +1,32 @@
+// 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;
+
+TEST("buffered output") {
+ SimpleBuffer buffer;
+ { // produce data
+ BufferedOutput dst(buffer, 3);
+ dst.append('a').append('b').append('c').append('\n');
+ dst.append("foo bar").append('\n');
+ dst.append(string("str")).append('\n');
+ dst.printf("%d + %d = %d\n", 2, 2, 4);
+ }
+ { // verify data
+ LineReader src(buffer, 3);
+ string str;
+ EXPECT_TRUE(src.readLine(str));
+ EXPECT_EQUAL("abc", str);
+ EXPECT_TRUE(src.readLine(str));
+ EXPECT_EQUAL("foo bar", str);
+ EXPECT_TRUE(src.readLine(str));
+ EXPECT_EQUAL("str", str);
+ EXPECT_TRUE(src.readLine(str));
+ EXPECT_EQUAL("2 + 2 = 4", str);
+ EXPECT_TRUE(!src.readLine(str));
+ EXPECT_EQUAL("", str);
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/byte_input/.gitignore b/vbench/src/tests/byte_input/.gitignore
new file mode 100644
index 00000000000..350435ffda4
--- /dev/null
+++ b/vbench/src/tests/byte_input/.gitignore
@@ -0,0 +1 @@
+vbench_byte_input_test_app
diff --git a/vbench/src/tests/byte_input/CMakeLists.txt b/vbench/src/tests/byte_input/CMakeLists.txt
new file mode 100644
index 00000000000..5838ed58d76
--- /dev/null
+++ b/vbench/src/tests/byte_input/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_byte_input_test_app
+ SOURCES
+ byte_input_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_byte_input_test_app COMMAND vbench_byte_input_test_app)
diff --git a/vbench/src/tests/byte_input/FILES b/vbench/src/tests/byte_input/FILES
new file mode 100644
index 00000000000..c625277f587
--- /dev/null
+++ b/vbench/src/tests/byte_input/FILES
@@ -0,0 +1 @@
+byte_input_test.cpp
diff --git a/vbench/src/tests/byte_input/byte_input_test.cpp b/vbench/src/tests/byte_input/byte_input_test.cpp
new file mode 100644
index 00000000000..251b16449be
--- /dev/null
+++ b/vbench/src/tests/byte_input/byte_input_test.cpp
@@ -0,0 +1,39 @@
+// 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;
+
+TEST("byte input") {
+ SimpleBuffer buffer;
+ {
+ BufferedOutput out(buffer, 10);
+ out.append("abcdefgh");
+ }
+ EXPECT_EQUAL(8u, buffer.get().size);
+ {
+ ByteInput in(buffer, 3);
+ EXPECT_EQUAL('a', in.get());
+ EXPECT_EQUAL('b', in.get());
+ EXPECT_EQUAL('c', in.get());
+ EXPECT_EQUAL('d', in.get());
+ }
+ EXPECT_EQUAL(4u, buffer.get().size);
+ {
+ ByteInput in(buffer, 3);
+ EXPECT_EQUAL('e', in.get());
+ EXPECT_EQUAL('f', in.get());
+ EXPECT_EQUAL('g', in.get());
+ EXPECT_EQUAL('h', in.get());
+ EXPECT_EQUAL(-1, in.get());
+ EXPECT_EQUAL(-1, in.get());
+ }
+ EXPECT_EQUAL(0u, buffer.get().size);
+ {
+ ByteInput in(buffer, 3);
+ EXPECT_EQUAL(-1, in.get());
+ }
+ EXPECT_EQUAL(0u, buffer.get().size);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/create-test.sh b/vbench/src/tests/create-test.sh
new file mode 100755
index 00000000000..793bfd9ef48
--- /dev/null
+++ b/vbench/src/tests/create-test.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+gen_project_file() {
+ echo "generating '$1' ..."
+ echo "APPLICATION ${test}_test" > $1
+ echo "OBJS ${test}_test" >> $1
+ echo "LIBS vbench/test/test" >> $1
+ echo "LIBS vbench/vbench" >> $1
+ echo "EXTERNALLIBS staging_vespalib" >> $1
+ echo "" >> $1
+ echo "CUSTOMMAKE" >> $1
+ echo "test: ${test}_test" >> $1
+ echo -e "\t\$(LDL) \$(VALGRIND) ./${test}_test" >> $1
+}
+
+gen_source() {
+ echo "generating '$1' ..."
+ echo "#include <vespa/vespalib/testkit/testapp.h>" >> $1
+ echo "#include <vbench/test/all.h>" >> $1
+ echo "" >> $1
+ echo "using namespace vbench;" >> $1
+ echo "" >> $1
+ echo "TEST(\"foo\") {" >> $1
+ echo " EXPECT_TRUE(true);" >> $1
+ echo "}" >> $1
+ echo "" >> $1
+ echo "TEST_MAIN() { TEST_RUN_ALL(); }" >> $1
+}
+
+gen_file_list() {
+ echo "generating '$1' ..."
+ echo "${test}_test.cpp" > $1
+}
+
+if [ $# -ne 1 ]; then
+ echo "usage: $0 <name>"
+ echo " name: name of the test to create"
+ exit 1
+fi
+
+test=$1
+if [ -e $test ]; then
+ echo "$test already present, don't want to mess it up..."
+ exit 1
+fi
+
+echo "creating directory '$test' ..."
+mkdir -p $test || exit 1
+cd $test || exit 1
+test=`basename $test`
+
+gen_project_file fastos.project
+gen_source ${test}_test.cpp
+gen_file_list FILES
diff --git a/vbench/src/tests/dispatcher/.gitignore b/vbench/src/tests/dispatcher/.gitignore
new file mode 100644
index 00000000000..6b038801688
--- /dev/null
+++ b/vbench/src/tests/dispatcher/.gitignore
@@ -0,0 +1 @@
+vbench_dispatcher_test_app
diff --git a/vbench/src/tests/dispatcher/CMakeLists.txt b/vbench/src/tests/dispatcher/CMakeLists.txt
new file mode 100644
index 00000000000..0cdc9ffb2d3
--- /dev/null
+++ b/vbench/src/tests/dispatcher/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_dispatcher_test_app
+ SOURCES
+ dispatcher_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_dispatcher_test_app COMMAND vbench_dispatcher_test_app)
diff --git a/vbench/src/tests/dispatcher/FILES b/vbench/src/tests/dispatcher/FILES
new file mode 100644
index 00000000000..8e526a62463
--- /dev/null
+++ b/vbench/src/tests/dispatcher/FILES
@@ -0,0 +1 @@
+dispatcher_test.cpp
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(); }
diff --git a/vbench/src/tests/dropped_tagger/.gitignore b/vbench/src/tests/dropped_tagger/.gitignore
new file mode 100644
index 00000000000..71ef5c44a9d
--- /dev/null
+++ b/vbench/src/tests/dropped_tagger/.gitignore
@@ -0,0 +1 @@
+vbench_dropped_tagger_test_app
diff --git a/vbench/src/tests/dropped_tagger/CMakeLists.txt b/vbench/src/tests/dropped_tagger/CMakeLists.txt
new file mode 100644
index 00000000000..2fc41839d5d
--- /dev/null
+++ b/vbench/src/tests/dropped_tagger/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_dropped_tagger_test_app
+ SOURCES
+ dropped_tagger_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_dropped_tagger_test_app COMMAND vbench_dropped_tagger_test_app)
diff --git a/vbench/src/tests/dropped_tagger/FILES b/vbench/src/tests/dropped_tagger/FILES
new file mode 100644
index 00000000000..535abf7ee58
--- /dev/null
+++ b/vbench/src/tests/dropped_tagger/FILES
@@ -0,0 +1 @@
+dropped_tagger_test.cpp
diff --git a/vbench/src/tests/dropped_tagger/dropped_tagger_test.cpp b/vbench/src/tests/dropped_tagger/dropped_tagger_test.cpp
new file mode 100644
index 00000000000..60cbf6d03a7
--- /dev/null
+++ b/vbench/src/tests/dropped_tagger/dropped_tagger_test.cpp
@@ -0,0 +1,15 @@
+// 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;
+
+TEST_FF("dropped tagger", RequestReceptor(), DroppedTagger(f1)) {
+ Request::UP req(new Request());
+ EXPECT_EQUAL(Request::STATUS_OK, req->status());
+ f2.handle(std::move(req));
+ ASSERT_TRUE(f1.request.get() != 0);
+ EXPECT_EQUAL(Request::STATUS_DROPPED, f1.request->status());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/handler_thread/.gitignore b/vbench/src/tests/handler_thread/.gitignore
new file mode 100644
index 00000000000..41890930291
--- /dev/null
+++ b/vbench/src/tests/handler_thread/.gitignore
@@ -0,0 +1 @@
+vbench_handler_thread_test_app
diff --git a/vbench/src/tests/handler_thread/CMakeLists.txt b/vbench/src/tests/handler_thread/CMakeLists.txt
new file mode 100644
index 00000000000..ee69cc594de
--- /dev/null
+++ b/vbench/src/tests/handler_thread/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_handler_thread_test_app
+ SOURCES
+ handler_thread_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_handler_thread_test_app COMMAND vbench_handler_thread_test_app)
diff --git a/vbench/src/tests/handler_thread/FILES b/vbench/src/tests/handler_thread/FILES
new file mode 100644
index 00000000000..978aa147772
--- /dev/null
+++ b/vbench/src/tests/handler_thread/FILES
@@ -0,0 +1 @@
+handler_thread_test.cpp
diff --git a/vbench/src/tests/handler_thread/handler_thread_test.cpp b/vbench/src/tests/handler_thread/handler_thread_test.cpp
new file mode 100644
index 00000000000..43f0c4d4a1b
--- /dev/null
+++ b/vbench/src/tests/handler_thread/handler_thread_test.cpp
@@ -0,0 +1,30 @@
+// 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 : Handler<int> {
+ std::vector<int> values;
+ virtual void handle(std::unique_ptr<int> value) {
+ values.push_back(*value);
+ vespalib::Thread::sleep(10); // for improved coverage
+ }
+};
+
+TEST("handler thread") {
+ MyHandler handler;
+ HandlerThread<int> th(handler);
+ th.handle(std::unique_ptr<int>(new int(1)));
+ th.handle(std::unique_ptr<int>(new int(2)));
+ th.handle(std::unique_ptr<int>(new int(3)));
+ th.join();
+ th.handle(std::unique_ptr<int>(new int(4)));
+ th.handle(std::unique_ptr<int>(new int(5)));
+ ASSERT_EQUAL(3u, handler.values.size());
+ EXPECT_EQUAL(1, handler.values[0]);
+ EXPECT_EQUAL(2, handler.values[1]);
+ EXPECT_EQUAL(3, handler.values[2]);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/hex_number/.gitignore b/vbench/src/tests/hex_number/.gitignore
new file mode 100644
index 00000000000..4fef44ee162
--- /dev/null
+++ b/vbench/src/tests/hex_number/.gitignore
@@ -0,0 +1 @@
+vbench_hex_number_test_app
diff --git a/vbench/src/tests/hex_number/CMakeLists.txt b/vbench/src/tests/hex_number/CMakeLists.txt
new file mode 100644
index 00000000000..37875434e5e
--- /dev/null
+++ b/vbench/src/tests/hex_number/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_hex_number_test_app
+ SOURCES
+ hex_number_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_hex_number_test_app COMMAND vbench_hex_number_test_app)
diff --git a/vbench/src/tests/hex_number/FILES b/vbench/src/tests/hex_number/FILES
new file mode 100644
index 00000000000..488979a3169
--- /dev/null
+++ b/vbench/src/tests/hex_number/FILES
@@ -0,0 +1 @@
+hex_number_test.cpp
diff --git a/vbench/src/tests/hex_number/hex_number_test.cpp b/vbench/src/tests/hex_number/hex_number_test.cpp
new file mode 100644
index 00000000000..12833814979
--- /dev/null
+++ b/vbench/src/tests/hex_number/hex_number_test.cpp
@@ -0,0 +1,20 @@
+// 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;
+
+TEST("hex number") {
+ EXPECT_EQUAL(0u, HexNumber("").value());
+ EXPECT_EQUAL(0u, HexNumber("").length());
+ EXPECT_EQUAL(0u, HexNumber("000").value());
+ EXPECT_EQUAL(3u, HexNumber("000").length());
+ EXPECT_EQUAL(0x1ee7u, HexNumber("1ee7").value());
+ EXPECT_EQUAL(0x0123456789abcdefU, HexNumber("0123456789abcdef").value());
+ EXPECT_EQUAL(0xfedcba9876543210U, HexNumber("FEDCBA9876543210").value());
+ EXPECT_EQUAL(16u, HexNumber("0123456789ABCDEF").length());
+ EXPECT_EQUAL(0xdefu, HexNumber("defghijk").value());
+ EXPECT_EQUAL(3u, HexNumber("defghijk").length());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/http_client/.gitignore b/vbench/src/tests/http_client/.gitignore
new file mode 100644
index 00000000000..7e86463762c
--- /dev/null
+++ b/vbench/src/tests/http_client/.gitignore
@@ -0,0 +1 @@
+vbench_http_client_test_app
diff --git a/vbench/src/tests/http_client/CMakeLists.txt b/vbench/src/tests/http_client/CMakeLists.txt
new file mode 100644
index 00000000000..3a01f9712a3
--- /dev/null
+++ b/vbench/src/tests/http_client/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_http_client_test_app
+ SOURCES
+ http_client_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_http_client_test_app COMMAND vbench_http_client_test_app)
diff --git a/vbench/src/tests/http_client/FILES b/vbench/src/tests/http_client/FILES
new file mode 100644
index 00000000000..a89979fbcba
--- /dev/null
+++ b/vbench/src/tests/http_client/FILES
@@ -0,0 +1 @@
+http_client_test.cpp
diff --git a/vbench/src/tests/http_client/http_client_test.cpp b/vbench/src/tests/http_client/http_client_test.cpp
new file mode 100644
index 00000000000..ce763e09b7d
--- /dev/null
+++ b/vbench/src/tests/http_client/http_client_test.cpp
@@ -0,0 +1,119 @@
+// 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;
+
+void checkMemory(const string &expect, const Memory &mem) {
+ EXPECT_EQUAL(expect, string(mem.data, mem.size));
+}
+
+bool endsWith(const Memory &mem, const string &str) {
+ return (mem.size < str.size()) ? false
+ : (strncmp(mem.data + mem.size - str.size(), str.data(), str.size()) == 0);
+}
+
+void readUntil(Input &input, SimpleBuffer &buffer, const string &end) {
+ ByteInput in(input, 256);
+ while (!endsWith(buffer.get(), end)) {
+ int c = in.get();
+ if (c < 0) {
+ return;
+ }
+ buffer.reserve(1).data[0] = c;
+ buffer.commit(1, 0);
+ }
+}
+
+TEST_MT_F("verify request", 2, ServerSocket()) {
+ if (thread_id == 0) {
+ SimpleBuffer expect;
+ {
+ BufferedOutput dst(expect, 256);
+ dst.append("GET /this/is/the/url HTTP/1.1\r\n");
+ dst.append("Host: localhost\r\n");
+ dst.append("User-Agent: vbench\r\n");
+ dst.append("X-Yahoo-Vespa-Benchmarkdata: true\r\n");
+ dst.append("X-Yahoo-Vespa-Benchmarkdata-Coverage: true\r\n");
+ dst.append("\r\n");
+ }
+ SimpleBuffer actual;
+ Stream::UP stream = f1.accept();
+ ASSERT_TRUE(stream.get() != 0);
+ readUntil(*stream, actual, "\r\n\r\n");
+ EXPECT_TRUE(expect == actual);
+ } else {
+ SimpleHttpResultHandler handler;
+ HttpClient::fetch(ServerSpec("localhost", f1.port()),
+ "/this/is/the/url", handler);
+ }
+}
+
+TEST_MT_F("verify connection close", 2, ServerSocket()) {
+ if (thread_id == 0) {
+ Stream::UP stream = f1.accept();
+ SimpleBuffer ignore;
+ readUntil(*stream, ignore, "\r\n\r\n");
+ BufferedOutput out(*stream, 256);
+ out.append("HTTP/1.0 200\r\n");
+ out.append("\r\n");
+ out.append("data");
+ } else {
+ SimpleHttpResultHandler handler;
+ HttpClient::fetch(ServerSpec("localhost", f1.port()),
+ "/foo", handler);
+ EXPECT_EQUAL(0u, handler.failures().size());
+ EXPECT_EQUAL(0u, handler.headers().size());
+ TEST_DO(checkMemory("data", handler.content()));
+ }
+}
+
+TEST_MT_F("verify content length", 2, ServerSocket()) {
+ if (thread_id == 0) {
+ Stream::UP stream = f1.accept();
+ SimpleBuffer ignore;
+ readUntil(*stream, ignore, "\r\n\r\n");
+ BufferedOutput out(*stream, 256);
+ out.append("HTTP/1.1 200\r\n");
+ out.append("content-length: 4\r\n");
+ out.append("\r\n");
+ out.append("data");
+ } else {
+ SimpleHttpResultHandler handler;
+ HttpClient::fetch(ServerSpec("localhost", f1.port()),
+ "/foo", handler);
+ EXPECT_EQUAL(0u, handler.failures().size());
+ EXPECT_EQUAL(1u, handler.headers().size());
+ TEST_DO(checkMemory("data", handler.content()));
+ }
+}
+
+TEST_MT_F("verify chunked encoding", 2, ServerSocket()) {
+ if (thread_id == 0) {
+ Stream::UP stream = f1.accept();
+ SimpleBuffer ignore;
+ readUntil(*stream, ignore, "\r\n\r\n");
+ BufferedOutput out(*stream, 256);
+ out.append("HTTP/1.1 200\r\n");
+ out.append("transfer-encoding: chunked\r\n");
+ out.append("\r\n");
+ out.append("2\r\n");
+ out.append("da\r\n");
+ out.append("2\r\n");
+ out.append("ta\r\n");
+ out.append("0\r\n");
+ out.append("\r\n");
+ } else {
+ SimpleHttpResultHandler handler;
+ HttpClient::fetch(ServerSpec("localhost", f1.port()),
+ "/foo", handler);
+ if (handler.failures().size() > 0) {
+ fprintf(stderr, "failure: %s\n", handler.failures()[0].c_str());
+ }
+ EXPECT_EQUAL(0u, handler.failures().size());
+ EXPECT_EQUAL(1u, handler.headers().size());
+ TEST_DO(checkMemory("data", handler.content()));
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/http_connection/.gitignore b/vbench/src/tests/http_connection/.gitignore
new file mode 100644
index 00000000000..9829af0bdba
--- /dev/null
+++ b/vbench/src/tests/http_connection/.gitignore
@@ -0,0 +1 @@
+vbench_http_connection_test_app
diff --git a/vbench/src/tests/http_connection/CMakeLists.txt b/vbench/src/tests/http_connection/CMakeLists.txt
new file mode 100644
index 00000000000..8d33e8fb1e3
--- /dev/null
+++ b/vbench/src/tests/http_connection/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_http_connection_test_app
+ SOURCES
+ http_connection_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_http_connection_test_app COMMAND vbench_http_connection_test_app)
diff --git a/vbench/src/tests/http_connection/FILES b/vbench/src/tests/http_connection/FILES
new file mode 100644
index 00000000000..de51725c9ac
--- /dev/null
+++ b/vbench/src/tests/http_connection/FILES
@@ -0,0 +1 @@
+http_connection_test.cpp
diff --git a/vbench/src/tests/http_connection/http_connection_test.cpp b/vbench/src/tests/http_connection/http_connection_test.cpp
new file mode 100644
index 00000000000..dc03a9e7e8e
--- /dev/null
+++ b/vbench/src/tests/http_connection/http_connection_test.cpp
@@ -0,0 +1,22 @@
+// 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;
+
+TEST("http connection") {
+ ServerSocket serverSocket;
+ HttpConnection client(ServerSpec("localhost", serverSocket.port()));
+ Stream::UP server = serverSocket.accept();
+ EXPECT_TRUE(client.fresh());
+ EXPECT_EQUAL("localhost", client.server().host);
+ EXPECT_FALSE(client.mayReuse(0.1)); // still fresh
+ client.touch(5.0);
+ EXPECT_FALSE(client.fresh());
+ EXPECT_TRUE(client.mayReuse(5.1));
+ server.reset();
+ client.stream().obtain(1, 1); // trigger eof
+ EXPECT_FALSE(client.mayReuse(5.1));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/http_connection_pool/.gitignore b/vbench/src/tests/http_connection_pool/.gitignore
new file mode 100644
index 00000000000..f9601f89d39
--- /dev/null
+++ b/vbench/src/tests/http_connection_pool/.gitignore
@@ -0,0 +1 @@
+vbench_http_connection_pool_test_app
diff --git a/vbench/src/tests/http_connection_pool/CMakeLists.txt b/vbench/src/tests/http_connection_pool/CMakeLists.txt
new file mode 100644
index 00000000000..6ebac01b954
--- /dev/null
+++ b/vbench/src/tests/http_connection_pool/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_http_connection_pool_test_app
+ SOURCES
+ http_connection_pool_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_http_connection_pool_test_app COMMAND vbench_http_connection_pool_test_app)
diff --git a/vbench/src/tests/http_connection_pool/FILES b/vbench/src/tests/http_connection_pool/FILES
new file mode 100644
index 00000000000..1bc5c1cc463
--- /dev/null
+++ b/vbench/src/tests/http_connection_pool/FILES
@@ -0,0 +1 @@
+http_connection_pool_test.cpp
diff --git a/vbench/src/tests/http_connection_pool/http_connection_pool_test.cpp b/vbench/src/tests/http_connection_pool/http_connection_pool_test.cpp
new file mode 100644
index 00000000000..06f158e7b84
--- /dev/null
+++ b/vbench/src/tests/http_connection_pool/http_connection_pool_test.cpp
@@ -0,0 +1,55 @@
+// 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>
+#include <vespa/vespalib/util/sync.h>
+
+using namespace vbench;
+using vespalib::CountDownLatch;
+
+TEST_MT_F("http connection pool", 2, ServerSocket()) {
+ if (thread_id == 0) {
+ for (; f1.accept().get() != 0; ) {}
+ } else {
+ Timer timer;
+ HttpConnection::UP conn;
+ HttpConnectionPool pool(timer);
+ conn = pool.getConnection(ServerSpec("localhost", f1.port()));
+ EXPECT_TRUE(conn.get() != 0);
+ pool.putConnection(std::move(conn));
+ EXPECT_TRUE(conn.get() == 0);
+ conn = pool.getConnection(ServerSpec("localhost", f1.port()));
+ EXPECT_TRUE(conn.get() != 0);
+ conn->stream().obtain(1, 1); // trigger eof
+ pool.putConnection(std::move(conn));
+ EXPECT_TRUE(conn.get() == 0);
+ conn = pool.getConnection(ServerSpec("localhost", f1.port()));
+ EXPECT_TRUE(conn.get() != 0);
+ f1.close();
+ }
+}
+
+TEST_MT_FFFF("stress http connection pool", 256, ServerSocket(), Timer(), HttpConnectionPool(f2),
+ CountDownLatch(num_threads-2))
+{
+ if (thread_id == 0) {
+ for (; f1.accept().get() != 0; ) {}
+ } else {
+ while (f2.sample() < 5.0) {
+ HttpConnection::UP conn = f3.getConnection(ServerSpec("localhost", f1.port()));
+ EXPECT_TRUE(conn.get() != 0);
+ if (thread_id > (num_threads / 2)) {
+ conn->stream().obtain(1, 1); // trigger eof
+ }
+ f3.putConnection(std::move(conn));
+ EXPECT_TRUE(conn.get() == 0);
+ }
+ if (thread_id == 1) {
+ f4.await();
+ f1.close();
+ } else {
+ f4.countDown();
+ }
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/input_file_reader/.gitignore b/vbench/src/tests/input_file_reader/.gitignore
new file mode 100644
index 00000000000..a8f6e9d2af4
--- /dev/null
+++ b/vbench/src/tests/input_file_reader/.gitignore
@@ -0,0 +1 @@
+vbench_input_file_reader_test_app
diff --git a/vbench/src/tests/input_file_reader/CMakeLists.txt b/vbench/src/tests/input_file_reader/CMakeLists.txt
new file mode 100644
index 00000000000..ac4ded756f9
--- /dev/null
+++ b/vbench/src/tests/input_file_reader/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_input_file_reader_test_app
+ SOURCES
+ input_file_reader_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_input_file_reader_test_app COMMAND vbench_input_file_reader_test_app)
diff --git a/vbench/src/tests/input_file_reader/FILES b/vbench/src/tests/input_file_reader/FILES
new file mode 100644
index 00000000000..46b97e37a9d
--- /dev/null
+++ b/vbench/src/tests/input_file_reader/FILES
@@ -0,0 +1,3 @@
+input_file_reader_test.cpp
+simple_test_input.txt
+hard_test_input.txt
diff --git a/vbench/src/tests/input_file_reader/hard_test_input.txt b/vbench/src/tests/input_file_reader/hard_test_input.txt
new file mode 100644
index 00000000000..8144450a5c7
--- /dev/null
+++ b/vbench/src/tests/input_file_reader/hard_test_input.txt
@@ -0,0 +1,5 @@
+foo
+
+bar
+baz
+ \ No newline at end of file
diff --git a/vbench/src/tests/input_file_reader/input_file_reader_test.cpp b/vbench/src/tests/input_file_reader/input_file_reader_test.cpp
new file mode 100644
index 00000000000..2cf59dff1ec
--- /dev/null
+++ b/vbench/src/tests/input_file_reader/input_file_reader_test.cpp
@@ -0,0 +1,42 @@
+// 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;
+
+TEST("input file reader") {
+ {
+ InputFileReader reader("not_found.txt");
+ EXPECT_TRUE(reader.tainted());
+ }
+ {
+ InputFileReader reader("simple_test_input.txt");
+ EXPECT_TRUE(!reader.tainted());
+ string line;
+ EXPECT_TRUE(reader.readLine(line));
+ EXPECT_EQUAL("foo", line);
+ EXPECT_TRUE(reader.readLine(line));
+ EXPECT_EQUAL("bar", line);
+ EXPECT_TRUE(reader.readLine(line));
+ EXPECT_EQUAL("baz", line);
+ EXPECT_TRUE(!reader.readLine(line));
+ TEST_FLUSH();
+ }
+ {
+ InputFileReader reader("hard_test_input.txt");
+ EXPECT_TRUE(!reader.tainted());
+ string line;
+ EXPECT_TRUE(reader.readLine(line));
+ EXPECT_EQUAL("foo", line);
+ EXPECT_TRUE(reader.readLine(line));
+ EXPECT_EQUAL("bar", line);
+ EXPECT_TRUE(reader.readLine(line));
+ EXPECT_EQUAL("baz", line);
+ EXPECT_TRUE(reader.readLine(line));
+ EXPECT_EQUAL("\r", line);
+ EXPECT_TRUE(!reader.readLine(line));
+ TEST_FLUSH();
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/input_file_reader/simple_test_input.txt b/vbench/src/tests/input_file_reader/simple_test_input.txt
new file mode 100644
index 00000000000..86e041dad66
--- /dev/null
+++ b/vbench/src/tests/input_file_reader/simple_test_input.txt
@@ -0,0 +1,3 @@
+foo
+bar
+baz
diff --git a/vbench/src/tests/input_reader/.gitignore b/vbench/src/tests/input_reader/.gitignore
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/vbench/src/tests/input_reader/.gitignore
diff --git a/vbench/src/tests/latency_analyzer/.gitignore b/vbench/src/tests/latency_analyzer/.gitignore
new file mode 100644
index 00000000000..c82c48eb1f6
--- /dev/null
+++ b/vbench/src/tests/latency_analyzer/.gitignore
@@ -0,0 +1 @@
+vbench_latency_analyzer_test_app
diff --git a/vbench/src/tests/latency_analyzer/CMakeLists.txt b/vbench/src/tests/latency_analyzer/CMakeLists.txt
new file mode 100644
index 00000000000..01fbb5c3d5c
--- /dev/null
+++ b/vbench/src/tests/latency_analyzer/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_latency_analyzer_test_app
+ SOURCES
+ latency_analyzer_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_latency_analyzer_test_app COMMAND vbench_latency_analyzer_test_app)
diff --git a/vbench/src/tests/latency_analyzer/FILES b/vbench/src/tests/latency_analyzer/FILES
new file mode 100644
index 00000000000..4d90bfb352d
--- /dev/null
+++ b/vbench/src/tests/latency_analyzer/FILES
@@ -0,0 +1 @@
+latency_analyzer_test.cpp
diff --git a/vbench/src/tests/latency_analyzer/latency_analyzer_test.cpp b/vbench/src/tests/latency_analyzer/latency_analyzer_test.cpp
new file mode 100644
index 00000000000..39d12420415
--- /dev/null
+++ b/vbench/src/tests/latency_analyzer/latency_analyzer_test.cpp
@@ -0,0 +1,36 @@
+// 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;
+
+void post(double latency, Handler<Request> &handler,
+ double startTime = 0.0, Request::Status status = Request::STATUS_OK)
+{
+ Request::UP req(new Request());
+ req->status(status).startTime(startTime).endTime(startTime + latency);
+ handler.handle(std::move(req));
+}
+
+TEST_FF("require that only OK requests are counted", RequestSink(), LatencyAnalyzer(f1)) {
+ post(1.0, f2);
+ post(2.0, f2, 3.0);
+ post(10.0, f2, 0.0, Request::STATUS_DROPPED);
+ post(20.0, f2, 0.0, Request::STATUS_FAILED);
+ EXPECT_APPROX(1.0, f2.getStats().min, 10e-6);
+ EXPECT_APPROX(1.5, f2.getStats().avg, 10e-6);
+ EXPECT_APPROX(2.0, f2.getStats().max, 10e-6);
+}
+
+TEST_FF("verify percentiles", RequestSink(), LatencyAnalyzer(f1)) {
+ for (size_t i = 0; i <= 10000; ++i) {
+ post(0.001 * i, f2);
+ }
+ LatencyAnalyzer::Stats stats = f2.getStats();
+ EXPECT_APPROX(5.0, stats.per50, 10e-6);
+ EXPECT_APPROX(9.5, stats.per95, 10e-6);
+ EXPECT_APPROX(9.9, stats.per99, 10e-6);
+ fprintf(stderr, "%s", stats.toString().c_str());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/line_reader/.gitignore b/vbench/src/tests/line_reader/.gitignore
new file mode 100644
index 00000000000..01fa87fd5f8
--- /dev/null
+++ b/vbench/src/tests/line_reader/.gitignore
@@ -0,0 +1 @@
+vbench_line_reader_test_app
diff --git a/vbench/src/tests/line_reader/CMakeLists.txt b/vbench/src/tests/line_reader/CMakeLists.txt
new file mode 100644
index 00000000000..5235d4dfe12
--- /dev/null
+++ b/vbench/src/tests/line_reader/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_line_reader_test_app
+ SOURCES
+ line_reader_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_line_reader_test_app COMMAND vbench_line_reader_test_app)
diff --git a/vbench/src/tests/line_reader/FILES b/vbench/src/tests/line_reader/FILES
new file mode 100644
index 00000000000..2611646033f
--- /dev/null
+++ b/vbench/src/tests/line_reader/FILES
@@ -0,0 +1 @@
+line_reader_test.cpp
diff --git a/vbench/src/tests/line_reader/line_reader_test.cpp b/vbench/src/tests/line_reader/line_reader_test.cpp
new file mode 100644
index 00000000000..631b2ffc765
--- /dev/null
+++ b/vbench/src/tests/line_reader/line_reader_test.cpp
@@ -0,0 +1,38 @@
+// 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;
+
+TEST("line reader") {
+ SimpleBuffer buffer;
+ {
+ BufferedOutput dst(buffer, 64);
+ dst.append("foo\n");
+ dst.append("bar\r\n");
+ dst.append("\n");
+ dst.append("\rbaz\n");
+ dst.append("\r\n");
+ dst.append("zzz");
+ }
+ {
+ LineReader src(buffer, 3);
+ string str;
+ EXPECT_TRUE(src.readLine(str));
+ EXPECT_EQUAL("foo", str);
+ EXPECT_TRUE(src.readLine(str));
+ EXPECT_EQUAL("bar", str);
+ EXPECT_TRUE(src.readLine(str));
+ EXPECT_EQUAL("", str);
+ EXPECT_TRUE(src.readLine(str));
+ EXPECT_EQUAL("\rbaz", str);
+ EXPECT_TRUE(src.readLine(str));
+ EXPECT_EQUAL("", str);
+ EXPECT_TRUE(src.readLine(str));
+ EXPECT_EQUAL("zzz", str);
+ EXPECT_TRUE(!src.readLine(str));
+ EXPECT_EQUAL("", str);
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/mapped_file_input/.gitignore b/vbench/src/tests/mapped_file_input/.gitignore
new file mode 100644
index 00000000000..99fcc66eeab
--- /dev/null
+++ b/vbench/src/tests/mapped_file_input/.gitignore
@@ -0,0 +1 @@
+vbench_mapped_file_input_test_app
diff --git a/vbench/src/tests/mapped_file_input/CMakeLists.txt b/vbench/src/tests/mapped_file_input/CMakeLists.txt
new file mode 100644
index 00000000000..de7cbb7c89d
--- /dev/null
+++ b/vbench/src/tests/mapped_file_input/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_mapped_file_input_test_app
+ SOURCES
+ mapped_file_input_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_mapped_file_input_test_app COMMAND vbench_mapped_file_input_test_app)
diff --git a/vbench/src/tests/mapped_file_input/FILES b/vbench/src/tests/mapped_file_input/FILES
new file mode 100644
index 00000000000..55eddab2a7a
--- /dev/null
+++ b/vbench/src/tests/mapped_file_input/FILES
@@ -0,0 +1,2 @@
+mapped_file_input_test.cpp
+file.txt
diff --git a/vbench/src/tests/mapped_file_input/file.txt b/vbench/src/tests/mapped_file_input/file.txt
new file mode 100644
index 00000000000..dd59d098638
--- /dev/null
+++ b/vbench/src/tests/mapped_file_input/file.txt
@@ -0,0 +1 @@
+file content
diff --git a/vbench/src/tests/mapped_file_input/mapped_file_input_test.cpp b/vbench/src/tests/mapped_file_input/mapped_file_input_test.cpp
new file mode 100644
index 00000000000..5044f5401e1
--- /dev/null
+++ b/vbench/src/tests/mapped_file_input/mapped_file_input_test.cpp
@@ -0,0 +1,23 @@
+// 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;
+
+TEST("mapped file input") {
+ {
+ MappedFileInput file("not_found.txt");
+ EXPECT_TRUE(file.tainted());
+ }
+ {
+ MappedFileInput file("file.txt");
+ EXPECT_TRUE(!file.tainted());
+ LineReader reader(file, 3);
+ string line;
+ EXPECT_TRUE(reader.readLine(line));
+ EXPECT_EQUAL("file content", line);
+ EXPECT_TRUE(!reader.readLine(line));
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/memory/.gitignore b/vbench/src/tests/memory/.gitignore
new file mode 100644
index 00000000000..e1fd81a3e7c
--- /dev/null
+++ b/vbench/src/tests/memory/.gitignore
@@ -0,0 +1 @@
+vbench_memory_test_app
diff --git a/vbench/src/tests/memory/CMakeLists.txt b/vbench/src/tests/memory/CMakeLists.txt
new file mode 100644
index 00000000000..bcdaf55f4a1
--- /dev/null
+++ b/vbench/src/tests/memory/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_memory_test_app
+ SOURCES
+ memory_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_memory_test_app COMMAND vbench_memory_test_app)
diff --git a/vbench/src/tests/memory/FILES b/vbench/src/tests/memory/FILES
new file mode 100644
index 00000000000..3627eec5ec7
--- /dev/null
+++ b/vbench/src/tests/memory/FILES
@@ -0,0 +1 @@
+memory_test.cpp
diff --git a/vbench/src/tests/memory/memory_test.cpp b/vbench/src/tests/memory/memory_test.cpp
new file mode 100644
index 00000000000..9504914d191
--- /dev/null
+++ b/vbench/src/tests/memory/memory_test.cpp
@@ -0,0 +1,40 @@
+// 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;
+
+TEST("empty memory") {
+ Memory m;
+ EXPECT_EQUAL((const char*)0, m.data);
+ EXPECT_EQUAL(0u, m.size);
+}
+
+TEST("from string") {
+ string str("foo");
+ Memory m1(str);
+ Memory m2 = str;
+ EXPECT_EQUAL(str.data(), m1.data);
+ EXPECT_EQUAL(str.size(), m1.size);
+ EXPECT_EQUAL(str.data(), m2.data);
+ EXPECT_EQUAL(str.size(), m2.size);
+}
+
+TEST("from cstring") {
+ const char *str = "foo";
+ Memory m1(str);
+ Memory m2 = str;
+ EXPECT_EQUAL(str, m1.data);
+ EXPECT_EQUAL(strlen(str), m1.size);
+ EXPECT_EQUAL(str, m2.data);
+ EXPECT_EQUAL(strlen(str), m2.size);
+}
+
+TEST("from ptr and len") {
+ string str("foo");
+ Memory m1(str.data(), str.size());
+ EXPECT_EQUAL(str.data(), m1.data);
+ EXPECT_EQUAL(str.size(), m1.size);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/qps_analyzer/.gitignore b/vbench/src/tests/qps_analyzer/.gitignore
new file mode 100644
index 00000000000..0651de34c3c
--- /dev/null
+++ b/vbench/src/tests/qps_analyzer/.gitignore
@@ -0,0 +1 @@
+vbench_qps_analyzer_test_app
diff --git a/vbench/src/tests/qps_analyzer/CMakeLists.txt b/vbench/src/tests/qps_analyzer/CMakeLists.txt
new file mode 100644
index 00000000000..b4167511665
--- /dev/null
+++ b/vbench/src/tests/qps_analyzer/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_qps_analyzer_test_app
+ SOURCES
+ qps_analyzer_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_qps_analyzer_test_app COMMAND vbench_qps_analyzer_test_app)
diff --git a/vbench/src/tests/qps_analyzer/FILES b/vbench/src/tests/qps_analyzer/FILES
new file mode 100644
index 00000000000..978efc5eafd
--- /dev/null
+++ b/vbench/src/tests/qps_analyzer/FILES
@@ -0,0 +1 @@
+qps_analyzer_test.cpp
diff --git a/vbench/src/tests/qps_analyzer/qps_analyzer_test.cpp b/vbench/src/tests/qps_analyzer/qps_analyzer_test.cpp
new file mode 100644
index 00000000000..4de340fcf29
--- /dev/null
+++ b/vbench/src/tests/qps_analyzer/qps_analyzer_test.cpp
@@ -0,0 +1,23 @@
+// 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;
+
+void post(double endTime, Handler<Request> &handler,
+ Request::Status status = Request::STATUS_OK)
+{
+ Request::UP req(new Request());
+ req->status(status).endTime(endTime);
+ handler.handle(std::move(req));
+}
+
+TEST_FF("simulate 100 qps", RequestSink(), QpsAnalyzer(f1)) {
+ for (size_t i = 1; i < 10000; ++i) {
+ post(i * 0.01, f2);
+ post(i * 0.01, f2, Request::STATUS_DROPPED);
+ post(i * 0.01, f2, Request::STATUS_FAILED);
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/qps_tagger/.gitignore b/vbench/src/tests/qps_tagger/.gitignore
new file mode 100644
index 00000000000..91701521f51
--- /dev/null
+++ b/vbench/src/tests/qps_tagger/.gitignore
@@ -0,0 +1 @@
+vbench_qps_tagger_test_app
diff --git a/vbench/src/tests/qps_tagger/CMakeLists.txt b/vbench/src/tests/qps_tagger/CMakeLists.txt
new file mode 100644
index 00000000000..2538de07b8f
--- /dev/null
+++ b/vbench/src/tests/qps_tagger/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_qps_tagger_test_app
+ SOURCES
+ qps_tagger_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_qps_tagger_test_app COMMAND vbench_qps_tagger_test_app)
diff --git a/vbench/src/tests/qps_tagger/FILES b/vbench/src/tests/qps_tagger/FILES
new file mode 100644
index 00000000000..9fbf5764e52
--- /dev/null
+++ b/vbench/src/tests/qps_tagger/FILES
@@ -0,0 +1 @@
+qps_tagger_test.cpp
diff --git a/vbench/src/tests/qps_tagger/qps_tagger_test.cpp b/vbench/src/tests/qps_tagger/qps_tagger_test.cpp
new file mode 100644
index 00000000000..34ae5082298
--- /dev/null
+++ b/vbench/src/tests/qps_tagger/qps_tagger_test.cpp
@@ -0,0 +1,22 @@
+// 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;
+
+TEST_FF("qps tagger", RequestReceptor(), QpsTagger(2.0, f1)) {
+ f2.handle(Request::UP(new Request()));
+ ASSERT_TRUE(f1.request.get() != 0);
+ EXPECT_APPROX(0.0, f1.request->scheduledTime(), 10e-6);
+ f2.handle(Request::UP(new Request()));
+ ASSERT_TRUE(f1.request.get() != 0);
+ EXPECT_APPROX(0.5, f1.request->scheduledTime(), 10e-6);
+ f2.handle(Request::UP(new Request()));
+ ASSERT_TRUE(f1.request.get() != 0);
+ EXPECT_APPROX(1.0, f1.request->scheduledTime(), 10e-6);
+ f2.handle(Request::UP(new Request()));
+ ASSERT_TRUE(f1.request.get() != 0);
+ EXPECT_APPROX(1.5, f1.request->scheduledTime(), 10e-6);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/request_dumper/.gitignore b/vbench/src/tests/request_dumper/.gitignore
new file mode 100644
index 00000000000..dec2573b121
--- /dev/null
+++ b/vbench/src/tests/request_dumper/.gitignore
@@ -0,0 +1 @@
+vbench_request_dumper_test_app
diff --git a/vbench/src/tests/request_dumper/CMakeLists.txt b/vbench/src/tests/request_dumper/CMakeLists.txt
new file mode 100644
index 00000000000..08cd6f12ebe
--- /dev/null
+++ b/vbench/src/tests/request_dumper/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_request_dumper_test_app
+ SOURCES
+ request_dumper_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_request_dumper_test_app COMMAND vbench_request_dumper_test_app)
diff --git a/vbench/src/tests/request_dumper/FILES b/vbench/src/tests/request_dumper/FILES
new file mode 100644
index 00000000000..24fc66cc387
--- /dev/null
+++ b/vbench/src/tests/request_dumper/FILES
@@ -0,0 +1 @@
+request_dumper_test.cpp
diff --git a/vbench/src/tests/request_dumper/request_dumper_test.cpp b/vbench/src/tests/request_dumper/request_dumper_test.cpp
new file mode 100644
index 00000000000..4ca98bb4c90
--- /dev/null
+++ b/vbench/src/tests/request_dumper/request_dumper_test.cpp
@@ -0,0 +1,11 @@
+// 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;
+
+TEST_FF("dump request", RequestSink(), RequestDumper(f1)) {
+ f2.handle(Request::UP(new Request()));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/request_generator/.gitignore b/vbench/src/tests/request_generator/.gitignore
new file mode 100644
index 00000000000..8ec28a2df32
--- /dev/null
+++ b/vbench/src/tests/request_generator/.gitignore
@@ -0,0 +1 @@
+vbench_request_generator_test_app
diff --git a/vbench/src/tests/request_generator/CMakeLists.txt b/vbench/src/tests/request_generator/CMakeLists.txt
new file mode 100644
index 00000000000..a59029055d0
--- /dev/null
+++ b/vbench/src/tests/request_generator/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_request_generator_test_app
+ SOURCES
+ request_generator_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_request_generator_test_app COMMAND vbench_request_generator_test_app)
diff --git a/vbench/src/tests/request_generator/FILES b/vbench/src/tests/request_generator/FILES
new file mode 100644
index 00000000000..2afbcd6ec35
--- /dev/null
+++ b/vbench/src/tests/request_generator/FILES
@@ -0,0 +1,2 @@
+request_generator_test.cpp
+input.txt
diff --git a/vbench/src/tests/request_generator/input.txt b/vbench/src/tests/request_generator/input.txt
new file mode 100644
index 00000000000..259b0f7250f
--- /dev/null
+++ b/vbench/src/tests/request_generator/input.txt
@@ -0,0 +1 @@
+/this/is/url
diff --git a/vbench/src/tests/request_generator/request_generator_test.cpp b/vbench/src/tests/request_generator/request_generator_test.cpp
new file mode 100644
index 00000000000..52aca22954c
--- /dev/null
+++ b/vbench/src/tests/request_generator/request_generator_test.cpp
@@ -0,0 +1,27 @@
+// 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;
+
+TEST_FF("generate request", RequestReceptor(), RequestGenerator("input.txt", f1)) {
+ f2.run();
+ ASSERT_TRUE(f1.request.get() != 0);
+ EXPECT_EQUAL("/this/is/url", f1.request->url());
+ EXPECT_FALSE(f2.tainted());
+}
+
+TEST_FF("input not found", RequestReceptor(), RequestGenerator("no_such_input.txt", f1)) {
+ f2.run();
+ EXPECT_TRUE(f1.request.get() == 0);
+ EXPECT_TRUE(f2.tainted());
+}
+
+TEST_FF("abort request generation", RequestReceptor(), RequestGenerator("input.txt", f1)) {
+ f2.abort();
+ f2.run();
+ EXPECT_TRUE(f1.request.get() == 0);
+ EXPECT_FALSE(f2.tainted());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/request_sink/.gitignore b/vbench/src/tests/request_sink/.gitignore
new file mode 100644
index 00000000000..82dd828954e
--- /dev/null
+++ b/vbench/src/tests/request_sink/.gitignore
@@ -0,0 +1 @@
+vbench_request_sink_test_app
diff --git a/vbench/src/tests/request_sink/CMakeLists.txt b/vbench/src/tests/request_sink/CMakeLists.txt
new file mode 100644
index 00000000000..4b184c25f91
--- /dev/null
+++ b/vbench/src/tests/request_sink/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_request_sink_test_app
+ SOURCES
+ request_sink_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_request_sink_test_app COMMAND vbench_request_sink_test_app)
diff --git a/vbench/src/tests/request_sink/FILES b/vbench/src/tests/request_sink/FILES
new file mode 100644
index 00000000000..77c3c4b8273
--- /dev/null
+++ b/vbench/src/tests/request_sink/FILES
@@ -0,0 +1 @@
+request_sink_test.cpp
diff --git a/vbench/src/tests/request_sink/request_sink_test.cpp b/vbench/src/tests/request_sink/request_sink_test.cpp
new file mode 100644
index 00000000000..aa281d2a3cb
--- /dev/null
+++ b/vbench/src/tests/request_sink/request_sink_test.cpp
@@ -0,0 +1,11 @@
+// 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;
+
+TEST_F("put a request into the sink, where does it go, nobody cares", RequestSink()) {
+ f1.handle(Request::UP(new Request()));
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/runnable_pair/.gitignore b/vbench/src/tests/runnable_pair/.gitignore
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/vbench/src/tests/runnable_pair/.gitignore
diff --git a/vbench/src/tests/server_socket/.gitignore b/vbench/src/tests/server_socket/.gitignore
new file mode 100644
index 00000000000..e79511c3a0a
--- /dev/null
+++ b/vbench/src/tests/server_socket/.gitignore
@@ -0,0 +1 @@
+vbench_server_socket_test_app
diff --git a/vbench/src/tests/server_socket/CMakeLists.txt b/vbench/src/tests/server_socket/CMakeLists.txt
new file mode 100644
index 00000000000..1077d7d0525
--- /dev/null
+++ b/vbench/src/tests/server_socket/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_server_socket_test_app
+ SOURCES
+ server_socket_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_server_socket_test_app COMMAND vbench_server_socket_test_app)
diff --git a/vbench/src/tests/server_socket/FILES b/vbench/src/tests/server_socket/FILES
new file mode 100644
index 00000000000..47bee2d3769
--- /dev/null
+++ b/vbench/src/tests/server_socket/FILES
@@ -0,0 +1 @@
+server_socket_test.cpp
diff --git a/vbench/src/tests/server_socket/server_socket_test.cpp b/vbench/src/tests/server_socket/server_socket_test.cpp
new file mode 100644
index 00000000000..575c7dfaa02
--- /dev/null
+++ b/vbench/src/tests/server_socket/server_socket_test.cpp
@@ -0,0 +1,24 @@
+// 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>
+#include <vespa/vespalib/util/thread.h>
+
+using namespace vbench;
+
+TEST_MT_F("require that close will interrupt accept", 2, ServerSocket()) {
+ if (thread_id == 0) {
+ for (;;) {
+ Stream::UP stream = f1.accept();
+ if (stream.get() == 0) {
+ break;
+ }
+ }
+ Stream::UP s2 = f1.accept();
+ EXPECT_TRUE(s2.get() == 0);
+ } else {
+ vespalib::Thread::sleep(20);
+ f1.close();
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/server_spec/.gitignore b/vbench/src/tests/server_spec/.gitignore
new file mode 100644
index 00000000000..635947d28a8
--- /dev/null
+++ b/vbench/src/tests/server_spec/.gitignore
@@ -0,0 +1 @@
+vbench_server_spec_test_app
diff --git a/vbench/src/tests/server_spec/CMakeLists.txt b/vbench/src/tests/server_spec/CMakeLists.txt
new file mode 100644
index 00000000000..a43d2c80dde
--- /dev/null
+++ b/vbench/src/tests/server_spec/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_server_spec_test_app
+ SOURCES
+ server_spec_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_server_spec_test_app COMMAND vbench_server_spec_test_app)
diff --git a/vbench/src/tests/server_spec/FILES b/vbench/src/tests/server_spec/FILES
new file mode 100644
index 00000000000..34e52a9f86e
--- /dev/null
+++ b/vbench/src/tests/server_spec/FILES
@@ -0,0 +1 @@
+server_spec_test.cpp
diff --git a/vbench/src/tests/server_spec/server_spec_test.cpp b/vbench/src/tests/server_spec/server_spec_test.cpp
new file mode 100644
index 00000000000..a254e5f8101
--- /dev/null
+++ b/vbench/src/tests/server_spec/server_spec_test.cpp
@@ -0,0 +1,38 @@
+// 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;
+
+TEST("empty") {
+ ServerSpec spec;
+ EXPECT_EQUAL("", spec.host);
+ EXPECT_EQUAL(0, spec.port);
+}
+
+TEST("standard") {
+ ServerSpec spec("foo", 3);
+ EXPECT_EQUAL("foo", spec.host);
+ EXPECT_EQUAL(3, spec.port);
+}
+
+TEST("compare") {
+ ServerSpec spec0("foo", 3);
+ ServerSpec spec1("foo", 3);
+ ServerSpec spec2("bar", 3);
+ ServerSpec spec3("foo", 4);
+ ServerSpec spec4("bar", 4);
+ EXPECT_TRUE(spec0 == spec1);
+ EXPECT_TRUE(spec1 == spec0);
+ EXPECT_FALSE(spec0 == spec2);
+ EXPECT_FALSE(spec2 == spec0);
+ EXPECT_TRUE(spec2 < spec0);
+ EXPECT_TRUE(spec0 < spec3);
+ EXPECT_TRUE(spec0 < spec4);
+ EXPECT_FALSE(spec0 < spec1);
+ EXPECT_FALSE(spec0 < spec2);
+ EXPECT_FALSE(spec3 < spec0);
+ EXPECT_FALSE(spec4 < spec0);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/server_tagger/.gitignore b/vbench/src/tests/server_tagger/.gitignore
new file mode 100644
index 00000000000..3ade58a58d5
--- /dev/null
+++ b/vbench/src/tests/server_tagger/.gitignore
@@ -0,0 +1 @@
+vbench_server_tagger_test_app
diff --git a/vbench/src/tests/server_tagger/CMakeLists.txt b/vbench/src/tests/server_tagger/CMakeLists.txt
new file mode 100644
index 00000000000..d7cc0bdbea9
--- /dev/null
+++ b/vbench/src/tests/server_tagger/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_server_tagger_test_app
+ SOURCES
+ server_tagger_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_server_tagger_test_app COMMAND vbench_server_tagger_test_app)
diff --git a/vbench/src/tests/server_tagger/FILES b/vbench/src/tests/server_tagger/FILES
new file mode 100644
index 00000000000..b632f6e6916
--- /dev/null
+++ b/vbench/src/tests/server_tagger/FILES
@@ -0,0 +1 @@
+server_tagger_test.cpp
diff --git a/vbench/src/tests/server_tagger/server_tagger_test.cpp b/vbench/src/tests/server_tagger/server_tagger_test.cpp
new file mode 100644
index 00000000000..461ddffc124
--- /dev/null
+++ b/vbench/src/tests/server_tagger/server_tagger_test.cpp
@@ -0,0 +1,17 @@
+// 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;
+
+TEST_FF("server tagger", RequestReceptor(), ServerTagger(ServerSpec("host", 42), f1)) {
+ Request::UP req(new Request());
+ EXPECT_EQUAL("", req->server().host);
+ EXPECT_EQUAL(0, req->server().port);
+ f2.handle(std::move(req));
+ ASSERT_TRUE(f1.request.get() != 0);
+ EXPECT_EQUAL("host", f1.request->server().host);
+ EXPECT_EQUAL(42, f1.request->server().port);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/simple_buffer/.gitignore b/vbench/src/tests/simple_buffer/.gitignore
new file mode 100644
index 00000000000..f40426a6708
--- /dev/null
+++ b/vbench/src/tests/simple_buffer/.gitignore
@@ -0,0 +1 @@
+vbench_simple_buffer_test_app
diff --git a/vbench/src/tests/simple_buffer/CMakeLists.txt b/vbench/src/tests/simple_buffer/CMakeLists.txt
new file mode 100644
index 00000000000..dd8da993c0b
--- /dev/null
+++ b/vbench/src/tests/simple_buffer/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_simple_buffer_test_app
+ SOURCES
+ simple_buffer_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_simple_buffer_test_app COMMAND vbench_simple_buffer_test_app)
diff --git a/vbench/src/tests/simple_buffer/FILES b/vbench/src/tests/simple_buffer/FILES
new file mode 100644
index 00000000000..3669f575911
--- /dev/null
+++ b/vbench/src/tests/simple_buffer/FILES
@@ -0,0 +1 @@
+simple_buffer_test.cpp
diff --git a/vbench/src/tests/simple_buffer/simple_buffer_test.cpp b/vbench/src/tests/simple_buffer/simple_buffer_test.cpp
new file mode 100644
index 00000000000..f666438d721
--- /dev/null
+++ b/vbench/src/tests/simple_buffer/simple_buffer_test.cpp
@@ -0,0 +1,70 @@
+// 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;
+
+void checkMemory(const string &expect, const Memory &mem) {
+ EXPECT_EQUAL(expect, string(mem.data, mem.size));
+}
+
+void checkBuffer(const string &expect, const SimpleBuffer &buf) {
+ TEST_DO(checkMemory(expect, buf.get()));
+}
+
+TEST("simple buffer") {
+ SimpleBuffer buf;
+ TEST_DO(checkBuffer("", buf));
+ { // read from empty buffer
+ EXPECT_EQUAL(0u, buf.obtain(1, 1).size);
+ }
+ { // write to buffer
+ WritableMemory mem = buf.reserve(10);
+ TEST_DO(checkBuffer("", buf));
+ EXPECT_EQUAL(10u, mem.size);
+ mem.data[0] = 'a';
+ mem.data[1] = 'b';
+ mem.data[2] = 'c';
+ EXPECT_EQUAL(&buf, &buf.commit(3, 0));
+ mem = buf.reserve(0);
+ TEST_DO(checkBuffer("abc", buf));
+ EXPECT_EQUAL(0u, mem.size);
+ }
+ { // unaligned read across end (last byte not evicted)
+ Memory mem = buf.obtain(2, 1);
+ TEST_DO(checkBuffer("abc", buf));
+ TEST_DO(checkMemory("ab", mem));
+ EXPECT_EQUAL(&buf, &buf.evict(2));
+ mem = buf.obtain(2, 1);
+ TEST_DO(checkBuffer("c", buf));
+ TEST_DO(checkMemory("c", mem));
+ mem = buf.obtain(2, 1);
+ TEST_DO(checkBuffer("c", buf));
+ TEST_DO(checkMemory("c", mem));
+ }
+ { // write more to buffer
+ WritableMemory mem = buf.reserve(10);
+ EXPECT_EQUAL(10u, mem.size);
+ TEST_DO(checkBuffer("c", buf));
+ mem.data[0] = 'd';
+ EXPECT_EQUAL(&buf, &buf.commit(1, 0));
+ mem = buf.reserve(5);
+ TEST_DO(checkBuffer("cd", buf));
+ EXPECT_EQUAL(5u, mem.size);
+ }
+ { // aligned read until end
+ Memory mem = buf.obtain(1, 1);
+ TEST_DO(checkBuffer("cd", buf));
+ TEST_DO(checkMemory("c", mem));
+ EXPECT_EQUAL(&buf, &buf.evict(1));
+ mem = buf.obtain(1, 1);
+ TEST_DO(checkBuffer("d", buf));
+ TEST_DO(checkMemory("d", mem));
+ EXPECT_EQUAL(&buf, &buf.evict(1));
+ mem = buf.obtain(1, 1);
+ TEST_DO(checkBuffer("", buf));
+ TEST_DO(checkMemory("", mem));
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/socket/.gitignore b/vbench/src/tests/socket/.gitignore
new file mode 100644
index 00000000000..da032fba4cc
--- /dev/null
+++ b/vbench/src/tests/socket/.gitignore
@@ -0,0 +1 @@
+vbench_socket_test_app
diff --git a/vbench/src/tests/socket/CMakeLists.txt b/vbench/src/tests/socket/CMakeLists.txt
new file mode 100644
index 00000000000..6ede77e5d63
--- /dev/null
+++ b/vbench/src/tests/socket/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_socket_test_app
+ SOURCES
+ socket_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_socket_test_app COMMAND vbench_socket_test_app)
diff --git a/vbench/src/tests/socket/FILES b/vbench/src/tests/socket/FILES
new file mode 100644
index 00000000000..d9051f5e248
--- /dev/null
+++ b/vbench/src/tests/socket/FILES
@@ -0,0 +1 @@
+socket_test.cpp
diff --git a/vbench/src/tests/socket/socket_test.cpp b/vbench/src/tests/socket/socket_test.cpp
new file mode 100644
index 00000000000..4e58465c5a8
--- /dev/null
+++ b/vbench/src/tests/socket/socket_test.cpp
@@ -0,0 +1,72 @@
+// 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;
+
+const size_t numLines = 100;
+
+struct Agent {
+ Stream::UP socket;
+ Agent(Stream::UP s) : socket(std::move(s)) {}
+ void write(const char *prefix) {
+ BufferedOutput out(*socket, 32);
+ for (size_t i = 0; i < numLines; ++i) {
+ out.printf("%s%zu\n", prefix, i);
+ }
+ out.append("\n");
+ }
+ void read(const char *prefix) {
+ LineReader reader(*socket, 32);
+ for (size_t lines = 0; true; ++lines) {
+ string line;
+ reader.readLine(line);
+ if (line.empty()) {
+ EXPECT_EQUAL(numLines, lines);
+ break;
+ }
+ EXPECT_EQUAL(strfmt("%s%zu", prefix, lines), line);
+ }
+ }
+};
+
+struct Client : public Agent, public vespalib::Runnable {
+ Client(Stream::UP s) : Agent(std::move(s)) {}
+ virtual void run() {
+ TEST_THREAD("client");
+ write("client-");
+ read("server-");
+ }
+};
+
+struct Server : public Agent, public vespalib::Runnable {
+ Server(Stream::UP s) : Agent(std::move(s)) {}
+ virtual void run() {
+ TEST_THREAD("server");
+ read("client-");
+ write("server-");
+ }
+};
+
+TEST("socket") {
+ ServerSocket serverSocket;
+ Client client(Stream::UP(new Socket("localhost", serverSocket.port())));
+ Server server(serverSocket.accept());
+ vespalib::Thread clientThread(client);
+ vespalib::Thread serverThread(server);
+ clientThread.start();
+ serverThread.start();
+ clientThread.join();
+ serverThread.join();
+ {
+ server.socket.reset();
+ LineReader reader(*client.socket, 32);
+ string line;
+ EXPECT_FALSE(reader.readLine(line));
+ EXPECT_TRUE(line.empty());
+ EXPECT_TRUE(client.socket->eof());
+ EXPECT_FALSE(client.socket->tainted());
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/taint/.gitignore b/vbench/src/tests/taint/.gitignore
new file mode 100644
index 00000000000..ed8a6bdc417
--- /dev/null
+++ b/vbench/src/tests/taint/.gitignore
@@ -0,0 +1 @@
+vbench_taint_test_app
diff --git a/vbench/src/tests/taint/CMakeLists.txt b/vbench/src/tests/taint/CMakeLists.txt
new file mode 100644
index 00000000000..7dd23e62020
--- /dev/null
+++ b/vbench/src/tests/taint/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_taint_test_app
+ SOURCES
+ taint_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_taint_test_app COMMAND vbench_taint_test_app)
diff --git a/vbench/src/tests/taint/FILES b/vbench/src/tests/taint/FILES
new file mode 100644
index 00000000000..448832fd7dc
--- /dev/null
+++ b/vbench/src/tests/taint/FILES
@@ -0,0 +1 @@
+taint_test.cpp
diff --git a/vbench/src/tests/taint/taint_test.cpp b/vbench/src/tests/taint/taint_test.cpp
new file mode 100644
index 00000000000..1d7c1cb0ef0
--- /dev/null
+++ b/vbench/src/tests/taint/taint_test.cpp
@@ -0,0 +1,43 @@
+// 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;
+
+TEST("untainted") {
+ Taint t;
+ bool fail = t;
+ EXPECT_FALSE(fail);
+ EXPECT_FALSE(t.taint());
+ EXPECT_EQUAL("", t.reason());
+}
+
+TEST("Taintable::nil") {
+ const Taint &t = Taintable::nil().tainted();
+ bool fail = t;
+ EXPECT_FALSE(fail);
+ EXPECT_FALSE(t.taint());
+ EXPECT_EQUAL("", t.reason());
+}
+
+TEST("tainted") {
+ Taint t("argh");
+ bool fail = t;
+ EXPECT_TRUE(fail);
+ EXPECT_TRUE(t.taint());
+ EXPECT_EQUAL("argh", t.reason());
+}
+
+TEST("reset taint") {
+ Taint t;
+ EXPECT_FALSE(t.taint());
+ EXPECT_EQUAL("", t.reason());
+ t.reset("argh");
+ EXPECT_TRUE(t.taint());
+ EXPECT_EQUAL("argh", t.reason());
+ t.reset();
+ EXPECT_FALSE(t.taint());
+ EXPECT_EQUAL("", t.reason());
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/thread/.gitignore b/vbench/src/tests/thread/.gitignore
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/vbench/src/tests/thread/.gitignore
diff --git a/vbench/src/tests/time_queue/.gitignore b/vbench/src/tests/time_queue/.gitignore
new file mode 100644
index 00000000000..c7cb2538d85
--- /dev/null
+++ b/vbench/src/tests/time_queue/.gitignore
@@ -0,0 +1 @@
+vbench_time_queue_test_app
diff --git a/vbench/src/tests/time_queue/CMakeLists.txt b/vbench/src/tests/time_queue/CMakeLists.txt
new file mode 100644
index 00000000000..a87a4c1982e
--- /dev/null
+++ b/vbench/src/tests/time_queue/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_time_queue_test_app
+ SOURCES
+ time_queue_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_time_queue_test_app COMMAND vbench_time_queue_test_app)
diff --git a/vbench/src/tests/time_queue/FILES b/vbench/src/tests/time_queue/FILES
new file mode 100644
index 00000000000..39406e0b322
--- /dev/null
+++ b/vbench/src/tests/time_queue/FILES
@@ -0,0 +1 @@
+time_queue_test.cpp
diff --git a/vbench/src/tests/time_queue/time_queue_test.cpp b/vbench/src/tests/time_queue/time_queue_test.cpp
new file mode 100644
index 00000000000..d6be9501e6d
--- /dev/null
+++ b/vbench/src/tests/time_queue/time_queue_test.cpp
@@ -0,0 +1,65 @@
+// 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>
+#include <vespa/vespalib/util/sync.h>
+
+using namespace vbench;
+
+TEST_MT_FFF("time queue", 2, TimeQueue<int>(10.0, 5.0), vespalib::Gate(), vespalib::Gate()) {
+ if (thread_id == 0) {
+ f1.insert(std::unique_ptr<int>(new int(1)), 1.0);
+ f1.insert(std::unique_ptr<int>(new int(2)), 3.0);
+ f1.insert(std::unique_ptr<int>(new int(3)), 2.0);
+ f2.countDown();
+ f1.insert(std::unique_ptr<int>(new int(4)), 100.0);
+ f1.insert(std::unique_ptr<int>(new int(5)), 101.0);
+ f3.countDown();
+ } else {
+ double delay;
+ std::vector<std::unique_ptr<int> > list;
+ EXPECT_TRUE(f2.await(20000));
+ EXPECT_FALSE(f3.await(20));
+ {
+ f1.extract(1.5, list, delay);
+ ASSERT_EQUAL(1u, list.size());
+ EXPECT_EQUAL(1, *list[0]);
+ EXPECT_EQUAL(0.5, delay);
+ list.clear();
+ }
+ {
+ f1.extract(10.0, list, delay);
+ ASSERT_EQUAL(2u, list.size());
+ EXPECT_EQUAL(3, *list[0]);
+ EXPECT_EQUAL(2, *list[1]);
+ EXPECT_EQUAL(5.0, delay);
+ list.clear();
+ }
+ {
+ f1.extract(99.25, list, delay);
+ EXPECT_EQUAL(0u, list.size());
+ EXPECT_EQUAL(5.0, delay);
+ }
+ EXPECT_TRUE(f3.await(20000));
+ {
+ f1.extract(99.25, list, delay);
+ EXPECT_EQUAL(0u, list.size());
+ EXPECT_EQUAL(0.75, delay);
+ }
+ f1.discard();
+ {
+ f1.extract(101.5, list, delay);
+ EXPECT_EQUAL(0u, list.size());
+ EXPECT_EQUAL(5.0, delay);
+ }
+ f1.close();
+ f1.insert(std::unique_ptr<int>(new int(6)), 102.0);
+ f1.insert(std::unique_ptr<int>(new int(7)), 103.0);
+ {
+ f1.extract(103.5, list, delay);
+ EXPECT_EQUAL(0u, list.size());
+ EXPECT_EQUAL(5.0, delay);
+ }
+ }
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/timer/.gitignore b/vbench/src/tests/timer/.gitignore
new file mode 100644
index 00000000000..cd37c01446c
--- /dev/null
+++ b/vbench/src/tests/timer/.gitignore
@@ -0,0 +1 @@
+vbench_timer_test_app
diff --git a/vbench/src/tests/timer/CMakeLists.txt b/vbench/src/tests/timer/CMakeLists.txt
new file mode 100644
index 00000000000..fc50c222ba0
--- /dev/null
+++ b/vbench/src/tests/timer/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_timer_test_app
+ SOURCES
+ timer_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_timer_test_app COMMAND vbench_timer_test_app)
diff --git a/vbench/src/tests/timer/FILES b/vbench/src/tests/timer/FILES
new file mode 100644
index 00000000000..a90924ff2d1
--- /dev/null
+++ b/vbench/src/tests/timer/FILES
@@ -0,0 +1 @@
+timer_test.cpp
diff --git a/vbench/src/tests/timer/timer_test.cpp b/vbench/src/tests/timer/timer_test.cpp
new file mode 100644
index 00000000000..150a8d847d6
--- /dev/null
+++ b/vbench/src/tests/timer/timer_test.cpp
@@ -0,0 +1,16 @@
+// 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;
+
+IGNORE_TEST("timer") {
+ Timer timer;
+ EXPECT_APPROX(0.0, timer.sample(), 0.1);
+ vespalib::Thread::sleep(1000);
+ EXPECT_APPROX(1.0, timer.sample(), 0.1);
+ timer.reset();
+ EXPECT_APPROX(0.0, timer.sample(), 0.1);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/vbench/src/tests/true/.gitignore b/vbench/src/tests/true/.gitignore
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/vbench/src/tests/true/.gitignore
diff --git a/vbench/src/tests/writable_memory/.gitignore b/vbench/src/tests/writable_memory/.gitignore
new file mode 100644
index 00000000000..00061ea18f7
--- /dev/null
+++ b/vbench/src/tests/writable_memory/.gitignore
@@ -0,0 +1 @@
+vbench_writable_memory_test_app
diff --git a/vbench/src/tests/writable_memory/CMakeLists.txt b/vbench/src/tests/writable_memory/CMakeLists.txt
new file mode 100644
index 00000000000..4011ee64f63
--- /dev/null
+++ b/vbench/src/tests/writable_memory/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(vbench_writable_memory_test_app
+ SOURCES
+ writable_memory_test.cpp
+ DEPENDS
+ vbench_test
+ vbench
+)
+vespa_add_test(NAME vbench_writable_memory_test_app COMMAND vbench_writable_memory_test_app)
diff --git a/vbench/src/tests/writable_memory/FILES b/vbench/src/tests/writable_memory/FILES
new file mode 100644
index 00000000000..14718444a2e
--- /dev/null
+++ b/vbench/src/tests/writable_memory/FILES
@@ -0,0 +1 @@
+writable_memory_test.cpp
diff --git a/vbench/src/tests/writable_memory/writable_memory_test.cpp b/vbench/src/tests/writable_memory/writable_memory_test.cpp
new file mode 100644
index 00000000000..2be9d6b5153
--- /dev/null
+++ b/vbench/src/tests/writable_memory/writable_memory_test.cpp
@@ -0,0 +1,20 @@
+// 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;
+
+TEST("empty") {
+ WritableMemory wm;
+ EXPECT_EQUAL((char*)0, wm.data);
+ EXPECT_EQUAL(0u, wm.size);
+}
+
+TEST("from buffer") {
+ char buf[3];
+ WritableMemory wm(buf, 3);
+ EXPECT_EQUAL(buf, wm.data);
+ EXPECT_EQUAL(3u, wm.size);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }