12 #include <framework/utilities/IOIntercept.h>
13 #include <framework/utilities/testhelpers/Fixtures.h>
14 #include <gtest/gtest.h>
20 using logconvert_params_t = std::tuple<LogConfig::ELogLevel, std::string, std::string, bool, bool>;
26 using IOInterceptDeathTest = IOInterceptTest;
29 class IOInterceptParamTest:
public IOInterceptTest,
public ::testing::WithParamInterface<logconvert_params_t> {};
32 TEST_P(IOInterceptParamTest, ConvertToLogMessage)
36 std::string raw_message, formatted_message;
37 bool useStdout, generateMessage;
38 std::tie(level, raw_message, formatted_message, useStdout, generateMessage) = GetParam();
42 (useStdout ? std::cout : std::cerr) << raw_message;
45 expectMessage(level, generateMessage ? 1 : 0,
true);
46 if (!generateMessage)
return;
48 expectMessageContent(level,
"Output from capture_name:\ncapture_name: " + formatted_message);
54 logconvert_params_t logconvert_params[] = {
81 INSTANTIATE_TEST_CASE_P(Params, IOInterceptParamTest, ::testing::ValuesIn(logconvert_params));
84 TEST_F(IOInterceptTest, LogMessagesNoFinish)
88 logmessages.setIndent(
"-");
90 std::cout <<
"this is my message";
95 expectMessageContent(
LogConfig::c_Info,
"Output from capture_name:\n-this is my message");
99 TEST_F(IOInterceptTest, InterceptGuard)
102 logmessages.setIndent(
"-");
105 std::cout <<
"this is my message";
107 std::cout <<
"this will not be captured" << std::endl;
111 std::cerr <<
"this is my error";
113 std::cerr <<
"this will not be captured" << std::endl;
114 ASSERT_EQ(m_messages.size(), 2);
116 expectMessageContent(
LogConfig::c_Error,
"Output from capture_name:\n-this is my error");
117 m_messages.pop_back();
118 expectMessageContent(
LogConfig::c_Info,
"Output from capture_name:\n-this is my message");
122 TEST_F(IOInterceptTest, ConvertCheckIndent)
126 std::cout <<
"this is\na multi line message";
129 expectMessageContent(
LogConfig::c_Info,
"Output from indent:\nindent: this is\nindent: a multi line message");
133 TEST_F(IOInterceptTest, ConvertSetIndent)
137 std::cout <<
"this is\na multi line message";
138 capture.setIndent(
"--->");
141 expectMessageContent(
LogConfig::c_Info,
"Output from indent:\n--->this is\n--->a multi line message");
145 TEST_F(IOInterceptTest, ConvertEmptyIndent)
149 capture.setIndent(
"");
150 std::cout <<
"this is\na multi line message";
153 expectMessageContent(
LogConfig::c_Info,
"Output from indent:\nthis is\na multi line message");
157 TEST_F(IOInterceptTest, CaptureStdOut)
160 ASSERT_FALSE(capture.
finish());
161 ASSERT_TRUE(capture.
start());
162 ASSERT_TRUE(capture.
start());
163 std::cout <<
"this is a test";
164 ASSERT_TRUE(capture.
finish());
165 ASSERT_EQ(capture.
getStdOut(),
"this is a test");
166 ASSERT_FALSE(capture.
finish());
167 ASSERT_EQ(capture.
getStdOut(),
"this is a test");
170 ASSERT_TRUE(capture.
start());
171 write(fileno(stdout),
"this is a test", 14);
172 ASSERT_TRUE(capture.
finish());
173 ASSERT_EQ(capture.
getStdOut(),
"this is a test");
177 TEST_F(IOInterceptTest, CaptureStdErr)
180 ASSERT_FALSE(capture.
finish());
181 ASSERT_TRUE(capture.
start());
182 ASSERT_TRUE(capture.
start());
183 std::cerr <<
"this is a test";
184 ASSERT_TRUE(capture.
finish());
185 ASSERT_EQ(capture.
getStdErr(),
"this is a test");
186 ASSERT_FALSE(capture.
finish());
187 ASSERT_EQ(capture.
getStdErr(),
"this is a test");
190 ASSERT_TRUE(capture.
start());
191 write(fileno(stderr),
"this is a test", 14);
192 ASSERT_TRUE(capture.
finish());
193 ASSERT_EQ(capture.
getStdErr(),
"this is a test");
197 TEST_F(IOInterceptTest, CaptureLargeOutput)
200 ASSERT_TRUE(capture.
start());
203 for (
int i = 0; i < 100000; ++i) {
204 std::cout << (char)(i % 255) << std::flush;
205 if (std::cout.good()) written = i + 1;
206 out.push_back(i % 255);
208 ASSERT_TRUE(capture.
finish());
209 const std::string& captured = capture.
getStdOut();
213 ASSERT_TRUE(captured.size() <= out.size());
214 ASSERT_EQ(captured.size(), written);
215 if (captured.size() < out.size()) {
216 std::cout <<
"Output truncated after " << captured.size() <<
" bytes" << std::endl;
218 ASSERT_EQ(captured, out.substr(0, captured.size()));
220 ASSERT_TRUE(capture.
start());
221 std::cout <<
"once more";
222 ASSERT_TRUE(capture.
finish());
223 ASSERT_EQ(capture.
getStdOut(),
"once more");
226 ASSERT_TRUE(capture.
start());
228 ASSERT_TRUE(capture.
finish());
229 ASSERT_EQ(capture.
getStdOut(),
"once more");
235 void generateStdErr()
238 std::cerr <<
"start->";
240 std::cerr <<
"this should not show up" << std::endl << std::flush;
241 write(fileno(stderr),
"nor this\n", 9);
243 std::cerr <<
"<-end";
248 TEST_F(IOInterceptDeathTest, DiscardStdOut)
251 ASSERT_FALSE(discard.
finish());
252 ASSERT_TRUE(discard.
start());
253 ASSERT_TRUE(discard.
start());
254 ASSERT_TRUE(discard.
finish());
255 ASSERT_FALSE(discard.
finish());
258 EXPECT_EXIT(generateStdErr(), ::testing::ExitedWithCode(0),
"^start-><-end$");
266 std::cerr <<
"start->";
268 std::cerr <<
"now we abort" << std::endl;
273 TEST_F(IOInterceptDeathTest, HandleAbort)
275 EXPECT_EXIT(generateAbort(), ::testing::ExitedWithCode(1),
"^start->now we abort\nabort\\(\\) called, exiting\n$");