12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #include "cmConnection.h"
- #include "cmServerConnection.h"
- #include <iostream>
- #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 (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;
- }
|