2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.core.logging.context;
24 import org.testng.annotations.Test;
26 import java.util.UUID;
27 import java.util.concurrent.atomic.AtomicBoolean;
29 import static org.testng.Assert.*;
35 public class MDCPropagationFactoryTest {
38 public void testNoPropagation() throws InterruptedException {
40 String uuid = UUID.randomUUID().toString();
41 AtomicBoolean complete = new AtomicBoolean(false);
42 MDC.put("data", uuid);
44 Runnable runnable = () -> {
45 assertNull(MDC.get("data"));
49 Thread thread = new Thread(runnable);
53 assertEquals(MDC.get("data"), uuid);
54 assertTrue(complete.get());
58 public void testPropagation() throws InterruptedException {
60 String uuid = UUID.randomUUID().toString();
61 AtomicBoolean complete = new AtomicBoolean(false);
62 MDC.put("data", uuid);
64 MdcPropagationService factory = new MdcPropagationService();
65 Runnable runnable = factory.create(() -> {
66 assertEquals(MDC.get("data"), uuid);
70 Thread thread = new Thread(runnable);
74 assertEquals(MDC.get("data"), uuid);
75 assertTrue(complete.get());
79 public void testReplacement() throws InterruptedException {
81 String innerUuid = UUID.randomUUID().toString();
82 AtomicBoolean innerComplete = new AtomicBoolean(false);
83 AtomicBoolean outerComplete = new AtomicBoolean(false);
85 MDC.put("data", innerUuid);
87 MdcPropagationService factory = new MdcPropagationService();
89 // should run with the context of main thread
90 Runnable inner = factory.create(() -> {
91 assertEquals(MDC.get("data"), innerUuid);
92 innerComplete.set(true);
95 // pushes its own context, but runs the inner runnable
96 Runnable outer = () -> {
97 String outerUuid = UUID.randomUUID().toString();
98 MDC.put("data", outerUuid);
100 assertEquals(MDC.get("data"), outerUuid);
101 outerComplete.set(true);
105 Thread thread = new Thread(outer);
109 assertEquals(MDC.get("data"), innerUuid);
110 assertTrue(outerComplete.get());
111 assertTrue(innerComplete.get());
115 public void testEmpty() throws InterruptedException {
117 final AtomicBoolean complete = new AtomicBoolean(false);
120 assertNull(MDC.get("data"));
122 MdcPropagationService factory = new MdcPropagationService();
123 Runnable runnable = factory.create(() -> {
124 assertNull(MDC.get("data"));
128 Thread thread = new Thread(runnable);
132 assertNull(MDC.get("data"));
133 assertTrue(complete.get());
137 public void testCleanup() throws Exception {
139 String innerUuid = UUID.randomUUID().toString();
140 AtomicBoolean innerComplete = new AtomicBoolean(false);
141 AtomicBoolean outerComplete = new AtomicBoolean(false);
143 MDC.put("data", innerUuid);
145 MdcPropagationService factory = new MdcPropagationService();
147 // should run with the context of main thread
148 Runnable inner = factory.create(() -> {
149 assertEquals(MDC.get("data"), innerUuid);
150 innerComplete.set(true);
153 // pushes its own context, but runs the inner runnable
154 Runnable outer = () -> {
155 assertNull(MDC.get("data"));
157 assertNull(MDC.get("data"));
158 outerComplete.set(true);
161 Thread thread = new Thread(outer);
165 assertEquals(MDC.get("data"), innerUuid);
166 assertTrue(outerComplete.get());
167 assertTrue(innerComplete.get());
171 public void testCleanupAfterError() throws Exception {
173 String innerUuid = UUID.randomUUID().toString();
174 AtomicBoolean innerComplete = new AtomicBoolean(false);
175 AtomicBoolean outerComplete = new AtomicBoolean(false);
176 AtomicBoolean exceptionThrown = new AtomicBoolean(false);
178 MDC.put("data", innerUuid);
180 MdcPropagationService factory = new MdcPropagationService();
182 // should run with the context of main thread
183 Runnable inner = factory.create(() -> {
184 assertEquals(MDC.get("data"), innerUuid);
185 innerComplete.set(true);
186 throw new RuntimeException();
189 // pushes its own context, but runs the inner runnable
190 Runnable outer = () -> {
192 String outerUuid = UUID.randomUUID().toString();
193 MDC.put("data", outerUuid);
194 assertEquals(MDC.get("data"), outerUuid);
198 } catch (RuntimeException e) {
199 exceptionThrown.set(true);
201 assertEquals(MDC.get("data"), outerUuid);
202 outerComplete.set(true);
206 Thread thread = new Thread(outer);
210 assertEquals(MDC.get("data"), innerUuid);
211 assertTrue(outerComplete.get());
212 assertTrue(innerComplete.get());
213 assertTrue(exceptionThrown.get());