@@ -209,7 +209,7 @@ public interface BeforeCaptureCallback {
*/
private boolean attachAnrThreadDump = false;
- private boolean enablePerformanceV2 = false;
+ private boolean enablePerformanceV2 = true;
private @Nullable SentryFrameMetricsCollector frameMetricsCollector;
@@ -340,27 +340,6 @@ public void enableAllAutoBreadcrumbs(boolean enable) {
setEnableUserInteractionBreadcrumbs(enable);
}
- /**
- * Returns the interval for profiling traces in milliseconds.
- *
- * @return the interval for profiling traces in milliseconds.
- * @deprecated has no effect and will be removed in future versions. It now just returns 0.
- */
- @Deprecated
- @SuppressWarnings("InlineMeSuggester")
- public int getProfilingTracesIntervalMillis() {
- return 0;
- }
-
- /**
- * Sets the interval for profiling traces in milliseconds.
- *
- * @param profilingTracesIntervalMillis - the interval for profiling traces in milliseconds.
- * @deprecated has no effect and will be removed in future versions.
- */
- @Deprecated
- public void setProfilingTracesIntervalMillis(final int profilingTracesIntervalMillis) {}
-
/**
* Returns the Debug image loader
*
@@ -589,20 +568,18 @@ public void setAttachAnrThreadDump(final boolean attachAnrThreadDump) {
* @return true if performance-v2 is enabled. See {@link #setEnablePerformanceV2(boolean)} for
* more details.
*/
- @ApiStatus.Experimental
public boolean isEnablePerformanceV2() {
return enablePerformanceV2;
}
/**
- * Experimental: Enables or disables the Performance V2 SDK features.
+ * Enables or disables the Performance V2 SDK features.
*
* With this change - Cold app start spans will provide more accurate timings - Cold app start
* spans will be enriched with detailed ContentProvider, Application and Activity startup times
*
* @param enablePerformanceV2 true if enabled or false otherwise
*/
- @ApiStatus.Experimental
public void setEnablePerformanceV2(final boolean enablePerformanceV2) {
this.enablePerformanceV2 = enablePerformanceV2;
}
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java b/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java
index 8baf10ebc32..6658e145605 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/SentryPerformanceProvider.java
@@ -7,10 +7,10 @@
import android.content.Context;
import android.content.pm.ProviderInfo;
import android.net.Uri;
-import android.os.Build;
import android.os.Process;
import android.os.SystemClock;
import io.sentry.ILogger;
+import io.sentry.ISentryLifecycleToken;
import io.sentry.ITransactionProfiler;
import io.sentry.JsonSerializer;
import io.sentry.SentryAppStartProfilingOptions;
@@ -21,6 +21,7 @@
import io.sentry.android.core.internal.util.SentryFrameMetricsCollector;
import io.sentry.android.core.performance.AppStartMetrics;
import io.sentry.android.core.performance.TimeSpan;
+import io.sentry.util.AutoClosableReentrantLock;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
@@ -43,6 +44,7 @@ public final class SentryPerformanceProvider extends EmptySecureContentProvider
private final @NotNull ILogger logger;
private final @NotNull BuildInfoProvider buildInfoProvider;
+ private final @NotNull AutoClosableReentrantLock lock = new AutoClosableReentrantLock();
@TestOnly
SentryPerformanceProvider(
@@ -82,7 +84,7 @@ public String getType(@NotNull Uri uri) {
@Override
public void shutdown() {
- synchronized (AppStartMetrics.getInstance()) {
+ try (final @NotNull ISentryLifecycleToken ignored = AppStartMetrics.staticLock.acquire()) {
final @Nullable ITransactionProfiler appStartProfiler =
AppStartMetrics.getInstance().getAppStartProfiler();
if (appStartProfiler != null) {
@@ -99,11 +101,6 @@ private void launchAppStartProfiler(final @NotNull AppStartMetrics appStartMetri
return;
}
- // Debug.startMethodTracingSampling() is only available since Lollipop
- if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) {
- return;
- }
-
final @NotNull File cacheDir = AndroidOptionsInitializer.getCacheDir(context);
final @NotNull File configFile = new File(cacheDir, APP_START_PROFILING_CONFIG_FILE_NAME);
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SpanFrameMetricsCollector.java b/sentry-android-core/src/main/java/io/sentry/android/core/SpanFrameMetricsCollector.java
index b4279db13f7..a83454d29b7 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/SpanFrameMetricsCollector.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/SpanFrameMetricsCollector.java
@@ -2,6 +2,7 @@
import io.sentry.DateUtils;
import io.sentry.IPerformanceContinuousCollector;
+import io.sentry.ISentryLifecycleToken;
import io.sentry.ISpan;
import io.sentry.ITransaction;
import io.sentry.NoOpSpan;
@@ -11,6 +12,7 @@
import io.sentry.SpanDataConvention;
import io.sentry.android.core.internal.util.SentryFrameMetricsCollector;
import io.sentry.protocol.MeasurementValue;
+import io.sentry.util.AutoClosableReentrantLock;
import java.util.Date;
import java.util.Iterator;
import java.util.SortedSet;
@@ -34,7 +36,7 @@ public class SpanFrameMetricsCollector
private static final SentryNanotimeDate EMPTY_NANO_TIME = new SentryNanotimeDate(new Date(0), 0);
private final boolean enabled;
- private final @NotNull Object lock = new Object();
+ protected final @NotNull AutoClosableReentrantLock lock = new AutoClosableReentrantLock();
private final @NotNull SentryFrameMetricsCollector frameMetricsCollector;
private volatile @Nullable String listenerId;
@@ -43,17 +45,19 @@ public class SpanFrameMetricsCollector
private final @NotNull SortedSet runningSpans =
new TreeSet<>(
(o1, o2) -> {
+ if (o1 == o2) {
+ return 0;
+ }
int timeDiff = o1.getStartDate().compareTo(o2.getStartDate());
if (timeDiff != 0) {
return timeDiff;
- } else {
- // TreeSet uses compareTo to check for duplicates, so ensure that
- // two non-equal spans with the same start date are not considered equal
- return o1.getSpanContext()
- .getSpanId()
- .toString()
- .compareTo(o2.getSpanContext().getSpanId().toString());
}
+ // TreeSet uses compareTo to check for duplicates, so ensure that
+ // two non-equal spans with the same start date are not considered equal
+ return o1.getSpanContext()
+ .getSpanId()
+ .toString()
+ .compareTo(o2.getSpanContext().getSpanId().toString());
});
// all collected frames, sorted by frame end time
@@ -85,7 +89,7 @@ public void onSpanStarted(final @NotNull ISpan span) {
return;
}
- synchronized (lock) {
+ try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
runningSpans.add(span);
if (listenerId == null) {
@@ -109,7 +113,7 @@ public void onSpanFinished(final @NotNull ISpan span) {
}
// ignore span if onSpanStarted was never called for it
- synchronized (lock) {
+ try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
if (!runningSpans.contains(span)) {
return;
}
@@ -117,7 +121,7 @@ public void onSpanFinished(final @NotNull ISpan span) {
captureFrameMetrics(span);
- synchronized (lock) {
+ try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
if (runningSpans.isEmpty()) {
clear();
} else {
@@ -130,7 +134,7 @@ public void onSpanFinished(final @NotNull ISpan span) {
private void captureFrameMetrics(@NotNull final ISpan span) {
// TODO lock still required?
- synchronized (lock) {
+ try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
boolean removed = runningSpans.remove(span);
if (!removed) {
return;
@@ -224,7 +228,7 @@ private void captureFrameMetrics(@NotNull final ISpan span) {
@Override
public void clear() {
- synchronized (lock) {
+ try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
if (listenerId != null) {
frameMetricsCollector.stopCollection(listenerId);
listenerId = null;
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java b/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java
index ea838975cde..04988c9a98b 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/SystemEventsBreadcrumbsIntegration.java
@@ -41,12 +41,14 @@
import android.os.Bundle;
import io.sentry.Breadcrumb;
import io.sentry.Hint;
-import io.sentry.IHub;
+import io.sentry.IScopes;
+import io.sentry.ISentryLifecycleToken;
import io.sentry.Integration;
import io.sentry.SentryLevel;
import io.sentry.SentryOptions;
import io.sentry.android.core.internal.util.AndroidCurrentDateProvider;
import io.sentry.android.core.internal.util.Debouncer;
+import io.sentry.util.AutoClosableReentrantLock;
import io.sentry.util.Objects;
import io.sentry.util.StringUtils;
import java.io.Closeable;
@@ -69,7 +71,7 @@ public final class SystemEventsBreadcrumbsIntegration implements Integration, Cl
private final @NotNull List actions;
private boolean isClosed = false;
- private final @NotNull Object startLock = new Object();
+ private final @NotNull AutoClosableReentrantLock startLock = new AutoClosableReentrantLock();
public SystemEventsBreadcrumbsIntegration(final @NotNull Context context) {
this(context, getDefaultActions());
@@ -83,8 +85,8 @@ public SystemEventsBreadcrumbsIntegration(
}
@Override
- public void register(final @NotNull IHub hub, final @NotNull SentryOptions options) {
- Objects.requireNonNull(hub, "Hub is required");
+ public void register(final @NotNull IScopes scopes, final @NotNull SentryOptions options) {
+ Objects.requireNonNull(scopes, "Scopes are required");
this.options =
Objects.requireNonNull(
(options instanceof SentryAndroidOptions) ? (SentryAndroidOptions) options : null,
@@ -104,9 +106,9 @@ public void register(final @NotNull IHub hub, final @NotNull SentryOptions optio
.getExecutorService()
.submit(
() -> {
- synchronized (startLock) {
+ try (final @NotNull ISentryLifecycleToken ignored = startLock.acquire()) {
if (!isClosed) {
- startSystemEventsReceiver(hub, (SentryAndroidOptions) options);
+ startSystemEventsReceiver(scopes, (SentryAndroidOptions) options);
}
}
});
@@ -122,8 +124,8 @@ public void register(final @NotNull IHub hub, final @NotNull SentryOptions optio
}
private void startSystemEventsReceiver(
- final @NotNull IHub hub, final @NotNull SentryAndroidOptions options) {
- receiver = new SystemEventsBroadcastReceiver(hub, options);
+ final @NotNull IScopes scopes, final @NotNull SentryAndroidOptions options) {
+ receiver = new SystemEventsBroadcastReceiver(scopes, options);
final IntentFilter filter = new IntentFilter();
for (String item : actions) {
filter.addAction(item);
@@ -193,7 +195,7 @@ private void startSystemEventsReceiver(
@Override
public void close() throws IOException {
- synchronized (startLock) {
+ try (final @NotNull ISentryLifecycleToken ignored = startLock.acquire()) {
isClosed = true;
}
if (receiver != null) {
@@ -209,14 +211,14 @@ public void close() throws IOException {
static final class SystemEventsBroadcastReceiver extends BroadcastReceiver {
private static final long DEBOUNCE_WAIT_TIME_MS = 60 * 1000;
- private final @NotNull IHub hub;
+ private final @NotNull IScopes scopes;
private final @NotNull SentryAndroidOptions options;
private final @NotNull Debouncer batteryChangedDebouncer =
new Debouncer(AndroidCurrentDateProvider.getInstance(), DEBOUNCE_WAIT_TIME_MS, 0);
SystemEventsBroadcastReceiver(
- final @NotNull IHub hub, final @NotNull SentryAndroidOptions options) {
- this.hub = hub;
+ final @NotNull IScopes scopes, final @NotNull SentryAndroidOptions options) {
+ this.scopes = scopes;
this.options = options;
}
@@ -240,7 +242,7 @@ public void onReceive(final Context context, final @NotNull Intent intent) {
createBreadcrumb(now, intent, action, isBatteryChanged);
final Hint hint = new Hint();
hint.set(ANDROID_INTENT, intent);
- hub.addBreadcrumb(breadcrumb, hint);
+ scopes.addBreadcrumb(breadcrumb, hint);
});
} catch (Throwable t) {
options
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/TempSensorBreadcrumbsIntegration.java b/sentry-android-core/src/main/java/io/sentry/android/core/TempSensorBreadcrumbsIntegration.java
index b94a06b9768..1d72fa22396 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/TempSensorBreadcrumbsIntegration.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/TempSensorBreadcrumbsIntegration.java
@@ -11,10 +11,12 @@
import android.hardware.SensorManager;
import io.sentry.Breadcrumb;
import io.sentry.Hint;
-import io.sentry.IHub;
+import io.sentry.IScopes;
+import io.sentry.ISentryLifecycleToken;
import io.sentry.Integration;
import io.sentry.SentryLevel;
import io.sentry.SentryOptions;
+import io.sentry.util.AutoClosableReentrantLock;
import io.sentry.util.Objects;
import java.io.Closeable;
import java.io.IOException;
@@ -26,12 +28,12 @@ public final class TempSensorBreadcrumbsIntegration
implements Integration, Closeable, SensorEventListener {
private final @NotNull Context context;
- private @Nullable IHub hub;
+ private @Nullable IScopes scopes;
private @Nullable SentryAndroidOptions options;
@TestOnly @Nullable SensorManager sensorManager;
private boolean isClosed = false;
- private final @NotNull Object startLock = new Object();
+ private final @NotNull AutoClosableReentrantLock startLock = new AutoClosableReentrantLock();
public TempSensorBreadcrumbsIntegration(final @NotNull Context context) {
this.context =
@@ -39,8 +41,8 @@ public TempSensorBreadcrumbsIntegration(final @NotNull Context context) {
}
@Override
- public void register(final @NotNull IHub hub, final @NotNull SentryOptions options) {
- this.hub = Objects.requireNonNull(hub, "Hub is required");
+ public void register(final @NotNull IScopes scopes, final @NotNull SentryOptions options) {
+ this.scopes = Objects.requireNonNull(scopes, "Scopes are required");
this.options =
Objects.requireNonNull(
(options instanceof SentryAndroidOptions) ? (SentryAndroidOptions) options : null,
@@ -60,7 +62,7 @@ public void register(final @NotNull IHub hub, final @NotNull SentryOptions optio
.getExecutorService()
.submit(
() -> {
- synchronized (startLock) {
+ try (final @NotNull ISentryLifecycleToken ignored = startLock.acquire()) {
if (!isClosed) {
startSensorListener(options);
}
@@ -101,7 +103,7 @@ private void startSensorListener(final @NotNull SentryOptions options) {
@Override
public void close() throws IOException {
- synchronized (startLock) {
+ try (final @NotNull ISentryLifecycleToken ignored = startLock.acquire()) {
isClosed = true;
}
if (sensorManager != null) {
@@ -122,7 +124,7 @@ public void onSensorChanged(final @NotNull SensorEvent event) {
return;
}
- if (hub != null) {
+ if (scopes != null) {
final Breadcrumb breadcrumb = new Breadcrumb();
breadcrumb.setType("system");
breadcrumb.setCategory("device.event");
@@ -135,7 +137,7 @@ public void onSensorChanged(final @NotNull SensorEvent event) {
final Hint hint = new Hint();
hint.set(ANDROID_SENSOR_EVENT, event);
- hub.addBreadcrumb(breadcrumb, hint);
+ scopes.addBreadcrumb(breadcrumb, hint);
}
}
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/UserInteractionIntegration.java b/sentry-android-core/src/main/java/io/sentry/android/core/UserInteractionIntegration.java
index a0ad3591669..46275504cbe 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/UserInteractionIntegration.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/UserInteractionIntegration.java
@@ -6,7 +6,7 @@
import android.app.Application;
import android.os.Bundle;
import android.view.Window;
-import io.sentry.IHub;
+import io.sentry.IScopes;
import io.sentry.Integration;
import io.sentry.SentryLevel;
import io.sentry.SentryOptions;
@@ -23,13 +23,13 @@ public final class UserInteractionIntegration
implements Integration, Closeable, Application.ActivityLifecycleCallbacks {
private final @NotNull Application application;
- private @Nullable IHub hub;
+ private @Nullable IScopes scopes;
private @Nullable SentryAndroidOptions options;
private final boolean isAndroidXAvailable;
public UserInteractionIntegration(
- final @NotNull Application application, final @NotNull LoadClass classLoader) {
+ final @NotNull Application application, final @NotNull io.sentry.util.LoadClass classLoader) {
this.application = Objects.requireNonNull(application, "Application is required");
isAndroidXAvailable =
classLoader.isClassAvailable("androidx.core.view.GestureDetectorCompat", options);
@@ -44,14 +44,14 @@ private void startTracking(final @NotNull Activity activity) {
return;
}
- if (hub != null && options != null) {
+ if (scopes != null && options != null) {
Window.Callback delegate = window.getCallback();
if (delegate == null) {
delegate = new NoOpWindowCallback();
}
final SentryGestureListener gestureListener =
- new SentryGestureListener(activity, hub, options);
+ new SentryGestureListener(activity, scopes, options);
window.setCallback(new SentryWindowCallback(delegate, activity, gestureListener, options));
}
}
@@ -102,13 +102,13 @@ public void onActivitySaveInstanceState(@NotNull Activity activity, @NotNull Bun
public void onActivityDestroyed(@NotNull Activity activity) {}
@Override
- public void register(@NotNull IHub hub, @NotNull SentryOptions options) {
+ public void register(@NotNull IScopes scopes, @NotNull SentryOptions options) {
this.options =
Objects.requireNonNull(
(options instanceof SentryAndroidOptions) ? (SentryAndroidOptions) options : null,
"SentryAndroidOptions is required");
- this.hub = Objects.requireNonNull(hub, "Hub is required");
+ this.scopes = Objects.requireNonNull(scopes, "Scopes are required");
final boolean integrationEnabled =
this.options.isEnableUserInteractionBreadcrumbs()
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/ViewHierarchyEventProcessor.java b/sentry-android-core/src/main/java/io/sentry/android/core/ViewHierarchyEventProcessor.java
index eaa9aaa5604..c32b05892f9 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/ViewHierarchyEventProcessor.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/ViewHierarchyEventProcessor.java
@@ -15,7 +15,7 @@
import io.sentry.SentryLevel;
import io.sentry.android.core.internal.gestures.ViewUtils;
import io.sentry.android.core.internal.util.AndroidCurrentDateProvider;
-import io.sentry.android.core.internal.util.AndroidMainThreadChecker;
+import io.sentry.android.core.internal.util.AndroidThreadChecker;
import io.sentry.android.core.internal.util.ClassUtil;
import io.sentry.android.core.internal.util.Debouncer;
import io.sentry.internal.viewhierarchy.ViewHierarchyExporter;
@@ -25,7 +25,7 @@
import io.sentry.util.HintUtils;
import io.sentry.util.JsonSerializationUtils;
import io.sentry.util.Objects;
-import io.sentry.util.thread.IMainThreadChecker;
+import io.sentry.util.thread.IThreadChecker;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
@@ -101,7 +101,7 @@ public ViewHierarchyEventProcessor(final @NotNull SentryAndroidOptions options)
snapshotViewHierarchy(
activity,
options.getViewHierarchyExporters(),
- options.getMainThreadChecker(),
+ options.getThreadChecker(),
options.getLogger());
if (viewHierarchy != null) {
@@ -113,13 +113,13 @@ public ViewHierarchyEventProcessor(final @NotNull SentryAndroidOptions options)
public static byte[] snapshotViewHierarchyAsData(
@Nullable Activity activity,
- @NotNull IMainThreadChecker mainThreadChecker,
+ @NotNull IThreadChecker threadChecker,
@NotNull ISerializer serializer,
@NotNull ILogger logger) {
@Nullable
ViewHierarchy viewHierarchy =
- snapshotViewHierarchy(activity, new ArrayList<>(0), mainThreadChecker, logger);
+ snapshotViewHierarchy(activity, new ArrayList<>(0), threadChecker, logger);
if (viewHierarchy == null) {
logger.log(SentryLevel.ERROR, "Could not get ViewHierarchy.");
@@ -144,14 +144,14 @@ public static byte[] snapshotViewHierarchyAsData(
public static ViewHierarchy snapshotViewHierarchy(
final @Nullable Activity activity, final @NotNull ILogger logger) {
return snapshotViewHierarchy(
- activity, new ArrayList<>(0), AndroidMainThreadChecker.getInstance(), logger);
+ activity, new ArrayList<>(0), AndroidThreadChecker.getInstance(), logger);
}
@Nullable
public static ViewHierarchy snapshotViewHierarchy(
final @Nullable Activity activity,
final @NotNull List exporters,
- final @NotNull IMainThreadChecker mainThreadChecker,
+ final @NotNull IThreadChecker threadChecker,
final @NotNull ILogger logger) {
if (activity == null) {
@@ -172,7 +172,7 @@ public static ViewHierarchy snapshotViewHierarchy(
}
try {
- if (mainThreadChecker.isMainThread()) {
+ if (threadChecker.isMainThread()) {
return snapshotViewHierarchy(decorView, exporters);
} else {
final CountDownLatch latch = new CountDownLatch(1);
@@ -284,4 +284,9 @@ private static ViewHierarchyNode viewToNode(@NotNull final View view) {
return node;
}
+
+ @Override
+ public @Nullable Long getOrder() {
+ return 11000L;
+ }
}
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java
index 0ec0d83258e..cd80f5ced7d 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/gestures/SentryGestureListener.java
@@ -10,8 +10,8 @@
import android.view.Window;
import io.sentry.Breadcrumb;
import io.sentry.Hint;
-import io.sentry.IHub;
import io.sentry.IScope;
+import io.sentry.IScopes;
import io.sentry.ITransaction;
import io.sentry.SentryLevel;
import io.sentry.SpanStatus;
@@ -43,7 +43,7 @@ private enum GestureType {
private static final String TRACE_ORIGIN = "auto.ui.gesture_listener";
private final @NotNull WeakReference activityRef;
- private final @NotNull IHub hub;
+ private final @NotNull IScopes scopes;
private final @NotNull SentryAndroidOptions options;
private @Nullable UiElement activeUiElement = null;
@@ -54,10 +54,10 @@ private enum GestureType {
public SentryGestureListener(
final @NotNull Activity currentActivity,
- final @NotNull IHub hub,
+ final @NotNull IScopes scopes,
final @NotNull SentryAndroidOptions options) {
this.activityRef = new WeakReference<>(currentActivity);
- this.hub = hub;
+ this.scopes = scopes;
this.options = options;
}
@@ -185,7 +185,7 @@ private void addBreadcrumb(
hint.set(ANDROID_MOTION_EVENT, motionEvent);
hint.set(ANDROID_VIEW, target.getView());
- hub.addBreadcrumb(
+ scopes.addBreadcrumb(
Breadcrumb.userInteraction(
type, target.getResourceName(), target.getClassName(), target.getTag(), additionalData),
hint);
@@ -202,7 +202,7 @@ private void startTracing(final @NotNull UiElement target, final @NotNull Gestur
if (!(options.isTracingEnabled() && options.isEnableUserInteractionTracing())) {
if (isNewInteraction) {
- TracingUtils.startNewTrace(hub);
+ TracingUtils.startNewTrace(scopes);
activeUiElement = target;
activeEventType = eventType;
}
@@ -251,14 +251,13 @@ private void startTracing(final @NotNull UiElement target, final @NotNull Gestur
TransactionOptions.DEFAULT_DEADLINE_TIMEOUT_AUTO_TRANSACTION);
transactionOptions.setIdleTimeout(options.getIdleTimeout());
transactionOptions.setTrimEnd(true);
+ transactionOptions.setOrigin(TRACE_ORIGIN + "." + target.getOrigin());
final ITransaction transaction =
- hub.startTransaction(
+ scopes.startTransaction(
new TransactionContext(name, TransactionNameSource.COMPONENT, op), transactionOptions);
- transaction.getSpanContext().setOrigin(TRACE_ORIGIN + "." + target.getOrigin());
-
- hub.configureScope(
+ scopes.configureScope(
scope -> {
applyScope(scope, transaction);
});
@@ -278,7 +277,7 @@ void stopTracing(final @NotNull SpanStatus status) {
activeTransaction.finish();
}
}
- hub.configureScope(
+ scopes.configureScope(
scope -> {
// avoid method refs on Android due to some issues with older AGP setups
// noinspection Convert2MethodRef
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidConnectionStatusProvider.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidConnectionStatusProvider.java
index 0afd2bce970..76a10567d2d 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidConnectionStatusProvider.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidConnectionStatusProvider.java
@@ -63,13 +63,8 @@ public AndroidConnectionStatusProvider(
return getConnectionType(context, logger, buildInfoProvider);
}
- @SuppressLint("NewApi") // we have an if-check for that down below
@Override
public boolean addConnectionStatusObserver(final @NotNull IConnectionStatusObserver observer) {
- if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) {
- logger.log(SentryLevel.DEBUG, "addConnectionStatusObserver requires Android 5+.");
- return false;
- }
final ConnectivityManager.NetworkCallback callback =
new ConnectivityManager.NetworkCallback() {
@@ -103,7 +98,7 @@ public void removeConnectionStatusObserver(final @NotNull IConnectionStatusObser
final @Nullable ConnectivityManager.NetworkCallback callback =
registeredCallbacks.remove(observer);
if (callback != null) {
- unregisterNetworkCallback(context, logger, buildInfoProvider, callback);
+ unregisterNetworkCallback(context, logger, callback);
}
}
@@ -253,13 +248,8 @@ public void removeConnectionStatusObserver(final @NotNull IConnectionStatusObser
* @param networkCapabilities the NetworkCapabilities to check the transport type
* @return the connection type wifi, ethernet, cellular or null
*/
- @SuppressLint("NewApi")
public static @Nullable String getConnectionType(
- final @NotNull NetworkCapabilities networkCapabilities,
- final @NotNull BuildInfoProvider buildInfoProvider) {
- if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) {
- return null;
- }
+ final @NotNull NetworkCapabilities networkCapabilities) {
// TODO: change the protocol to be a list of transports as a device may have the capability of
// multiple
@@ -317,11 +307,8 @@ public static boolean registerNetworkCallback(
public static void unregisterNetworkCallback(
final @NotNull Context context,
final @NotNull ILogger logger,
- final @NotNull BuildInfoProvider buildInfoProvider,
final @NotNull ConnectivityManager.NetworkCallback networkCallback) {
- if (buildInfoProvider.getSdkInfoVersion() < Build.VERSION_CODES.LOLLIPOP) {
- return;
- }
+
final ConnectivityManager connectivityManager = getConnectivityManager(context, logger);
if (connectivityManager == null) {
return;
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidMainThreadChecker.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidThreadChecker.java
similarity index 56%
rename from sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidMainThreadChecker.java
rename to sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidThreadChecker.java
index aa54790c472..15781d711fb 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidMainThreadChecker.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidThreadChecker.java
@@ -1,22 +1,28 @@
package io.sentry.android.core.internal.util;
+import android.os.Handler;
import android.os.Looper;
+import android.os.Process;
import io.sentry.protocol.SentryThread;
-import io.sentry.util.thread.IMainThreadChecker;
+import io.sentry.util.thread.IThreadChecker;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
/** Class that checks if a given thread is the Android Main/UI thread */
@ApiStatus.Internal
-public final class AndroidMainThreadChecker implements IMainThreadChecker {
+public final class AndroidThreadChecker implements IThreadChecker {
- private static final AndroidMainThreadChecker instance = new AndroidMainThreadChecker();
+ private static final AndroidThreadChecker instance = new AndroidThreadChecker();
+ public static volatile long mainThreadSystemId = Process.myTid();
- public static AndroidMainThreadChecker getInstance() {
+ public static AndroidThreadChecker getInstance() {
return instance;
}
- private AndroidMainThreadChecker() {}
+ private AndroidThreadChecker() {
+ // The first time this class is loaded, we make sure to set the correct mainThreadId
+ new Handler(Looper.getMainLooper()).post(() -> mainThreadSystemId = Process.myTid());
+ }
@Override
public boolean isMainThread(final long threadId) {
@@ -38,4 +44,9 @@ public boolean isMainThread(final @NotNull SentryThread sentryThread) {
final Long threadId = sentryThread.getId();
return threadId != null && isMainThread(threadId);
}
+
+ @Override
+ public long currentThreadSystemId() {
+ return Process.myTid();
+ }
}
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/CpuInfoUtils.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/CpuInfoUtils.java
index 8dcb994fbc9..019db99fc7d 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/CpuInfoUtils.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/CpuInfoUtils.java
@@ -1,5 +1,7 @@
package io.sentry.android.core.internal.util;
+import io.sentry.ISentryLifecycleToken;
+import io.sentry.util.AutoClosableReentrantLock;
import io.sentry.util.FileUtils;
import java.io.File;
import java.io.IOException;
@@ -14,6 +16,7 @@
public final class CpuInfoUtils {
private static final CpuInfoUtils instance = new CpuInfoUtils();
+ private final @NotNull AutoClosableReentrantLock lock = new AutoClosableReentrantLock();
public static CpuInfoUtils getInstance() {
return instance;
@@ -34,34 +37,36 @@ private CpuInfoUtils() {}
*
* @return A list with the frequency of each core of the cpu in Mhz
*/
- public synchronized @NotNull List readMaxFrequencies() {
- if (!cpuMaxFrequenciesMhz.isEmpty()) {
- return cpuMaxFrequenciesMhz;
- }
- File[] cpuDirs = new File(getSystemCpuPath()).listFiles();
- if (cpuDirs == null) {
- return new ArrayList<>();
- }
+ public @NotNull List readMaxFrequencies() {
+ try (final @NotNull ISentryLifecycleToken ignored = lock.acquire()) {
+ if (!cpuMaxFrequenciesMhz.isEmpty()) {
+ return cpuMaxFrequenciesMhz;
+ }
+ File[] cpuDirs = new File(getSystemCpuPath()).listFiles();
+ if (cpuDirs == null) {
+ return new ArrayList<>();
+ }
- for (File cpuDir : cpuDirs) {
- if (!cpuDir.getName().matches("cpu[0-9]+")) continue;
- File cpuMaxFreqFile = new File(cpuDir, CPUINFO_MAX_FREQ_PATH);
+ for (File cpuDir : cpuDirs) {
+ if (!cpuDir.getName().matches("cpu[0-9]+")) continue;
+ File cpuMaxFreqFile = new File(cpuDir, CPUINFO_MAX_FREQ_PATH);
- if (!cpuMaxFreqFile.exists() || !cpuMaxFreqFile.canRead()) continue;
+ if (!cpuMaxFreqFile.exists() || !cpuMaxFreqFile.canRead()) continue;
- long khz;
- try {
- String content = FileUtils.readText(cpuMaxFreqFile);
- if (content == null) continue;
- khz = Long.parseLong(content.trim());
- } catch (NumberFormatException e) {
- continue;
- } catch (IOException e) {
- continue;
+ long khz;
+ try {
+ String content = FileUtils.readText(cpuMaxFreqFile);
+ if (content == null) continue;
+ khz = Long.parseLong(content.trim());
+ } catch (NumberFormatException e) {
+ continue;
+ } catch (IOException e) {
+ continue;
+ }
+ cpuMaxFrequenciesMhz.add((int) (khz / 1000));
}
- cpuMaxFrequenciesMhz.add((int) (khz / 1000));
+ return cpuMaxFrequenciesMhz;
}
- return cpuMaxFrequenciesMhz;
}
@VisibleForTesting
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java
index 45e9d56877d..d6cd7bc6af9 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/ScreenshotUtils.java
@@ -14,7 +14,7 @@
import io.sentry.ILogger;
import io.sentry.SentryLevel;
import io.sentry.android.core.BuildInfoProvider;
-import io.sentry.util.thread.IMainThreadChecker;
+import io.sentry.util.thread.IThreadChecker;
import java.io.ByteArrayOutputStream;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -31,14 +31,13 @@ public class ScreenshotUtils {
final @NotNull Activity activity,
final @NotNull ILogger logger,
final @NotNull BuildInfoProvider buildInfoProvider) {
- return takeScreenshot(
- activity, AndroidMainThreadChecker.getInstance(), logger, buildInfoProvider);
+ return takeScreenshot(activity, AndroidThreadChecker.getInstance(), logger, buildInfoProvider);
}
@SuppressLint("NewApi")
public static @Nullable byte[] takeScreenshot(
final @NotNull Activity activity,
- final @NotNull IMainThreadChecker mainThreadChecker,
+ final @NotNull IThreadChecker threadChecker,
final @NotNull ILogger logger,
final @NotNull BuildInfoProvider buildInfoProvider) {
// We are keeping BuildInfoProvider param for compatibility, as it's being used by
@@ -113,7 +112,7 @@ public class ScreenshotUtils {
}
} else {
final Canvas canvas = new Canvas(bitmap);
- if (mainThreadChecker.isMainThread()) {
+ if (threadChecker.isMainThread()) {
view.draw(canvas);
latch.countDown();
} else {
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/SentryFrameMetricsCollector.java b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/SentryFrameMetricsCollector.java
index 25ff5da2bdb..ef509228dc6 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/SentryFrameMetricsCollector.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/internal/util/SentryFrameMetricsCollector.java
@@ -16,6 +16,7 @@
import io.sentry.ILogger;
import io.sentry.SentryLevel;
import io.sentry.SentryOptions;
+import io.sentry.SentryUUID;
import io.sentry.android.core.BuildInfoProvider;
import io.sentry.android.core.ContextUtils;
import io.sentry.util.Objects;
@@ -23,7 +24,6 @@
import java.lang.reflect.Field;
import java.util.Map;
import java.util.Set;
-import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.TimeUnit;
@@ -262,7 +262,7 @@ public void onActivityDestroyed(@NotNull Activity activity) {}
if (!isAvailable) {
return null;
}
- final String uid = UUID.randomUUID().toString();
+ final String uid = SentryUUID.generateSentryId();
listenerMap.put(uid, listener);
trackCurrentWindow();
return uid;
diff --git a/sentry-android-core/src/main/java/io/sentry/android/core/performance/AppStartMetrics.java b/sentry-android-core/src/main/java/io/sentry/android/core/performance/AppStartMetrics.java
index ad6c4025201..5ee32b6f7bd 100644
--- a/sentry-android-core/src/main/java/io/sentry/android/core/performance/AppStartMetrics.java
+++ b/sentry-android-core/src/main/java/io/sentry/android/core/performance/AppStartMetrics.java
@@ -10,12 +10,14 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
+import io.sentry.ISentryLifecycleToken;
import io.sentry.ITransactionProfiler;
import io.sentry.SentryDate;
import io.sentry.SentryNanotimeDate;
import io.sentry.TracesSamplingDecision;
import io.sentry.android.core.ContextUtils;
import io.sentry.android.core.SentryAndroidOptions;
+import io.sentry.util.AutoClosableReentrantLock;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -43,6 +45,8 @@ public enum AppStartType {
private static long CLASS_LOADED_UPTIME_MS = SystemClock.uptimeMillis();
private static volatile @Nullable AppStartMetrics instance;
+ public static final @NotNull AutoClosableReentrantLock staticLock =
+ new AutoClosableReentrantLock();
private @NotNull AppStartType appStartType = AppStartType.UNKNOWN;
private boolean appLaunchedInForeground = false;
@@ -60,9 +64,8 @@ public enum AppStartType {
private boolean shouldSendStartMeasurements = true;
public static @NotNull AppStartMetrics getInstance() {
-
if (instance == null) {
- synchronized (AppStartMetrics.class) {
+ try (final @NotNull ISentryLifecycleToken ignored = staticLock.acquire()) {
if (instance == null) {
instance = new AppStartMetrics();
}
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityBreadcrumbsIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityBreadcrumbsIntegrationTest.kt
index 10dc60e74b9..56dabd2fbc5 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityBreadcrumbsIntegrationTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityBreadcrumbsIntegrationTest.kt
@@ -4,7 +4,7 @@ import android.app.Activity
import android.app.Application
import android.os.Bundle
import io.sentry.Breadcrumb
-import io.sentry.Hub
+import io.sentry.Scopes
import io.sentry.SentryLevel
import org.mockito.kotlin.any
import org.mockito.kotlin.anyOrNull
@@ -20,7 +20,7 @@ class ActivityBreadcrumbsIntegrationTest {
private class Fixture {
val application = mock()
- val hub = mock()
+ val scopes = mock()
val options = SentryAndroidOptions().apply {
dsn = "https://key@sentry.io/proj"
}
@@ -28,7 +28,7 @@ class ActivityBreadcrumbsIntegrationTest {
fun getSut(enabled: Boolean = true): ActivityBreadcrumbsIntegration {
options.isEnableActivityLifecycleBreadcrumbs = enabled
- whenever(hub.options).thenReturn(options)
+ whenever(scopes.options).thenReturn(options)
return ActivityBreadcrumbsIntegration(
application
)
@@ -40,7 +40,7 @@ class ActivityBreadcrumbsIntegrationTest {
@Test
fun `When ActivityBreadcrumbsIntegration is disabled, it should not register the activity callback`() {
val sut = fixture.getSut(false)
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
verify(fixture.application, never()).registerActivityLifecycleCallbacks(any())
}
@@ -48,7 +48,7 @@ class ActivityBreadcrumbsIntegrationTest {
@Test
fun `When ActivityBreadcrumbsIntegration is enabled, it should register the activity callback`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
verify(fixture.application).registerActivityLifecycleCallbacks(any())
@@ -59,12 +59,12 @@ class ActivityBreadcrumbsIntegrationTest {
@Test
fun `When breadcrumb is added, type and category should be set`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
- verify(fixture.hub).addBreadcrumb(
+ verify(fixture.scopes).addBreadcrumb(
check {
assertEquals("ui.lifecycle", it.category)
assertEquals("navigation", it.type)
@@ -78,77 +78,77 @@ class ActivityBreadcrumbsIntegrationTest {
@Test
fun `When activity is created, it should add a breadcrumb`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
- verify(fixture.hub).addBreadcrumb(any(), anyOrNull())
+ verify(fixture.scopes).addBreadcrumb(any(), anyOrNull())
}
@Test
fun `When activity is started, it should add a breadcrumb`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityStarted(activity)
- verify(fixture.hub).addBreadcrumb(any(), anyOrNull())
+ verify(fixture.scopes).addBreadcrumb(any(), anyOrNull())
}
@Test
fun `When activity is resumed, it should add a breadcrumb`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityResumed(activity)
- verify(fixture.hub).addBreadcrumb(any(), anyOrNull())
+ verify(fixture.scopes).addBreadcrumb(any(), anyOrNull())
}
@Test
fun `When activity is paused, it should add a breadcrumb`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityPaused(activity)
- verify(fixture.hub).addBreadcrumb(any(), anyOrNull())
+ verify(fixture.scopes).addBreadcrumb(any(), anyOrNull())
}
@Test
fun `When activity is stopped, it should add a breadcrumb`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityStopped(activity)
- verify(fixture.hub).addBreadcrumb(any(), anyOrNull())
+ verify(fixture.scopes).addBreadcrumb(any(), anyOrNull())
}
@Test
fun `When activity is save instance, it should add a breadcrumb`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivitySaveInstanceState(activity, fixture.bundle)
- verify(fixture.hub).addBreadcrumb(any(), anyOrNull())
+ verify(fixture.scopes).addBreadcrumb(any(), anyOrNull())
}
@Test
fun `When activity is destroyed, it should add a breadcrumb`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityDestroyed(activity)
- verify(fixture.hub).addBreadcrumb(any(), anyOrNull())
+ verify(fixture.scopes).addBreadcrumb(any(), anyOrNull())
}
}
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt
index f42d9034157..db9912c0524 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityFramesTrackerTest.kt
@@ -30,6 +30,11 @@ class ActivityFramesTrackerTest {
val handler = mock()
val options = SentryAndroidOptions()
+ init {
+ // ActivityFramesTracker is used only if performanceV2 is disabled
+ options.isEnablePerformanceV2 = false
+ }
+
fun getSut(mockAggregator: Boolean = true): ActivityFramesTracker {
return if (mockAggregator) {
ActivityFramesTracker(loadClass, options, handler, aggregator)
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt
index e9021c68302..1a1d1dc7fef 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/ActivityLifecycleIntegrationTest.kt
@@ -14,10 +14,10 @@ import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.sentry.DateUtils
import io.sentry.FullyDisplayedReporter
-import io.sentry.Hub
import io.sentry.IScope
import io.sentry.Scope
import io.sentry.ScopeCallback
+import io.sentry.Scopes
import io.sentry.Sentry
import io.sentry.SentryDate
import io.sentry.SentryDateProvider
@@ -72,7 +72,7 @@ class ActivityLifecycleIntegrationTest {
private class Fixture {
val application = mock()
- val hub = mock()
+ val scopes = mock()
val options = SentryAndroidOptions().apply {
dsn = "https://key@sentry.io/proj"
}
@@ -92,14 +92,14 @@ class ActivityLifecycleIntegrationTest {
): ActivityLifecycleIntegration {
initializer?.configure(options)
- whenever(hub.options).thenReturn(options)
+ whenever(scopes.options).thenReturn(options)
AppStartMetrics.getInstance().isAppLaunchedInForeground = true
// We let the ActivityLifecycleIntegration create the proper transaction here
val optionCaptor = argumentCaptor()
val contextCaptor = argumentCaptor()
- whenever(hub.startTransaction(contextCaptor.capture(), optionCaptor.capture())).thenAnswer {
- val t = SentryTracer(contextCaptor.lastValue, hub, optionCaptor.lastValue)
+ whenever(scopes.startTransaction(contextCaptor.capture(), optionCaptor.capture())).thenAnswer {
+ val t = SentryTracer(contextCaptor.lastValue, scopes, optionCaptor.lastValue)
transaction = t
return@thenAnswer t
}
@@ -146,7 +146,7 @@ class ActivityLifecycleIntegrationTest {
@Test
fun `When ActivityLifecycleIntegration is registered, it registers activity callback`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
verify(fixture.application).registerActivityLifecycleCallbacks(any())
}
@@ -154,7 +154,7 @@ class ActivityLifecycleIntegrationTest {
@Test
fun `When ActivityLifecycleIntegration is closed, it should unregister the callback`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.close()
@@ -164,7 +164,7 @@ class ActivityLifecycleIntegrationTest {
@Test
fun `When ActivityLifecycleIntegration is closed, it should close the ActivityFramesTracker`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.close()
@@ -174,39 +174,39 @@ class ActivityLifecycleIntegrationTest {
@Test
fun `When tracing is disabled, do not start tracing`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
- verify(fixture.hub, never()).startTransaction(any(), any())
+ verify(fixture.scopes, never()).startTransaction(any(), any())
}
@Test
fun `When tracing is enabled but activity is running, do not start tracing again`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
sut.onActivityCreated(activity, fixture.bundle)
- verify(fixture.hub).startTransaction(any(), any())
+ verify(fixture.scopes).startTransaction(any(), any())
}
@Test
fun `Transaction op is ui_load and idle+deadline timeouts are set`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
setAppStartTime()
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
- verify(fixture.hub).startTransaction(
+ verify(fixture.scopes).startTransaction(
check {
assertEquals("ui.load", it.operation)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
@@ -214,6 +214,7 @@ class ActivityLifecycleIntegrationTest {
check { transactionOptions ->
assertEquals(fixture.options.idleTimeout, transactionOptions.idleTimeout)
assertEquals(TransactionOptions.DEFAULT_DEADLINE_TIMEOUT_AUTO_TRANSACTION, transactionOptions.deadlineTimeout)
+ assertEquals("auto.ui.activity", transactionOptions.origin)
}
)
}
@@ -222,7 +223,7 @@ class ActivityLifecycleIntegrationTest {
fun `Activity gets added to ActivityFramesTracker during transaction creation`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityStarted(activity)
@@ -234,14 +235,14 @@ class ActivityLifecycleIntegrationTest {
fun `Transaction name is the Activity's name`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
setAppStartTime()
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
- verify(fixture.hub).startTransaction(
+ verify(fixture.scopes).startTransaction(
check {
assertEquals("Activity", it.name)
assertEquals(TransactionNameSource.COMPONENT, it.transactionNameSource)
@@ -255,9 +256,9 @@ class ActivityLifecycleIntegrationTest {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
- whenever(fixture.hub.configureScope(any())).thenAnswer {
+ whenever(fixture.scopes.configureScope(any())).thenAnswer {
val scope = Scope(fixture.options)
sut.applyScope(scope, fixture.transaction)
@@ -274,11 +275,11 @@ class ActivityLifecycleIntegrationTest {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
- whenever(fixture.hub.configureScope(any())).thenAnswer {
+ whenever(fixture.scopes.configureScope(any())).thenAnswer {
val scope = Scope(fixture.options)
- val previousTransaction = SentryTracer(TransactionContext("name", "op"), fixture.hub)
+ val previousTransaction = SentryTracer(TransactionContext("name", "op"), fixture.scopes)
scope.transaction = previousTransaction
sut.applyScope(scope, fixture.transaction)
@@ -298,14 +299,14 @@ class ActivityLifecycleIntegrationTest {
it.isEnableTimeToFullDisplayTracing = true
it.idleTimeout = 200
})
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(activity, fixture.bundle)
sut.ttidSpanMap.values.first().finish()
sut.ttfdSpanMap.values.first().finish()
// then transaction should not be immediately finished
- verify(fixture.hub, never())
+ verify(fixture.scopes, never())
.captureTransaction(
anyOrNull(),
anyOrNull(),
@@ -317,7 +318,7 @@ class ActivityLifecycleIntegrationTest {
Thread.sleep(400)
// then the transaction should be finished
- verify(fixture.hub).captureTransaction(
+ verify(fixture.scopes).captureTransaction(
check {
assertEquals(SpanStatus.OK, it.status)
},
@@ -331,13 +332,13 @@ class ActivityLifecycleIntegrationTest {
fun `When tracing auto finish is enabled, it doesn't stop the transaction on onActivityPostResumed`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
sut.onActivityPostResumed(activity)
- verify(fixture.hub, never()).captureTransaction(
+ verify(fixture.scopes, never()).captureTransaction(
any(),
anyOrNull(),
anyOrNull(),
@@ -345,25 +346,11 @@ class ActivityLifecycleIntegrationTest {
)
}
- @Test
- fun `When tracing auto finish is disabled, do not finish transaction`() {
- val sut = fixture.getSut(initializer = {
- it.tracesSampleRate = 1.0
- it.isEnableActivityLifecycleTracingAutoFinish = false
- })
- sut.register(fixture.hub, fixture.options)
- val activity = mock()
- sut.onActivityCreated(activity, fixture.bundle)
- // We don't schedule the transaction to finish
- assertFalse(fixture.transaction.isFinishing())
- assertFalse(fixture.transaction.isFinished)
- }
-
@Test
fun `When tracing has status, do not overwrite it`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
@@ -373,7 +360,7 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityPostResumed(activity)
sut.onActivityDestroyed(activity)
- verify(fixture.hub).captureTransaction(
+ verify(fixture.scopes).captureTransaction(
check {
assertEquals(SpanStatus.UNKNOWN_ERROR, it.status)
},
@@ -383,35 +370,49 @@ class ActivityLifecycleIntegrationTest {
)
}
+ @Test
+ fun `When tracing auto finish is disabled, do not finish transaction`() {
+ val sut = fixture.getSut(initializer = {
+ it.tracesSampleRate = 1.0
+ it.isEnableActivityLifecycleTracingAutoFinish = false
+ })
+ sut.register(fixture.scopes, fixture.options)
+ val activity = mock()
+ sut.onActivityCreated(activity, fixture.bundle)
+ // We don't schedule the transaction to finish
+ assertFalse(fixture.transaction.isFinishing())
+ assertFalse(fixture.transaction.isFinished)
+ }
+
@Test
fun `When tracing is disabled, do not finish transaction`() {
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityPostResumed(activity)
- verify(fixture.hub, never()).captureTransaction(any(), anyOrNull(), anyOrNull(), anyOrNull())
+ verify(fixture.scopes, never()).captureTransaction(any(), anyOrNull(), anyOrNull(), anyOrNull())
}
@Test
fun `When Activity is destroyed but transaction is running, finish it`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
sut.onActivityDestroyed(activity)
- verify(fixture.hub).captureTransaction(any(), anyOrNull(), anyOrNull(), anyOrNull())
+ verify(fixture.scopes).captureTransaction(any(), anyOrNull(), anyOrNull(), anyOrNull())
}
@Test
fun `When transaction is started, adds to WeakWef`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
@@ -423,7 +424,7 @@ class ActivityLifecycleIntegrationTest {
fun `When Activity is destroyed removes WeakRef`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
@@ -436,7 +437,7 @@ class ActivityLifecycleIntegrationTest {
fun `When Activity is destroyed, sets appStartSpan status to cancelled and finish it`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
setAppStartTime()
@@ -453,7 +454,7 @@ class ActivityLifecycleIntegrationTest {
fun `When Activity is destroyed, sets appStartSpan to null`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
setAppStartTime()
@@ -468,7 +469,7 @@ class ActivityLifecycleIntegrationTest {
fun `When Activity is destroyed, finish ttidSpan with deadline_exceeded and remove from map`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
setAppStartTime()
@@ -480,6 +481,21 @@ class ActivityLifecycleIntegrationTest {
val span = fixture.transaction.children.first { it.operation == ActivityLifecycleIntegration.TTID_OP }
assertEquals(SpanStatus.DEADLINE_EXCEEDED, span.status)
assertTrue(span.isFinished)
+ }
+
+ @Test
+ fun `When Activity is destroyed, sets ttidSpan to null`() {
+ val sut = fixture.getSut()
+ fixture.options.tracesSampleRate = 1.0
+ sut.register(fixture.scopes, fixture.options)
+
+ setAppStartTime()
+
+ val activity = mock()
+ sut.onActivityCreated(activity, fixture.bundle)
+ assertNotNull(sut.ttidSpanMap[activity])
+
+ sut.onActivityDestroyed(activity)
assertNull(sut.ttidSpanMap[activity])
}
@@ -488,7 +504,7 @@ class ActivityLifecycleIntegrationTest {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = true
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
setAppStartTime()
@@ -500,6 +516,22 @@ class ActivityLifecycleIntegrationTest {
val span = fixture.transaction.children.first { it.operation == ActivityLifecycleIntegration.TTFD_OP }
assertEquals(SpanStatus.DEADLINE_EXCEEDED, span.status)
assertTrue(span.isFinished)
+ }
+
+ @Test
+ fun `When Activity is destroyed, sets ttfdSpan to null`() {
+ val sut = fixture.getSut()
+ fixture.options.tracesSampleRate = 1.0
+ fixture.options.isEnableTimeToFullDisplayTracing = true
+ sut.register(fixture.scopes, fixture.options)
+
+ setAppStartTime()
+
+ val activity = mock()
+ sut.onActivityCreated(activity, fixture.bundle)
+ assertNotNull(sut.ttfdSpanMap[activity])
+
+ sut.onActivityDestroyed(activity)
assertNull(sut.ttfdSpanMap[activity])
}
@@ -507,35 +539,35 @@ class ActivityLifecycleIntegrationTest {
fun `When new Activity and transaction is created, finish previous ones`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(mock(), mock())
sut.onActivityCreated(mock(), fixture.bundle)
- verify(fixture.hub).captureTransaction(any(), anyOrNull(), anyOrNull(), anyOrNull())
+ verify(fixture.scopes).captureTransaction(any(), anyOrNull(), anyOrNull(), anyOrNull())
}
@Test
fun `do not stop transaction on resumed`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, mock())
sut.onActivityResumed(activity)
- verify(fixture.hub, never()).captureTransaction(any(), any(), anyOrNull(), anyOrNull())
+ verify(fixture.scopes, never()).captureTransaction(any(), any(), anyOrNull(), anyOrNull())
}
@Test
fun `start transaction on created`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(mock(), mock())
- verify(fixture.hub).startTransaction(any(), any())
+ verify(fixture.scopes).startTransaction(any(), any())
}
@Test
@@ -544,7 +576,7 @@ class ActivityLifecycleIntegrationTest {
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = true
fixture.options.idleTimeout = 0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, mock())
@@ -563,7 +595,7 @@ class ActivityLifecycleIntegrationTest {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = true
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, mock())
@@ -585,7 +617,7 @@ class ActivityLifecycleIntegrationTest {
fullyDisplayedReporter = ttfdReporter
}
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, mock())
@@ -597,7 +629,7 @@ class ActivityLifecycleIntegrationTest {
fun `App start is Cold when savedInstanceState is null`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, null)
@@ -609,7 +641,7 @@ class ActivityLifecycleIntegrationTest {
fun `App start is Warm when savedInstanceState is not null`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
val bundle = Bundle()
@@ -622,7 +654,7 @@ class ActivityLifecycleIntegrationTest {
fun `Do not overwrite App start type after set`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
val bundle = Bundle()
@@ -636,7 +668,7 @@ class ActivityLifecycleIntegrationTest {
fun `When firstActivityCreated is false, start transaction with given appStartTime`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(false)
val date = SentryNanotimeDate(Date(1), 0)
@@ -648,7 +680,7 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityCreated(activity, fixture.bundle)
// call only once
- verify(fixture.hub).startTransaction(
+ verify(fixture.scopes).startTransaction(
any(),
check {
assertEquals(date.nanoTimestamp(), it.startTimestamp!!.nanoTimestamp())
@@ -660,7 +692,7 @@ class ActivityLifecycleIntegrationTest {
fun `When firstActivityCreated is false and app start sampling decision is set, start transaction with isAppStart true`() {
AppStartMetrics.getInstance().appStartSamplingDecision = mock()
val sut = fixture.getSut { it.tracesSampleRate = 1.0 }
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(false)
val date = SentryNanotimeDate(Date(1), 0)
@@ -670,7 +702,7 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityPreCreated(activity, fixture.bundle)
sut.onActivityCreated(activity, fixture.bundle)
- verify(fixture.hub).startTransaction(
+ verify(fixture.scopes).startTransaction(
any(),
check {
assertEquals(date.nanoTimestamp(), it.startTimestamp!!.nanoTimestamp())
@@ -682,7 +714,7 @@ class ActivityLifecycleIntegrationTest {
@Test
fun `When firstActivityCreated is false and app start sampling decision is not set, start transaction with isAppStart false`() {
val sut = fixture.getSut { it.tracesSampleRate = 1.0 }
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(false)
val date = SentryNanotimeDate(Date(1), 0)
@@ -695,7 +727,7 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityPreCreated(activity, fixture.bundle)
sut.onActivityCreated(activity, fixture.bundle)
- verify(fixture.hub).startTransaction(
+ verify(fixture.scopes).startTransaction(
any(),
check {
assertEquals(date.nanoTimestamp(), it.startTimestamp!!.nanoTimestamp())
@@ -709,7 +741,7 @@ class ActivityLifecycleIntegrationTest {
fun `When firstActivityCreated is true and app start sampling decision is set, start transaction with isAppStart false`() {
AppStartMetrics.getInstance().appStartSamplingDecision = mock()
val sut = fixture.getSut { it.tracesSampleRate = 1.0 }
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(true)
val date = SentryNanotimeDate(Date(1), 0)
setAppStartTime(date)
@@ -718,14 +750,14 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityPreCreated(activity, fixture.bundle)
sut.onActivityCreated(activity, fixture.bundle)
- verify(fixture.hub).startTransaction(any(), check { assertFalse(it.isAppStartTransaction) })
+ verify(fixture.scopes).startTransaction(any(), check { assertFalse(it.isAppStartTransaction) })
}
@Test
fun `When firstActivityCreated is false and no app start time is set, default to onActivityPreCreated time`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(false)
// usually set by SentryPerformanceProvider
@@ -738,7 +770,7 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityPreCreated(activity, fixture.bundle)
sut.onActivityCreated(activity, fixture.bundle)
- verify(fixture.hub).startTransaction(
+ verify(fixture.scopes).startTransaction(
any(),
check {
assertEquals(date2.nanoTimestamp(), it.startTimestamp!!.nanoTimestamp())
@@ -751,7 +783,7 @@ class ActivityLifecycleIntegrationTest {
fun `When not foregroundImportance, do not create app start span`() {
val sut = fixture.getSut(importance = RunningAppProcessInfo.IMPORTANCE_BACKGROUND)
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
// usually set by SentryPerformanceProvider
val date = SentryNanotimeDate(Date(1), 0)
@@ -762,7 +794,7 @@ class ActivityLifecycleIntegrationTest {
sut.onActivityCreated(activity, fixture.bundle)
// call only once
- verify(fixture.hub).startTransaction(
+ verify(fixture.scopes).startTransaction(
any(),
check { assertNotEquals(date.nanoTimestamp(), it.startTimestamp!!.nanoTimestamp()) }
)
@@ -772,7 +804,7 @@ class ActivityLifecycleIntegrationTest {
fun `Create and finish app start span immediately in case SDK init is deferred`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
// usually set by SentryPerformanceProvider
val startDate = SentryNanotimeDate(Date(1), 0)
@@ -780,24 +812,28 @@ class ActivityLifecycleIntegrationTest {
val appStartMetrics = AppStartMetrics.getInstance()
appStartMetrics.appStartType = AppStartType.WARM
appStartMetrics.sdkInitTimeSpan.setStoppedAt(2)
-
- val endDate = appStartMetrics.sdkInitTimeSpan.projectedStopTimestamp
+ appStartMetrics.appStartTimeSpan.setStoppedAt(2)
val activity = mock()
- sut.onActivityPreCreated(activity, fixture.bundle)
- sut.onActivityCreated(activity, fixture.bundle)
+ // An Activity already started, as SDK init is deferred
+ sut.onActivityPrePaused(activity)
+ sut.onActivityPaused(activity)
+ // And when we create a new Activity
+ sut.onActivityPreCreated(activity, null)
+ sut.onActivityCreated(activity, null)
+ sut.onActivityStopped(activity)
+ sut.onActivityDestroyed(activity)
- val appStartSpan = fixture.transaction.children.first { it.operation.startsWith("app.start.warm") }
- assertEquals(startDate.nanoTimestamp(), appStartSpan.startDate.nanoTimestamp())
- assertEquals(endDate!!.nanoTimestamp(), appStartSpan.finishDate!!.nanoTimestamp())
- assertTrue(appStartSpan.isFinished)
+ // No app start span is created
+ val appStartSpan = fixture.transaction.children.firstOrNull { it.operation.startsWith("app.start.warm") || it.operation.startsWith("app.start.cold") }
+ assertNull(appStartSpan)
}
@Test
fun `When SentryPerformanceProvider is disabled, app start time span is still created`() {
val sut = fixture.getSut(importance = RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
// usually done by SentryPerformanceProvider, if disabled it's done by
// SentryAndroid.init
@@ -825,7 +861,7 @@ class ActivityLifecycleIntegrationTest {
fun `When app-start end time is already set, it should not be overwritten`() {
val sut = fixture.getSut(importance = RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
// usually done by SentryPerformanceProvider
val startDate = SentryNanotimeDate(Date(1), 0)
@@ -849,7 +885,7 @@ class ActivityLifecycleIntegrationTest {
fun `When activity lifecycle happens multiple times, app-start end time should not be overwritten`() {
val sut = fixture.getSut(importance = RunningAppProcessInfo.IMPORTANCE_FOREGROUND)
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
// usually done by SentryPerformanceProvider
val startDate = SentryNanotimeDate(Date(1), 0)
@@ -887,7 +923,7 @@ class ActivityLifecycleIntegrationTest {
fun `When firstActivityCreated is false and bundle is not null, start app start warm span with given appStartTime`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(false)
val date = SentryNanotimeDate(Date(1), 0)
@@ -907,7 +943,7 @@ class ActivityLifecycleIntegrationTest {
fun `When firstActivityCreated is false and bundle is not null, start app start cold span with given appStartTime`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(false)
val date = SentryNanotimeDate(Date(1), 0)
@@ -926,7 +962,7 @@ class ActivityLifecycleIntegrationTest {
fun `When firstActivityCreated is false and app started more than 1 minute ago, start app with Warm start`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(false)
val date = SentryNanotimeDate(Date(1), 0)
@@ -942,7 +978,7 @@ class ActivityLifecycleIntegrationTest {
val span = fixture.transaction.children.first()
assertEquals(span.operation, "app.start.warm")
assertEquals(span.description, "Warm Start")
- assertEquals(span.startDate.nanoTimestamp(), date.nanoTimestamp())
+ assertNotEquals(span.startDate.nanoTimestamp(), date.nanoTimestamp())
}
@Test
@@ -950,7 +986,7 @@ class ActivityLifecycleIntegrationTest {
val sut = fixture.getSut()
AppStartMetrics.getInstance().isAppLaunchedInForeground = false
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(false)
val date = SentryNanotimeDate(Date(1), 0)
@@ -963,14 +999,54 @@ class ActivityLifecycleIntegrationTest {
val span = fixture.transaction.children.first()
assertEquals(span.operation, "app.start.warm")
assertEquals(span.description, "Warm Start")
- assertEquals(span.startDate.nanoTimestamp(), date.nanoTimestamp())
+ assertNotEquals(span.startDate.nanoTimestamp(), date.nanoTimestamp())
+ }
+
+ @Test
+ fun `When firstActivityCreated is true and app started more than 1 minute ago, app start spans are dropped`() {
+ val sut = fixture.getSut()
+ fixture.options.tracesSampleRate = 1.0
+ sut.register(fixture.scopes, fixture.options)
+
+ val date = SentryNanotimeDate(Date(1), 0)
+ val duration = TimeUnit.MINUTES.toMillis(1) + 2
+ val durationNanos = TimeUnit.MILLISECONDS.toNanos(duration)
+ val stopDate = SentryNanotimeDate(Date(duration), durationNanos)
+ setAppStartTime(date, stopDate)
+
+ val activity = mock()
+ sut.onActivityCreated(activity, null)
+
+ val appStartSpan = fixture.transaction.children.firstOrNull {
+ it.description == "Cold Start"
+ }
+ assertNull(appStartSpan)
+ }
+
+ @Test
+ fun `When firstActivityCreated is true and app started in background, app start spans are dropped`() {
+ val sut = fixture.getSut()
+ AppStartMetrics.getInstance().isAppLaunchedInForeground = false
+ fixture.options.tracesSampleRate = 1.0
+ sut.register(fixture.scopes, fixture.options)
+
+ val date = SentryNanotimeDate(Date(1), 0)
+ setAppStartTime(date)
+
+ val activity = mock()
+ sut.onActivityCreated(activity, null)
+
+ val appStartSpan = fixture.transaction.children.firstOrNull {
+ it.description == "Cold Start"
+ }
+ assertNull(appStartSpan)
}
@Test
fun `When firstActivityCreated is true, start transaction but not with given appStartTime`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(true)
val date = SentryNanotimeDate(Date(1), 0)
@@ -987,12 +1063,12 @@ class ActivityLifecycleIntegrationTest {
fun `When transaction is finished, it gets removed from scope`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
- whenever(fixture.hub.configureScope(any())).thenAnswer {
+ whenever(fixture.scopes.configureScope(any())).thenAnswer {
val scope = Scope(fixture.options)
scope.transaction = fixture.transaction
@@ -1010,7 +1086,7 @@ class ActivityLifecycleIntegrationTest {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = false
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
@@ -1023,7 +1099,7 @@ class ActivityLifecycleIntegrationTest {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = true
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
@@ -1038,7 +1114,7 @@ class ActivityLifecycleIntegrationTest {
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = true
fixture.options.executorService = deferredExecutorService
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
val ttfdSpan = sut.ttfdSpanMap[activity]
@@ -1054,7 +1130,7 @@ class ActivityLifecycleIntegrationTest {
assertEquals(SpanStatus.DEADLINE_EXCEEDED, ttfdSpan.status)
sut.onActivityDestroyed(activity)
- verify(fixture.hub).captureTransaction(
+ verify(fixture.scopes).captureTransaction(
check {
// ttfd timed out, so its measurement should not be set
val ttfdMeasurement = it.measurements[MeasurementValue.KEY_TIME_TO_FULL_DISPLAY]
@@ -1071,7 +1147,7 @@ class ActivityLifecycleIntegrationTest {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = true
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
val ttfdSpan = sut.ttfdSpanMap[activity]
@@ -1094,7 +1170,7 @@ class ActivityLifecycleIntegrationTest {
assertNull(autoCloseFuture)
sut.onActivityDestroyed(activity)
- verify(fixture.hub).captureTransaction(
+ verify(fixture.scopes).captureTransaction(
check {
// ttfd was finished successfully, so its measurement should be set
val ttfdMeasurement = it.measurements[MeasurementValue.KEY_TIME_TO_FULL_DISPLAY]
@@ -1112,7 +1188,7 @@ class ActivityLifecycleIntegrationTest {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = true
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
val activity2 = mock()
sut.onActivityCreated(activity, fixture.bundle)
@@ -1150,7 +1226,7 @@ class ActivityLifecycleIntegrationTest {
whenever(activity.findViewById(any())).thenReturn(view)
// Make the integration create the spans and register to the FirstDrawDoneListener
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(activity, fixture.bundle)
sut.onActivityResumed(activity)
@@ -1165,7 +1241,7 @@ class ActivityLifecycleIntegrationTest {
assertTrue(ttidSpan.isFinished)
sut.onActivityDestroyed(activity)
- verify(fixture.hub).captureTransaction(
+ verify(fixture.scopes).captureTransaction(
check {
// ttid measurement should be set
val ttidMeasurement = it.measurements[MeasurementValue.KEY_TIME_TO_INITIAL_DISPLAY]
@@ -1188,7 +1264,7 @@ class ActivityLifecycleIntegrationTest {
whenever(activity.findViewById(any())).thenReturn(view)
// Make the integration create the spans and register to the FirstDrawDoneListener
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(activity, fixture.bundle)
sut.onActivityResumed(activity)
@@ -1211,7 +1287,7 @@ class ActivityLifecycleIntegrationTest {
assertEquals(newEndDate, ttidSpan.finishDate)
sut.onActivityDestroyed(activity)
- verify(fixture.hub).captureTransaction(
+ verify(fixture.scopes).captureTransaction(
check {
// ttid and ttfd measurements should be the same
val ttidMeasurement = it.measurements[MeasurementValue.KEY_TIME_TO_INITIAL_DISPLAY]
@@ -1233,7 +1309,7 @@ class ActivityLifecycleIntegrationTest {
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = true
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(activity, fixture.bundle)
// The ttid span should be running
@@ -1255,7 +1331,7 @@ class ActivityLifecycleIntegrationTest {
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = true
fixture.options.executorService = deferredExecutorService
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(activity, fixture.bundle)
sut.onActivityResumed(activity)
@@ -1290,7 +1366,7 @@ class ActivityLifecycleIntegrationTest {
fixture.options.tracesSampleRate = 1.0
fixture.options.isEnableTimeToFullDisplayTracing = true
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(activity, fixture.bundle)
val ttfdSpan = sut.ttfdSpanMap[activity]
assertNotNull(ttfdSpan)
@@ -1311,20 +1387,20 @@ class ActivityLifecycleIntegrationTest {
fun `starts new trace if performance is disabled`() {
val sut = fixture.getSut()
val activity = mock()
- fixture.options.enableTracing = false
+ fixture.options.tracesSampleRate = null
val argumentCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ScopeCallback::class.java)
val scope = Scope(fixture.options)
val propagationContextAtStart = scope.propagationContext
- whenever(fixture.hub.configureScope(argumentCaptor.capture())).thenAnswer {
+ whenever(fixture.scopes.configureScope(argumentCaptor.capture())).thenAnswer {
argumentCaptor.value.run(scope)
}
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(activity, fixture.bundle)
// once for the screen, and once for the tracing propagation context
- verify(fixture.hub, times(2)).configureScope(any())
+ verify(fixture.scopes, times(2)).configureScope(any())
assertNotSame(propagationContextAtStart, scope.propagationContext)
}
@@ -1332,19 +1408,19 @@ class ActivityLifecycleIntegrationTest {
fun `sets the activity as the current screen`() {
val sut = fixture.getSut()
val activity = mock()
- fixture.options.enableTracing = false
+ fixture.options.tracesSampleRate = null
val argumentCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ScopeCallback::class.java)
val scope = mock()
- whenever(fixture.hub.configureScope(argumentCaptor.capture())).thenAnswer {
+ whenever(fixture.scopes.configureScope(argumentCaptor.capture())).thenAnswer {
argumentCaptor.value.run(scope)
}
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(activity, fixture.bundle)
// once for the screen, and once for the tracing propagation context
- verify(fixture.hub, times(2)).configureScope(any())
+ verify(fixture.scopes, times(2)).configureScope(any())
verify(scope).setScreen(any())
}
@@ -1352,37 +1428,37 @@ class ActivityLifecycleIntegrationTest {
fun `does not start another new trace if one has already been started but does after activity was destroyed`() {
val sut = fixture.getSut()
val activity = mock()
- fixture.options.enableTracing = false
+ fixture.options.tracesSampleRate = null
val argumentCaptor: ArgumentCaptor = ArgumentCaptor.forClass(ScopeCallback::class.java)
val scope = Scope(fixture.options)
val propagationContextAtStart = scope.propagationContext
- whenever(fixture.hub.configureScope(argumentCaptor.capture())).thenAnswer {
+ whenever(fixture.scopes.configureScope(argumentCaptor.capture())).thenAnswer {
argumentCaptor.value.run(scope)
}
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.onActivityCreated(activity, fixture.bundle)
// once for the screen, and once for the tracing propagation context
- verify(fixture.hub, times(2)).configureScope(any())
+ verify(fixture.scopes, times(2)).configureScope(any())
val propagationContextAfterNewTrace = scope.propagationContext
assertNotSame(propagationContextAtStart, propagationContextAfterNewTrace)
- clearInvocations(fixture.hub)
+ clearInvocations(fixture.scopes)
sut.onActivityCreated(activity, fixture.bundle)
// once for the screen, but not for the tracing propagation context
- verify(fixture.hub).configureScope(any())
+ verify(fixture.scopes).configureScope(any())
assertSame(propagationContextAfterNewTrace, scope.propagationContext)
sut.onActivityDestroyed(activity)
- clearInvocations(fixture.hub)
+ clearInvocations(fixture.scopes)
sut.onActivityCreated(activity, fixture.bundle)
// once for the screen, and once for the tracing propagation context
- verify(fixture.hub, times(2)).configureScope(any())
+ verify(fixture.scopes, times(2)).configureScope(any())
assertNotSame(propagationContextAfterNewTrace, scope.propagationContext)
}
@@ -1390,7 +1466,7 @@ class ActivityLifecycleIntegrationTest {
fun `when transaction is finished, sets frame metrics`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val activity = mock()
sut.onActivityCreated(activity, fixture.bundle)
@@ -1406,7 +1482,7 @@ class ActivityLifecycleIntegrationTest {
fixture.options.tracesSampleRate = 1.0
fixture.options.dateProvider = SentryDateProvider { now }
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
// usually done by SentryPerformanceProvider
val startDate = SentryNanotimeDate(Date(5678), 910)
@@ -1431,7 +1507,7 @@ class ActivityLifecycleIntegrationTest {
fun `On activity preCreated onCreate span is started`() {
val sut = fixture.getSut()
fixture.options.tracesSampleRate = 1.0
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
val date = SentryNanotimeDate(Date(1), 0)
setAppStartTime(date)
@@ -1457,7 +1533,7 @@ class ActivityLifecycleIntegrationTest {
fixture.options.dateProvider = SentryDateProvider { startDate }
setAppStartTime(appStartDate)
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
assertTrue(sut.activitySpanHelpers.isEmpty())
sut.onActivityPreCreated(activity, null)
@@ -1492,7 +1568,7 @@ class ActivityLifecycleIntegrationTest {
val activity = mock()
setAppStartTime()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
assertTrue(sut.activitySpanHelpers.isEmpty())
sut.onActivityPreCreated(activity, null)
@@ -1516,7 +1592,7 @@ class ActivityLifecycleIntegrationTest {
fixture.options.dateProvider = SentryDateProvider { startDate }
setAppStartTime(appStartDate)
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
assertTrue(sut.activitySpanHelpers.isEmpty())
sut.onActivityCreated(activity, null)
@@ -1545,7 +1621,7 @@ class ActivityLifecycleIntegrationTest {
val activity = mock()
setAppStartTime()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
assertTrue(sut.activitySpanHelpers.isEmpty())
sut.onActivityCreated(activity, null)
@@ -1565,7 +1641,7 @@ class ActivityLifecycleIntegrationTest {
val activity = mock()
fixture.options.dateProvider = SentryDateProvider { startDate }
setAppStartTime(appStartDate)
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
sut.setFirstActivityCreated(true)
sut.onActivityPreCreated(activity, null)
@@ -1587,7 +1663,7 @@ class ActivityLifecycleIntegrationTest {
setAppStartTime(appStartDate)
// Let's pretend app start started and finished
appStartMetrics.appStartTimeSpan.stop()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
assertEquals(0, sut.getProperty("lastPausedUptimeMillis"))
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidConnectionStatusProviderTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidConnectionStatusProviderTest.kt
index 359fee49cc0..d10cdea35e1 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidConnectionStatusProviderTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidConnectionStatusProviderTest.kt
@@ -4,9 +4,6 @@ import android.content.Context
import android.content.pm.PackageManager.PERMISSION_DENIED
import android.net.ConnectivityManager
import android.net.ConnectivityManager.NetworkCallback
-import android.net.ConnectivityManager.TYPE_ETHERNET
-import android.net.ConnectivityManager.TYPE_MOBILE
-import android.net.ConnectivityManager.TYPE_WIFI
import android.net.Network
import android.net.NetworkCapabilities
import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
@@ -112,14 +109,6 @@ class AndroidConnectionStatusProviderTest {
assertNull(AndroidConnectionStatusProvider.getConnectionType(mock(), mock(), buildInfo))
}
- @Test
- fun `When sdkInfoVersion is not min Marshmallow, return null for getConnectionType`() {
- val buildInfo = mock()
- whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT)
-
- assertNull(AndroidConnectionStatusProvider.getConnectionType(mock(), mock(), buildInfo))
- }
-
@Test
fun `When there's no permission, return null for getConnectionType`() {
whenever(contextMock.checkPermission(any(), any(), any())).thenReturn(PERMISSION_DENIED)
@@ -146,14 +135,6 @@ class AndroidConnectionStatusProviderTest {
assertEquals("wifi", AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo))
}
- @Test
- fun `When network is TYPE_WIFI, return wifi`() {
- whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT)
- whenever(networkInfo.type).thenReturn(TYPE_WIFI)
-
- assertEquals("wifi", AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo))
- }
-
@Test
fun `When network capabilities has TRANSPORT_ETHERNET, return ethernet`() {
whenever(networkCapabilities.hasTransport(eq(TRANSPORT_ETHERNET))).thenReturn(true)
@@ -164,17 +145,6 @@ class AndroidConnectionStatusProviderTest {
)
}
- @Test
- fun `When network is TYPE_ETHERNET, return ethernet`() {
- whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT)
- whenever(networkInfo.type).thenReturn(TYPE_ETHERNET)
-
- assertEquals(
- "ethernet",
- AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo)
- )
- }
-
@Test
fun `When network capabilities has TRANSPORT_CELLULAR, return cellular`() {
whenever(networkCapabilities.hasTransport(eq(TRANSPORT_CELLULAR))).thenReturn(true)
@@ -185,17 +155,6 @@ class AndroidConnectionStatusProviderTest {
)
}
- @Test
- fun `When network is TYPE_MOBILE, return cellular`() {
- whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT)
- whenever(networkInfo.type).thenReturn(TYPE_MOBILE)
-
- assertEquals(
- "cellular",
- AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo)
- )
- }
-
@Test
fun `When there's no permission, do not register any NetworkCallback`() {
val buildInfo = mock()
@@ -231,20 +190,10 @@ class AndroidConnectionStatusProviderTest {
verify(connectivityManager).registerDefaultNetworkCallback(any())
}
- @Test
- fun `When sdkInfoVersion is not min Lollipop, do not unregister any NetworkCallback`() {
- val buildInfo = mock()
- whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT)
- whenever(contextMock.getSystemService(any())).thenReturn(connectivityManager)
- AndroidConnectionStatusProvider.unregisterNetworkCallback(contextMock, mock(), buildInfo, mock())
-
- verify(connectivityManager, never()).unregisterNetworkCallback(any())
- }
-
@Test
fun `unregisterNetworkCallback calls connectivityManager unregisterDefaultNetworkCallback`() {
whenever(contextMock.getSystemService(any())).thenReturn(connectivityManager)
- AndroidConnectionStatusProvider.unregisterNetworkCallback(contextMock, mock(), buildInfo, mock())
+ AndroidConnectionStatusProvider.unregisterNetworkCallback(contextMock, mock(), mock())
verify(connectivityManager).unregisterNetworkCallback(any())
}
@@ -257,15 +206,6 @@ class AndroidConnectionStatusProviderTest {
assertNull(AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo))
}
- @Test
- fun `When connectivityManager getActiveNetworkInfo throws an exception, getConnectionType returns null`() {
- whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT)
- whenever(connectivityManager.activeNetworkInfo).thenThrow(SecurityException("Android OS Bug"))
-
- assertNull(AndroidConnectionStatusProvider.getConnectionType(contextMock, mock(), buildInfo))
- assertEquals(IConnectionStatusProvider.ConnectionStatus.UNKNOWN, connectionStatusProvider.connectionStatus)
- }
-
@Test
fun `When connectivityManager registerDefaultCallback throws an exception, false is returned`() {
whenever(connectivityManager.registerDefaultNetworkCallback(any())).thenThrow(
@@ -289,7 +229,7 @@ class AndroidConnectionStatusProviderTest {
var failed = false
try {
- AndroidConnectionStatusProvider.unregisterNetworkCallback(contextMock, mock(), buildInfo, mock())
+ AndroidConnectionStatusProvider.unregisterNetworkCallback(contextMock, mock(), mock())
} catch (t: Throwable) {
failed = true
}
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidCpuCollectorTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidCpuCollectorTest.kt
index 45010255e8d..7f54b2c3539 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidCpuCollectorTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidCpuCollectorTest.kt
@@ -1,11 +1,9 @@
package io.sentry.android.core
-import android.os.Build
import io.sentry.ILogger
import io.sentry.PerformanceCollectionData
import io.sentry.test.getCtor
import org.mockito.kotlin.mock
-import org.mockito.kotlin.whenever
import kotlin.test.Test
import kotlin.test.assertFailsWith
import kotlin.test.assertNotEquals
@@ -15,16 +13,11 @@ import kotlin.test.assertNull
class AndroidCpuCollectorTest {
private val className = "io.sentry.android.core.AndroidCpuCollector"
- private val ctorTypes = arrayOf(ILogger::class.java, BuildInfoProvider::class.java)
+ private val ctorTypes = arrayOf>(ILogger::class.java)
private val fixture = Fixture()
private class Fixture {
- private val mockBuildInfoProvider = mock()
- init {
- whenever(mockBuildInfoProvider.sdkInfoVersion).thenReturn(Build.VERSION_CODES.LOLLIPOP)
- }
- fun getSut(buildInfoProvider: BuildInfoProvider = mockBuildInfoProvider) =
- AndroidCpuCollector(mock(), buildInfoProvider)
+ fun getSut() = AndroidCpuCollector(mock())
}
@Test
@@ -32,10 +25,7 @@ class AndroidCpuCollectorTest {
val ctor = className.getCtor(ctorTypes)
assertFailsWith {
- ctor.newInstance(arrayOf(null, mock()))
- }
- assertFailsWith {
- ctor.newInstance(arrayOf(mock(), null))
+ ctor.newInstance(arrayOf(mock()))
}
}
@@ -57,15 +47,4 @@ class AndroidCpuCollectorTest {
assertNotEquals(0.0, cpuData.cpuUsagePercentage)
assertNotEquals(0, cpuData.timestampMillis)
}
-
- @Test
- fun `collector works only on api 21+`() {
- val data = PerformanceCollectionData()
- val mockBuildInfoProvider = mock()
- whenever(mockBuildInfoProvider.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT)
- val collector = fixture.getSut(mockBuildInfoProvider)
- collector.setup()
- collector.collect(data)
- assertNull(data.cpuData)
- }
}
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt
index ed2fa3338a5..95ca59a06e2 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt
@@ -13,7 +13,7 @@ import io.sentry.SentryOptions
import io.sentry.android.core.cache.AndroidEnvelopeCache
import io.sentry.android.core.internal.gestures.AndroidViewGestureTargetLocator
import io.sentry.android.core.internal.modules.AssetsModulesLoader
-import io.sentry.android.core.internal.util.AndroidMainThreadChecker
+import io.sentry.android.core.internal.util.AndroidThreadChecker
import io.sentry.android.fragment.FragmentLifecycleIntegration
import io.sentry.android.replay.ReplayIntegration
import io.sentry.android.timber.SentryTimberIntegration
@@ -98,7 +98,6 @@ class AndroidOptionsInitializerTest {
}
fun initSutWithClassLoader(
- minApi: Int = Build.VERSION_CODES.KITKAT,
classesToLoad: List = emptyList(),
isFragmentAvailable: Boolean = false,
isTimberAvailable: Boolean = false,
@@ -111,7 +110,7 @@ class AndroidOptionsInitializerTest {
}
)
sentryOptions.isDebug = true
- val buildInfo = createBuildInfo(minApi)
+ val buildInfo = createBuildInfo()
val loadClass = createClassMock(classesToLoad)
val activityFramesTracker = ActivityFramesTracker(loadClass, sentryOptions)
@@ -142,9 +141,9 @@ class AndroidOptionsInitializerTest {
)
}
- private fun createBuildInfo(minApi: Int): BuildInfoProvider {
+ private fun createBuildInfo(): BuildInfoProvider {
val buildInfo = mock()
- whenever(buildInfo.sdkInfoVersion).thenReturn(minApi)
+ whenever(buildInfo.sdkInfoVersion).thenReturn(Build.VERSION_CODES.LOLLIPOP)
return buildInfo
}
@@ -524,7 +523,7 @@ class AndroidOptionsInitializerTest {
}
@Test
- fun `When Activity Frames Tracking is enabled, the Activity Frames Tracker should be available`() {
+ fun `When Activity Frames Tracking is enabled, the Activity Frames Tracker should be unavailable`() {
fixture.initSut(
hasAppContext = true,
useRealContext = true,
@@ -533,6 +532,25 @@ class AndroidOptionsInitializerTest {
}
)
+ val activityLifeCycleIntegration = fixture.sentryOptions.integrations
+ .first { it is ActivityLifecycleIntegration }
+
+ assertFalse(
+ (activityLifeCycleIntegration as ActivityLifecycleIntegration).activityFramesTracker.isFrameMetricsAggregatorAvailable
+ )
+ }
+
+ @Test
+ fun `When Activity Frames Tracking is enabled, the Activity Frames Tracker should be available if perfv2 is false`() {
+ fixture.initSut(
+ hasAppContext = true,
+ useRealContext = true,
+ configureOptions = {
+ isEnablePerformanceV2 = false
+ isEnableFramesTracking = true
+ }
+ )
+
val activityLifeCycleIntegration = fixture.sentryOptions.integrations
.first { it is ActivityLifecycleIntegration }
@@ -556,12 +574,32 @@ class AndroidOptionsInitializerTest {
}
@Test
- fun `When Frames Tracking is initially disabled, but enabled via configureOptions it should be available`() {
+ fun `When Frames Tracking is initially disabled, but enabled via configureOptions it should be unavailable`() {
+ fixture.sentryOptions.isEnableFramesTracking = false
+ fixture.initSut(
+ hasAppContext = true,
+ useRealContext = true,
+ configureOptions = {
+ isEnableFramesTracking = true
+ }
+ )
+
+ val activityLifeCycleIntegration = fixture.sentryOptions.integrations
+ .first { it is ActivityLifecycleIntegration }
+
+ assertFalse(
+ (activityLifeCycleIntegration as ActivityLifecycleIntegration).activityFramesTracker.isFrameMetricsAggregatorAvailable
+ )
+ }
+
+ @Test
+ fun `When Frames Tracking is initially disabled, but enabled via configureOptions it should be available if perfv2 is false`() {
fixture.sentryOptions.isEnableFramesTracking = false
fixture.initSut(
hasAppContext = true,
useRealContext = true,
configureOptions = {
+ isEnablePerformanceV2 = false
isEnableFramesTracking = true
}
)
@@ -582,10 +620,10 @@ class AndroidOptionsInitializerTest {
}
@Test
- fun `AndroidMainThreadChecker is set to options`() {
+ fun `AndroidThreadChecker is set to options`() {
fixture.initSut()
- assertTrue { fixture.sentryOptions.mainThreadChecker is AndroidMainThreadChecker }
+ assertTrue { fixture.sentryOptions.threadChecker is AndroidThreadChecker }
}
@Test
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidProfilerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidProfilerTest.kt
index c5bb334bb3b..670729c4d76 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidProfilerTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidProfilerTest.kt
@@ -1,7 +1,6 @@
package io.sentry.android.core
import android.content.Context
-import android.os.Build
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.sentry.CpuCollectionData
@@ -42,14 +41,11 @@ class AndroidProfilerTest {
private lateinit var context: Context
private val className = "io.sentry.android.core.AndroidProfiler"
- private val ctorTypes = arrayOf(String::class.java, Int::class.java, SentryFrameMetricsCollector::class.java, ISentryExecutorService::class.java, ILogger::class.java, BuildInfoProvider::class.java)
+ private val ctorTypes = arrayOf(String::class.java, Int::class.java, SentryFrameMetricsCollector::class.java, ISentryExecutorService::class.java, ILogger::class.java)
private val fixture = Fixture()
private class Fixture {
private val mockDsn = "http://key@localhost/proj"
- val buildInfo = mock {
- whenever(it.sdkInfoVersion).thenReturn(Build.VERSION_CODES.LOLLIPOP)
- }
val mockLogger = mock()
var lastScheduledRunnable: Runnable? = null
val mockExecutorService = object : ISentryExecutorService {
@@ -86,14 +82,13 @@ class AndroidProfilerTest {
val frameMetricsCollector: SentryFrameMetricsCollector = mock()
- fun getSut(interval: Int = 1, buildInfoProvider: BuildInfoProvider = buildInfo): AndroidProfiler {
+ fun getSut(interval: Int = 1): AndroidProfiler {
return AndroidProfiler(
options.profilingTracesDirPath!!,
interval,
frameMetricsCollector,
options.executorService,
- options.logger,
- buildInfoProvider
+ options.logger
)
}
}
@@ -144,34 +139,19 @@ class AndroidProfilerTest {
val ctor = className.getCtor(ctorTypes)
assertFailsWith {
- ctor.newInstance(arrayOf(null, 0, mock(), mock(), mock(), mock()))
- }
- assertFailsWith {
- ctor.newInstance(arrayOf("mock", 0, null, mock(), mock(), mock()))
+ ctor.newInstance(arrayOf(null, 0, mock(), mock(), mock()))
}
assertFailsWith {
- ctor.newInstance(arrayOf("mock", 0, mock(), null, mock(), mock()))
+ ctor.newInstance(arrayOf("mock", 0, null, mock(), mock()))
}
assertFailsWith {
- ctor.newInstance(arrayOf("mock", 0, mock(), mock(), null, mock()))
+ ctor.newInstance(arrayOf("mock", 0, mock(), null, mock()))
}
assertFailsWith {
- ctor.newInstance(arrayOf("mock", 0, mock(), mock(), mock(), null))
+ ctor.newInstance(arrayOf("mock", 0, mock(), mock(), null))
}
}
- @Test
- fun `profiler works only on api 21+`() {
- val buildInfo = mock {
- whenever(it.sdkInfoVersion).thenReturn(Build.VERSION_CODES.KITKAT)
- }
- val profiler = fixture.getSut(1, buildInfo)
- val startData = profiler.start()
- val endData = profiler.endAndCollect(false, null)
- assertNull(startData)
- assertNull(endData)
- }
-
@Test
fun `profiler returns start and end timestamps`() {
val profiler = fixture.getSut()
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidTransactionProfilerTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidTransactionProfilerTest.kt
index df64e20b16f..b92db7cfc62 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/AndroidTransactionProfilerTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/AndroidTransactionProfilerTest.kt
@@ -5,8 +5,8 @@ import android.os.Build
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.sentry.CpuCollectionData
-import io.sentry.IHub
import io.sentry.ILogger
+import io.sentry.IScopes
import io.sentry.ISentryExecutorService
import io.sentry.MemoryCollectionData
import io.sentry.PerformanceCollectionData
@@ -89,7 +89,7 @@ class AndroidTransactionProfilerTest {
executorService = mockExecutorService
}
- val hub: IHub = mock()
+ val scopes: IScopes = mock()
val frameMetricsCollector: SentryFrameMetricsCollector = mock()
lateinit var transaction1: SentryTracer
@@ -97,10 +97,10 @@ class AndroidTransactionProfilerTest {
lateinit var transaction3: SentryTracer
fun getSut(context: Context, buildInfoProvider: BuildInfoProvider = buildInfo): AndroidTransactionProfiler {
- whenever(hub.options).thenReturn(options)
- transaction1 = SentryTracer(TransactionContext("", ""), hub)
- transaction2 = SentryTracer(TransactionContext("", ""), hub)
- transaction3 = SentryTracer(TransactionContext("", ""), hub)
+ whenever(scopes.options).thenReturn(options)
+ transaction1 = SentryTracer(TransactionContext("", ""), scopes)
+ transaction2 = SentryTracer(TransactionContext("", ""), scopes)
+ transaction3 = SentryTracer(TransactionContext("", ""), scopes)
return AndroidTransactionProfiler(context, options, buildInfoProvider, frameMetricsCollector)
}
}
@@ -336,16 +336,6 @@ class AndroidTransactionProfilerTest {
assertEquals(0, profiler.transactionsCounter)
}
- @Test
- fun `profiler ignores profilingTracesIntervalMillis`() {
- fixture.options.apply {
- profilingTracesIntervalMillis = 0
- }
- val profiler = fixture.getSut(context)
- profiler.start()
- assertEquals(1, profiler.transactionsCounter)
- }
-
@Test
fun `profiler never use background threads`() {
val profiler = fixture.getSut(context)
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AnrIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AnrIntegrationTest.kt
index cceabc9774f..1a74a47ae1e 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/AnrIntegrationTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/AnrIntegrationTest.kt
@@ -2,7 +2,7 @@ package io.sentry.android.core
import android.content.Context
import io.sentry.Hint
-import io.sentry.IHub
+import io.sentry.IScopes
import io.sentry.SentryLevel
import io.sentry.android.core.AnrIntegration.AnrHint
import io.sentry.exception.ExceptionMechanismException
@@ -24,7 +24,7 @@ class AnrIntegrationTest {
private class Fixture {
val context = mock()
- val hub = mock()
+ val scopes = mock()
var options: SentryAndroidOptions = SentryAndroidOptions().apply {
setLogger(mock())
}
@@ -49,7 +49,7 @@ class AnrIntegrationTest {
fixture.options.executorService = ImmediateExecutorService()
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
assertNotNull(sut.anrWatchDog)
assertTrue((sut.anrWatchDog as ANRWatchDog).isAlive)
@@ -60,7 +60,7 @@ class AnrIntegrationTest {
fixture.options.executorService = mock()
val sut = fixture.getSut()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
assertNull(sut.anrWatchDog)
}
@@ -70,7 +70,7 @@ class AnrIntegrationTest {
val sut = fixture.getSut()
fixture.options.isAnrEnabled = false
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
assertNull(sut.anrWatchDog)
}
@@ -79,9 +79,9 @@ class AnrIntegrationTest {
fun `When ANR watch dog is triggered, it should capture an error event with AnrHint`() {
val sut = fixture.getSut()
- sut.reportANR(fixture.hub, fixture.options, getApplicationNotResponding())
+ sut.reportANR(fixture.scopes, fixture.options, getApplicationNotResponding())
- verify(fixture.hub).captureEvent(
+ verify(fixture.scopes).captureEvent(
check {
assertEquals(SentryLevel.ERROR, it.level)
},
@@ -97,7 +97,7 @@ class AnrIntegrationTest {
val sut = fixture.getSut()
fixture.options.executorService = ImmediateExecutorService()
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
assertNotNull(sut.anrWatchDog)
@@ -107,11 +107,11 @@ class AnrIntegrationTest {
}
@Test
- fun `when hub is closed right after start, integration is not registered`() {
+ fun `when scopes is closed right after start, integration is not registered`() {
val deferredExecutorService = DeferredExecutorService()
val sut = fixture.getSut()
fixture.options.executorService = deferredExecutorService
- sut.register(fixture.hub, fixture.options)
+ sut.register(fixture.scopes, fixture.options)
assertNull(sut.anrWatchDog)
sut.close()
deferredExecutorService.runAll()
@@ -122,9 +122,9 @@ class AnrIntegrationTest {
fun `When ANR watch dog is triggered, constructs exception with proper mechanism and snapshot flag`() {
val sut = fixture.getSut()
- sut.reportANR(fixture.hub, fixture.options, getApplicationNotResponding())
+ sut.reportANR(fixture.scopes, fixture.options, getApplicationNotResponding())
- verify(fixture.hub).captureEvent(
+ verify(fixture.scopes).captureEvent(
check {
val ex = it.throwableMechanism as ExceptionMechanismException
assertTrue(ex.isSnapshot)
@@ -139,9 +139,9 @@ class AnrIntegrationTest {
val sut = fixture.getSut()
AppState.getInstance().setInBackground(true)
- sut.reportANR(fixture.hub, fixture.options, getApplicationNotResponding())
+ sut.reportANR(fixture.scopes, fixture.options, getApplicationNotResponding())
- verify(fixture.hub).captureEvent(
+ verify(fixture.scopes).captureEvent(
check {
val message = it.throwable?.message
assertTrue(message?.startsWith("Background") == true)
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2EventProcessorTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2EventProcessorTest.kt
index 80ae9467114..d930333f4c2 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2EventProcessorTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2EventProcessorTest.kt
@@ -115,7 +115,7 @@ class AnrV2EventProcessorTest {
persistScope(
CONTEXTS_FILENAME,
Contexts().apply {
- trace = SpanContext("test")
+ setTrace(SpanContext("test"))
setResponse(Response().apply { bodySize = 1024 })
setBrowser(Browser().apply { name = "Google Chrome" })
}
@@ -179,7 +179,7 @@ class AnrV2EventProcessorTest {
assertNull(processed.platform)
assertNull(processed.exceptions)
- assertEquals(emptyMap(), processed.contexts)
+ assertTrue(processed.contexts.isEmpty)
}
@Test
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2IntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2IntegrationTest.kt
index a658a245051..68339a4b797 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2IntegrationTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/AnrV2IntegrationTest.kt
@@ -6,8 +6,8 @@ import android.content.Context
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.sentry.Hint
-import io.sentry.IHub
import io.sentry.ILogger
+import io.sentry.IScopes
import io.sentry.SentryEnvelope
import io.sentry.SentryLevel
import io.sentry.android.core.AnrV2Integration.AnrV2Hint
@@ -59,7 +59,7 @@ class AnrV2IntegrationTest {
lateinit var lastReportedAnrFile: File
val options = SentryAndroidOptions()
- val hub = mock()
+ val scopes = mock()
val logger = mock()
fun getSut(
@@ -93,7 +93,7 @@ class AnrV2IntegrationTest {
lastReportedAnrFile = File(cacheDir, AndroidEnvelopeCache.LAST_ANR_REPORT)
lastReportedAnrFile.writeText(lastReportedAnrTimestamp.toString())
}
- whenever(hub.captureEvent(any(), anyOrNull())).thenReturn(lastEventId)
+ whenever(scopes.captureEvent(any(), anyOrNull())).thenReturn(lastEventId)
return AnrV2Integration(context)
}
@@ -200,7 +200,7 @@ class AnrV2IntegrationTest {
fun `when cacheDir is not set, does not process historical exits`() {
val integration = fixture.getSut(null, useImmediateExecutorService = false)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
verify(fixture.options.executorService, never()).submit(any())
}
@@ -210,7 +210,7 @@ class AnrV2IntegrationTest {
val integration =
fixture.getSut(tmpDir, isAnrEnabled = false, useImmediateExecutorService = false)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
verify(fixture.options.executorService, never()).submit(any())
}
@@ -219,9 +219,9 @@ class AnrV2IntegrationTest {
fun `when historical exit list is empty, does not process historical exits`() {
val integration = fixture.getSut(tmpDir)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub, never()).captureEvent(any(), anyOrNull())
+ verify(fixture.scopes, never()).captureEvent(any(), anyOrNull())
}
@Test
@@ -229,9 +229,9 @@ class AnrV2IntegrationTest {
val integration = fixture.getSut(tmpDir)
fixture.addAppExitInfo(reason = null)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub, never()).captureEvent(any(), anyOrNull())
+ verify(fixture.scopes, never()).captureEvent(any(), anyOrNull())
}
@Test
@@ -242,9 +242,9 @@ class AnrV2IntegrationTest {
val integration = fixture.getSut(tmpDir)
fixture.addAppExitInfo(timestamp = oldTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub, never()).captureEvent(any(), anyOrNull())
+ verify(fixture.scopes, never()).captureEvent(any(), anyOrNull())
}
@Test
@@ -252,9 +252,9 @@ class AnrV2IntegrationTest {
val integration = fixture.getSut(tmpDir, lastReportedAnrTimestamp = oldTimestamp)
fixture.addAppExitInfo(timestamp = oldTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub, never()).captureEvent(any(), anyOrNull())
+ verify(fixture.scopes, never()).captureEvent(any(), anyOrNull())
}
@Test
@@ -262,9 +262,9 @@ class AnrV2IntegrationTest {
val integration = fixture.getSut(tmpDir, lastReportedAnrTimestamp = null)
fixture.addAppExitInfo(timestamp = oldTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub).captureEvent(any(), anyOrNull())
+ verify(fixture.scopes).captureEvent(any(), anyOrNull())
}
@Test
@@ -272,9 +272,9 @@ class AnrV2IntegrationTest {
val integration = fixture.getSut(tmpDir, lastReportedAnrTimestamp = oldTimestamp)
fixture.addAppExitInfo(timestamp = newTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub).captureEvent(
+ verify(fixture.scopes).captureEvent(
check {
assertEquals(newTimestamp, it.timestamp.time)
assertEquals(SentryLevel.FATAL, it.level)
@@ -321,9 +321,9 @@ class AnrV2IntegrationTest {
importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub).captureEvent(
+ verify(fixture.scopes).captureEvent(
any(),
argThat {
val hint = HintUtils.getSentrySdkHint(this)
@@ -341,7 +341,7 @@ class AnrV2IntegrationTest {
)
fixture.addAppExitInfo(timestamp = newTimestamp)
- whenever(fixture.hub.captureEvent(any(), any())).thenAnswer { invocation ->
+ whenever(fixture.scopes.captureEvent(any(), any())).thenAnswer { invocation ->
val hint = HintUtils.getSentrySdkHint(invocation.getArgument(1))
as DiskFlushNotification
thread {
@@ -351,9 +351,9 @@ class AnrV2IntegrationTest {
SentryId()
}
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub).captureEvent(any(), anyOrNull())
+ verify(fixture.scopes).captureEvent(any(), anyOrNull())
// shouldn't fall into timed out state, because we marked event as flushed on another thread
verify(fixture.logger, never()).log(
any(),
@@ -371,9 +371,9 @@ class AnrV2IntegrationTest {
)
fixture.addAppExitInfo(timestamp = newTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub).captureEvent(any(), anyOrNull())
+ verify(fixture.scopes).captureEvent(any(), anyOrNull())
// we do not call markFlushed, hence it should time out waiting for flush, but because
// we drop the event, it should not even come to this if-check
verify(fixture.logger, never()).log(
@@ -390,9 +390,9 @@ class AnrV2IntegrationTest {
fixture.addAppExitInfo(timestamp = newTimestamp - 1 * 60 * 1000)
fixture.addAppExitInfo(timestamp = newTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub, times(2)).captureEvent(
+ verify(fixture.scopes, times(2)).captureEvent(
any(),
argThat {
val hint = HintUtils.getSentrySdkHint(this)
@@ -412,10 +412,10 @@ class AnrV2IntegrationTest {
fixture.addAppExitInfo(timestamp = newTimestamp - 1 * 60 * 1000)
fixture.addAppExitInfo(timestamp = newTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
// only the latest anr is reported which should be enrichable
- verify(fixture.hub, atMost(1)).captureEvent(
+ verify(fixture.scopes, atMost(1)).captureEvent(
any(),
argThat {
val hint = HintUtils.getSentrySdkHint(this)
@@ -432,20 +432,20 @@ class AnrV2IntegrationTest {
fixture.addAppExitInfo(timestamp = newTimestamp - TimeUnit.DAYS.toMillis(1))
fixture.addAppExitInfo(timestamp = newTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
// the order is reverse here, so the oldest ANR will be reported first to keep track of
// last reported ANR in a marker file
- inOrder(fixture.hub) {
- verify(fixture.hub).captureEvent(
+ inOrder(fixture.scopes) {
+ verify(fixture.scopes).captureEvent(
argThat { timestamp.time == newTimestamp - TimeUnit.DAYS.toMillis(2) },
anyOrNull()
)
- verify(fixture.hub).captureEvent(
+ verify(fixture.scopes).captureEvent(
argThat { timestamp.time == newTimestamp - TimeUnit.DAYS.toMillis(1) },
anyOrNull()
)
- verify(fixture.hub).captureEvent(
+ verify(fixture.scopes).captureEvent(
argThat { timestamp.time == newTimestamp },
anyOrNull()
)
@@ -457,9 +457,9 @@ class AnrV2IntegrationTest {
val integration = fixture.getSut(tmpDir, lastReportedAnrTimestamp = oldTimestamp)
fixture.addAppExitInfo(timestamp = newTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub).captureEvent(
+ verify(fixture.scopes).captureEvent(
any(),
argThat {
val hint = HintUtils.getSentrySdkHint(this)
@@ -473,9 +473,9 @@ class AnrV2IntegrationTest {
val integration = fixture.getSut(tmpDir, lastReportedAnrTimestamp = oldTimestamp)
fixture.addAppExitInfo(timestamp = newTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub).captureEvent(
+ verify(fixture.scopes).captureEvent(
any(),
argThat {
val hint = HintUtils.getSentrySdkHint(this)
@@ -502,7 +502,7 @@ class AnrV2IntegrationTest {
)
}
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
// we store envelope with StartSessionHint on different thread after some delay, which
// triggers the previous session flush, so no timeout
@@ -523,14 +523,14 @@ class AnrV2IntegrationTest {
)
fixture.addAppExitInfo(timestamp = newTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
verify(fixture.logger, never()).log(
any(),
argThat { startsWith("Timed out waiting to flush previous session to its own file.") },
any()
)
- verify(fixture.hub).captureEvent(any(), any())
+ verify(fixture.scopes).captureEvent(any(), any())
}
@Test
@@ -542,7 +542,7 @@ class AnrV2IntegrationTest {
)
fixture.addAppExitInfo(timestamp = newTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
verify(fixture.logger).log(
any(),
@@ -562,9 +562,9 @@ class AnrV2IntegrationTest {
)
fixture.addAppExitInfo(timestamp = newTimestamp)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub).captureEvent(
+ verify(fixture.scopes).captureEvent(
any(),
check {
assertNotNull(it.threadDump)
@@ -577,9 +577,9 @@ class AnrV2IntegrationTest {
val integration = fixture.getSut(tmpDir, lastReportedAnrTimestamp = oldTimestamp)
fixture.addAppExitInfo(timestamp = newTimestamp, addTrace = false)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub, never()).captureEvent(any(), anyOrNull())
+ verify(fixture.scopes, never()).captureEvent(any(), anyOrNull())
}
@Test
@@ -587,8 +587,8 @@ class AnrV2IntegrationTest {
val integration = fixture.getSut(tmpDir, lastReportedAnrTimestamp = oldTimestamp)
fixture.addAppExitInfo(timestamp = newTimestamp, addBadTrace = true)
- integration.register(fixture.hub, fixture.options)
+ integration.register(fixture.scopes, fixture.options)
- verify(fixture.hub, never()).captureEvent(any(), anyOrNull())
+ verify(fixture.scopes, never()).captureEvent(any(), anyOrNull())
}
}
diff --git a/sentry-android-core/src/test/java/io/sentry/android/core/AppComponentsBreadcrumbsIntegrationTest.kt b/sentry-android-core/src/test/java/io/sentry/android/core/AppComponentsBreadcrumbsIntegrationTest.kt
index 8f45c238029..9ae0c1c1c0f 100644
--- a/sentry-android-core/src/test/java/io/sentry/android/core/AppComponentsBreadcrumbsIntegrationTest.kt
+++ b/sentry-android-core/src/test/java/io/sentry/android/core/AppComponentsBreadcrumbsIntegrationTest.kt
@@ -5,7 +5,7 @@ import android.content.Context
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.sentry.Breadcrumb
-import io.sentry.IHub
+import io.sentry.IScopes
import io.sentry.SentryLevel
import io.sentry.test.ImmediateExecutorService
import org.junit.runner.RunWith
@@ -40,8 +40,8 @@ class AppComponentsBreadcrumbsIntegrationTest {
val options = SentryAndroidOptions().apply {
executorService = ImmediateExecutorService()
}
- val hub = mock()
- sut.register(hub, options)
+ val scopes = mock()
+ sut.register(scopes, options)
verify(fixture.context).registerComponentCallbacks(any())
}
@@ -51,10 +51,10 @@ class AppComponentsBreadcrumbsIntegrationTest {
val options = SentryAndroidOptions().apply {
executorService = ImmediateExecutorService()
}
- val hub = mock()
- sut.register(hub, options)
+ val scopes = mock()
+ sut.register(scopes, options)
whenever(fixture.context.registerComponentCallbacks(any())).thenThrow(NullPointerException())
- sut.register(hub, options)
+ sut.register(scopes, options)
assertFalse(options.isEnableAppComponentBreadcrumbs)
}
@@ -65,8 +65,8 @@ class AppComponentsBreadcrumbsIntegrationTest {
isEnableAppComponentBreadcrumbs = false
executorService = ImmediateExecutorService()
}
- val hub = mock()
- sut.register(hub, options)
+ val scopes = mock()
+ sut.register(scopes, options)
verify(fixture.context, never()).registerComponentCallbacks(any())
}
@@ -76,8 +76,8 @@ class AppComponentsBreadcrumbsIntegrationTest {
val options = SentryAndroidOptions().apply {
executorService = ImmediateExecutorService()
}
- val hub = mock()
- sut.register(hub, options)
+ val scopes = mock()
+ sut.register(scopes, options)
sut.close()
verify(fixture.context).unregisterComponentCallbacks(any())
}
@@ -88,10 +88,10 @@ class AppComponentsBreadcrumbsIntegrationTest {
val options = SentryAndroidOptions().apply {
executorService = ImmediateExecutorService()
}
- val hub = mock()
+ val scopes = mock()
whenever(fixture.context.registerComponentCallbacks(any())).thenThrow(NullPointerException())
whenever(fixture.context.unregisterComponentCallbacks(any())).thenThrow(NullPointerException())
- sut.register(hub, options)
+ sut.register(scopes, options)
sut.close()
}
@@ -101,10 +101,10 @@ class AppComponentsBreadcrumbsIntegrationTest {
val options = SentryAndroidOptions().apply {
executorService = ImmediateExecutorService()
}
- val hub = mock()
- sut.register(hub, options)
+ val scopes = mock()
+ sut.register(scopes, options)
sut.onLowMemory()
- verify(hub).addBreadcrumb(
+ verify(scopes).addBreadcrumb(
check {
assertEquals("device.event", it.category)
assertEquals("system", it.type)
@@ -119,10 +119,10 @@ class AppComponentsBreadcrumbsIntegrationTest {
val options = SentryAndroidOptions().apply {
executorService = ImmediateExecutorService()
}
- val hub = mock()
- sut.register(hub, options)
+ val scopes = mock