#include "cmConnection.h" #include "cmServerConnection.h" #include #include #include #include void print_error(const std::vector& input, const std::vector& 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 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(new cmServerBufferStrategy); std::vector response; std::string rawBuffer; for (auto& messageChar : fullMessage) { rawBuffer += messageChar; 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; }