xref: /openbmc/bmcweb/test/http/http_body_test.cpp (revision daadfb2e)
1 #include "file_test_utilities.hpp"
2 #include "http_body.hpp"
3 
4 #include <boost/beast/core/file_base.hpp>
5 #include <boost/system/error_code.hpp>
6 
7 #include <array>
8 #include <cstddef>
9 #include <cstdio>
10 #include <span>
11 #include <string>
12 #include <utility>
13 
14 #include <gmock/gmock.h>
15 #include <gtest/gtest.h>
16 
17 using ::testing::ElementsAre;
18 
19 namespace bmcweb
20 {
21 namespace
22 {
23 
TEST(HttpHttpBodyValueType,MoveString)24 TEST(HttpHttpBodyValueType, MoveString)
25 {
26     HttpBody::value_type value("teststring");
27     // Move constructor
28     HttpBody::value_type value2(std::move(value));
29     EXPECT_EQ(value2.encodingType, EncodingType::Raw);
30     EXPECT_EQ(value2.str(), "teststring");
31     EXPECT_EQ(value2.payloadSize(), 10);
32 }
33 
TEST(HttpHttpBodyValueType,MoveOperatorString)34 TEST(HttpHttpBodyValueType, MoveOperatorString)
35 {
36     HttpBody::value_type value;
37     value.str() = "teststring";
38     // Move constructor
39     HttpBody::value_type value2 = std::move(value);
40     EXPECT_EQ(value2.encodingType, EncodingType::Raw);
41     EXPECT_EQ(value2.str(), "teststring");
42     EXPECT_EQ(value2.payloadSize(), 10);
43 }
44 
TEST(HttpHttpBodyValueType,copysignl)45 TEST(HttpHttpBodyValueType, copysignl)
46 {
47     HttpBody::value_type value;
48     value.str() = "teststring";
49     // Move constructor
50     HttpBody::value_type value2(value);
51     EXPECT_EQ(value2.encodingType, EncodingType::Raw);
52     EXPECT_EQ(value2.str(), "teststring");
53     EXPECT_EQ(value2.payloadSize(), 10);
54 }
55 
TEST(HttpHttpBodyValueType,CopyOperatorString)56 TEST(HttpHttpBodyValueType, CopyOperatorString)
57 {
58     HttpBody::value_type value;
59     value.str() = "teststring";
60     // Move constructor
61     HttpBody::value_type value2 = value;
62     EXPECT_EQ(value2.encodingType, EncodingType::Raw);
63     EXPECT_EQ(value2.str(), "teststring");
64     EXPECT_EQ(value2.payloadSize(), 10);
65 }
66 
TEST(HttpHttpBodyValueType,MoveFile)67 TEST(HttpHttpBodyValueType, MoveFile)
68 {
69     HttpBody::value_type value(EncodingType::Base64);
70     TemporaryFileHandle temporaryFile("teststring");
71     boost::system::error_code ec;
72     value.open(temporaryFile.stringPath.c_str(), boost::beast::file_mode::read,
73                ec);
74     ASSERT_FALSE(ec);
75     // Move constructor
76     HttpBody::value_type value2(std::move(value));
77     std::array<char, 11> buffer{};
78     size_t out = value2.file().read(buffer.data(), buffer.size(), ec);
79     ASSERT_FALSE(ec);
80     EXPECT_EQ(value2.encodingType, EncodingType::Base64);
81 
82     EXPECT_THAT(std::span(buffer.data(), out),
83                 ElementsAre('t', 'e', 's', 't', 's', 't', 'r', 'i', 'n', 'g'));
84 
85     EXPECT_THAT(buffer, ElementsAre('t', 'e', 's', 't', 's', 't', 'r', 'i', 'n',
86                                     'g', '\0'));
87 
88     EXPECT_EQ(value2.payloadSize(), 16);
89 }
90 
TEST(HttpHttpBodyValueType,MoveOperatorFile)91 TEST(HttpHttpBodyValueType, MoveOperatorFile)
92 {
93     HttpBody::value_type value(EncodingType::Base64);
94     TemporaryFileHandle temporaryFile("teststring");
95     boost::system::error_code ec;
96     value.open(temporaryFile.stringPath.c_str(), boost::beast::file_mode::read,
97                ec);
98     ASSERT_FALSE(ec);
99     // Move constructor
100     HttpBody::value_type value2 = std::move(value);
101     std::array<char, 11> buffer{};
102     size_t out = value2.file().read(buffer.data(), buffer.size(), ec);
103     ASSERT_FALSE(ec);
104     EXPECT_EQ(value2.encodingType, EncodingType::Base64);
105 
106     EXPECT_THAT(std::span(buffer.data(), out),
107                 ElementsAre('t', 'e', 's', 't', 's', 't', 'r', 'i', 'n', 'g'));
108     EXPECT_THAT(buffer, ElementsAre('t', 'e', 's', 't', 's', 't', 'r', 'i', 'n',
109                                     'g', '\0'));
110 
111     EXPECT_EQ(value2.payloadSize(), 16);
112 }
113 
TEST(HttpFileBodyValueType,SetFd)114 TEST(HttpFileBodyValueType, SetFd)
115 {
116     HttpBody::value_type value(EncodingType::Base64);
117     TemporaryFileHandle temporaryFile("teststring");
118     boost::system::error_code ec;
119     FILE* r = fopen(temporaryFile.stringPath.c_str(), "r");
120     ASSERT_NE(r, nullptr);
121     value.setFd(fileno(r), ec);
122     ASSERT_FALSE(ec);
123 
124     std::array<char, 4096> buffer{};
125 
126     size_t out = value.file().read(buffer.data(), buffer.size(), ec);
127     ASSERT_FALSE(ec);
128 
129     EXPECT_THAT(std::span(buffer.data(), out),
130                 ElementsAre('t', 'e', 's', 't', 's', 't', 'r', 'i', 'n', 'g'));
131     EXPECT_EQ(value.payloadSize(), 16);
132 }
133 
134 } // namespace
135 } // namespace bmcweb
136