blob: 7d171a8d88a50a4fc7fdae27cad3b0e66d473e4d [file] [log] [blame]
//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#define BOOST_TEST_MODULE UnitTests
#include <boost/test/unit_test.hpp>
#include "UnitTests.hpp"
#include <armnn/Logging.hpp>
#include <boost/algorithm/string.hpp>
struct ConfigureLoggingFixture
{
ConfigureLoggingFixture()
{
ConfigureLoggingTest();
}
};
BOOST_GLOBAL_FIXTURE(ConfigureLoggingFixture);
// On Windows, duplicate the boost test logging output to the Visual Studio output window using OutputDebugString.
#if defined(_MSC_VER)
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/tee.hpp>
#include <iostream>
#include <Windows.h>
using namespace boost::iostreams;
using namespace std;
struct DebugOutputSink : boost::iostreams::sink
{
std::streamsize write(const char* s, std::streamsize n)
{
// The given string is not null-terminated, so we need to copy it.
std::string s2(s, boost::numeric_cast<size_t>(n));
OutputDebugString(s2.c_str());
return n;
}
};
class SetupDebugOutput
{
public:
SetupDebugOutput()
{
// Sends the output to both cout (as standard) and the debug output.
m_OutputStream.push(tee(std::cout));
m_OutputStream.push(m_DebugOutputSink);
boost::unit_test::unit_test_log.set_stream(m_OutputStream);
}
private:
filtering_ostream m_OutputStream;
DebugOutputSink m_DebugOutputSink;
};
BOOST_GLOBAL_FIXTURE(SetupDebugOutput);
#endif // defined(_MSC_VER)
BOOST_AUTO_TEST_SUITE(LoggerSuite)
BOOST_AUTO_TEST_CASE(LoggerTest)
{
std::stringstream ss;
{
struct StreamRedirector
{
public:
StreamRedirector(std::ostream& stream, std::streambuf* newStreamBuffer)
: m_Stream(stream)
, m_BackupBuffer(m_Stream.rdbuf(newStreamBuffer))
{}
~StreamRedirector() { m_Stream.rdbuf(m_BackupBuffer); }
private:
std::ostream& m_Stream;
std::streambuf* m_BackupBuffer;
};
StreamRedirector redirect(std::cout, ss.rdbuf());
using namespace armnn;
SetLogFilter(LogSeverity::Trace);
SetAllLoggingSinks(true, false, false);
ARMNN_LOG(trace) << "My trace message; " << -2;
ARMNN_LOG(debug) << "My debug message; " << -1;
ARMNN_LOG(info) << "My info message; " << 0;
ARMNN_LOG(warning) << "My warning message; " << 1;
ARMNN_LOG(error) << "My error message; " << 2;
ARMNN_LOG(fatal) << "My fatal message; " << 3;
SetLogFilter(LogSeverity::Fatal);
}
BOOST_CHECK(boost::contains(ss.str(), "Trace: My trace message; -2"));
BOOST_CHECK(boost::contains(ss.str(), "Debug: My debug message; -1"));
BOOST_CHECK(boost::contains(ss.str(), "Info: My info message; 0"));
BOOST_CHECK(boost::contains(ss.str(), "Warning: My warning message; 1"));
BOOST_CHECK(boost::contains(ss.str(), "Error: My error message; 2"));
BOOST_CHECK(boost::contains(ss.str(), "Fatal: My fatal message; 3"));
}
BOOST_AUTO_TEST_SUITE_END()