
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <log4cxx/mdc.h>
#include <log4cxx/file.h>
#include <log4cxx/logger.h>
#include <log4cxx/patternlayout.h>
#include "insertwide.h"
#include "logunit.h"
#include "util/compare.h"



using namespace log4cxx;

LOGUNIT_CLASS(MDCTestCase)
{
	LOGUNIT_TEST_SUITE(MDCTestCase);
	LOGUNIT_TEST(test1);
	LOGUNIT_TEST(test2);
	LOGUNIT_TEST_SUITE_END();

public:

	void setUp()
	{
	}

	void tearDown()
	{
		auto rep = Logger::getRootLogger()->getLoggerRepository();

		if (rep)
		{
			rep->resetConfiguration();
		}
	}

	/**
	 *   log4cxx 0.10.0 did not replace previously set value.
	 */
	void test1()
	{
		std::string key("key1");
		std::string expected("value2");
		MDC item1(key, "value1");
		MDC::put(key, expected);
		std::string actual(MDC::get(key));
		LOGUNIT_ASSERT_EQUAL(expected, actual);
	}

	/// Check MDC formatting skips entries that exceed the maximum field length.
	void test2()
	{
		MDC item1("key1", "value1");
		MDC item2("key2", "value2");
		helpers::Pool p;
		LogString output;
		PatternLayout l{ LOG4CXX_STR("%-5p %c - %.30J %m") };
		l.format(output, std::make_shared<spi::LoggingEvent>(LOG4CXX_STR("MDC.LayoutTest"), Level::getInfo(), LOG4CXX_STR("Message"), spi::LocationInfo::getLocationUnavailable()), p);
		LOGUNIT_ASSERT_EQUAL(LOG4CXX_STR("INFO  MDC.LayoutTest - {\"key1\":\"value1\"} Message"), output);
	}
};

LOGUNIT_TEST_SUITE_REGISTRATION(MDCTestCase);
