Skip to content

Commit 80fbec8

Browse files
committed
feat: add null safety for tracer initialization and update tests
1 parent c7a062f commit 80fbec8

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

sdk-platform-java/gax-java/gax/src/main/java/com/google/api/gax/tracing/SpanTracerFactory.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,18 @@ public ApiTracerContext getApiTracerContext() {
103103
*/
104104
@Override
105105
public ApiTracerFactory withContext(ApiTracerContext context) {
106+
if (context == null) {
107+
return new BaseApiTracerFactory();
108+
}
106109
ApiTracerContext mergedContext = this.apiTracerContext.merge(context);
107110
LibraryMetadata metadata = mergedContext.libraryMetadata();
111+
if (metadata == null) {
112+
return new BaseApiTracerFactory();
113+
}
108114
Tracer newTracer = openTelemetry.getTracer(metadata.artifactName(), metadata.version());
115+
if (newTracer == null) {
116+
return new BaseApiTracerFactory();
117+
}
109118
return new SpanTracerFactory(openTelemetry, newTracer, mergedContext);
110119
}
111120
}

sdk-platform-java/gax-java/gax/src/test/java/com/google/api/gax/tracing/SpanTracerFactoryTest.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,10 @@ void testWithContext_addsInferredAttributes(boolean useContext) {
173173
@ParameterizedTest
174174
@ValueSource(booleans = {false, true})
175175
void testWithContext_noEndpointContext_doesNotAddServerAddressAttribute(boolean useContext) {
176-
ApiTracerContext context = ApiTracerContext.empty();
176+
ApiTracerContext context =
177+
ApiTracerContext.newBuilder()
178+
.setLibraryMetadata(LibraryMetadata.empty())
179+
.build();
177180

178181
SpanTracerFactory factory =
179182
new SpanTracerFactory(openTelemetry, tracer, ApiTracerContext.empty());
@@ -322,4 +325,37 @@ void testNoOpWhenTracerNull() {
322325

323326
assertThat(tracerInstance2).isInstanceOf(BaseApiTracer.class);
324327
}
328+
329+
@Test
330+
void testWithContext_nullContext_returnsBaseApiTracerFactory() {
331+
SpanTracerFactory factory =
332+
new SpanTracerFactory(openTelemetry, tracer, ApiTracerContext.empty());
333+
ApiTracerFactory factoryWithContext = factory.withContext(null);
334+
assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class);
335+
}
336+
337+
@Test
338+
void testWithContext_nullMetadata_returnsBaseApiTracerFactory() {
339+
SpanTracerFactory factory =
340+
new SpanTracerFactory(openTelemetry, tracer, ApiTracerContext.empty());
341+
// Assuming ApiTracerContext.empty() has null libraryMetadata
342+
ApiTracerFactory factoryWithContext = factory.withContext(ApiTracerContext.empty());
343+
assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class);
344+
}
345+
346+
@Test
347+
void testWithContext_nullTracer_returnsBaseApiTracerFactory() {
348+
OpenTelemetry mockOpenTelemetry = mock(OpenTelemetry.class);
349+
when(mockOpenTelemetry.getTracer(nullable(String.class), nullable(String.class))).thenReturn(null);
350+
351+
SpanTracerFactory factory =
352+
new SpanTracerFactory(mockOpenTelemetry, tracer, ApiTracerContext.empty());
353+
ApiTracerContext context =
354+
ApiTracerContext.newBuilder()
355+
.setLibraryMetadata(LibraryMetadata.empty())
356+
.build();
357+
358+
ApiTracerFactory factoryWithContext = factory.withContext(context);
359+
assertThat(factoryWithContext).isInstanceOf(BaseApiTracerFactory.class);
360+
}
325361
}

0 commit comments

Comments
 (0)