/*
 * Copyright 2016-2017 Talsma ICT
 *
 * Licensed 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.
 */
package nl.talsmasoftware.context.mdc;

import nl.talsmasoftware.context.executors.ContextAwareExecutorService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.MDC;

import java.util.concurrent.*;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;

/**
 * Unit test for the {@link MdcManager}.
 *
 * @author Sjoerd Talsma
 */
public class MdcManagerTest {

    ExecutorService threadpool;

    @Before
    public void setupThreadpool() {
        threadpool = new ContextAwareExecutorService(Executors.newCachedThreadPool());
    }

    @After
    public void shutdownThreadpool() {
        threadpool.shutdown();
        threadpool = null;
    }

    private static final Callable<String> GET_MDC_ITEM = new Callable<String>() {
        public String call() {
            return MDC.get("mdc-item");
        }
    };

    @Test
    public void testMdcItemPropagation() throws ExecutionException, InterruptedException {
        MDC.put("mdc-item", "Item value");
        Future<String> itemValue = threadpool.submit(GET_MDC_ITEM);
        assertThat(itemValue.get(), is("Item value"));
    }

}

@@ -636,16 +636,158 @@
 t.mdc;%0A%0A
+import nl.talsmasoftware.context.Context;%0Aimport nl.talsmasoftware.context.ContextManagers;%0Aimport nl.talsmasoftware.context.ContextSnapshot;%0A
 import n
@@ -850,16 +850,16 @@
 ervice;%0A
-
 import o
@@ -1465,24 +1465,104 @@
 ull;%0A    %7D%0A%0A
+    @Before%0A    @After%0A    public void clearMDC() %7B%0A        MDC.clear();%0A    %7D%0A%0A
     private 
@@ -1932,16 +1932,16 @@
 _ITEM);%0A
-
         
@@ -1994,10 +1994,681 @@
 %0A    %7D%0A%0A
+    @Test%0A    public void testMdcItemRestoration() throws Exception %7B%0A        MDC.put(%22mdc-item%22, %22Value 1%22);%0A%0A        ContextSnapshot snapshot = ContextManagers.createContextSnapshot();%0A        assertThat(%22New snapshot shouldn't manipulate MDC.%22, GET_MDC_ITEM.call(), is(%22Value 1%22));%0A%0A        MDC.put(%22mdc-item%22, %22Value 2%22);%0A        assertThat(%22Sanity check: MDC changed?%22, GET_MDC_ITEM.call(), is(%22Value 2%22));%0A%0A        Context%3CVoid%3E reactivation = snapshot.reactivate();%0A        assertThat(%22MDC changed by reactivation%22, GET_MDC_ITEM.call(), is(%22Value 1%22));%0A%0A        reactivation.close();%0A        assertThat(%22MDC restored?%22, GET_MDC_ITEM.call(), is(%22Value 2%22));%0A    %7D%0A%0A
 %7D%0A

Add unit test for MDC restoration.