/*
 * Copyright (c) 2021 Daniel R. Carvalho
 * All rights reserved
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include <gtest/gtest.h>

#include <sstream>
#include <string>

#include "base/gtest/cur_tick_fake.hh"
#include "base/gtest/logging.hh"
#include "base/named.hh"
#include "base/trace.hh"

// In test SetGetLogger this logger will be assigned to be the one returned
// by Tracer::getDebugLogger(). All tests before that test should assume
// that getDebugLogger() returns a cerr-based logger, and all tests after
// that test should assume that this logger is returned
std::stringstream ss;
Trace::OstreamLogger main_logger(ss);

// Instantiate the mock class to have a valid curTick of 0
GTestTickHandler tickHandler;

namespace Debug {
/** Debug flag used for the tests in this file. */
SimpleFlag TraceTestDebugFlag("TraceTestDebugFlag",
    "Exclusive debug flag for the trace tests");
}

/** @return The ostream as a std::string. */
std::string
getString(std::ostream &os)
{
    auto buf = os.rdbuf();
    std::ostringstream oss;
    oss << buf;
    return oss.str();
}

/** @return The logger's ostream as a std::string. */
std::string
getString(Trace::Logger *logger)
{
    return getString(logger->getOstream());
}

/** Test creating a simple log message. */
TEST(TraceTest, LogSimpleMessage)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    logger.logMessage(Tick(100), "", "", "Test message");
    ASSERT_EQ(getString(&logger), "    100: Test message");
}

/** Test creating a simple log message with a name. */
TEST(TraceTest, LogMessageName)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    logger.logMessage(Tick(100), "Foo", "", "Test message");
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message");
}

/** Test that when the tick is set to MaxTick it is not printed. */
TEST(TraceTest, LogMessageMaxTick)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    logger.logMessage(MaxTick, "Foo", "", "Test message");
    ASSERT_EQ(getString(&logger), "Foo: Test message");
}

/** Test that by default the flag is not printed. */
TEST(TraceTest, LogMessageFlagDisabled)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    logger.logMessage(Tick(100), "Foo", "Bar", "Test message");
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message");
}

/**
 * Test creating a simple log message without tick information and that
 * enabling and disabling format flags work.
 */
TEST(TraceTest, LogMessageTickDisabledAndEnableDisable)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    logger.logMessage(Tick(100), "Foo", "", "Test message");
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message");

    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("FmtTicksOff", true));

    logger.logMessage(Tick(200), "Foo", "", "Test message");
#if TRACING_ON
    ASSERT_EQ(getString(&logger), "Foo: Test message");
#else
    ASSERT_EQ(getString(&logger), "    200: Foo: Test message");
#endif

    Debug::changeFlag("FmtTicksOff", false);
    Trace::disable();

    logger.logMessage(Tick(300), "Foo", "", "Test message");
    ASSERT_EQ(getString(&logger), "    300: Foo: Test message");
}

/**
 * Test creating a full log message to verify expected order of appearance.
 * This does not include the backtrace.
 */
TEST(TraceTest, LogMessageFlagEnabled)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);
    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("FmtFlag", true));

    logger.logMessage(Tick(100), "Foo", "Bar", "Test message");
#if TRACING_ON
    ASSERT_EQ(getString(&logger), "    100: Bar: Foo: Test message");
#else
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message");
#endif

    Debug::changeFlag("FmtFlag", false);
    Trace::disable();
}

/** Test that log messages are not displayed for ignored objects (single). */
TEST(TraceTest, LogMessageIgnoreOne)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    ObjectMatch ignore_foo("Foo");
    ObjectMatch ignore_bar("Bar");

    // Ignore foo
    logger.setIgnore(ignore_foo);
    logger.logMessage(Tick(100), "Foo", "", "Test message");
    ASSERT_EQ(getString(&logger), "");
    logger.logMessage(Tick(100), "Bar", "", "Test message");
    ASSERT_EQ(getString(&logger), "    100: Bar: Test message");

    // Make sure that when setting a new ignore the old ignores are not kept
    logger.setIgnore(ignore_bar);
    logger.logMessage(Tick(100), "Foo", "", "Test message");
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message");
    logger.logMessage(Tick(100), "Bar", "", "Test message");
    ASSERT_EQ(getString(&logger), "");
}

