17a6f0031SEd Tanous #include "file_test_utilities.hpp"
2b2896149SEd Tanous #include "http/http_body.hpp"
38e3f7032SAbhilash Raju #include "http/http_response.hpp"
4f0b59af4SEd Tanous #include "utility.hpp"
58e3f7032SAbhilash Raju 
6*8d45b9cbSEd Tanous #include <boost/beast/core/buffers_to_string.hpp>
7f0b59af4SEd Tanous #include <boost/beast/core/file_base.hpp>
8f0b59af4SEd Tanous #include <boost/beast/core/file_posix.hpp>
9f0b59af4SEd Tanous #include <boost/beast/http/message.hpp>
10*8d45b9cbSEd Tanous #include <boost/beast/http/serializer.hpp>
11f0b59af4SEd Tanous #include <boost/beast/http/status.hpp>
12f0b59af4SEd Tanous 
13f0b59af4SEd Tanous #include <cstdio>
148e3f7032SAbhilash Raju #include <filesystem>
15f0b59af4SEd Tanous #include <string>
168e3f7032SAbhilash Raju 
178e3f7032SAbhilash Raju #include "gtest/gtest.h"
188e3f7032SAbhilash Raju namespace
198e3f7032SAbhilash Raju {
addHeaders(crow::Response & res)208e3f7032SAbhilash Raju void addHeaders(crow::Response& res)
218e3f7032SAbhilash Raju {
228e3f7032SAbhilash Raju     res.addHeader("myheader", "myvalue");
238e3f7032SAbhilash Raju     res.keepAlive(true);
248e3f7032SAbhilash Raju     res.result(boost::beast::http::status::ok);
258e3f7032SAbhilash Raju }
verifyHeaders(crow::Response & res)268e3f7032SAbhilash Raju void verifyHeaders(crow::Response& res)
278e3f7032SAbhilash Raju {
288e3f7032SAbhilash Raju     EXPECT_EQ(res.getHeaderValue("myheader"), "myvalue");
298e3f7032SAbhilash Raju     EXPECT_EQ(res.keepAlive(), true);
308e3f7032SAbhilash Raju     EXPECT_EQ(res.result(), boost::beast::http::status::ok);
318e3f7032SAbhilash Raju }
328e3f7032SAbhilash Raju 
getData(boost::beast::http::response<bmcweb::HttpBody> & m)33b2896149SEd Tanous std::string getData(boost::beast::http::response<bmcweb::HttpBody>& m)
34b5f288d2SAbhilash Raju {
3552e31629SEd Tanous     std::string ret;
3652e31629SEd Tanous 
37b2896149SEd Tanous     boost::beast::http::response_serializer<bmcweb::HttpBody> sr{m};
3852e31629SEd Tanous     sr.split(true);
395575efb6SEd Tanous     // Reads buffers into ret
4052e31629SEd Tanous     auto reader = [&sr, &ret](const boost::system::error_code& ec2,
4152e31629SEd Tanous                               const auto& buffer) {
4252e31629SEd Tanous         EXPECT_FALSE(ec2);
4352e31629SEd Tanous         std::string ret2 = boost::beast::buffers_to_string(buffer);
4452e31629SEd Tanous         sr.consume(ret2.size());
4552e31629SEd Tanous         ret += ret2;
4652e31629SEd Tanous     };
4752e31629SEd Tanous     boost::system::error_code ec;
4852e31629SEd Tanous 
4952e31629SEd Tanous     // Read headers
50b5f288d2SAbhilash Raju     while (!sr.is_header_done())
51b5f288d2SAbhilash Raju     {
5252e31629SEd Tanous         sr.next(ec, reader);
5352e31629SEd Tanous         EXPECT_FALSE(ec);
54b5f288d2SAbhilash Raju     }
5552e31629SEd Tanous     ret.clear();
56b5f288d2SAbhilash Raju 
5752e31629SEd Tanous     // Read body
58b5f288d2SAbhilash Raju     while (!sr.is_done())
59b5f288d2SAbhilash Raju     {
6052e31629SEd Tanous         sr.next(ec, reader);
61b5f288d2SAbhilash Raju         EXPECT_FALSE(ec);
62b5f288d2SAbhilash Raju     }
63b5f288d2SAbhilash Raju 
64b5f288d2SAbhilash Raju     return ret;
65b5f288d2SAbhilash Raju }
6652e31629SEd Tanous 
TEST(HttpResponse,Headers)678e3f7032SAbhilash Raju TEST(HttpResponse, Headers)
688e3f7032SAbhilash Raju {
698e3f7032SAbhilash Raju     crow::Response res;
708e3f7032SAbhilash Raju     addHeaders(res);
718e3f7032SAbhilash Raju     verifyHeaders(res);
728e3f7032SAbhilash Raju }
TEST(HttpResponse,StringBody)738e3f7032SAbhilash Raju TEST(HttpResponse, StringBody)
748e3f7032SAbhilash Raju {
758e3f7032SAbhilash Raju     crow::Response res;
768e3f7032SAbhilash Raju     addHeaders(res);
775575efb6SEd Tanous     std::string_view bodyValue = "this is my new body";
785575efb6SEd Tanous     res.write({bodyValue.data(), bodyValue.length()});
795575efb6SEd Tanous     EXPECT_EQ(*res.body(), bodyValue);
808e3f7032SAbhilash Raju     verifyHeaders(res);
818e3f7032SAbhilash Raju }
TEST(HttpResponse,HttpBody)82b2896149SEd Tanous TEST(HttpResponse, HttpBody)
838e3f7032SAbhilash Raju {
848e3f7032SAbhilash Raju     crow::Response res;
858e3f7032SAbhilash Raju     addHeaders(res);
865575efb6SEd Tanous     TemporaryFileHandle temporaryFile("sample text");
875575efb6SEd Tanous     res.openFile(temporaryFile.stringPath);
888e3f7032SAbhilash Raju 
898e3f7032SAbhilash Raju     verifyHeaders(res);
908e3f7032SAbhilash Raju }
TEST(HttpResponse,HttpBodyWithFd)91b2896149SEd Tanous TEST(HttpResponse, HttpBodyWithFd)
92b5f288d2SAbhilash Raju {
93b5f288d2SAbhilash Raju     crow::Response res;
94b5f288d2SAbhilash Raju     addHeaders(res);
955575efb6SEd Tanous     TemporaryFileHandle temporaryFile("sample text");
965575efb6SEd Tanous     FILE* fd = fopen(temporaryFile.stringPath.c_str(), "r+");
97b5f288d2SAbhilash Raju     res.openFd(fileno(fd));
98b5f288d2SAbhilash Raju     verifyHeaders(res);
99b5f288d2SAbhilash Raju     fclose(fd);
100b5f288d2SAbhilash Raju }
101b5f288d2SAbhilash Raju 
TEST(HttpResponse,Base64HttpBodyWithFd)102b2896149SEd Tanous TEST(HttpResponse, Base64HttpBodyWithFd)
103b5f288d2SAbhilash Raju {
104b5f288d2SAbhilash Raju     crow::Response res;
105b5f288d2SAbhilash Raju     addHeaders(res);
1065575efb6SEd Tanous     TemporaryFileHandle temporaryFile("sample text");
1075575efb6SEd Tanous     FILE* fd = fopen(temporaryFile.stringPath.c_str(), "r");
1085575efb6SEd Tanous     ASSERT_NE(fd, nullptr);
109b5f288d2SAbhilash Raju     res.openFd(fileno(fd), bmcweb::EncodingType::Base64);
110b5f288d2SAbhilash Raju     verifyHeaders(res);
111b5f288d2SAbhilash Raju     fclose(fd);
112b5f288d2SAbhilash Raju }
113b5f288d2SAbhilash Raju 
TEST(HttpResponse,BodyTransitions)1148e3f7032SAbhilash Raju TEST(HttpResponse, BodyTransitions)
1158e3f7032SAbhilash Raju {
1168e3f7032SAbhilash Raju     crow::Response res;
1178e3f7032SAbhilash Raju     addHeaders(res);
1185575efb6SEd Tanous     TemporaryFileHandle temporaryFile("sample text");
1195575efb6SEd Tanous     res.openFile(temporaryFile.stringPath);
1208e3f7032SAbhilash Raju 
1218e3f7032SAbhilash Raju     verifyHeaders(res);
1228e3f7032SAbhilash Raju     res.write("body text");
1238e3f7032SAbhilash Raju 
1248e3f7032SAbhilash Raju     verifyHeaders(res);
125b5f288d2SAbhilash Raju }
126b5f288d2SAbhilash Raju 
generateBigdata()1277a6f0031SEd Tanous std::string generateBigdata()
1287a6f0031SEd Tanous {
1297a6f0031SEd Tanous     std::string result;
1307a6f0031SEd Tanous     while (result.size() < 10000)
1317a6f0031SEd Tanous     {
1327a6f0031SEd Tanous         result += "sample text";
1337a6f0031SEd Tanous     }
1347a6f0031SEd Tanous     return result;
1357a6f0031SEd Tanous }
1367a6f0031SEd Tanous 
TEST(HttpResponse,StringBodyWriterLarge)1377a6f0031SEd Tanous TEST(HttpResponse, StringBodyWriterLarge)
1387a6f0031SEd Tanous {
1397a6f0031SEd Tanous     crow::Response res;
1407a6f0031SEd Tanous     std::string data = generateBigdata();
1417a6f0031SEd Tanous     res.write(std::string(data));
1425575efb6SEd Tanous     EXPECT_EQ(getData(res.response), data);
1437a6f0031SEd Tanous }
1447a6f0031SEd Tanous 
TEST(HttpResponse,Base64HttpBodyWriter)145b2896149SEd Tanous TEST(HttpResponse, Base64HttpBodyWriter)
146b5f288d2SAbhilash Raju {
147b5f288d2SAbhilash Raju     crow::Response res;
148b5f288d2SAbhilash Raju     std::string data = "sample text";
1495575efb6SEd Tanous     TemporaryFileHandle temporaryFile(data);
1505575efb6SEd Tanous     FILE* f = fopen(temporaryFile.stringPath.c_str(), "r+");
151b5f288d2SAbhilash Raju     res.openFd(fileno(f), bmcweb::EncodingType::Base64);
1525575efb6SEd Tanous     EXPECT_EQ(getData(res.response), "c2FtcGxlIHRleHQ=");
153b5f288d2SAbhilash Raju }
154b5f288d2SAbhilash Raju 
TEST(HttpResponse,Base64HttpBodyWriterLarge)155b2896149SEd Tanous TEST(HttpResponse, Base64HttpBodyWriterLarge)
156b5f288d2SAbhilash Raju {
157b5f288d2SAbhilash Raju     crow::Response res;
158b5f288d2SAbhilash Raju     std::string data = generateBigdata();
1595575efb6SEd Tanous     TemporaryFileHandle temporaryFile(data);
1605575efb6SEd Tanous 
161b5f288d2SAbhilash Raju     boost::beast::file_posix file;
162b5f288d2SAbhilash Raju     boost::system::error_code ec;
1635575efb6SEd Tanous     file.open(temporaryFile.stringPath.c_str(), boost::beast::file_mode::read,
1645575efb6SEd Tanous               ec);
165b5f288d2SAbhilash Raju     EXPECT_EQ(ec.value(), 0);
166b5f288d2SAbhilash Raju     res.openFd(file.native_handle(), bmcweb::EncodingType::Base64);
1675575efb6SEd Tanous     EXPECT_EQ(getData(res.response), crow::utility::base64encode(data));
168b5f288d2SAbhilash Raju }
169b5f288d2SAbhilash Raju 
TEST(HttpResponse,HttpBodyWriterLarge)170b2896149SEd Tanous TEST(HttpResponse, HttpBodyWriterLarge)
171b5f288d2SAbhilash Raju {
172b5f288d2SAbhilash Raju     crow::Response res;
173b5f288d2SAbhilash Raju     std::string data = generateBigdata();
1745575efb6SEd Tanous     TemporaryFileHandle temporaryFile(data);
1755575efb6SEd Tanous 
176b5f288d2SAbhilash Raju     boost::beast::file_posix file;
177b5f288d2SAbhilash Raju     boost::system::error_code ec;
1785575efb6SEd Tanous     file.open(temporaryFile.stringPath.c_str(), boost::beast::file_mode::read,
1795575efb6SEd Tanous               ec);
180b5f288d2SAbhilash Raju     EXPECT_EQ(ec.value(), 0);
181b5f288d2SAbhilash Raju     res.openFd(file.native_handle());
1825575efb6SEd Tanous     EXPECT_EQ(getData(res.response), data);
183b5f288d2SAbhilash Raju }
184b5f288d2SAbhilash Raju 
1858e3f7032SAbhilash Raju } // namespace
186