77
88import static io .opentelemetry .sdk .testing .assertj .OpenTelemetryAssertions .assertThat ;
99import static org .assertj .core .api .Assertions .assertThatThrownBy ;
10+ import static org .mockito .Mockito .spy ;
11+ import static org .mockito .Mockito .when ;
1012
1113import io .opentelemetry .api .GlobalOpenTelemetry ;
1214import io .opentelemetry .api .OpenTelemetry ;
2527import java .util .HashMap ;
2628import java .util .LinkedHashMap ;
2729import java .util .Map ;
30+ import java .util .Optional ;
2831import java .util .concurrent .TimeUnit ;
2932import java .util .stream .Collectors ;
3033import javax .annotation .Nullable ;
3134import org .junit .jupiter .api .Test ;
35+ import org .junit .jupiter .api .extension .ExtensionContext ;
3236import org .junit .jupiter .api .extension .RegisterExtension ;
3337
3438class OpenTelemetryExtensionTest {
@@ -219,7 +223,14 @@ public void getLogRecordsAgain() {
219223 void afterAll () {
220224 // Use a different instance of OpenTelemetryExtension to avoid interfering with other tests
221225 OpenTelemetryExtension extension = OpenTelemetryExtension .create ();
222- extension .beforeAll (null );
226+
227+ ExtensionContext parentContext = spy (ExtensionContext .class );
228+ when (parentContext .getTestClass ()).thenReturn (Optional .empty ());
229+
230+ ExtensionContext context = spy (ExtensionContext .class );
231+ when (context .getParent ()).thenReturn (Optional .of (parentContext ));
232+
233+ extension .beforeAll (context );
223234
224235 Meter meter = extension .getOpenTelemetry ().getMeter ("meter" );
225236 Tracer tracer = extension .getOpenTelemetry ().getTracer ("tracer" );
@@ -229,7 +240,7 @@ void afterAll() {
229240 assertThat (extension .getMetrics ()).isNotEmpty ();
230241 assertThat (extension .getSpans ()).isNotEmpty ();
231242
232- extension .afterAll (null );
243+ extension .afterAll (context );
233244 assertThat (GlobalOpenTelemetry .get ()).extracting ("delegate" ).isSameAs (OpenTelemetry .noop ());
234245
235246 meter .counterBuilder ("counter" ).build ().add (10 );
@@ -238,6 +249,30 @@ void afterAll() {
238249 assertThat (extension .getSpans ()).isEmpty ();
239250 }
240251
252+ @ Test
253+ void afterAllNestedOnly () {
254+ // Demonstrate specifically that Nested tests do not reset extension sdk
255+ OpenTelemetryExtension extension = OpenTelemetryExtension .create ();
256+
257+ ExtensionContext context = spy (ExtensionContext .class );
258+ when (context .getParent ()).thenReturn (Optional .empty ());
259+
260+ extension .beforeAll (context );
261+
262+ Meter meter = extension .getOpenTelemetry ().getMeter ("meter" );
263+ Tracer tracer = extension .getOpenTelemetry ().getTracer ("tracer" );
264+
265+ extension .afterAll (context );
266+
267+ assertThat (GlobalOpenTelemetry .get ()).extracting ("delegate" ).isSameAs (OpenTelemetry .noop ());
268+
269+ // GlobalTelemetry was reset, but extension's sdk was not closed
270+ meter .counterBuilder ("counter" ).build ().add (10 );
271+ tracer .spanBuilder ("span" ).startSpan ().end ();
272+ assertThat (extension .getMetrics ()).isNotEmpty ();
273+ assertThat (extension .getSpans ()).isNotEmpty ();
274+ }
275+
241276 @ Test
242277 void baggageAndTracePropagation () {
243278 OpenTelemetryExtension extension = OpenTelemetryExtension .create ();
0 commit comments