xref: /openbmc/bmcweb/test/http/http_response_test.cpp (revision 40e9b92ec19acffb46f83a6e55b18974da5d708e)
1*40e9b92eSEd Tanous // SPDX-License-Identifier: Apache-2.0
2*40e9b92eSEd Tanous // SPDX-FileCopyrightText: Copyright OpenBMC Authors
37a6f0031SEd Tanous #include "file_test_utilities.hpp"
4b2896149SEd Tanous #include "http/http_body.hpp"
58e3f7032SAbhilash Raju #include "http/http_response.hpp"
6f0b59af4SEd Tanous #include "utility.hpp"
78e3f7032SAbhilash Raju 
88d45b9cbSEd Tanous #include <boost/beast/core/buffers_to_string.hpp>
9f0b59af4SEd Tanous #include <boost/beast/core/file_base.hpp>
10f0b59af4SEd Tanous #include <boost/beast/core/file_posix.hpp>
11f0b59af4SEd Tanous #include <boost/beast/http/message.hpp>
128d45b9cbSEd Tanous #include <boost/beast/http/serializer.hpp>
13f0b59af4SEd Tanous #include <boost/beast/http/status.hpp>
14f0b59af4SEd Tanous 
15f0b59af4SEd Tanous #include <cstdio>
168e3f7032SAbhilash Raju #include <filesystem>
17f0b59af4SEd Tanous #include <string>
188e3f7032SAbhilash Raju 
198e3f7032SAbhilash Raju #include "gtest/gtest.h"
208e3f7032SAbhilash Raju namespace
218e3f7032SAbhilash Raju {
addHeaders(crow::Response & res)228e3f7032SAbhilash Raju void addHeaders(crow::Response& res)
238e3f7032SAbhilash Raju {
248e3f7032SAbhilash Raju     res.addHeader("myheader", "myvalue");
258e3f7032SAbhilash Raju     res.keepAlive(true);
268e3f7032SAbhilash Raju     res.result(boost::beast::http::status::ok);
278e3f7032SAbhilash Raju }
verifyHeaders(crow::Response & res)288e3f7032SAbhilash Raju void verifyHeaders(crow::Response& res)
298e3f7032SAbhilash Raju {
308e3f7032SAbhilash Raju     EXPECT_EQ(res.getHeaderValue("myheader"), "myvalue");
318e3f7032SAbhilash Raju     EXPECT_EQ(res.keepAlive(), true);
328e3f7032SAbhilash Raju     EXPECT_EQ(res.result(), boost::beast::http::status::ok);
338e3f7032SAbhilash Raju }
348e3f7032SAbhilash Raju 
getData(boost::beast::http::response<bmcweb::HttpBody> & m)35b2896149SEd Tanous std::string getData(boost::beast::http::response<bmcweb::HttpBody>& m)
36b5f288d2SAbhilash Raju {
3752e31629SEd Tanous     std::string ret;
3852e31629SEd Tanous 
39b2896149SEd Tanous     boost::beast::http::response_serializer<bmcweb::HttpBody> sr{m};
4052e31629SEd Tanous     sr.split(true);
415575efb6SEd Tanous     // Reads buffers into ret
42bd79bce8SPatrick Williams     auto reader =
43bd79bce8SPatrick Williams         [&sr, &ret](const boost::system::error_code& ec2, const auto& buffer) {
4452e31629SEd Tanous             EXPECT_FALSE(ec2);
4552e31629SEd Tanous             std::string ret2 = boost::beast::buffers_to_string(buffer);
4652e31629SEd Tanous             sr.consume(ret2.size());
4752e31629SEd Tanous             ret += ret2;
4852e31629SEd Tanous         };
4952e31629SEd Tanous     boost::system::error_code ec;
5052e31629SEd Tanous 
5152e31629SEd Tanous     // Read headers
52b5f288d2SAbhilash Raju     while (!sr.is_header_done())
53b5f288d2SAbhilash Raju     {
5452e31629SEd Tanous         sr.next(ec, reader);
5552e31629SEd Tanous         EXPECT_FALSE(ec);
56b5f288d2SAbhilash Raju     }
5752e31629SEd Tanous     ret.clear();
58b5f288d2SAbhilash Raju 
5952e31629SEd Tanous     // Read body
60b5f288d2SAbhilash Raju     while (!sr.is_done())
61b5f288d2SAbhilash Raju     {
6252e31629SEd Tanous         sr.next(ec, reader);
63b5f288d2SAbhilash Raju         EXPECT_FALSE(ec);
64b5f288d2SAbhilash Raju     }
65b5f288d2SAbhilash Raju 
66b5f288d2SAbhilash Raju     return ret;
67b5f288d2SAbhilash Raju }
6852e31629SEd Tanous 
TEST(HttpResponse,Headers)698e3f7032SAbhilash Raju TEST(HttpResponse, Headers)
708e3f7032SAbhilash Raju {
718e3f7032SAbhilash Raju     crow::Response res;
728e3f7032SAbhilash Raju     addHeaders(res);
738e3f7032SAbhilash Raju     verifyHeaders(res);
748e3f7032SAbhilash Raju }
TEST(HttpResponse,StringBody)758e3f7032SAbhilash Raju TEST(HttpResponse, StringBody)
768e3f7032SAbhilash Raju {
778e3f7032SAbhilash Raju     crow::Response res;
788e3f7032SAbhilash Raju     addHeaders(res);
795575efb6SEd Tanous     std::string_view bodyValue = "this is my new body";
805575efb6SEd Tanous     res.write({bodyValue.data(), bodyValue.length()});
815575efb6SEd Tanous     EXPECT_EQ(*res.body(), bodyValue);
828e3f7032SAbhilash Raju     verifyHeaders(res);
838e3f7032SAbhilash Raju }
TEST(HttpResponse,HttpBody)84b2896149SEd Tanous TEST(HttpResponse, HttpBody)
858e3f7032SAbhilash Raju {
868e3f7032SAbhilash Raju     crow::Response res;
878e3f7032SAbhilash Raju     addHeaders(res);
885575efb6SEd Tanous     TemporaryFileHandle temporaryFile("sample text");
895575efb6SEd Tanous     res.openFile(temporaryFile.stringPath);
908e3f7032SAbhilash Raju 
918e3f7032SAbhilash Raju     verifyHeaders(res);
928e3f7032SAbhilash Raju }
TEST(HttpResponse,HttpBodyWithFd)93b2896149SEd Tanous TEST(HttpResponse, HttpBodyWithFd)
94b5f288d2SAbhilash Raju {
95b5f288d2SAbhilash Raju     crow::Response res;
96b5f288d2SAbhilash Raju     addHeaders(res);
975575efb6SEd Tanous     TemporaryFileHandle temporaryFile("sample text");
985575efb6SEd Tanous     FILE* fd = fopen(temporaryFile.stringPath.c_str(), "r+");
99b5f288d2SAbhilash Raju     res.openFd(fileno(fd));
100b5f288d2SAbhilash Raju     verifyHeaders(res);
101b5f288d2SAbhilash Raju     fclose(fd);
102b5f288d2SAbhilash Raju }
103b5f288d2SAbhilash Raju 
TEST(HttpResponse,Base64HttpBodyWithFd)104b2896149SEd Tanous TEST(HttpResponse, Base64HttpBodyWithFd)
105b5f288d2SAbhilash Raju {
106b5f288d2SAbhilash Raju     crow::Response res;
107b5f288d2SAbhilash Raju     addHeaders(res);
1085575efb6SEd Tanous     TemporaryFileHandle temporaryFile("sample text");
1095575efb6SEd Tanous     FILE* fd = fopen(temporaryFile.stringPath.c_str(), "r");
1105575efb6SEd Tanous     ASSERT_NE(fd, nullptr);
111b5f288d2SAbhilash Raju     res.openFd(fileno(fd), bmcweb::EncodingType::Base64);
112b5f288d2SAbhilash Raju     verifyHeaders(res);
113b5f288d2SAbhilash Raju     fclose(fd);
114b5f288d2SAbhilash Raju }
115b5f288d2SAbhilash Raju 
TEST(HttpResponse,BodyTransitions)1168e3f7032SAbhilash Raju TEST(HttpResponse, BodyTransitions)
1178e3f7032SAbhilash Raju {
1188e3f7032SAbhilash Raju     crow::Response res;
1198e3f7032SAbhilash Raju     addHeaders(res);
1205575efb6SEd Tanous     TemporaryFileHandle temporaryFile("sample text");
1215575efb6SEd Tanous     res.openFile(temporaryFile.stringPath);
1228e3f7032SAbhilash Raju 
1238e3f7032SAbhilash Raju     verifyHeaders(res);
1248e3f7032SAbhilash Raju     res.write("body text");
1258e3f7032SAbhilash Raju 
1268e3f7032SAbhilash Raju     verifyHeaders(res);
127b5f288d2SAbhilash Raju }
128b5f288d2SAbhilash Raju 
generateBigdata()1297a6f0031SEd Tanous std::string generateBigdata()
1307a6f0031SEd Tanous {
1317a6f0031SEd Tanous     std::string result;
1327a6f0031SEd Tanous     while (result.size() < 10000)
1337a6f0031SEd Tanous     {
1347a6f0031SEd Tanous         result += "sample text";
1357a6f0031SEd Tanous     }
1367a6f0031SEd Tanous     return result;
1377a6f0031SEd Tanous }
1387a6f0031SEd Tanous 
TEST(HttpResponse,StringBodyWriterLarge)1397a6f0031SEd Tanous TEST(HttpResponse, StringBodyWriterLarge)
1407a6f0031SEd Tanous {
1417a6f0031SEd Tanous     crow::Response res;
1427a6f0031SEd Tanous     std::string data = generateBigdata();
1437a6f0031SEd Tanous     res.write(std::string(data));
1445575efb6SEd Tanous     EXPECT_EQ(getData(res.response), data);
1457a6f0031SEd Tanous }
1467a6f0031SEd Tanous 
TEST(HttpResponse,Base64HttpBodyWriter)147b2896149SEd Tanous TEST(HttpResponse, Base64HttpBodyWriter)
148b5f288d2SAbhilash Raju {
149b5f288d2SAbhilash Raju     crow::Response res;
150b5f288d2SAbhilash Raju     std::string data = "sample text";
1515575efb6SEd Tanous     TemporaryFileHandle temporaryFile(data);
1525575efb6SEd Tanous     FILE* f = fopen(temporaryFile.stringPath.c_str(), "r+");
153b5f288d2SAbhilash Raju     res.openFd(fileno(f), bmcweb::EncodingType::Base64);
1545575efb6SEd Tanous     EXPECT_EQ(getData(res.response), "c2FtcGxlIHRleHQ=");
155b5f288d2SAbhilash Raju }
156b5f288d2SAbhilash Raju 
TEST(HttpResponse,Base64HttpBodyWriterLarge)157b2896149SEd Tanous TEST(HttpResponse, Base64HttpBodyWriterLarge)
158b5f288d2SAbhilash Raju {
159b5f288d2SAbhilash Raju     crow::Response res;
160b5f288d2SAbhilash Raju     std::string data = generateBigdata();
1615575efb6SEd Tanous     TemporaryFileHandle temporaryFile(data);
1625575efb6SEd Tanous 
163b5f288d2SAbhilash Raju     boost::beast::file_posix file;
164b5f288d2SAbhilash Raju     boost::system::error_code ec;
1655575efb6SEd Tanous     file.open(temporaryFile.stringPath.c_str(), boost::beast::file_mode::read,
1665575efb6SEd Tanous               ec);
167b5f288d2SAbhilash Raju     EXPECT_EQ(ec.value(), 0);
168b5f288d2SAbhilash Raju     res.openFd(file.native_handle(), bmcweb::EncodingType::Base64);
1695575efb6SEd Tanous     EXPECT_EQ(getData(res.response), crow::utility::base64encode(data));
170b5f288d2SAbhilash Raju }
171b5f288d2SAbhilash Raju 
TEST(HttpResponse,HttpBodyWriterLarge)172b2896149SEd Tanous TEST(HttpResponse, HttpBodyWriterLarge)
173b5f288d2SAbhilash Raju {
174b5f288d2SAbhilash Raju     crow::Response res;
175b5f288d2SAbhilash Raju     std::string data = generateBigdata();
1765575efb6SEd Tanous     TemporaryFileHandle temporaryFile(data);
1775575efb6SEd Tanous 
178b5f288d2SAbhilash Raju     boost::beast::file_posix file;
179b5f288d2SAbhilash Raju     boost::system::error_code ec;
1805575efb6SEd Tanous     file.open(temporaryFile.stringPath.c_str(), boost::beast::file_mode::read,
1815575efb6SEd Tanous               ec);
182b5f288d2SAbhilash Raju     EXPECT_EQ(ec.value(), 0);
183b5f288d2SAbhilash Raju     res.openFd(file.native_handle());
1845575efb6SEd Tanous     EXPECT_EQ(getData(res.response), data);
185b5f288d2SAbhilash Raju }
186b5f288d2SAbhilash Raju 
1878e3f7032SAbhilash Raju } // namespace
188