From 7a6f003180968fc578af8eee88b453a906efeed7 Mon Sep 17 00:00:00 2001 From: Ed Tanous Date: Sun, 28 Jan 2024 09:49:03 -0800 Subject: Add unit tests for file body File body needs some unit tests for managing the move constructors. Tested: Unit tests pass. Change-Id: Ia640aec75a6f3f85640a50f5dd492638871f9eca Signed-off-by: Ed Tanous --- test/http/file_test_utilities.hpp | 19 ++++++ test/http/http_file_body_test.cpp | 128 ++++++++++++++++++++++++++++++++++++++ test/http/http_response_test.cpp | 42 ++++++------- 3 files changed, 166 insertions(+), 23 deletions(-) create mode 100644 test/http/file_test_utilities.hpp create mode 100644 test/http/http_file_body_test.cpp (limited to 'test') diff --git a/test/http/file_test_utilities.hpp b/test/http/file_test_utilities.hpp new file mode 100644 index 0000000000..073a0747a4 --- /dev/null +++ b/test/http/file_test_utilities.hpp @@ -0,0 +1,19 @@ +#pragma once +#include +#include +#include + +#include + +inline std::string makeFile(std::string_view sampleData) +{ + std::filesystem::path path = std::filesystem::temp_directory_path(); + path /= "bmcweb_http_response_test_XXXXXXXXXXX"; + std::string stringPath = path.string(); + int fd = mkstemp(stringPath.data()); + EXPECT_GT(fd, 0); + EXPECT_EQ(write(fd, sampleData.data(), sampleData.size()), + sampleData.size()); + close(fd); + return stringPath; +} diff --git a/test/http/http_file_body_test.cpp b/test/http/http_file_body_test.cpp new file mode 100644 index 0000000000..4eaa93bac2 --- /dev/null +++ b/test/http/http_file_body_test.cpp @@ -0,0 +1,128 @@ +#include "file_test_utilities.hpp" +#include "http_file_body.hpp" + +#include + +#include +#include +#include + +#include +#include + +using ::testing::ElementsAre; + +namespace bmcweb +{ +namespace +{ + +TEST(HttpFileBodyValueType, MoveString) +{ + FileBody::value_type value("teststring"); + // Move constructor + FileBody::value_type value2(std::move(value)); + EXPECT_EQ(value2.encodingType, EncodingType::Raw); + EXPECT_EQ(value2.str(), "teststring"); + EXPECT_EQ(value2.payloadSize(), 10); +} + +TEST(HttpFileBodyValueType, MoveOperatorString) +{ + FileBody::value_type value; + value.str() = "teststring"; + // Move constructor + FileBody::value_type value2 = std::move(value); + EXPECT_EQ(value2.encodingType, EncodingType::Raw); + EXPECT_EQ(value2.str(), "teststring"); + EXPECT_EQ(value2.payloadSize(), 10); +} + +TEST(HttpFileBodyValueType, copysignl) +{ + FileBody::value_type value; + value.str() = "teststring"; + // Move constructor + FileBody::value_type value2(value); + EXPECT_EQ(value2.encodingType, EncodingType::Raw); + EXPECT_EQ(value2.str(), "teststring"); + EXPECT_EQ(value2.payloadSize(), 10); +} + +TEST(HttpFileBodyValueType, CopyOperatorString) +{ + FileBody::value_type value; + value.str() = "teststring"; + // Move constructor + FileBody::value_type value2 = value; + EXPECT_EQ(value2.encodingType, EncodingType::Raw); + EXPECT_EQ(value2.str(), "teststring"); + EXPECT_EQ(value2.payloadSize(), 10); +} + +TEST(HttpFileBodyValueType, MoveFile) +{ + FileBody::value_type value(EncodingType::Base64); + std::string filepath = makeFile("teststring"); + boost::system::error_code ec; + value.open(filepath.c_str(), boost::beast::file_mode::read, ec); + ASSERT_FALSE(ec); + // Move constructor + FileBody::value_type value2(std::move(value)); + std::array buffer{}; + size_t out = value2.file().read(buffer.data(), buffer.size(), ec); + ASSERT_FALSE(ec); + EXPECT_EQ(value2.encodingType, EncodingType::Base64); + + EXPECT_THAT(std::span(buffer.data(), out), + ElementsAre('t', 'e', 's', 't', 's', 't', 'r', 'i', 'n', 'g')); + + EXPECT_THAT(buffer, ElementsAre('t', 'e', 's', 't', 's', 't', 'r', 'i', 'n', + 'g', '\0')); + + EXPECT_EQ(value2.payloadSize(), 16); +} + +TEST(HttpFileBodyValueType, MoveOperatorFile) +{ + FileBody::value_type value(EncodingType::Base64); + std::string filepath = makeFile("teststring"); + boost::system::error_code ec; + value.open(filepath.c_str(), boost::beast::file_mode::read, ec); + ASSERT_FALSE(ec); + // Move constructor + FileBody::value_type value2 = std::move(value); + std::array buffer{}; + size_t out = value2.file().read(buffer.data(), buffer.size(), ec); + ASSERT_FALSE(ec); + EXPECT_EQ(value2.encodingType, EncodingType::Base64); + + EXPECT_THAT(std::span(buffer.data(), out), + ElementsAre('t', 'e', 's', 't', 's', 't', 'r', 'i', 'n', 'g')); + EXPECT_THAT(buffer, ElementsAre('t', 'e', 's', 't', 's', 't', 'r', 'i', 'n', + 'g', '\0')); + + EXPECT_EQ(value2.payloadSize(), 16); +} + +TEST(HttpFileBodyValueType, SetFd) +{ + FileBody::value_type value(EncodingType::Base64); + std::string filepath = makeFile("teststring"); + + boost::system::error_code ec; + value.setFd(fileno(fopen(filepath.c_str(), "r")), ec); + ASSERT_FALSE(ec); + + std::array buffer{}; + + size_t out = value.file().read(buffer.data(), buffer.size(), ec); + ASSERT_FALSE(ec); + + EXPECT_THAT(std::span(buffer.data(), out), + ElementsAre('t', 'e', 's', 't', 's', 't', 'r', 'i', 'n', 'g')); + EXPECT_EQ(value.payloadSize(), 16); +} + +} // namespace +} // namespace bmcweb diff --git a/test/http/http_response_test.cpp b/test/http/http_response_test.cpp index f61d6dea9d..c5bfbdca99 100644 --- a/test/http/http_response_test.cpp +++ b/test/http/http_response_test.cpp @@ -1,6 +1,7 @@ #include "boost/beast/core/buffers_to_string.hpp" #include "boost/beast/core/flat_buffer.hpp" #include "boost/beast/http/serializer.hpp" +#include "file_test_utilities.hpp" #include "http/http_response.hpp" #include @@ -23,19 +24,6 @@ void verifyHeaders(crow::Response& res) EXPECT_EQ(res.result(), boost::beast::http::status::ok); } -std::string makeFile(std::string_view sampleData) -{ - std::filesystem::path path = std::filesystem::temp_directory_path(); - path /= "bmcweb_http_response_test_XXXXXXXXXXX"; - std::string stringPath = path.string(); - int fd = mkstemp(stringPath.data()); - EXPECT_GT(fd, 0); - EXPECT_EQ(write(fd, sampleData.data(), sampleData.size()), - sampleData.size()); - close(fd); - return stringPath; -} - std::string getData(boost::beast::http::response& m) { std::string ret; @@ -139,6 +127,24 @@ void testFileData(crow::Response& res, const std::string& data) EXPECT_EQ(getData(fb), data); } +std::string generateBigdata() +{ + std::string result; + while (result.size() < 10000) + { + result += "sample text"; + } + return result; +} + +TEST(HttpResponse, StringBodyWriterLarge) +{ + crow::Response res; + std::string data = generateBigdata(); + res.write(std::string(data)); + testFileData(res, data); +} + TEST(HttpResponse, Base64FileBodyWriter) { crow::Response res; @@ -151,16 +157,6 @@ TEST(HttpResponse, Base64FileBodyWriter) std::filesystem::remove(path); } -std::string generateBigdata() -{ - std::string result; - while (result.size() < 10000) - { - result += "sample text"; - } - return result; -} - TEST(HttpResponse, Base64FileBodyWriterLarge) { crow::Response res; -- cgit v1.2.3