@After public void afterMethod() { resetTracingAndMdc(); }
public void onCompleted_deals_with_trace_info_as_expected(Boolean setupForSubspan) throws Throwable { Pair<Deque<Span>, Map<String, String>> traceInfo = generateTraceInfo(setupForSubspan); Whitebox.setInternalState(handlerSpy, "distributedTraceStackToUse", traceInfo.getLeft()); Whitebox.setInternalState(handlerSpy, "mdcContextToUse", traceInfo.getRight()); setupBeforeAndAfterSpanCaptureForOnCompleted();
doReturn(false).when(cfMock).isDone(); Pair<Deque<Span>, Map<String, String>> traceInfo = generateTraceInfo(setupForSubspan); Whitebox.setInternalState(handlerSpy, "distributedTraceStackToUse", traceInfo.getLeft()); Whitebox.setInternalState(handlerSpy, "mdcContextToUse", traceInfo.getRight()); Whitebox.setInternalState(handlerSpy, "performSubSpanAroundDownstreamCalls", false); Pair<ObjectHolder<Span>, ObjectHolder<Span>> actualBeforeAndAfterSpanHolders = setupBeforeAndAfterSpanCaptureForOnThrowable(cfMock);
@DataProvider(value = { "null", "false", "true" }) @Test public void onCompleted_does_nothing_to_trace_info_if_performSubSpanAroundDownstreamCalls_is_false( Boolean setupForSubspan) throws Throwable { // given Pair<Deque<Span>, Map<String, String>> traceInfo = generateTraceInfo(setupForSubspan); Whitebox.setInternalState(handlerSpy, "distributedTraceStackToUse", traceInfo.getLeft()); Whitebox.setInternalState(handlerSpy, "mdcContextToUse", traceInfo.getRight()); Whitebox.setInternalState(handlerSpy, "performSubSpanAroundDownstreamCalls", false); Pair<ObjectHolder<Span>, ObjectHolder<Span>> actualBeforeAndAfterSpanHolders = setupBeforeAndAfterSpanCaptureForOnCompleted(); // when handlerSpy.onCompleted(responseMock); // then verify(circuitBreakerManualTaskMock).handleEvent(responseMock); verify(responseHandlerFunctionMock).handleResponse(responseMock); assertThat(actualBeforeAndAfterSpanHolders.getLeft().objSet).isTrue(); assertThat(actualBeforeAndAfterSpanHolders.getRight().objSet).isTrue(); assertThat(actualBeforeAndAfterSpanHolders.getLeft().obj) .isEqualTo(actualBeforeAndAfterSpanHolders.getRight().obj); }
doReturn(false).when(cfMock).isDone(); Pair<Deque<Span>, Map<String, String>> traceInfo = generateTraceInfo(setupForSubspan); Whitebox.setInternalState(handlerSpy, "distributedTraceStackToUse", traceInfo.getLeft()); Whitebox.setInternalState(handlerSpy, "mdcContextToUse", traceInfo.getRight()); setupBeforeAndAfterSpanCaptureForOnThrowable(cfMock);
@Before public void beforeMethod() throws Throwable { resetTracingAndMdc(); )); resetTracingAndMdc();
private Pair<Deque<Span>, Map<String, String>> generateTraceInfo(Boolean setupForSubspan) { if (setupForSubspan == null) return Pair.of(null, null); try { resetTracingAndMdc(); Tracer.getInstance().startRequestWithRootSpan("overallReqSpan"); if (setupForSubspan) Tracer.getInstance().startSubSpan("subSpan", Span.SpanPurpose.LOCAL_ONLY); return Pair.of(Tracer.getInstance().getCurrentSpanStackCopy(), MDC.getCopyOfContextMap()); } finally { resetTracingAndMdc(); } }
case NULL: case EMPTY: //intentional fall-through resetTracingAndMdc(); break; case HAS_EXISTING_SPAN: Map<String, String> mdcInfo = (existingSpanStackState == EMPTY) ? new HashMap<>() : MDC.getCopyOfContextMap(); resetTracingAndMdc();