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() + } +}