/** Test that log messages are not displayed for ignored objects (multiple). */
TEST(TraceTest, LogMessageIgnoreMultiple)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    ObjectMatch ignore_foo("Foo");
    ObjectMatch ignore_bar("Bar");
    ObjectMatch ignore_thy("Thy");

    // Ignore foo and bar
    logger.setIgnore(ignore_foo);
    logger.addIgnore(ignore_bar);
    logger.logMessage(Tick(100), "Foo", "", "Test message");
    ASSERT_EQ(getString(&logger), "");
    logger.logMessage(Tick(100), "Bar", "", "Test message");
    ASSERT_EQ(getString(&logger), "");
    logger.logMessage(Tick(100), "Thy", "", "Test message");
    ASSERT_EQ(getString(&logger), "    100: Thy: Test message");

    // Make sure that when setting a new ignore, the old sub-ignores
    // are not kept
    logger.setIgnore(ignore_thy);
    logger.logMessage(Tick(100), "Foo", "", "Test message");
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message");
    logger.logMessage(Tick(100), "Bar", "", "Test message");
    ASSERT_EQ(getString(&logger), "    100: Bar: Test message");
    logger.logMessage(Tick(100), "Thy", "", "Test message");
    ASSERT_EQ(getString(&logger), "");
}

/** Test that dumping for an ignored name does not log anything. */
TEST(TraceTest, DumpIgnored)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    ObjectMatch ignore_foo("Foo");
    logger.setIgnore(ignore_foo);
    std::string message = "Test message";
    logger.dump(Tick(100), "Foo", message.c_str(), message.size(), "");
    ASSERT_EQ(getString(&logger), "");
}

/**
 * Test that a regular dump will change the message so that it contains both
 * the hex and char representation of every byte. There is a space between
 * every 8 bytes. For each 16-byte line of a message the order of appearance is
 *   <byte number> <2 spaces> <8 spaced bytes> <1 space> <8 spaced bytes>
 *   <3-spaces missing to fill 16 bytes> <1 space> <16 bytes as chars> <\n>
 */
TEST(TraceTest, DumpSimple)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("FmtFlag", true));
    std::string message = "Test message";
    logger.dump(Tick(100), "Foo", message.c_str(), message.size(), "Bar");
#if TRACING_ON
    ASSERT_EQ(getString(&logger),
        // logMessage prefix
        "    100: Bar: Foo: "
        // Byte number + 2 spaces
        "00000000  "
        // 8 bytes + 1 space + 4 bytes + ((16 - 12) * 3) spaces
        "54 65 73 74 20 6d 65 73  73 61 67 65              "
        // 1 space + 12 chars + \n
        " Test message\n");
#else
    ASSERT_EQ(getString(&logger),
        // logMessage prefix
        "    100: Foo: "
        // Byte number + 2 spaces
        "00000000  "
        // 8 bytes + 1 space + 4 bytes + ((16 - 12) * 3) spaces
        "54 65 73 74 20 6d 65 73  73 61 67 65              "
        // 1 space + 12 chars + \n
        " Test message\n");
#endif
    Debug::changeFlag("FmtFlag", false);
    Trace::disable();
}

/**
 * Test that a regular dump will change the message so that it contains both
 * the hex and char representation of every byte, for a multi-line message.
 */
TEST(TraceTest, DumpMultiLine)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    std::string message =
        "This is a very long line that will span over multiple lines";
    logger.dump(Tick(100), "Foo", message.c_str(), message.size(), "");
    ASSERT_EQ(getString(&logger),
        "    100: Foo: 00000000  "
        "54 68 69 73 20 69 73 20  61 20 76 65 72 79 20 6c   This is a very l\n"
        "    100: Foo: 00000010  "
        "6f 6e 67 20 6c 69 6e 65  20 74 68 61 74 20 77 69   ong line that wi\n"
        "    100: Foo: 00000020  "
        "6c 6c 20 73 70 61 6e 20  6f 76 65 72 20 6d 75 6c   ll span over mul\n"
        "    100: Foo: 00000030  "
        "74 69 70 6c 65 20 6c 69  6e 65 73                  tiple lines\n");
}

/**
 * Test that when no logger exists a logger is created redirecting to cerr.
 * This is the only test that uses cerr. All other test will use main_logger.
 */
TEST(TraceTest, DISABLED_GetNullLogger)
{
    Trace::Logger *logger = Trace::getDebugLogger();
    ASSERT_FALSE(logger == nullptr);

    gtestLogOutput.str("");
    logger->logMessage(Tick(100), "Foo", "", "Test message");
    ASSERT_EQ(gtestLogOutput.str(), "    100: Foo: Test message");
}

/** Test that the logger is set properly. */
TEST(TraceTest, SetGetLogger)
{
    // NOTE: From now on getDebugLogger will use main_logger to avoid
    // having to check cerr. This assumes that tests are run in the order
    // they appear from line 1 to the last line of this file.
    Trace::setDebugLogger(&main_logger);

    // Set message with local variable, and retrieve the string with
    // the debug-logger getter
    main_logger.logMessage(Tick(100), "Foo", "", "Test message");
    auto logger_from_getter = Trace::getDebugLogger();
    ASSERT_EQ(getString(logger_from_getter), "    100: Foo: Test message");
}

/** Test that output() gets the ostream of the current debug logger. */
TEST(TraceTest, Output)
{
    Trace::getDebugLogger()->logMessage(Tick(100), "Foo", "", "Test message");
    ASSERT_EQ(getString(Trace::output()), "    100: Foo: Test message");
}

/** Test dprintf_flag with ignored name. */
TEST(TraceTest, DprintfFlagIgnore)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    ObjectMatch ignore_foo("Foo");
    logger.setIgnore(ignore_foo);
    logger.dprintf_flag(Tick(100), "Foo", "", "Test message");
    ASSERT_EQ(getString(&logger), "");
}

/** Test dprintf_flag with zero args. */
TEST(TraceTest, DprintfFlagZeroArgs)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    logger.dprintf_flag(Tick(100), "Foo", "", "Test message");
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message");
}

/** Test dprintf_flag with one arg. */
TEST(TraceTest, DprintfFlagOneArg)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    logger.dprintf_flag(Tick(100), "Foo", "", "Test %s", "message");
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message");
}

/** Test dprintf_flag with multiple args. */
TEST(TraceTest, DprintfFlagMultipleArgs)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    logger.dprintf_flag(Tick(100), "Foo", "", "Test %s %c %d %x",
        "message", 'A', 217, 0x30);
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message A 217 30");
}

/** Test dprintf_flag with flag. */
TEST(TraceTest, DprintfFlagEnabled)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("FmtFlag", true));
    logger.dprintf_flag(Tick(100), "Foo", "Bar", "Test %s", "message");
#if TRACING_ON
    ASSERT_EQ(getString(&logger), "    100: Bar: Foo: Test message");
#else
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message");
#endif
    Debug::changeFlag("FmtFlag", false);
    Trace::disable();
}

/** Test dprintf with ignored name. */
TEST(TraceTest, DprintfIgnore)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    ObjectMatch ignore_foo("Foo");
    logger.setIgnore(ignore_foo);
    logger.dprintf(Tick(100), "Foo", "Test message");
    ASSERT_EQ(getString(&logger), "");
}

/** Test that dprintf does not have a flag. */
TEST(TraceTest, DprintfEnabled)
{
    std::stringstream ss;
    Trace::OstreamLogger logger(ss);

    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("FmtFlag", true));
    logger.dprintf(Tick(100), "Foo", "Test %s", "message");
    ASSERT_EQ(getString(&logger), "    100: Foo: Test message");
    Debug::changeFlag("FmtFlag", false);
    Trace::disable();
}

/** Test that dprintf is just a flagless wrapper for dprintf_flag. */
TEST(TraceTest, DprintfWrapper)
{
    std::stringstream ss, ss_flag;
    Trace::OstreamLogger logger(ss);
    Trace::OstreamLogger logger_flag(ss_flag);

    logger.dprintf(Tick(100), "Foo", "Test %s %c %d %x",
        "message", 'A', 217, 0x30);
    logger_flag.dprintf_flag(Tick(100), "Foo", "", "Test %s %c %d %x",
        "message", 'A', 217, 0x30);
    ASSERT_EQ(getString(&logger), getString(&logger_flag));
}

/** Test DDUMP with tracing on. */
TEST(TraceTest, MacroDDUMP)
{
    StringWrap name("Foo");
    std::string message = "Test message";

    // Flag enabled
    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", true));
    EXPECT_TRUE(Debug::changeFlag("FmtFlag", true));
    DDUMP(TraceTestDebugFlag, message.c_str(), message.size());
#if TRACING_ON
    ASSERT_EQ(getString(Trace::output()),
        "      0: TraceTestDebugFlag: Foo: 00000000  "
        "54 65 73 74 20 6d 65 73  73 61 67 65               Test message\n");
#else
    ASSERT_EQ(getString(Trace::output()), "");
#endif

    // Flag disabled
    Trace::disable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", false));
    DDUMP(TraceTestDebugFlag, message.c_str(), message.size());
    ASSERT_EQ(getString(Trace::output()), "");
}

/** Test DPRINTF with tracing on. */
TEST(TraceTest, MacroDPRINTF)
{
    StringWrap name("Foo");

    // Flag enabled
    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", true));
    EXPECT_TRUE(Debug::changeFlag("FmtFlag", true));
    DPRINTF(TraceTestDebugFlag, "Test message");
#if TRACING_ON
    ASSERT_EQ(getString(Trace::output()),
        "      0: TraceTestDebugFlag: Foo: Test message");
#else
    ASSERT_EQ(getString(Trace::output()), "");
#endif

    // Flag disabled
    Trace::disable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", false));
    DPRINTF(TraceTestDebugFlag, "Test message");
    ASSERT_EQ(getString(Trace::output()), "");
}

/** Test DPRINTFS with tracing on. */
TEST(TraceTest, MacroDPRINTFS)
{
    Named named("Foo");
#if TRACING_ON
    Named *named_ptr = &named;
#endif

    // Flag enabled
    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", true));
    EXPECT_TRUE(Debug::changeFlag("FmtFlag", true));
#if TRACING_ON
    DPRINTFS(TraceTestDebugFlag, named_ptr, "Test message");
    ASSERT_EQ(getString(Trace::output()),
        "      0: TraceTestDebugFlag: Foo: Test message");
#endif

    // Flag disabled
    Trace::disable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", false));
#if TRACING_ON
    DPRINTFS(TraceTestDebugFlag, named_ptr, "Test message");
    ASSERT_EQ(getString(Trace::output()), "");
#endif
}

/** Test DPRINTFR with tracing on. */
TEST(TraceTest, MacroDPRINTFR)
{
    // Flag enabled
    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", true));
    EXPECT_TRUE(Debug::changeFlag("FmtFlag", true));
    DPRINTFR(TraceTestDebugFlag, "Test message");
#if TRACING_ON
    ASSERT_EQ(getString(Trace::output()), "TraceTestDebugFlag: Test message");
#else
    ASSERT_EQ(getString(Trace::output()), "");
#endif

    // Flag disabled
    Trace::disable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", false));
    DPRINTFR(TraceTestDebugFlag, "Test message");
    ASSERT_EQ(getString(Trace::output()), "");
}

/** Test DPRINTFN with tracing on. */
TEST(TraceTest, MacroDPRINTFN)
{
    StringWrap name("Foo");
    DPRINTFN("Test message");
#if TRACING_ON
    ASSERT_EQ(getString(Trace::output()), "      0: Foo: Test message");
#else
    ASSERT_EQ(getString(Trace::output()), "");
#endif
}

/** Test DPRINTFNR with tracing on. */
TEST(TraceTest, MacroDPRINTFNR)
{
    DPRINTFNR("Test message");
#if TRACING_ON
    ASSERT_EQ(getString(Trace::output()), "Test message");
#else
    ASSERT_EQ(getString(Trace::output()), "");
#endif
}

/** Test DPRINTF_UNCONDITIONAL with tracing on. */
TEST(TraceTest, MacroDPRINTF_UNCONDITIONAL)
{
    StringWrap name("Foo");

    // Flag enabled
    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", true));
    EXPECT_TRUE(Debug::changeFlag("FmtFlag", true));
    DPRINTF_UNCONDITIONAL(TraceTestDebugFlag, "Test message");
#if TRACING_ON
    ASSERT_EQ(getString(Trace::output()),
        "      0: TraceTestDebugFlag: Foo: Test message");
#else
    ASSERT_EQ(getString(Trace::output()), "");
#endif

    // Flag disabled
    Trace::disable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", false));
    DPRINTF_UNCONDITIONAL(TraceTestDebugFlag, "Test message");
#if TRACING_ON
    ASSERT_EQ(getString(Trace::output()), "      0: Foo: Test message");
#else
    ASSERT_EQ(getString(Trace::output()), "");
#endif
}

/**
 * Test that there is a global name() to fall through when a locally scoped
 * name() is not defined.
 */
TEST(TraceTest, GlobalName)
{
    // Flag enabled
    Trace::enable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", true));
    EXPECT_TRUE(Debug::changeFlag("FmtFlag", true));
    DPRINTF(TraceTestDebugFlag, "Test message");
#if TRACING_ON
    ASSERT_EQ(getString(Trace::output()),
        "      0: TraceTestDebugFlag: global: Test message");
#else
    ASSERT_EQ(getString(Trace::output()), "");
#endif

    // Flag disabled
    Trace::disable();
    EXPECT_TRUE(Debug::changeFlag("TraceTestDebugFlag", false));
    DPRINTF(TraceTestDebugFlag, "Test message");
    ASSERT_EQ(getString(Trace::output()), "");
}
