/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.toolkit.modules.concurrency.api.threadcontext; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import org.junit.Before; import org.junit.Test; import de.rcenvironment.toolkit.modules.concurrency.internal.AbstractConcurrencyModuleTest; /** * Common test for {@link ThreadContext}, {@link ThreadContextBuilder}, {@link ThreadContextHolder}, and {@link ThreadContextMemento}. * * @author Robert Mischke */ public class ThreadContextTest extends AbstractConcurrencyModuleTest { /** * @Before method. */ @Before public void resetBefore() { ThreadContextHolder.setCurrentContext(null); } /** * Tests basic behavior: Null context handling, context building and deriving, aspect setting and reading, previous context restoration * via Memento. */ @Test public void basicBehavior() { assertNull(ThreadContextHolder.getCurrentContext()); assertNull(ThreadContextHolder.getCurrentContextAspect(Object.class)); assertNull(ThreadContextHolder.getCurrentContextAspect(String.class)); // set new/custom context final String value1 = "test data"; final ThreadContextMemento previousContext1 = ThreadContextHolder.setCurrentContext(ThreadContextBuilder.empty().setAspect(String.class, value1).build()); assertNotNull(ThreadContextHolder.getCurrentContext()); assertNull(ThreadContextHolder.getCurrentContextAspect(Object.class)); assertEquals(value1, ThreadContextHolder.getCurrentContextAspect(String.class)); // set derived context final String value2 = value1 + " 2"; final ThreadContextMemento previousContext2 = ThreadContextHolder.setCurrentContext(ThreadContextBuilder.fromCurrent().setAspect(String.class, value2).build()); assertEquals(value2, ThreadContextHolder.getCurrentContextAspect(String.class)); // restore first context previousContext2.restore(); assertEquals(value1, ThreadContextHolder.getCurrentContextAspect(String.class)); // restore original (null) context previousContext1.restore(); assertNull(ThreadContextHolder.getCurrentContext()); assertNull(ThreadContextHolder.getCurrentContextAspect(Object.class)); assertNull(ThreadContextHolder.getCurrentContextAspect(String.class)); } /** * Verifies that {@link ThreadContextBuilder#fromCurrent()) also works if no ThreadContext has been set yet (so it is null). It is * important to test for a non-existing aspect here, as that is the only case where the parent context is actually used. */ @Test public void derivingFromNullContext() { assertNull(ThreadContextHolder.getCurrentContext()); final String value = "ok"; final ThreadContext derivedFromNullContext = ThreadContextBuilder.fromCurrent().setAspect(String.class, value).build(); assertEquals(value, derivedFromNullContext.getAspect(String.class)); assertNull(derivedFromNullContext.getAspect(Object.class)); // important test; see JavaDoc } // TODO add test for Memento consistency check failure }