mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Ensure that null C strings do not break logging (#15255)
This commit is contained in:
parent
4e6e8b7bf1
commit
2188adc0f9
6 changed files with 225 additions and 73 deletions
90
src/unittest/test_logging.cpp
Normal file
90
src/unittest/test_logging.cpp
Normal file
|
@ -0,0 +1,90 @@
|
|||
// SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
|
||||
#include "test.h"
|
||||
#include "log_internal.h"
|
||||
|
||||
using std::ostream;
|
||||
|
||||
class TestLogging : public TestBase
|
||||
{
|
||||
public:
|
||||
TestLogging() { TestManager::registerTestModule(this); }
|
||||
const char *getName() { return "TestLogging"; }
|
||||
|
||||
void runTests(IGameDef *gamedef);
|
||||
|
||||
void testNullChecks();
|
||||
void testBitCheck();
|
||||
};
|
||||
|
||||
static TestLogging g_test_instance;
|
||||
|
||||
void TestLogging::runTests(IGameDef *gamedef)
|
||||
{
|
||||
TEST(testNullChecks);
|
||||
TEST(testBitCheck);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void TestLogging::testNullChecks()
|
||||
{
|
||||
CaptureLogOutput capture(g_logger);
|
||||
|
||||
infostream << "Test char*: " << (char*)0 << std::endl;
|
||||
infostream << "Test signed char*: " << (signed char*)0 << std::endl;
|
||||
infostream << "Test unsigned char*: " << (unsigned char*)0 << std::endl;
|
||||
|
||||
infostream << "Test const char*: " << (const char*)0 << std::endl;
|
||||
infostream << "Test const signed char*: " << (const signed char*)0 << std::endl;
|
||||
infostream << "Test const unsigned char*: " << (const unsigned char*)0 << std::endl;
|
||||
|
||||
|
||||
auto logs = capture.take();
|
||||
UASSERTEQ(size_t, logs.size(), 6);
|
||||
UASSERTEQ(std::string, logs[0].text, "Test char*: (null)");
|
||||
UASSERTEQ(std::string, logs[1].text, "Test signed char*: (null)");
|
||||
UASSERTEQ(std::string, logs[2].text, "Test unsigned char*: (null)");
|
||||
UASSERTEQ(std::string, logs[3].text, "Test const char*: (null)");
|
||||
UASSERTEQ(std::string, logs[4].text, "Test const signed char*: (null)");
|
||||
UASSERTEQ(std::string, logs[5].text, "Test const unsigned char*: (null)");
|
||||
}
|
||||
|
||||
namespace {
|
||||
class ForceEofBit {};
|
||||
class ForceFailBit {};
|
||||
class ForceBadBit {};
|
||||
|
||||
ostream& operator<<(ostream& os, ForceEofBit)
|
||||
{
|
||||
os.setstate(std::ios::eofbit);
|
||||
return os;
|
||||
}
|
||||
|
||||
ostream& operator<<(ostream& os, ForceFailBit)
|
||||
{
|
||||
os.setstate(std::ios::failbit);
|
||||
return os;
|
||||
}
|
||||
|
||||
ostream& operator<<(ostream& os, ForceBadBit)
|
||||
{
|
||||
os.setstate(std::ios::badbit);
|
||||
return os;
|
||||
}
|
||||
}
|
||||
|
||||
void TestLogging::testBitCheck()
|
||||
{
|
||||
CaptureLogOutput capture(g_logger);
|
||||
|
||||
infostream << "EOF is " << ForceEofBit{} << std::endl;
|
||||
infostream << "Fail is " << ForceFailBit{} << std::endl;
|
||||
infostream << "Bad is " << ForceBadBit{} << std::endl;
|
||||
|
||||
auto logs = capture.take();
|
||||
UASSERTEQ(size_t, logs.size(), 3);
|
||||
UASSERTEQ(std::string, logs[0].text, "EOF is (ostream:eofbit)");
|
||||
UASSERTEQ(std::string, logs[1].text, "Fail is (ostream:failbit)");
|
||||
UASSERTEQ(std::string, logs[2].text, "Bad is (ostream:badbit)");
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue