diff --git a/core/src/main/java/io/opentelemetry/android/GlobalAttributesSpanAppender.java b/core/src/main/java/io/opentelemetry/android/GlobalAttributesSpanAppender.java
deleted file mode 100644
index 3e15e420b..000000000
--- a/core/src/main/java/io/opentelemetry/android/GlobalAttributesSpanAppender.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.android;
-
-import io.opentelemetry.api.common.Attributes;
-import io.opentelemetry.api.common.AttributesBuilder;
-import io.opentelemetry.context.Context;
-import io.opentelemetry.sdk.trace.ReadWriteSpan;
-import io.opentelemetry.sdk.trace.ReadableSpan;
-import io.opentelemetry.sdk.trace.SpanProcessor;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
-
-/**
- * A {@link SpanProcessor} implementation that appends a set of {@linkplain Attributes attributes}
- * to every span that is exported. The attributes are supplied via Supplier. This Supplier may alter
- * its results and return different attributes over time. collection is mutable, and can be updated
- * by calling {@link #update(Consumer)}.
- *
- *
This class is internal and is hence not for public use. Its APIs are unstable and can change
- * at any time.
- */
-public final class GlobalAttributesSpanAppender implements SpanProcessor {
-
- /**
- * Returns a new {@link GlobalAttributesSpanAppender} with a given initial attributes.
- *
- * @param initialState The initial collection of attributes to append to every span.
- */
- public static GlobalAttributesSpanAppender create(Attributes initialState) {
- return create(() -> initialState);
- }
-
- /**
- * Returns a new {@link GlobalAttributesSpanAppender} which calls the given supplier to populate
- * the global attributes;
- *
- * @param attributeSupplier a Supplier of Attributes to be placed on every span.
- */
- public static GlobalAttributesSpanAppender create(Supplier attributeSupplier) {
- return new GlobalAttributesSpanAppender(attributeSupplier);
- }
-
- private final AtomicReference> attributesSupplier;
-
- private GlobalAttributesSpanAppender(Supplier initialState) {
- this.attributesSupplier = new AtomicReference<>(initialState);
- }
-
- @Override
- public void onStart(Context parentContext, ReadWriteSpan span) {
- span.setAllAttributes(getAttributes());
- }
-
- private Attributes getAttributes() {
- Supplier supplier = attributesSupplier.get();
- if (supplier != null) {
- Attributes result = supplier.get();
- if (result != null) {
- return result;
- }
- }
- return Attributes.empty();
- }
-
- @Override
- public boolean isStartRequired() {
- return true;
- }
-
- @Override
- public void onEnd(ReadableSpan span) {}
-
- @Override
- public boolean isEndRequired() {
- return false;
- }
-
- /**
- * Update the global set of attributes to be appended to every span.
- *
- * Note: Calling this method invalidates the Supplier originally passed to this {@link
- * GlobalAttributesSpanAppender} and any other previously updated Supplier.
- *
- * @param attributesUpdater A function which will update the current set of attributes, by
- * operating on a {@link AttributesBuilder} from the current set.
- */
- public void update(Consumer attributesUpdater) {
- synchronized (attributesSupplier) {
- Attributes oldAttributes = getAttributes();
-
- AttributesBuilder builder = oldAttributes.toBuilder();
- attributesUpdater.accept(builder);
- Attributes newAttributes = builder.build();
-
- attributesSupplier.set(() -> newAttributes);
- }
- }
-
- /**
- * Replaces the currently configured attributes Supplier with a new one.
- *
- * @param attributesSupplier Supplier to call to obtain Attributes for every span.
- */
- public void update(Supplier attributesSupplier) {
- this.attributesSupplier.set(attributesSupplier);
- }
-}
diff --git a/core/src/main/java/io/opentelemetry/android/GlobalAttributesSpanAppender.kt b/core/src/main/java/io/opentelemetry/android/GlobalAttributesSpanAppender.kt
new file mode 100644
index 000000000..92cb4d476
--- /dev/null
+++ b/core/src/main/java/io/opentelemetry/android/GlobalAttributesSpanAppender.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.android
+
+import io.opentelemetry.api.common.Attributes
+import io.opentelemetry.api.common.AttributesBuilder
+import io.opentelemetry.context.Context
+import io.opentelemetry.sdk.trace.ReadWriteSpan
+import io.opentelemetry.sdk.trace.ReadableSpan
+import io.opentelemetry.sdk.trace.SpanProcessor
+import java.util.concurrent.atomic.AtomicReference
+import java.util.function.Consumer
+import java.util.function.Supplier
+
+/**
+ * A [SpanProcessor] implementation that appends a set of [attributes][Attributes]
+ * to every span. The attributes are supplied via Supplier. This Supplier may alter
+ * its results and return different attributes over time. collection is mutable, and can be updated
+ * by calling [.update].
+ */
+internal class GlobalAttributesSpanAppender(
+ initialState: Supplier,
+) : SpanProcessor {
+ private val attributesSupplier = AtomicReference(initialState)
+
+ override fun onStart(
+ parentContext: Context,
+ span: ReadWriteSpan,
+ ) {
+ span.setAllAttributes(attributes)
+ }
+
+ private val attributes: Attributes
+ get() = attributesSupplier.get().get()
+
+ override fun isStartRequired(): Boolean = true
+
+ override fun onEnd(span: ReadableSpan) {}
+
+ override fun isEndRequired(): Boolean = false
+
+ /**
+ * Update the global set of attributes to be appended to every span.
+ *
+ * Note: Calling this method invalidates the Supplier originally passed to this [ ] and any other previously updated Supplier.
+ *
+ * @param attributesUpdater A function which will update the current set of attributes, by
+ * operating on a [AttributesBuilder] from the current set.
+ */
+ fun update(attributesUpdater: Consumer) {
+ synchronized(attributesSupplier) {
+ val oldAttributes = attributes
+ val builder = oldAttributes.toBuilder()
+ attributesUpdater.accept(builder)
+ val newAttributes = builder.build()
+ attributesSupplier.set(Supplier { newAttributes })
+ }
+ }
+
+ /**
+ * Replaces the currently configured attributes Supplier with a new one.
+ *
+ * @param attributesSupplier Supplier to call to obtain Attributes for every span.
+ */
+ fun update(attributesSupplier: Supplier) {
+ this.attributesSupplier.set(attributesSupplier)
+ }
+}
diff --git a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java
index 8a1f5413b..fb6c4b840 100644
--- a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java
+++ b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumBuilder.java
@@ -487,7 +487,7 @@ private void applyConfiguration(Services services, InitializationEvents initiali
if (config.hasGlobalAttributes()) {
// Add span processor that appends global attributes.
GlobalAttributesSpanAppender appender =
- GlobalAttributesSpanAppender.create(config.getGlobalAttributesSupplier());
+ new GlobalAttributesSpanAppender(config.getGlobalAttributesSupplier());
addTracerProviderCustomizer(
(tracerProviderBuilder, app) ->
tracerProviderBuilder.addSpanProcessor(appender));
diff --git a/core/src/main/java/io/opentelemetry/android/ScreenAttributesSpanProcessor.java b/core/src/main/java/io/opentelemetry/android/ScreenAttributesSpanProcessor.java
deleted file mode 100644
index 947fabfa2..000000000
--- a/core/src/main/java/io/opentelemetry/android/ScreenAttributesSpanProcessor.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.android;
-
-import static io.opentelemetry.android.common.RumConstants.SCREEN_NAME_KEY;
-
-import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenTracker;
-import io.opentelemetry.context.Context;
-import io.opentelemetry.sdk.trace.ReadWriteSpan;
-import io.opentelemetry.sdk.trace.ReadableSpan;
-import io.opentelemetry.sdk.trace.SpanProcessor;
-
-public final class ScreenAttributesSpanProcessor implements SpanProcessor {
-
- private final VisibleScreenTracker visibleScreenTracker;
-
- public ScreenAttributesSpanProcessor(VisibleScreenTracker visibleScreenTracker) {
- this.visibleScreenTracker = visibleScreenTracker;
- }
-
- @Override
- public void onStart(Context parentContext, ReadWriteSpan span) {
- String currentScreen = visibleScreenTracker.getCurrentlyVisibleScreen();
- span.setAttribute(SCREEN_NAME_KEY, currentScreen);
- }
-
- @Override
- public boolean isStartRequired() {
- return true;
- }
-
- @Override
- public void onEnd(ReadableSpan span) {
- // nop
- }
-
- @Override
- public boolean isEndRequired() {
- return false;
- }
-}
diff --git a/core/src/main/java/io/opentelemetry/android/ScreenAttributesSpanProcessor.kt b/core/src/main/java/io/opentelemetry/android/ScreenAttributesSpanProcessor.kt
new file mode 100644
index 000000000..ae8d1cffc
--- /dev/null
+++ b/core/src/main/java/io/opentelemetry/android/ScreenAttributesSpanProcessor.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.android
+
+import io.opentelemetry.android.common.RumConstants
+import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenTracker
+import io.opentelemetry.context.Context
+import io.opentelemetry.sdk.trace.ReadWriteSpan
+import io.opentelemetry.sdk.trace.ReadableSpan
+import io.opentelemetry.sdk.trace.SpanProcessor
+
+/**
+ * This class appends the screen name to all spans.
+ */
+internal class ScreenAttributesSpanProcessor(
+ private val visibleScreenTracker: VisibleScreenTracker,
+) : SpanProcessor {
+ override fun onStart(
+ parentContext: Context,
+ span: ReadWriteSpan,
+ ) {
+ val currentScreen = visibleScreenTracker.currentlyVisibleScreen
+ span.setAttribute(RumConstants.SCREEN_NAME_KEY, currentScreen)
+ }
+
+ override fun isStartRequired(): Boolean = true
+
+ override fun onEnd(span: ReadableSpan) {
+ // nop
+ }
+
+ override fun isEndRequired(): Boolean = false
+}
diff --git a/core/src/main/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppender.java b/core/src/main/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppender.java
deleted file mode 100644
index 28febe03b..000000000
--- a/core/src/main/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppender.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.android.internal.features.networkattrs;
-
-import io.opentelemetry.android.common.internal.features.networkattributes.CurrentNetworkAttributesExtractor;
-import io.opentelemetry.android.common.internal.features.networkattributes.data.CurrentNetwork;
-import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider;
-import io.opentelemetry.api.common.Attributes;
-import io.opentelemetry.context.Context;
-import io.opentelemetry.sdk.trace.ReadWriteSpan;
-import io.opentelemetry.sdk.trace.ReadableSpan;
-import io.opentelemetry.sdk.trace.SpanProcessor;
-
-/**
- * A {@link SpanProcessor} implementation that appends a set of {@linkplain Attributes attributes}
- * describing the {@linkplain CurrentNetwork current network} to every span that is exported.
- *
- * This class is internal and not for public use. Its APIs are unstable and can change at any
- * time.
- */
-public final class NetworkAttributesSpanAppender implements SpanProcessor {
-
- public static SpanProcessor create(CurrentNetworkProvider currentNetworkProvider) {
- return new NetworkAttributesSpanAppender(currentNetworkProvider);
- }
-
- private final CurrentNetworkProvider currentNetworkProvider;
- private final CurrentNetworkAttributesExtractor networkAttributesExtractor =
- new CurrentNetworkAttributesExtractor();
-
- NetworkAttributesSpanAppender(CurrentNetworkProvider currentNetworkProvider) {
- this.currentNetworkProvider = currentNetworkProvider;
- }
-
- @Override
- public void onStart(Context parentContext, ReadWriteSpan span) {
- CurrentNetwork currentNetwork = currentNetworkProvider.getCurrentNetwork();
- span.setAllAttributes(networkAttributesExtractor.extract(currentNetwork));
- }
-
- @Override
- public boolean isStartRequired() {
- return true;
- }
-
- @Override
- public void onEnd(ReadableSpan span) {}
-
- @Override
- public boolean isEndRequired() {
- return false;
- }
-}
diff --git a/core/src/main/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppender.kt b/core/src/main/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppender.kt
new file mode 100644
index 000000000..005b85e9b
--- /dev/null
+++ b/core/src/main/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppender.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.android.internal.features.networkattrs
+
+import io.opentelemetry.android.common.internal.features.networkattributes.CurrentNetworkAttributesExtractor
+import io.opentelemetry.android.common.internal.features.networkattributes.data.CurrentNetwork
+import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider
+import io.opentelemetry.context.Context
+import io.opentelemetry.sdk.trace.ReadWriteSpan
+import io.opentelemetry.sdk.trace.ReadableSpan
+import io.opentelemetry.sdk.trace.SpanProcessor
+
+/**
+ * A [SpanProcessor] implementation that appends a set of [attributes][Attributes]
+ * describing the [current network][CurrentNetwork] to every span that is exported.
+ */
+internal class NetworkAttributesSpanAppender(
+ private val currentNetworkProvider: CurrentNetworkProvider,
+) : SpanProcessor {
+ private val networkAttributesExtractor = CurrentNetworkAttributesExtractor()
+
+ override fun onStart(
+ parentContext: Context,
+ span: ReadWriteSpan,
+ ) {
+ val currentNetwork = currentNetworkProvider.currentNetwork
+ span.setAllAttributes(networkAttributesExtractor.extract(currentNetwork))
+ }
+
+ override fun isStartRequired(): Boolean = true
+
+ override fun onEnd(span: ReadableSpan) {}
+
+ override fun isEndRequired(): Boolean = false
+
+ companion object {
+ @JvmStatic
+ fun create(currentNetworkProvider: CurrentNetworkProvider): SpanProcessor = NetworkAttributesSpanAppender(currentNetworkProvider)
+ }
+}
diff --git a/core/src/test/java/io/opentelemetry/android/GlobalAttributesSpanAppenderTest.java b/core/src/test/java/io/opentelemetry/android/GlobalAttributesSpanAppenderTest.java
deleted file mode 100644
index 90733694c..000000000
--- a/core/src/test/java/io/opentelemetry/android/GlobalAttributesSpanAppenderTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.android;
-
-import static io.opentelemetry.api.common.AttributeKey.longKey;
-import static io.opentelemetry.api.common.AttributeKey.stringKey;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import io.opentelemetry.api.common.Attributes;
-import io.opentelemetry.context.Context;
-import io.opentelemetry.sdk.trace.ReadWriteSpan;
-import java.util.function.Supplier;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-@ExtendWith(MockitoExtension.class)
-class GlobalAttributesSpanAppenderTest {
-
- @Mock private ReadWriteSpan span;
-
- @Test
- void shouldAppendGlobalAttributes() {
- GlobalAttributesSpanAppender globalAttributes =
- GlobalAttributesSpanAppender.create(Attributes.of(stringKey("key"), "value"));
- globalAttributes.update(attributesBuilder -> attributesBuilder.put("key", "value2"));
- globalAttributes.update(
- attributesBuilder -> attributesBuilder.put(longKey("otherKey"), 1234L));
-
- assertTrue(globalAttributes.isStartRequired());
- globalAttributes.onStart(Context.root(), span);
-
- verify(span)
- .setAllAttributes(
- Attributes.of(stringKey("key"), "value2", longKey("otherKey"), 1234L));
-
- assertFalse(globalAttributes.isEndRequired());
- }
-
- @Test
- void createWithSupplier() {
- Attributes attrs = Attributes.of(stringKey("foo"), "bar");
- GlobalAttributesSpanAppender globalAttributes =
- GlobalAttributesSpanAppender.create(() -> attrs);
-
- globalAttributes.onStart(Context.root(), span);
- verify(span).setAllAttributes(Attributes.of(stringKey("foo"), "bar"));
- }
-
- @Test
- void updateWithSupplierReplacesSupplier() {
- Attributes attrs = Attributes.of(stringKey("foo"), "bar");
- Supplier originalSupplier = () -> fail("Should not have been called");
-
- GlobalAttributesSpanAppender globalAttributes =
- GlobalAttributesSpanAppender.create(originalSupplier);
- globalAttributes.update(() -> attrs);
-
- globalAttributes.onStart(Context.root(), span);
- verify(span).setAllAttributes(Attributes.of(stringKey("foo"), "bar"));
- }
-
- @Test
- void updateWithAttributesReplacesSupplier() {
- Attributes attrs = Attributes.of(stringKey("foo"), "bar");
- Attributes extra = Attributes.of(stringKey("bar"), "baz");
- Supplier originalSupplier = mock(Supplier.class);
-
- when(originalSupplier.get())
- .thenReturn(attrs)
- .thenThrow(new RuntimeException("Should not have been called again."));
-
- GlobalAttributesSpanAppender globalAttributes =
- GlobalAttributesSpanAppender.create(originalSupplier);
- globalAttributes.update(builder -> builder.putAll(extra));
-
- globalAttributes.onStart(Context.root(), span);
- verify(span)
- .setAllAttributes(Attributes.of(stringKey("foo"), "bar", stringKey("bar"), "baz"));
- }
-}
diff --git a/core/src/test/java/io/opentelemetry/android/GlobalAttributesSpanAppenderTest.kt b/core/src/test/java/io/opentelemetry/android/GlobalAttributesSpanAppenderTest.kt
new file mode 100644
index 000000000..943837491
--- /dev/null
+++ b/core/src/test/java/io/opentelemetry/android/GlobalAttributesSpanAppenderTest.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.android
+
+import io.mockk.MockKAnnotations
+import io.mockk.every
+import io.mockk.impl.annotations.MockK
+import io.mockk.mockk
+import io.mockk.verify
+import io.opentelemetry.api.common.AttributeKey
+import io.opentelemetry.api.common.Attributes
+import io.opentelemetry.api.common.AttributesBuilder
+import io.opentelemetry.context.Context
+import io.opentelemetry.sdk.trace.ReadWriteSpan
+import org.assertj.core.api.Assertions.assertThat
+import org.assertj.core.api.Assertions.fail
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+import java.util.function.Supplier
+
+internal class GlobalAttributesSpanAppenderTest {
+ @MockK
+ lateinit var span: ReadWriteSpan
+
+ @BeforeEach
+ fun setup() {
+ MockKAnnotations.init(this, relaxUnitFun = true)
+ every { span.setAllAttributes(any()) } returns span
+ }
+
+ @Test
+ fun shouldAppendGlobalAttributes() {
+ val globalAttributes =
+ GlobalAttributesSpanAppender {
+ Attributes.of(AttributeKey.stringKey("key"), "value")
+ }
+ globalAttributes.update { attributesBuilder: AttributesBuilder ->
+ attributesBuilder.put(
+ "key",
+ "value2",
+ )
+ }
+ globalAttributes.update { attributesBuilder: AttributesBuilder ->
+ attributesBuilder.put(
+ AttributeKey.longKey("otherKey"),
+ 1234L,
+ )
+ }
+
+ assertThat(globalAttributes.isStartRequired).isTrue()
+ globalAttributes.onStart(Context.root(), span)
+
+ verify {
+ span.setAllAttributes(
+ Attributes.of(
+ AttributeKey.stringKey("key"),
+ "value2",
+ AttributeKey.longKey("otherKey"),
+ 1234L,
+ ),
+ )
+ }
+
+ assertThat(globalAttributes.isEndRequired).isFalse()
+ }
+
+ @Test
+ fun createWithSupplier() {
+ val attrs = Attributes.of(AttributeKey.stringKey("foo"), "bar")
+ val globalAttributes = GlobalAttributesSpanAppender { attrs }
+
+ globalAttributes.onStart(Context.root(), span)
+ verify {
+ span.setAllAttributes(Attributes.of(AttributeKey.stringKey("foo"), "bar"))
+ }
+ }
+
+ @Test
+ fun updateWithSupplierReplacesSupplier() {
+ val attrs = Attributes.of(AttributeKey.stringKey("foo"), "bar")
+ val originalSupplier =
+ Supplier { fail("Should not have been called") }
+
+ val globalAttributes = GlobalAttributesSpanAppender(originalSupplier)
+ globalAttributes.update(Supplier { attrs })
+
+ globalAttributes.onStart(Context.root(), span)
+ verify {
+ span.setAllAttributes(Attributes.of(AttributeKey.stringKey("foo"), "bar"))
+ }
+ }
+
+ @Test
+ fun updateWithAttributesReplacesSupplier() {
+ val attrs = Attributes.of(AttributeKey.stringKey("foo"), "bar")
+ val extra = Attributes.of(AttributeKey.stringKey("bar"), "baz")
+ val originalSupplier = mockk>()
+
+ every { originalSupplier.get() } returns attrs andThenThrows RuntimeException("Should not have been called again.")
+
+ val globalAttributes = GlobalAttributesSpanAppender(originalSupplier)
+ globalAttributes.update { builder: AttributesBuilder ->
+ builder.putAll(
+ extra,
+ )
+ }
+
+ globalAttributes.onStart(Context.root(), span)
+ verify {
+ span.setAllAttributes(
+ Attributes.of(
+ AttributeKey.stringKey("foo"),
+ "bar",
+ AttributeKey.stringKey("bar"),
+ "baz",
+ ),
+ )
+ }
+ }
+}
diff --git a/core/src/test/java/io/opentelemetry/android/ScreenAttributesSpanProcessorTest.java b/core/src/test/java/io/opentelemetry/android/ScreenAttributesSpanProcessorTest.java
deleted file mode 100644
index 48c85e6bd..000000000
--- a/core/src/test/java/io/opentelemetry/android/ScreenAttributesSpanProcessorTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.android;
-
-import static io.opentelemetry.android.common.RumConstants.SCREEN_NAME_KEY;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenTracker;
-import io.opentelemetry.context.Context;
-import io.opentelemetry.sdk.trace.ReadWriteSpan;
-import io.opentelemetry.sdk.trace.ReadableSpan;
-import org.junit.jupiter.api.Test;
-
-class ScreenAttributesSpanProcessorTest {
-
- @Test
- void append() {
- String screenName = "my cool screen";
- VisibleScreenTracker visibleScreenTracker = mock(VisibleScreenTracker.class);
- Context contenxt = mock(Context.class);
- ReadWriteSpan span = mock(ReadWriteSpan.class);
-
- when(visibleScreenTracker.getCurrentlyVisibleScreen()).thenReturn(screenName);
-
- ScreenAttributesSpanProcessor testClass =
- new ScreenAttributesSpanProcessor(visibleScreenTracker);
- assertThat(testClass.isStartRequired()).isTrue();
- assertThat(testClass.isEndRequired()).isFalse();
- assertThatCode(() -> testClass.onEnd(mock(ReadableSpan.class))).doesNotThrowAnyException();
-
- testClass.onStart(contenxt, span);
- verify(span).setAttribute(SCREEN_NAME_KEY, screenName);
- }
-}
diff --git a/core/src/test/java/io/opentelemetry/android/ScreenAttributesSpanProcessorTest.kt b/core/src/test/java/io/opentelemetry/android/ScreenAttributesSpanProcessorTest.kt
new file mode 100644
index 000000000..9e7bd957a
--- /dev/null
+++ b/core/src/test/java/io/opentelemetry/android/ScreenAttributesSpanProcessorTest.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.android
+
+import io.mockk.every
+import io.mockk.mockk
+import io.mockk.verify
+import io.opentelemetry.android.common.RumConstants
+import io.opentelemetry.android.internal.services.visiblescreen.VisibleScreenTracker
+import io.opentelemetry.api.common.AttributeKey
+import io.opentelemetry.context.Context
+import io.opentelemetry.sdk.trace.ReadWriteSpan
+import io.opentelemetry.sdk.trace.ReadableSpan
+import org.assertj.core.api.Assertions.assertThat
+import org.assertj.core.api.Assertions.assertThatCode
+import org.junit.jupiter.api.Test
+
+internal class ScreenAttributesSpanProcessorTest {
+ @Test
+ fun append() {
+ val screenName = "my cool screen"
+ val visibleScreenTracker = mockk()
+ val contenxt = mockk()
+ val span = mockk()
+
+ every { visibleScreenTracker.currentlyVisibleScreen } returns screenName
+ every { span.setAttribute(any>(), any()) } returns span
+
+ val testClass =
+ ScreenAttributesSpanProcessor(visibleScreenTracker)
+ assertThat(testClass.isStartRequired).isTrue()
+ assertThat(testClass.isEndRequired).isFalse()
+ assertThatCode {
+ testClass.onEnd(mockk())
+ }.doesNotThrowAnyException()
+
+ testClass.onStart(contenxt, span)
+ verify {
+ span.setAttribute(RumConstants.SCREEN_NAME_KEY, screenName)
+ }
+ }
+}
diff --git a/core/src/test/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppenderTest.java b/core/src/test/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppenderTest.java
deleted file mode 100644
index f6c8e1329..000000000
--- a/core/src/test/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppenderTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package io.opentelemetry.android.internal.features.networkattrs;
-
-import static io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NETWORK_CONNECTION_SUBTYPE;
-import static io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes.NETWORK_CONNECTION_TYPE;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import io.opentelemetry.android.common.internal.features.networkattributes.data.CurrentNetwork;
-import io.opentelemetry.android.common.internal.features.networkattributes.data.NetworkState;
-import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider;
-import io.opentelemetry.api.common.Attributes;
-import io.opentelemetry.context.Context;
-import io.opentelemetry.sdk.trace.ReadWriteSpan;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-@ExtendWith(MockitoExtension.class)
-class NetworkAttributesSpanAppenderTest {
-
- @Mock CurrentNetworkProvider currentNetworkProvider;
- @Mock ReadWriteSpan span;
-
- @InjectMocks NetworkAttributesSpanAppender underTest;
-
- @Test
- void shouldAppendNetworkAttributes() {
- when(currentNetworkProvider.getCurrentNetwork())
- .thenReturn(
- CurrentNetwork.builder(NetworkState.TRANSPORT_CELLULAR)
- .subType("LTE")
- .build());
-
- assertTrue(underTest.isStartRequired());
- underTest.onStart(Context.current(), span);
-
- verify(span)
- .setAllAttributes(
- Attributes.of(
- NETWORK_CONNECTION_TYPE, "cell",
- NETWORK_CONNECTION_SUBTYPE, "LTE"));
-
- assertFalse(underTest.isEndRequired());
- }
-}
diff --git a/core/src/test/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppenderTest.kt b/core/src/test/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppenderTest.kt
new file mode 100644
index 000000000..f64c06062
--- /dev/null
+++ b/core/src/test/java/io/opentelemetry/android/internal/features/networkattrs/NetworkAttributesSpanAppenderTest.kt
@@ -0,0 +1,64 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.android.internal.features.networkattrs
+
+import io.mockk.MockKAnnotations
+import io.mockk.every
+import io.mockk.impl.annotations.InjectMockKs
+import io.mockk.impl.annotations.MockK
+import io.mockk.verify
+import io.opentelemetry.android.common.internal.features.networkattributes.data.CurrentNetwork
+import io.opentelemetry.android.common.internal.features.networkattributes.data.NetworkState
+import io.opentelemetry.android.internal.services.network.CurrentNetworkProvider
+import io.opentelemetry.api.common.Attributes
+import io.opentelemetry.context.Context
+import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat
+import io.opentelemetry.sdk.trace.ReadWriteSpan
+import io.opentelemetry.semconv.incubating.NetworkIncubatingAttributes
+import org.junit.jupiter.api.BeforeEach
+import org.junit.jupiter.api.Test
+
+internal class NetworkAttributesSpanAppenderTest {
+ @MockK
+ lateinit var currentNetworkProvider: CurrentNetworkProvider
+
+ @MockK
+ lateinit var span: ReadWriteSpan
+
+ @InjectMockKs
+ lateinit var underTest: NetworkAttributesSpanAppender
+
+ @BeforeEach
+ fun setUp() {
+ MockKAnnotations.init(this)
+ every { span.setAllAttributes(any()) } returns span
+ }
+
+ @Test
+ fun shouldAppendNetworkAttributes() {
+ val network =
+ CurrentNetwork
+ .builder(NetworkState.TRANSPORT_CELLULAR)
+ .subType("LTE")
+ .build()
+ every { currentNetworkProvider.currentNetwork } returns network
+ assertThat(underTest.isStartRequired).isTrue()
+
+ underTest.onStart(Context.current(), span)
+
+ verify {
+ span.setAllAttributes(
+ Attributes.of(
+ NetworkIncubatingAttributes.NETWORK_CONNECTION_TYPE,
+ "cell",
+ NetworkIncubatingAttributes.NETWORK_CONNECTION_SUBTYPE,
+ "LTE",
+ ),
+ )
+ }
+ assertThat(underTest.isEndRequired).isFalse()
+ }
+}