blob: 536415eb7e2537f74215e705d2c2c0904f88b613 [file] [log] [blame]
Ed Tanous40e9b922024-09-10 13:50:16 -07001// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright OpenBMC Authors
Ed Tanous7a6f0032024-01-28 09:49:03 -08003#include "file_test_utilities.hpp"
Ed Tanousb2896142024-01-31 15:25:47 -08004#include "http/http_body.hpp"
Abhilash Raju8e3f7032023-07-17 08:53:11 -05005#include "http/http_response.hpp"
Ed Tanousf0b59af2024-03-20 13:38:04 -07006#include "utility.hpp"
Abhilash Raju8e3f7032023-07-17 08:53:11 -05007
Ed Tanous8d45b9c2024-04-08 17:50:10 -07008#include <boost/beast/core/buffers_to_string.hpp>
Ed Tanousf0b59af2024-03-20 13:38:04 -07009#include <boost/beast/core/file_base.hpp>
10#include <boost/beast/core/file_posix.hpp>
Ed Tanous8d45b9c2024-04-08 17:50:10 -070011#include <boost/beast/http/serializer.hpp>
Ed Tanousf0b59af2024-03-20 13:38:04 -070012#include <boost/beast/http/status.hpp>
13
14#include <cstdio>
Abhilash Raju8e3f7032023-07-17 08:53:11 -050015#include <filesystem>
Ed Tanousf0b59af2024-03-20 13:38:04 -070016#include <string>
Abhilash Raju8e3f7032023-07-17 08:53:11 -050017
18#include "gtest/gtest.h"
Ed Tanous05c27352024-10-09 17:00:37 -070019namespace crow
20{
Abhilash Raju8e3f7032023-07-17 08:53:11 -050021namespace
22{
Ed Tanous05c27352024-10-09 17:00:37 -070023void addHeaders(Response& res)
Abhilash Raju8e3f7032023-07-17 08:53:11 -050024{
25 res.addHeader("myheader", "myvalue");
26 res.keepAlive(true);
27 res.result(boost::beast::http::status::ok);
28}
Ed Tanous05c27352024-10-09 17:00:37 -070029void verifyHeaders(Response& res)
Abhilash Raju8e3f7032023-07-17 08:53:11 -050030{
31 EXPECT_EQ(res.getHeaderValue("myheader"), "myvalue");
32 EXPECT_EQ(res.keepAlive(), true);
33 EXPECT_EQ(res.result(), boost::beast::http::status::ok);
34}
35
Ed Tanousb2896142024-01-31 15:25:47 -080036std::string getData(boost::beast::http::response<bmcweb::HttpBody>& m)
Abhilash Rajub5f288d2023-11-08 22:32:44 -060037{
Ed Tanous52e31622024-01-23 16:31:11 -080038 std::string ret;
39
Ed Tanousb2896142024-01-31 15:25:47 -080040 boost::beast::http::response_serializer<bmcweb::HttpBody> sr{m};
Ed Tanous52e31622024-01-23 16:31:11 -080041 sr.split(true);
Ed Tanous5575efb2024-01-30 09:25:03 -080042 // Reads buffers into ret
Patrick Williamsbd79bce2024-08-16 15:22:20 -040043 auto reader =
44 [&sr, &ret](const boost::system::error_code& ec2, const auto& buffer) {
45 EXPECT_FALSE(ec2);
46 std::string ret2 = boost::beast::buffers_to_string(buffer);
47 sr.consume(ret2.size());
48 ret += ret2;
49 };
Ed Tanous52e31622024-01-23 16:31:11 -080050 boost::system::error_code ec;
51
52 // Read headers
Abhilash Rajub5f288d2023-11-08 22:32:44 -060053 while (!sr.is_header_done())
54 {
Ed Tanous52e31622024-01-23 16:31:11 -080055 sr.next(ec, reader);
56 EXPECT_FALSE(ec);
Abhilash Rajub5f288d2023-11-08 22:32:44 -060057 }
Ed Tanous52e31622024-01-23 16:31:11 -080058 ret.clear();
Abhilash Rajub5f288d2023-11-08 22:32:44 -060059
Ed Tanous52e31622024-01-23 16:31:11 -080060 // Read body
Abhilash Rajub5f288d2023-11-08 22:32:44 -060061 while (!sr.is_done())
62 {
Ed Tanous52e31622024-01-23 16:31:11 -080063 sr.next(ec, reader);
Abhilash Rajub5f288d2023-11-08 22:32:44 -060064 EXPECT_FALSE(ec);
65 }
66
67 return ret;
68}
Ed Tanous52e31622024-01-23 16:31:11 -080069
Abhilash Raju8e3f7032023-07-17 08:53:11 -050070TEST(HttpResponse, Headers)
71{
Ed Tanous05c27352024-10-09 17:00:37 -070072 Response res;
Abhilash Raju8e3f7032023-07-17 08:53:11 -050073 addHeaders(res);
74 verifyHeaders(res);
75}
76TEST(HttpResponse, StringBody)
77{
Ed Tanous05c27352024-10-09 17:00:37 -070078 Response res;
Abhilash Raju8e3f7032023-07-17 08:53:11 -050079 addHeaders(res);
Ed Tanous5575efb2024-01-30 09:25:03 -080080 std::string_view bodyValue = "this is my new body";
81 res.write({bodyValue.data(), bodyValue.length()});
82 EXPECT_EQ(*res.body(), bodyValue);
Abhilash Raju8e3f7032023-07-17 08:53:11 -050083 verifyHeaders(res);
84}
Ed Tanousb2896142024-01-31 15:25:47 -080085TEST(HttpResponse, HttpBody)
Abhilash Raju8e3f7032023-07-17 08:53:11 -050086{
Ed Tanous05c27352024-10-09 17:00:37 -070087 Response res;
Abhilash Raju8e3f7032023-07-17 08:53:11 -050088 addHeaders(res);
Ed Tanous5575efb2024-01-30 09:25:03 -080089 TemporaryFileHandle temporaryFile("sample text");
90 res.openFile(temporaryFile.stringPath);
Abhilash Raju8e3f7032023-07-17 08:53:11 -050091
92 verifyHeaders(res);
Abhilash Raju8e3f7032023-07-17 08:53:11 -050093}
Ed Tanousb2896142024-01-31 15:25:47 -080094TEST(HttpResponse, HttpBodyWithFd)
Abhilash Rajub5f288d2023-11-08 22:32:44 -060095{
Ed Tanous05c27352024-10-09 17:00:37 -070096 Response res;
Abhilash Rajub5f288d2023-11-08 22:32:44 -060097 addHeaders(res);
Ed Tanous5575efb2024-01-30 09:25:03 -080098 TemporaryFileHandle temporaryFile("sample text");
99 FILE* fd = fopen(temporaryFile.stringPath.c_str(), "r+");
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600100 res.openFd(fileno(fd));
101 verifyHeaders(res);
102 fclose(fd);
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600103}
104
Ed Tanousb2896142024-01-31 15:25:47 -0800105TEST(HttpResponse, Base64HttpBodyWithFd)
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600106{
Ed Tanous05c27352024-10-09 17:00:37 -0700107 Response res;
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600108 addHeaders(res);
Ed Tanous5575efb2024-01-30 09:25:03 -0800109 TemporaryFileHandle temporaryFile("sample text");
110 FILE* fd = fopen(temporaryFile.stringPath.c_str(), "r");
111 ASSERT_NE(fd, nullptr);
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600112 res.openFd(fileno(fd), bmcweb::EncodingType::Base64);
113 verifyHeaders(res);
114 fclose(fd);
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600115}
116
Abhilash Raju8e3f7032023-07-17 08:53:11 -0500117TEST(HttpResponse, BodyTransitions)
118{
Ed Tanous05c27352024-10-09 17:00:37 -0700119 Response res;
Abhilash Raju8e3f7032023-07-17 08:53:11 -0500120 addHeaders(res);
Ed Tanous5575efb2024-01-30 09:25:03 -0800121 TemporaryFileHandle temporaryFile("sample text");
122 res.openFile(temporaryFile.stringPath);
Abhilash Raju8e3f7032023-07-17 08:53:11 -0500123
Abhilash Raju8e3f7032023-07-17 08:53:11 -0500124 verifyHeaders(res);
125 res.write("body text");
126
Abhilash Raju8e3f7032023-07-17 08:53:11 -0500127 verifyHeaders(res);
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600128}
129
Ed Tanous7a6f0032024-01-28 09:49:03 -0800130std::string generateBigdata()
131{
132 std::string result;
133 while (result.size() < 10000)
134 {
135 result += "sample text";
136 }
137 return result;
138}
139
140TEST(HttpResponse, StringBodyWriterLarge)
141{
Ed Tanous05c27352024-10-09 17:00:37 -0700142 Response res;
Ed Tanous7a6f0032024-01-28 09:49:03 -0800143 std::string data = generateBigdata();
144 res.write(std::string(data));
Ed Tanous5575efb2024-01-30 09:25:03 -0800145 EXPECT_EQ(getData(res.response), data);
Ed Tanous7a6f0032024-01-28 09:49:03 -0800146}
147
Ed Tanousb2896142024-01-31 15:25:47 -0800148TEST(HttpResponse, Base64HttpBodyWriter)
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600149{
Ed Tanous05c27352024-10-09 17:00:37 -0700150 Response res;
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600151 std::string data = "sample text";
Ed Tanous5575efb2024-01-30 09:25:03 -0800152 TemporaryFileHandle temporaryFile(data);
153 FILE* f = fopen(temporaryFile.stringPath.c_str(), "r+");
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600154 res.openFd(fileno(f), bmcweb::EncodingType::Base64);
Ed Tanous5575efb2024-01-30 09:25:03 -0800155 EXPECT_EQ(getData(res.response), "c2FtcGxlIHRleHQ=");
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600156}
157
Ed Tanousb2896142024-01-31 15:25:47 -0800158TEST(HttpResponse, Base64HttpBodyWriterLarge)
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600159{
Ed Tanous05c27352024-10-09 17:00:37 -0700160 Response res;
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600161 std::string data = generateBigdata();
Ed Tanous5575efb2024-01-30 09:25:03 -0800162 TemporaryFileHandle temporaryFile(data);
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600163
Ed Tanous5575efb2024-01-30 09:25:03 -0800164 boost::beast::file_posix file;
165 boost::system::error_code ec;
166 file.open(temporaryFile.stringPath.c_str(), boost::beast::file_mode::read,
167 ec);
168 EXPECT_EQ(ec.value(), 0);
169 res.openFd(file.native_handle(), bmcweb::EncodingType::Base64);
Ed Tanous05c27352024-10-09 17:00:37 -0700170 EXPECT_EQ(getData(res.response), utility::base64encode(data));
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600171}
172
Ed Tanousb2896142024-01-31 15:25:47 -0800173TEST(HttpResponse, HttpBodyWriterLarge)
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600174{
Ed Tanous05c27352024-10-09 17:00:37 -0700175 Response res;
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600176 std::string data = generateBigdata();
Ed Tanous5575efb2024-01-30 09:25:03 -0800177 TemporaryFileHandle temporaryFile(data);
178
179 boost::beast::file_posix file;
180 boost::system::error_code ec;
181 file.open(temporaryFile.stringPath.c_str(), boost::beast::file_mode::read,
182 ec);
183 EXPECT_EQ(ec.value(), 0);
184 res.openFd(file.native_handle());
185 EXPECT_EQ(getData(res.response), data);
Abhilash Rajub5f288d2023-11-08 22:32:44 -0600186}
Abhilash Raju8e3f7032023-07-17 08:53:11 -0500187} // namespace
Ed Tanous05c27352024-10-09 17:00:37 -0700188} // namespace crow