summaryrefslogtreecommitdiffstats
path: root/vbench/src/tests/socket/socket_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vbench/src/tests/socket/socket_test.cpp')
-rw-r--r--vbench/src/tests/socket/socket_test.cpp72
1 files changed, 72 insertions, 0 deletions
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(); }