http_ut.cpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "simple_server.h"
  2. #include <yt/cpp/mapreduce/http/http.h>
  3. #include <yt/cpp/mapreduce/interface/config.h>
  4. #include <library/cpp/testing/common/network.h>
  5. #include <library/cpp/testing/gtest/gtest.h>
  6. #include <util/system/byteorder.h>
  7. using namespace NYT;
  8. void WriteDataFrame(TStringBuf string, IOutputStream* stream)
  9. {
  10. stream->Write("\x01");
  11. ui32 size = string.size();
  12. auto littleEndianSize = HostToLittle(size);
  13. stream->Write(&littleEndianSize, sizeof(littleEndianSize));
  14. stream->Write(string);
  15. }
  16. THolder<TSimpleServer> CreateFramingEchoServer()
  17. {
  18. auto port = NTesting::GetFreePort();
  19. return MakeHolder<TSimpleServer>(
  20. port,
  21. [] (IInputStream* input, IOutputStream* output) {
  22. try {
  23. THttpInput httpInput(input);
  24. if (!httpInput.Headers().FindHeader("X-YT-Accept-Framing")) {
  25. FAIL() << "X-YT-Accept-Framing header not found";
  26. }
  27. auto input = httpInput.ReadAll();
  28. THttpOutput httpOutput(output);
  29. httpOutput << "HTTP/1.1 200 OK\r\n";
  30. httpOutput << "X-YT-Framing: 1\r\n";
  31. httpOutput << "\r\n";
  32. httpOutput << "\x02\x02"; // Two KeepAlive frames.
  33. WriteDataFrame("", &httpOutput);
  34. WriteDataFrame(TStringBuf(input).SubString(0, 10), &httpOutput);
  35. httpOutput << "\x02"; // KeepAlive.
  36. WriteDataFrame("", &httpOutput);
  37. WriteDataFrame(TStringBuf(input).SubString(10, std::string::npos), &httpOutput);
  38. httpOutput << "\x02"; // KeepAlive.
  39. httpOutput.Flush();
  40. } catch (const std::exception& exc) {
  41. }
  42. });
  43. }
  44. TEST(THttpHeaderTest, AddParameter)
  45. {
  46. THttpHeader header("POST", "/foo");
  47. header.AddMutationId();
  48. auto id1 = header.GetParameters()["mutation_id"].AsString();
  49. header.AddMutationId();
  50. auto id2 = header.GetParameters()["mutation_id"].AsString();
  51. EXPECT_TRUE(id1 != id2);
  52. }
  53. TEST(TFramingTest, FramingSimple)
  54. {
  55. auto server = CreateFramingEchoServer();
  56. THttpRequest request("0-0-0-0", server->GetAddress(), THttpHeader("POST", "concatenate"), TDuration::Zero());
  57. auto requestStream = request.StartRequest();
  58. *requestStream << "Some funny data";
  59. request.FinishRequest();
  60. auto response = request.GetResponseStream()->ReadAll();
  61. EXPECT_EQ(response, "Some funny data");
  62. }
  63. TEST(TFramingTest, FramingLarge)
  64. {
  65. auto server = CreateFramingEchoServer();
  66. THttpRequest request("0-0-0-0", server->GetAddress(), THttpHeader("POST", "concatenate"), TDuration::Zero());
  67. auto requestStream = request.StartRequest();
  68. auto data = TString(100000, 'x');
  69. *requestStream << data;
  70. request.FinishRequest();
  71. auto response = request.GetResponseStream()->ReadAll();
  72. EXPECT_EQ(response, data);
  73. }