PageRenderTime 57ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/tasks/asio/tiny-echo/tests/echo/tests.cpp

https://gitlab.com/Keeek/concurrency-course
C++ | 95 lines | 63 code | 29 blank | 3 comment | 0 complexity | 901f28a9cba1fe5f0e288160d4651754 MD5 | raw file
  1. #include <wheels/test/test_framework.hpp>
  2. #include <echo/tiny/server.hpp>
  3. #include <tinyfibers/api.hpp>
  4. #include <tinyfibers/net/socket.hpp>
  5. #include <tinyfibers/test/test.hpp>
  6. #include <tests_support/generator.hpp>
  7. #include <tests_support/buffer.hpp>
  8. #include <tests_support/port.hpp>
  9. #include <tests_support/read.hpp>
  10. #include <tests_support/tcp_client.hpp>
  11. #include <thread>
  12. using namespace tinyfibers;
  13. using namespace tinyfibers::net;
  14. using namespace tests::support;
  15. //////////////////////////////////////////////////////////////////////
  16. namespace {
  17. uint16_t EchoServerPort() {
  18. return tests::support::StaticFreePort();
  19. }
  20. void LaunchEchoServer() {
  21. // Serve forever in background thread
  22. std::thread([]() {
  23. RunScheduler([]() {
  24. echo::tiny::ServeForever(EchoServerPort());
  25. });
  26. }).detach();
  27. }
  28. SimpleTcpClient MakeEchoClient() {
  29. return {"localhost", EchoServerPort()};
  30. }
  31. } // namespace
  32. //////////////////////////////////////////////////////////////////////
  33. TEST_SUITE(EchoServer) {
  34. TINY_FIBERS_TEST(HelloWorld) {
  35. static const std::string kMessage = "Hello, World!";
  36. Socket socket = Socket::ConnectToLocal(EchoServerPort());
  37. socket.Write(asio::buffer(kMessage)).ExpectOk();
  38. std::string response = Read(socket, kMessage.length());
  39. ASSERT_EQ(response, kMessage);
  40. socket.Write(asio::buffer("!")).ExpectOk();
  41. std::string terminator = Read(socket, 1);
  42. socket.ShutdownWrite().ExpectOk();
  43. ASSERT_EQ(terminator, "!");
  44. }
  45. TINY_FIBERS_TEST(ShutdownWrite) {
  46. static const std::string kMessage = "Test shutdown";
  47. auto client = MakeEchoClient();
  48. client.Write(kMessage).ExpectOk();
  49. client.ShutdownWrite().ExpectOk();
  50. ASSERT_EQ(client.ReadAll().ValueOrThrow(), kMessage);
  51. }
  52. TINY_FIBERS_TEST(TwoClients) {
  53. auto first = MakeEchoClient();
  54. auto second = MakeEchoClient();
  55. first.Write("Hi, Jake!").ExpectOk();
  56. second.Write("Hi, Finn!").ExpectOk();
  57. ASSERT_EQ(first.Read(9).ValueOrThrow(), "Hi, Jake!");
  58. ASSERT_EQ(second.Read(9).ValueOrThrow(), "Hi, Finn!");
  59. }
  60. }
  61. int main(int argc, const char* argv[]) {
  62. std::cout << "Echo server port: " << EchoServerPort() << std::endl;
  63. LaunchEchoServer();
  64. wheels::test::RunTestsMain(wheels::test::ListAllTests(), argc, argv);
  65. return EXIT_SUCCESS;
  66. }