summaryrefslogtreecommitdiffstats
path: root/Tests/CMakeServerLib/testServerBuffering.cpp
diff options
context:
space:
mode:
authorJustin Berger <j.david.berger@gmail.com>2017-07-22 23:23:11 (GMT)
committerBrad King <brad.king@kitware.com>2017-08-31 19:35:04 (GMT)
commitdc7a18d82eb0013a2afbdea9ba5fec131fc3179f (patch)
treeece5cf570b60a21caf772cc20576f097e0520a83 /Tests/CMakeServerLib/testServerBuffering.cpp
parentf8fd5a979cb4acd8a37632c29b453a426e798178 (diff)
downloadCMake-dc7a18d82eb0013a2afbdea9ba5fec131fc3179f.zip
CMake-dc7a18d82eb0013a2afbdea9ba5fec131fc3179f.tar.gz
CMake-dc7a18d82eb0013a2afbdea9ba5fec131fc3179f.tar.bz2
server: test buffer parsing
Diffstat (limited to 'Tests/CMakeServerLib/testServerBuffering.cpp')
-rw-r--r--Tests/CMakeServerLib/testServerBuffering.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/Tests/CMakeServerLib/testServerBuffering.cpp b/Tests/CMakeServerLib/testServerBuffering.cpp
new file mode 100644
index 0000000..97be891
--- /dev/null
+++ b/Tests/CMakeServerLib/testServerBuffering.cpp
@@ -0,0 +1,86 @@
+#include "cmConnection.h"
+#include "cmServerConnection.h"
+#include <iostream>
+#include <stddef.h>
+#include <string>
+#include <vector>
+
+void print_error(const std::vector<std::string>& input,
+ const std::vector<std::string>& output)
+{
+ std::cerr << "Responses don't equal input messages input." << std::endl;
+ std::cerr << "Responses: " << std::endl;
+
+ for (auto& msg : output) {
+ std::cerr << "'" << msg << "'" << std::endl;
+ }
+
+ std::cerr << "Input messages" << std::endl;
+ for (auto& msg : input) {
+ std::cerr << "'" << msg << "'" << std::endl;
+ }
+}
+
+std::string trim_newline(const std::string& _buffer)
+{
+ auto buffer = _buffer;
+ while (!buffer.empty() && (buffer.back() == '\n' || buffer.back() == '\r')) {
+ buffer.pop_back();
+ }
+ return buffer;
+}
+
+int testServerBuffering(int, char** const)
+{
+ std::vector<std::string> messages = {
+ "{ \"test\": 10}", "{ \"test\": { \"test2\": false} }",
+ "{ \"test\": [1, 2, 3] }",
+ "{ \"a\": { \"1\": {}, \n\n\n \"2\":[] \t\t\t\t}}"
+ };
+
+ std::string fullMessage;
+ for (auto& msg : messages) {
+ fullMessage += "[== \"CMake Server\" ==[\n";
+ fullMessage += msg;
+ fullMessage += "\n]== \"CMake Server\" ==]\n";
+ }
+
+ // The buffering strategy should cope with any fragmentation, including
+ // just getting the characters one at a time.
+ auto bufferingStrategy =
+ std::unique_ptr<cmConnectionBufferStrategy>(new cmServerBufferStrategy);
+ std::vector<std::string> response;
+ std::string rawBuffer;
+ for (size_t i = 0; i < fullMessage.size(); i++) {
+ rawBuffer += fullMessage[i];
+ std::string packet = bufferingStrategy->BufferMessage(rawBuffer);
+ do {
+ if (!packet.empty() && packet != "\r\n") {
+ response.push_back(trim_newline(packet));
+ }
+ packet = bufferingStrategy->BufferMessage(rawBuffer);
+ } while (!packet.empty());
+ }
+
+ if (response != messages) {
+ print_error(messages, response);
+ return 1;
+ }
+
+ // We should also be able to deal with getting a bunch at once
+ response.clear();
+ std::string packet = bufferingStrategy->BufferMessage(fullMessage);
+ do {
+ if (!packet.empty() && packet != "\r\n") {
+ response.push_back(trim_newline(packet));
+ }
+ packet = bufferingStrategy->BufferMessage(fullMessage);
+ } while (!packet.empty());
+
+ if (response != messages) {
+ print_error(messages, response);
+ return 1;
+ }
+
+ return 0;
+}