testServerBuffering.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "cmConnection.h"
  2. #include "cmServerConnection.h"
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. void print_error(const std::vector<std::string>& input,
  7. const std::vector<std::string>& output)
  8. {
  9. std::cerr << "Responses don't equal input messages input." << std::endl;
  10. std::cerr << "Responses: " << std::endl;
  11. for (auto& msg : output) {
  12. std::cerr << "'" << msg << "'" << std::endl;
  13. }
  14. std::cerr << "Input messages" << std::endl;
  15. for (auto& msg : input) {
  16. std::cerr << "'" << msg << "'" << std::endl;
  17. }
  18. }
  19. std::string trim_newline(const std::string& _buffer)
  20. {
  21. auto buffer = _buffer;
  22. while (!buffer.empty() && (buffer.back() == '\n' || buffer.back() == '\r')) {
  23. buffer.pop_back();
  24. }
  25. return buffer;
  26. }
  27. int testServerBuffering(int, char** const)
  28. {
  29. std::vector<std::string> messages = {
  30. "{ \"test\": 10}", "{ \"test\": { \"test2\": false} }",
  31. "{ \"test\": [1, 2, 3] }",
  32. "{ \"a\": { \"1\": {}, \n\n\n \"2\":[] \t\t\t\t}}"
  33. };
  34. std::string fullMessage;
  35. for (auto& msg : messages) {
  36. fullMessage += "[== \"CMake Server\" ==[\n";
  37. fullMessage += msg;
  38. fullMessage += "\n]== \"CMake Server\" ==]\n";
  39. }
  40. // The buffering strategy should cope with any fragmentation, including
  41. // just getting the characters one at a time.
  42. auto bufferingStrategy =
  43. std::unique_ptr<cmConnectionBufferStrategy>(new cmServerBufferStrategy);
  44. std::vector<std::string> response;
  45. std::string rawBuffer;
  46. for (auto& messageChar : fullMessage) {
  47. rawBuffer += messageChar;
  48. std::string packet = bufferingStrategy->BufferMessage(rawBuffer);
  49. do {
  50. if (!packet.empty() && packet != "\r\n") {
  51. response.push_back(trim_newline(packet));
  52. }
  53. packet = bufferingStrategy->BufferMessage(rawBuffer);
  54. } while (!packet.empty());
  55. }
  56. if (response != messages) {
  57. print_error(messages, response);
  58. return 1;
  59. }
  60. // We should also be able to deal with getting a bunch at once
  61. response.clear();
  62. std::string packet = bufferingStrategy->BufferMessage(fullMessage);
  63. do {
  64. if (!packet.empty() && packet != "\r\n") {
  65. response.push_back(trim_newline(packet));
  66. }
  67. packet = bufferingStrategy->BufferMessage(fullMessage);
  68. } while (!packet.empty());
  69. if (response != messages) {
  70. print_error(messages, response);
  71. return 1;
  72. }
  73. return 0;
  74. }