summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/http/server_sent_event_test.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/test/http/server_sent_event_test.cpp b/test/http/server_sent_event_test.cpp
new file mode 100644
index 0000000000..d3f9403364
--- /dev/null
+++ b/test/http/server_sent_event_test.cpp
@@ -0,0 +1,111 @@
+#include "boost/asio/read.hpp"
+#include "boost/asio/read_until.hpp"
+#include "http/http_request.hpp"
+#include "http/http_response.hpp"
+#include "http/server_sent_event.hpp"
+
+#include <boost/asio/steady_timer.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+
+#include <memory>
+#include <string>
+#include <string_view>
+
+#include "gtest/gtest.h"
+namespace crow
+{
+namespace sse_socket
+{
+
+namespace
+{
+
+TEST(ServerSentEvent, SseWorks)
+{
+ boost::asio::io_context io;
+ boost::beast::test::stream stream(io);
+ boost::beast::test::stream out(io);
+ stream.connect(out);
+
+ bool openCalled = false;
+ auto openHandler = [&openCalled](Connection&) { openCalled = true; };
+ bool closeCalled = false;
+ auto closeHandler = [&closeCalled](Connection&) { closeCalled = true; };
+
+ std::shared_ptr<ConnectionImpl<boost::beast::test::stream>> conn =
+ std::make_shared<ConnectionImpl<boost::beast::test::stream>>(
+ io, std::move(stream), openHandler, closeHandler);
+ conn->start();
+ // Connect
+ {
+ constexpr std::string_view expected =
+ "HTTP/1.1 200 OK\r\n"
+ "Content-Type: text/event-stream\r\n"
+ "\r\n";
+
+ while (out.str().size() != expected.size())
+ {
+ io.run_for(std::chrono::milliseconds(1));
+ }
+
+ std::string eventContent;
+ eventContent.resize(expected.size());
+ boost::asio::read(out, boost::asio::buffer(eventContent));
+
+ EXPECT_EQ(eventContent, expected);
+ EXPECT_TRUE(openCalled);
+ EXPECT_FALSE(closeCalled);
+ EXPECT_TRUE(out.str().empty());
+ }
+ // Send one event
+ {
+ conn->sendEvent("TestEventId", "TestEventContent");
+ std::string_view expected = "id: TestEventId\n"
+ "data: TestEventContent\n"
+ "\n";
+
+ while (out.str().size() < expected.size())
+ {
+ io.run_for(std::chrono::milliseconds(1));
+ }
+ EXPECT_EQ(out.str(), expected);
+
+ std::string eventContent;
+ eventContent.resize(expected.size());
+ boost::asio::read(out, boost::asio::buffer(eventContent));
+
+ EXPECT_EQ(eventContent, expected);
+ EXPECT_TRUE(out.str().empty());
+ }
+ // Send second event
+ {
+ conn->sendEvent("TestEventId2", "TestEvent\nContent2");
+ constexpr std::string_view expected = "id: TestEventId2\n"
+ "data: TestEvent\n"
+ "data: Content2\n"
+ "\n";
+
+ while (out.str().size() < expected.size())
+ {
+ io.run_for(std::chrono::milliseconds(1));
+ }
+
+ std::string eventContent;
+ eventContent.resize(expected.size());
+ boost::asio::read(out, boost::asio::buffer(eventContent));
+ EXPECT_EQ(eventContent, expected);
+ EXPECT_TRUE(out.str().empty());
+ }
+ // close the remote
+ {
+ out.close();
+ while (!closeCalled)
+ {
+ io.run_for(std::chrono::milliseconds(1));
+ }
+ }
+}
+} // namespace
+
+} // namespace sse_socket
+} // namespace crow