testServerBuffering.cpp 2.3 KB

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