From 2f8f12f0cd35f77c91dde2e7c6f6312014a774c4 Mon Sep 17 00:00:00 2001 From: Joseph Rodiz Date: Sun, 23 Nov 2025 14:11:04 -0600 Subject: [PATCH 1/4] Potential refactor --- .../google/firebase/perf/FirebasePerformance.java | 4 +--- .../google/firebase/perf/config/ConfigResolver.java | 13 +++++++++++-- .../firebase/perf/config/RemoteConfigManager.java | 8 +------- .../modules/FirebasePerformanceModule.java | 5 ----- .../firebase/perf/FirebasePerformanceTest.java | 9 +++++---- .../perf/config/RemoteConfigManagerTest.java | 4 ++-- 6 files changed, 20 insertions(+), 23 deletions(-) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java index 40468566225..a23bb2621cb 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java @@ -151,7 +151,6 @@ public static FirebasePerformance getInstance() { * @param firebaseRemoteConfigProvider The {@link Provider} for FirebaseRemoteConfig instance. * @param firebaseInstallationsApi The FirebaseInstallationsApi instance. * @param transportFactoryProvider The {@link Provider} for the the {@link TransportFactory}. - * @param remoteConfigManager The RemoteConfigManager instance. * @param configResolver The ConfigResolver instance. * @param sessionManager The SessionManager instance. */ @@ -162,7 +161,6 @@ public static FirebasePerformance getInstance() { Provider firebaseRemoteConfigProvider, FirebaseInstallationsApi firebaseInstallationsApi, Provider transportFactoryProvider, - RemoteConfigManager remoteConfigManager, ConfigResolver configResolver, SessionManager sessionManager) { @@ -185,8 +183,8 @@ public static FirebasePerformance getInstance() { // TODO(b/110178816): Explore moving off of main thread. mMetadataBundle = extractMetadata(appContext); - remoteConfigManager.setFirebaseRemoteConfigProvider(firebaseRemoteConfigProvider); this.configResolver = configResolver; + this.configResolver.getRemoteConfigManager().setFirebaseRemoteConfigProvider(firebaseRemoteConfigProvider); this.configResolver.setMetadataBundle(mMetadataBundle); this.configResolver.setApplicationContext(appContext); sessionManager.setApplicationContext(appContext); diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/config/ConfigResolver.java b/firebase-perf/src/main/java/com/google/firebase/perf/config/ConfigResolver.java index 5ac3ecfc282..c4c3418d05c 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/config/ConfigResolver.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/config/ConfigResolver.java @@ -58,7 +58,7 @@ public class ConfigResolver { private static volatile ConfigResolver instance; // Configuration Storage objects. - private final RemoteConfigManager remoteConfigManager; + private RemoteConfigManager remoteConfigManager; private ImmutableBundle metadataBundle; private DeviceCacheManager deviceCacheManager; @@ -75,7 +75,7 @@ public ConfigResolver( @Nullable ImmutableBundle metadataBundle, @Nullable DeviceCacheManager deviceCacheManager) { this.remoteConfigManager = - remoteConfigManager == null ? RemoteConfigManager.getInstance() : remoteConfigManager; + remoteConfigManager != null ? remoteConfigManager : new RemoteConfigManager(); this.metadataBundle = metadataBundle == null ? new ImmutableBundle() : metadataBundle; this.deviceCacheManager = deviceCacheManager == null ? DeviceCacheManager.getInstance() : deviceCacheManager; @@ -98,6 +98,11 @@ public void setDeviceCacheManager(DeviceCacheManager deviceCacheManager) { this.deviceCacheManager = deviceCacheManager; } + @VisibleForTesting + public void setRemoteConfigManager(RemoteConfigManager remoteConfigManager) { + this.remoteConfigManager = remoteConfigManager; + } + public void setContentProviderContext(Context context) { setApplicationContext(context.getApplicationContext()); } @@ -916,4 +921,8 @@ private boolean isGaugeCaptureFrequencyMsValid(long frequencyMilliseconds) { private boolean isSessionsMaxDurationMinutesValid(long maxDurationMin) { return maxDurationMin > 0; } + + public RemoteConfigManager getRemoteConfigManager() { + return remoteConfigManager; + } } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java index 66b8ff8f804..db9738f905b 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/config/RemoteConfigManager.java @@ -47,7 +47,6 @@ public class RemoteConfigManager { private static final AndroidLogger logger = AndroidLogger.getInstance(); - private static final RemoteConfigManager instance = new RemoteConfigManager(); private static final String FIREPERF_FRC_NAMESPACE_NAME = "fireperf"; private static final long TIME_AFTER_WHICH_A_FETCH_IS_CONSIDERED_STALE_MS = TimeUnit.HOURS.toMillis(12); @@ -67,7 +66,7 @@ public class RemoteConfigManager { // TODO(b/258263016): Migrate to go/firebase-android-executors @SuppressLint("ThreadPoolCreation") - private RemoteConfigManager() { + public RemoteConfigManager() { this( DeviceCacheManager.getInstance(), new ThreadPoolExecutor( @@ -96,11 +95,6 @@ private RemoteConfigManager() { this.remoteConfigFetchDelayInMs = remoteConfigFetchDelayInMs; } - /** Gets the singleton instance. */ - public static RemoteConfigManager getInstance() { - return instance; - } - /** * Sets the {@link Provider} for {@link RemoteConfigComponent} from which we can extract the * {@link FirebaseRemoteConfig} instance whenever it gets available. diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java index 799a6cdccd9..aad6c067def 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java @@ -66,11 +66,6 @@ Provider providesTransportFactoryProvider() { return transportFactoryProvider; } - @Provides - RemoteConfigManager providesRemoteConfigManager() { - return RemoteConfigManager.getInstance(); - } - @Provides ConfigResolver providesConfigResolver() { return ConfigResolver.getInstance(); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTest.java index cd41c5a3adf..deda4f79be2 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTest.java @@ -63,7 +63,7 @@ public class FirebasePerformanceTest { "firebase_performance_collection_deactivated"; private static final String FIREPERF_ENABLED_KEY = "firebase_performance_collection_enabled"; - @Nullable private RemoteConfigManager spyRemoteConfigManager = null; + @Nullable private RemoteConfigManager spyRemoteConfigManager = spy(new RemoteConfigManager()); @Nullable private ConfigResolver spyConfigResolver = null; @Nullable private SessionManager spySessionManager = null; @@ -100,9 +100,10 @@ public void setUp() throws NameNotFoundException { sharedPreferences.edit().clear().commit(); DeviceCacheManager.clearInstance(); - spyRemoteConfigManager = spy(RemoteConfigManager.getInstance()); ConfigResolver.clearInstance(); - spyConfigResolver = spy(ConfigResolver.getInstance()); + ConfigResolver configResolver = ConfigResolver.getInstance(); + configResolver.setRemoteConfigManager(spyRemoteConfigManager); + spyConfigResolver = spy(configResolver); spySessionManager = spy(SessionManager.getInstance()); fakeDirectExecutorService = new FakeDirectExecutorService(); @@ -470,6 +471,7 @@ public void firebasePerformanceInitialization_providesRcProvider_remoteConfigMan () -> FirebaseApp.getInstance().get(TransportFactory.class)); verify(spyRemoteConfigManager).setFirebaseRemoteConfigProvider(firebaseRemoteConfigProvider); + assertThat(spyRemoteConfigManager.isFirebaseRemoteConfigAvailable()).isTrue(); } @Test @@ -577,7 +579,6 @@ private FirebasePerformance initializeFirebasePerformancePreferences( firebaseRemoteConfigProvider, mock(FirebaseInstallationsApi.class), transportFactoryProvider, - spyRemoteConfigManager, spyConfigResolver, spySessionManager); } diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/config/RemoteConfigManagerTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/config/RemoteConfigManagerTest.java index 3e1a9623adc..6f413b69c5a 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/config/RemoteConfigManagerTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/config/RemoteConfigManagerTest.java @@ -76,8 +76,8 @@ public void setUp() { @Test public void getInstance_verifiesSingleton() { - RemoteConfigManager instanceOne = RemoteConfigManager.getInstance(); - RemoteConfigManager instanceTwo = RemoteConfigManager.getInstance(); + RemoteConfigManager instanceOne = ConfigResolver.getInstance().getRemoteConfigManager(); + RemoteConfigManager instanceTwo = ConfigResolver.getInstance().getRemoteConfigManager(); assertThat(instanceOne).isSameInstanceAs(instanceTwo); } From 4364c188e52073b9d4a0bb2f81e707780477c629 Mon Sep 17 00:00:00 2001 From: Joseph Rodiz Date: Mon, 8 Dec 2025 16:14:27 -0600 Subject: [PATCH 2/4] wip sessionmanager --- .../firebase/perf/FirebasePerfEarly.java | 7 ++-- .../firebase/perf/FirebasePerfRegistrar.java | 13 ++++++-- .../firebase/perf/FirebasePerformance.java | 10 +++--- .../perf/application/AppStateMonitor.java | 16 ++++++++-- .../application/FragmentStateMonitor.java | 8 +++-- .../components/SessionManagerComponent.java | 17 ++++++++++ .../modules/FirebasePerformanceModule.java | 7 ++-- .../modules/SessionManagerModule.java | 22 +++++++++++++ .../firebase/perf/metrics/AppStartTrace.java | 7 +++- .../firebase/perf/metrics/HttpMetric.java | 9 +++--- .../metrics/NetworkRequestMetricBuilder.java | 22 +++++++------ .../google/firebase/perf/metrics/Trace.java | 22 ++++++++----- .../perf/network/FirebasePerfHttpClient.java | 16 +++++----- .../network/FirebasePerfOkHttpClient.java | 7 ++-- .../network/FirebasePerfUrlConnection.java | 32 +++++++++++-------- .../InstrumentOkHttpEnqueueCallback.java | 6 ++-- .../firebase/perf/session/SessionManager.java | 10 +----- .../perf/transport/TransportManager.java | 10 ++++-- .../firebase/testing/sessions/MainActivity.kt | 1 + 19 files changed, 166 insertions(+), 76 deletions(-) create mode 100644 firebase-perf/src/main/java/com/google/firebase/perf/injection/components/SessionManagerComponent.java create mode 100644 firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/SessionManagerModule.java diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfEarly.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfEarly.java index 5b89deaad82..613c991ec7f 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfEarly.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfEarly.java @@ -34,7 +34,7 @@ public class FirebasePerfEarly { public FirebasePerfEarly( - FirebaseApp app, @Nullable StartupTime startupTime, Executor uiExecutor) { + FirebaseApp app, @Nullable StartupTime startupTime, Executor uiExecutor, SessionManager sessionManager) { Context context = app.getApplicationContext(); // Initialize ConfigResolver early for accessing device caching layer. @@ -42,21 +42,22 @@ public FirebasePerfEarly( configResolver.setApplicationContext(context); AppStateMonitor appStateMonitor = AppStateMonitor.getInstance(); + appStateMonitor.setSessionManager(sessionManager); appStateMonitor.registerActivityLifecycleCallbacks(context); appStateMonitor.registerForAppColdStart(new FirebasePerformanceInitializer()); if (startupTime != null) { AppStartTrace appStartTrace = AppStartTrace.getInstance(); + appStartTrace.setSessionManager(sessionManager); appStartTrace.registerActivityLifecycleCallbacks(context); uiExecutor.execute(new AppStartTrace.StartFromBackgroundRunnable(appStartTrace)); } - // TODO: Bring back Firebase Sessions dependency to watch for updates to sessions. // In the case of cold start, we create a session and start collecting gauges as early as // possible. // There is code in SessionManager that prevents us from resetting the session twice in case // of app cold start. - SessionManager.getInstance().initializeGaugeCollection(); + sessionManager.initializeGaugeCollection(); } } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java index c01f035af1f..ed0b7a1b68c 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java @@ -26,8 +26,12 @@ import com.google.firebase.components.Qualified; import com.google.firebase.installations.FirebaseInstallationsApi; import com.google.firebase.perf.injection.components.DaggerFirebasePerformanceComponent; +import com.google.firebase.perf.injection.components.DaggerSessionManagerComponent; import com.google.firebase.perf.injection.components.FirebasePerformanceComponent; +import com.google.firebase.perf.injection.components.SessionManagerComponent; import com.google.firebase.perf.injection.modules.FirebasePerformanceModule; +import com.google.firebase.perf.injection.modules.SessionManagerModule; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.platforminfo.LibraryVersionComponent; import com.google.firebase.remoteconfig.RemoteConfigComponent; import java.util.Arrays; @@ -59,6 +63,7 @@ public List> getComponents() { .add(Dependency.required(FirebaseInstallationsApi.class)) .add(Dependency.requiredProvider(TransportFactory.class)) .add(Dependency.required(FirebasePerfEarly.class)) + .add(Dependency.required(SessionManager.class)) .factory(FirebasePerfRegistrar::providesFirebasePerformance) .build(), Component.builder(FirebasePerfEarly.class) @@ -66,14 +71,17 @@ public List> getComponents() { .add(Dependency.required(FirebaseApp.class)) .add(Dependency.optionalProvider(StartupTime.class)) .add(Dependency.required(uiExecutor)) + .add(Dependency.required(SessionManager.class)) .eagerInDefaultApp() .factory( container -> new FirebasePerfEarly( container.get(FirebaseApp.class), container.getProvider(StartupTime.class).get(), - container.get(uiExecutor))) + container.get(uiExecutor), + container.get(SessionManager.class))) .build(), + Component.builder(SessionManager.class).factory(container -> new SessionManager()).build(), /** * Fireperf SDK is lazily by {@link FirebasePerformanceInitializer} during {@link * com.google.firebase.perf.application.AppStateMonitor#onActivityResumed(Activity)}. we use @@ -94,7 +102,8 @@ private static FirebasePerformance providesFirebasePerformance(ComponentContaine container.get(FirebaseApp.class), container.get(FirebaseInstallationsApi.class), container.getProvider(RemoteConfigComponent.class), - container.getProvider(TransportFactory.class))) + container.getProvider(TransportFactory.class), + container.get(SessionManager.class))) .build(); return component.getFirebasePerformance(); diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java index a23bb2621cb..f752f6a6767 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerformance.java @@ -140,6 +140,7 @@ public static FirebasePerformance getInstance() { private final Provider firebaseRemoteConfigProvider; private final FirebaseInstallationsApi firebaseInstallationsApi; private final Provider transportFactoryProvider; + private final SessionManager sessionManager; /** * Constructs the FirebasePerformance class and allows injecting dependencies. @@ -168,6 +169,7 @@ public static FirebasePerformance getInstance() { this.firebaseRemoteConfigProvider = firebaseRemoteConfigProvider; this.firebaseInstallationsApi = firebaseInstallationsApi; this.transportFactoryProvider = transportFactoryProvider; + this.sessionManager = sessionManager; if (firebaseApp == null) { this.mPerformanceCollectionForceEnabledState = false; @@ -177,7 +179,7 @@ public static FirebasePerformance getInstance() { } TransportManager.getInstance() - .initialize(firebaseApp, firebaseInstallationsApi, transportFactoryProvider); + .initialize(firebaseApp, firebaseInstallationsApi, transportFactoryProvider, sessionManager); Context appContext = firebaseApp.getApplicationContext(); // TODO(b/110178816): Explore moving off of main thread. @@ -187,7 +189,7 @@ public static FirebasePerformance getInstance() { this.configResolver.getRemoteConfigManager().setFirebaseRemoteConfigProvider(firebaseRemoteConfigProvider); this.configResolver.setMetadataBundle(mMetadataBundle); this.configResolver.setApplicationContext(appContext); - sessionManager.setApplicationContext(appContext); + this.sessionManager.setApplicationContext(appContext); mPerformanceCollectionForceEnabledState = configResolver.getIsPerformanceCollectionEnabled(); if (logger.isLogcatEnabled() && isPerformanceCollectionEnabled()) { @@ -423,7 +425,7 @@ public Trace newTrace(@NonNull String traceName) { */ @NonNull public HttpMetric newHttpMetric(@NonNull String url, @NonNull @HttpMethod String httpMethod) { - return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer()); + return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer(), sessionManager); } /** @@ -436,7 +438,7 @@ public HttpMetric newHttpMetric(@NonNull String url, @NonNull @HttpMethod String */ @NonNull public HttpMetric newHttpMetric(@NonNull URL url, @NonNull @HttpMethod String httpMethod) { - return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer()); + return new HttpMetric(url, httpMethod, TransportManager.getInstance(), new Timer(), sessionManager); } /** diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java b/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java index b014d82bb83..4f9941fd83c 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java @@ -80,6 +80,8 @@ public class AppStateMonitor implements ActivityLifecycleCallbacks { private boolean isRegisteredForLifecycleCallbacks = false; private boolean isColdStart = true; + private SessionManager sessionManager; + public static AppStateMonitor getInstance() { if (instance == null) { synchronized (AppStateMonitor.class) { @@ -159,7 +161,7 @@ private void startFrameMonitoring(Activity activity) { activityToRecorderMap.put(activity, recorder); if (activity instanceof FragmentActivity) { FragmentStateMonitor fragmentStateMonitor = - new FragmentStateMonitor(clock, transportManager, this, recorder); + new FragmentStateMonitor(clock, transportManager, this, recorder, sessionManager); activityToFragmentStateMonitorMap.put(activity, fragmentStateMonitor); FragmentActivity fragmentActivity = (FragmentActivity) activity; fragmentActivity @@ -198,7 +200,7 @@ public synchronized void onActivityStarted(Activity activity) { // Starts recording frame metrics for this activity. activityToRecorderMap.get(activity).start(); // Start the Trace - Trace screenTrace = new Trace(getScreenTraceName(activity), transportManager, clock, this); + Trace screenTrace = new Trace(getScreenTraceName(activity), transportManager, clock, this, sessionManager); screenTrace.start(); activityToScreenTraceMap.put(activity, screenTrace); } @@ -379,7 +381,7 @@ private void sendSessionLog(String name, Timer startTime, Timer endTime) { .setName(name) .setClientStartTimeUs(startTime.getMicros()) .setDurationUs(startTime.getDurationMicros(endTime)) - .addPerfSessions(SessionManager.getInstance().perfSession().build()); + .addPerfSessions(sessionManager.perfSession().build()); // Atomically get mTsnsCount and set it to zero. int tsnsCount = this.tsnsCount.getAndSet(0); synchronized (metricToCountMap) { @@ -463,4 +465,12 @@ Timer getResumeTime() { public void setIsColdStart(boolean isColdStart) { this.isColdStart = isColdStart; } + + public SessionManager getSessionManager() { + return sessionManager; + } + + public void setSessionManager(SessionManager sessionManager) { + this.sessionManager = sessionManager; + } } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java b/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java index fba6cb0907a..1e1f08ceb44 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java @@ -21,6 +21,7 @@ import com.google.firebase.perf.logging.AndroidLogger; import com.google.firebase.perf.metrics.FrameMetricsCalculator.PerfFrameMetrics; import com.google.firebase.perf.metrics.Trace; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Constants; @@ -33,6 +34,7 @@ public class FragmentStateMonitor extends FragmentManager.FragmentLifecycleCallb private final WeakHashMap fragmentToTraceMap = new WeakHashMap<>(); private final Clock clock; private final TransportManager transportManager; + private final SessionManager sessionManager; private final AppStateMonitor appStateMonitor; private final FrameMetricsRecorder activityFramesRecorder; @@ -40,11 +42,13 @@ public FragmentStateMonitor( Clock clock, TransportManager transportManager, AppStateMonitor appStateMonitor, - FrameMetricsRecorder recorder) { + FrameMetricsRecorder recorder, + SessionManager sessionManager) { this.clock = clock; this.transportManager = transportManager; this.appStateMonitor = appStateMonitor; this.activityFramesRecorder = recorder; + this.sessionManager = sessionManager; } /** @@ -63,7 +67,7 @@ public void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f) // Start Fragment screen trace logger.debug("FragmentMonitor %s.onFragmentResumed", f.getClass().getSimpleName()); Trace fragmentTrace = - new Trace(getFragmentScreenTraceName(f), transportManager, clock, appStateMonitor); + new Trace(getFragmentScreenTraceName(f), transportManager, clock, appStateMonitor, sessionManager); fragmentTrace.start(); fragmentTrace.putAttribute( diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/injection/components/SessionManagerComponent.java b/firebase-perf/src/main/java/com/google/firebase/perf/injection/components/SessionManagerComponent.java new file mode 100644 index 00000000000..cb567970bca --- /dev/null +++ b/firebase-perf/src/main/java/com/google/firebase/perf/injection/components/SessionManagerComponent.java @@ -0,0 +1,17 @@ +package com.google.firebase.perf.injection.components; + +import androidx.annotation.NonNull; + +import com.google.firebase.perf.injection.modules.SessionManagerModule; +import com.google.firebase.perf.session.SessionManager; + +import javax.inject.Singleton; + +import dagger.Component; + +@Component(modules = {SessionManagerModule.class}) +@Singleton +public interface SessionManagerComponent { + @NonNull + SessionManager getSessionManager(); +} diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java index aad6c067def..a8cd8881d70 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/FirebasePerformanceModule.java @@ -34,16 +34,19 @@ public class FirebasePerformanceModule { private final FirebaseInstallationsApi firebaseInstallations; private final Provider remoteConfigComponentProvider; private final Provider transportFactoryProvider; + private final SessionManager sessionManager; public FirebasePerformanceModule( @NonNull FirebaseApp firebaseApp, @NonNull FirebaseInstallationsApi firebaseInstallations, @NonNull Provider remoteConfigComponentProvider, - @NonNull Provider transportFactoryProvider) { + @NonNull Provider transportFactoryProvider, + @NonNull SessionManager sessionManager) { this.firebaseApp = firebaseApp; this.firebaseInstallations = firebaseInstallations; this.remoteConfigComponentProvider = remoteConfigComponentProvider; this.transportFactoryProvider = transportFactoryProvider; + this.sessionManager = sessionManager; } @Provides @@ -73,6 +76,6 @@ ConfigResolver providesConfigResolver() { @Provides SessionManager providesSessionManager() { - return SessionManager.getInstance(); + return sessionManager; } } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/SessionManagerModule.java b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/SessionManagerModule.java new file mode 100644 index 00000000000..d2d46ec0ee9 --- /dev/null +++ b/firebase-perf/src/main/java/com/google/firebase/perf/injection/modules/SessionManagerModule.java @@ -0,0 +1,22 @@ +package com.google.firebase.perf.injection.modules; + +import androidx.annotation.NonNull; + +import com.google.firebase.perf.session.SessionManager; + +import dagger.Module; +import dagger.Provides; + +@Module +public class SessionManagerModule { + private final SessionManager sessionManager; + + public SessionManagerModule(@NonNull SessionManager sessionManager) { + this.sessionManager = sessionManager; + } + + @Provides + SessionManager providesSessionManager() { + return sessionManager; + } +} diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/AppStartTrace.java b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/AppStartTrace.java index 813c8988383..f91c12fc62c 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/AppStartTrace.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/AppStartTrace.java @@ -92,6 +92,7 @@ public class AppStartTrace implements ActivityLifecycleCallbacks, LifecycleObser private final ConfigResolver configResolver; private final TraceMetric.Builder experimentTtid; private Context appContext; + private SessionManager sessionManager; /** * The first time onCreate() of any activity is called, the activity is saved as launchActivity. @@ -413,7 +414,7 @@ public synchronized void onActivityResumed(Activity activity) { appStartActivity = new WeakReference(activity); onResumeTime = clock.getTime(); - this.startSession = SessionManager.getInstance().perfSession(); + this.startSession = sessionManager.perfSession(); AndroidLogger.getInstance() .debug( "onResume(): " @@ -572,6 +573,10 @@ public static boolean isAnyAppProcessInForeground(Context appContext) { return false; } + public void setSessionManager(SessionManager sessionManager) { + this.sessionManager = sessionManager; + } + /** * We use StartFromBackgroundRunnable to detect if app is started from background or foreground. * If app is started from background, we do not generate AppStart trace. This runnable is posted diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/HttpMetric.java b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/HttpMetric.java index 04177ba30ee..a390bf71902 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/HttpMetric.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/HttpMetric.java @@ -22,6 +22,7 @@ import com.google.firebase.perf.FirebasePerformanceAttributable; import com.google.firebase.perf.config.ConfigResolver; import com.google.firebase.perf.logging.AndroidLogger; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Constants; import com.google.firebase.perf.util.Timer; @@ -52,12 +53,12 @@ public class HttpMetric implements FirebasePerformanceAttributable { * @hide */ public HttpMetric( - String url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer) { + String url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer, SessionManager sessionManager) { customAttributesMap = new ConcurrentHashMap<>(); this.timer = timer; networkMetricBuilder = - NetworkRequestMetricBuilder.builder(transportManager).setUrl(url).setHttpMethod(httpMethod); + NetworkRequestMetricBuilder.builder(transportManager, sessionManager).setUrl(url).setHttpMethod(httpMethod); networkMetricBuilder.setManualNetworkRequestMetric(); if (!ConfigResolver.getInstance().isPerformanceMonitoringEnabled()) { @@ -72,8 +73,8 @@ public HttpMetric( * @hide */ public HttpMetric( - URL url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer) { - this(url.toString(), httpMethod, transportManager, timer); + URL url, @HttpMethod String httpMethod, TransportManager transportManager, Timer timer, SessionManager sessionManager) { + this(url.toString(), httpMethod, transportManager, timer, sessionManager); } /** diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilder.java b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilder.java index 1e04744d1b2..f1d8e9a7494 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilder.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilder.java @@ -56,6 +56,7 @@ public final class NetworkRequestMetricBuilder extends AppStateUpdateHandler // TODO(b/177317027): Consider using a Set to avoid adding same PerfSession object private final List sessions; private final GaugeManager gaugeManager; + private final SessionManager sessionManager; private final TransportManager transportManager; private final NetworkRequestMetric.Builder builder = NetworkRequestMetric.newBuilder(); @@ -80,16 +81,16 @@ public void updateSession(PerfSession session) { } /** Creates and returns a {@link NetworkRequestMetricBuilder} object. */ - public static NetworkRequestMetricBuilder builder(TransportManager transportManager) { - return new NetworkRequestMetricBuilder(transportManager); + public static NetworkRequestMetricBuilder builder(TransportManager transportManager, SessionManager sessionManager) { + return new NetworkRequestMetricBuilder(transportManager, sessionManager); } /** * SDK facing constructor which calls constructor with AppStateMonitor and GaugeManager to * initialize them. */ - private NetworkRequestMetricBuilder(TransportManager transportManager) { - this(transportManager, AppStateMonitor.getInstance(), GaugeManager.getInstance()); + private NetworkRequestMetricBuilder(TransportManager transportManager, SessionManager sessionManager) { + this(transportManager, AppStateMonitor.getInstance(), GaugeManager.getInstance(), sessionManager); } /** @@ -99,11 +100,13 @@ private NetworkRequestMetricBuilder(TransportManager transportManager) { public NetworkRequestMetricBuilder( TransportManager transportManager, AppStateMonitor appStateMonitor, - GaugeManager gaugeManager) { + GaugeManager gaugeManager, + SessionManager sessionManager) { super(appStateMonitor); this.transportManager = transportManager; this.gaugeManager = gaugeManager; + this.sessionManager = sessionManager; sessions = Collections.synchronizedList(new ArrayList<>()); registerForAppState(); @@ -227,9 +230,8 @@ public NetworkRequestMetricBuilder setCustomAttributes(Map attri * @see PerfSession#isGaugeAndEventCollectionEnabled() */ public NetworkRequestMetricBuilder setRequestStartTimeMicros(long time) { - SessionManager sessionManager = SessionManager.getInstance(); PerfSession perfSession = sessionManager.perfSession(); - SessionManager.getInstance().registerForSessionUpdates(weakReference); + sessionManager.registerForSessionUpdates(weakReference); builder.setClientStartTimeUs(time); updateSession(perfSession); @@ -270,8 +272,8 @@ public long getTimeToResponseInitiatedMicros() { public NetworkRequestMetricBuilder setTimeToResponseCompletedMicros(long time) { builder.setTimeToResponseCompletedUs(time); - if (SessionManager.getInstance().perfSession().isGaugeAndEventCollectionEnabled()) { - gaugeManager.collectGaugeMetricOnce(SessionManager.getInstance().perfSession().getTimer()); + if (sessionManager.perfSession().isGaugeAndEventCollectionEnabled()) { + gaugeManager.collectGaugeMetricOnce(sessionManager.perfSession().getTimer()); } return this; @@ -309,7 +311,7 @@ public NetworkRequestMetricBuilder setNetworkClientErrorReason() { /** Builds the current {@link NetworkRequestMetric}. */ public NetworkRequestMetric build() { - SessionManager.getInstance().unregisterForSessionUpdates(weakReference); + sessionManager.unregisterForSessionUpdates(weakReference); unregisterForAppState(); com.google.firebase.perf.v1.PerfSession[] perfSessions = diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java index 91e5f44b4a0..5cc7aa86630 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java @@ -24,6 +24,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; + +import com.google.firebase.perf.FirebasePerformance; import com.google.firebase.perf.FirebasePerformanceAttributable; import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.application.AppStateUpdateHandler; @@ -57,6 +59,7 @@ public class Trace extends AppStateUpdateHandler private final Trace parent; private final GaugeManager gaugeManager; + private final SessionManager sessionManager; private final String name; private final Map counterNameToCounterMap; @@ -138,6 +141,7 @@ private Trace( transportManager = parent.transportManager; sessions = Collections.synchronizedList(new ArrayList<>()); gaugeManager = this.parent.gaugeManager; + sessionManager = this.parent.sessionManager; } /** @@ -150,7 +154,8 @@ public Trace( @NonNull String name, @NonNull TransportManager transportManager, @NonNull Clock clock, - @NonNull AppStateMonitor appStateMonitor) { + @NonNull AppStateMonitor appStateMonitor + ) { this(name, transportManager, clock, appStateMonitor, GaugeManager.getInstance()); } @@ -176,6 +181,7 @@ public Trace( this.transportManager = transportManager; sessions = Collections.synchronizedList(new ArrayList<>()); this.gaugeManager = gaugeManager; + this.sessionManager = transportManager.getSessionManager(); } private Trace(@NonNull Parcel in, boolean isDataOnly) { @@ -201,6 +207,7 @@ private Trace(@NonNull Parcel in, boolean isDataOnly) { clock = new Clock(); gaugeManager = GaugeManager.getInstance(); } + sessionManager = TransportManager.getInstance().getSessionManager(); } /** Starts this trace. */ @@ -227,9 +234,8 @@ public void start() { registerForAppState(); - SessionManager sessionManager = SessionManager.getInstance(); PerfSession perfSession = sessionManager.perfSession(); - SessionManager.getInstance().registerForSessionUpdates(sessionAwareObject); + sessionManager.registerForSessionUpdates(sessionAwareObject); updateSession(perfSession); @@ -250,7 +256,7 @@ public void stop() { return; } - SessionManager.getInstance().unregisterForSessionUpdates(sessionAwareObject); + sessionManager.unregisterForSessionUpdates(sessionAwareObject); unregisterForAppState(); endTime = clock.getTime(); @@ -259,9 +265,8 @@ public void stop() { if (!name.isEmpty()) { transportManager.log(new TraceMetricBuilder(this).build(), getAppState()); - if (SessionManager.getInstance().perfSession().isGaugeAndEventCollectionEnabled()) { - gaugeManager.collectGaugeMetricOnce( - SessionManager.getInstance().perfSession().getTimer()); + if (sessionManager.perfSession().isGaugeAndEventCollectionEnabled()) { + gaugeManager.collectGaugeMetricOnce(sessionManager.perfSession().getTimer()); } } else { logger.error("Trace name is empty, no log is sent to server"); @@ -432,7 +437,8 @@ static synchronized Trace getTrace( @NonNull String traceName, @NonNull TransportManager transportManager, @NonNull Clock clock, - @NonNull AppStateMonitor appStateMonitor) { + @NonNull AppStateMonitor appStateMonitor, + @NonNull SessionManager sessionManager) { Trace trace = traceNameToTraceMap.get(traceName); if (trace == null) { trace = diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java index 58027613b76..40c75e7df16 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java @@ -176,7 +176,7 @@ static HttpResponse execute( final TransportManager transportManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -224,7 +224,7 @@ static HttpResponse execute( final TransportManager transportManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -272,7 +272,7 @@ static T execute( final Timer timer, final TransportManager transportManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -309,7 +309,7 @@ static T execute( final Timer timer, final TransportManager transportManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -347,7 +347,7 @@ static HttpResponse execute( final TransportManager transportManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) @@ -399,7 +399,7 @@ static HttpResponse execute( final TransportManager transportManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) @@ -450,7 +450,7 @@ static T execute( final Timer timer, final TransportManager transportManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) @@ -492,7 +492,7 @@ static T execute( final Timer timer, final TransportManager transportManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfOkHttpClient.java b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfOkHttpClient.java index 6f53b7aa1bd..f5f5b5cc5f5 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfOkHttpClient.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfOkHttpClient.java @@ -16,6 +16,7 @@ import androidx.annotation.Keep; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Timer; import java.io.IOException; @@ -37,7 +38,7 @@ private FirebasePerfOkHttpClient() {} public static Response execute(final Call call) throws IOException { final Response response; NetworkRequestMetricBuilder builder = - NetworkRequestMetricBuilder.builder(TransportManager.getInstance()); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), /*, sessionManager = */ null); Timer timer = new Timer(); long startTimeMicros = timer.getMicros(); try { @@ -65,12 +66,12 @@ public static Response execute(final Call call) throws IOException { } @Keep - public static void enqueue(final Call call, final Callback callback) { + public static void enqueue(final Call call, final Callback callback, final SessionManager sessionManager) { Timer timer = new Timer(); long startTime = timer.getMicros(); call.enqueue( new InstrumentOkHttpEnqueueCallback( - callback, TransportManager.getInstance(), timer, startTime)); + callback, TransportManager.getInstance(), timer, startTime, sessionManager)); } static void sendNetworkMetric( diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfUrlConnection.java b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfUrlConnection.java index 07f58bdee1b..535a82b3efe 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfUrlConnection.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfUrlConnection.java @@ -16,6 +16,7 @@ import androidx.annotation.Keep; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.util.URLWrapper; @@ -32,7 +33,11 @@ */ public class FirebasePerfUrlConnection { - private FirebasePerfUrlConnection() {} + private final SessionManager sessionManager; + + private FirebasePerfUrlConnection(SessionManager sessionManager) { + this.sessionManager = sessionManager; + } // Bytecode instrumented functions /** @@ -44,7 +49,7 @@ private FirebasePerfUrlConnection() {} */ @Keep public static InputStream openStream(final URL url) throws IOException { - return openStream(new URLWrapper(url), TransportManager.getInstance(), new Timer()); + return openStream(new URLWrapper(url), TransportManager.getInstance(), new Timer(), /* sessionManager = */ null); } // Functions to collect information for the Network Request Metric @@ -56,14 +61,14 @@ public static InputStream openStream(final URL url) throws IOException { * @throws IOException if there is a problem with opening the connection or using the connection * to open a stream */ - static InputStream openStream(URLWrapper wrapper, TransportManager transportManager, Timer timer) + static InputStream openStream(URLWrapper wrapper, TransportManager transportManager, Timer timer, SessionManager sessionManager) throws IOException { if (!TransportManager.getInstance().isInitialized()) { return wrapper.openConnection().getInputStream(); } timer.reset(); long startTime = timer.getMicros(); - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { URLConnection connection = wrapper.openConnection(); if (connection instanceof HttpsURLConnection) { @@ -92,7 +97,7 @@ static InputStream openStream(URLWrapper wrapper, TransportManager transportMana */ @Keep public static Object getContent(final URL url) throws IOException { - return getContent(new URLWrapper(url), TransportManager.getInstance(), new Timer()); + return getContent(new URLWrapper(url), TransportManager.getInstance(), new Timer(), /* sessionManager = */ null); } /** @@ -103,9 +108,9 @@ public static Object getContent(final URL url) throws IOException { * to get the content */ @Keep - public static Object getContent(final URL url, @SuppressWarnings("rawtypes") final Class[] types) + public static Object getContent(final URL url, @SuppressWarnings("rawtypes") final Class[] types, final SessionManager sessionManager) throws IOException { - return getContent(new URLWrapper(url), types, TransportManager.getInstance(), new Timer()); + return getContent(new URLWrapper(url), types, TransportManager.getInstance(), new Timer(), sessionManager); } /** @@ -115,11 +120,11 @@ public static Object getContent(final URL url, @SuppressWarnings("rawtypes") fin * @throws IOException if there is a problem with opening the connection or using the connection * to get the content */ - static Object getContent(final URLWrapper wrapper, TransportManager transportManager, Timer timer) + static Object getContent(final URLWrapper wrapper, TransportManager transportManager, Timer timer, SessionManager sessionManager) throws IOException { timer.reset(); long startTime = timer.getMicros(); - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { URLConnection connection = wrapper.openConnection(); if (connection instanceof HttpsURLConnection) { @@ -150,11 +155,12 @@ static Object getContent( final URLWrapper wrapper, @SuppressWarnings("rawtypes") final Class[] types, TransportManager transportManager, - Timer timer) + Timer timer, + SessionManager sessionManager) throws IOException { timer.reset(); long startTime = timer.getMicros(); - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { URLConnection connection = wrapper.openConnection(); if (connection instanceof HttpsURLConnection) { @@ -186,12 +192,12 @@ public static Object instrument(Object connection) throws IOException { return new InstrHttpsURLConnection( (HttpsURLConnection) connection, new Timer(), - NetworkRequestMetricBuilder.builder(TransportManager.getInstance())); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), /* sessionManager = */ null)); } else if (connection instanceof HttpURLConnection) { return new InstrHttpURLConnection( (HttpURLConnection) connection, new Timer(), - NetworkRequestMetricBuilder.builder(TransportManager.getInstance())); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), /* sessionManager = */ null)); } return connection; } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallback.java b/firebase-perf/src/main/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallback.java index 1a94758c011..b40b3d146a6 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallback.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallback.java @@ -15,6 +15,7 @@ package com.google.firebase.perf.network; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Timer; import java.io.IOException; @@ -37,9 +38,10 @@ public InstrumentOkHttpEnqueueCallback( final Callback callback, final TransportManager transportManager, Timer timer, - long startTime) { + long startTime, + final SessionManager sessionManager) { this.callback = callback; - networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager); + networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); startTimeMicros = startTime; this.timer = timer; } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java index 79d034b9b0b..7e81ec8f0e7 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java @@ -37,9 +37,6 @@ @Keep // Needed because of b/117526359. public class SessionManager extends AppStateUpdateHandler { - @SuppressLint("StaticFieldLeak") - private static final SessionManager instance = new SessionManager(); - private final GaugeManager gaugeManager; private final AppStateMonitor appStateMonitor; private final Set> clients = new HashSet<>(); @@ -47,17 +44,12 @@ public class SessionManager extends AppStateUpdateHandler { private PerfSession perfSession; private Future syncInitFuture; - /** Returns the singleton instance of SessionManager. */ - public static SessionManager getInstance() { - return instance; - } - /** Returns the currently active PerfSession. */ public final PerfSession perfSession() { return perfSession; } - private SessionManager() { + public SessionManager() { // Generate a new sessionID for every cold start. this( GaugeManager.getInstance(), diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java index 9600b099a6d..d9f74edd436 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java @@ -114,6 +114,7 @@ public class TransportManager implements AppStateCallback { @Nullable private FirebasePerformance firebasePerformance; private FirebaseInstallationsApi firebaseInstallationsApi; private Provider flgTransportFactoryProvider; + private SessionManager sessionManager; private FlgTransport flgTransport; private ExecutorService executorService; private Context appContext; @@ -197,12 +198,14 @@ void initializeForTest( public void initialize( @NonNull FirebaseApp firebaseApp, @NonNull FirebaseInstallationsApi firebaseInstallationsApi, - @NonNull Provider flgTransportFactoryProvider) { + @NonNull Provider flgTransportFactoryProvider, + @NonNull SessionManager sessionManager) { this.firebaseApp = firebaseApp; projectId = firebaseApp.getOptions().getProjectId(); this.firebaseInstallationsApi = firebaseInstallationsApi; this.flgTransportFactoryProvider = flgTransportFactoryProvider; + this.sessionManager = sessionManager; // Run initialization in background thread this.executorService.execute(this::syncInit); @@ -382,7 +385,7 @@ private void syncLog(PerfMetric.Builder perfMetricBuilder, ApplicationProcessSta dispatchLog(perfMetric); // Check if the session is expired. If so, stop gauge collection. - SessionManager.getInstance().stopGaugeCollectionIfSessionRunningTooLong(); + sessionManager.stopGaugeCollectionIfSessionRunningTooLong(); } } @@ -662,6 +665,9 @@ private String getConsoleUrl(TraceMetric traceMetric) { } } + public SessionManager getSessionManager() { + return sessionManager; + } // endregion // region Visible for Testing diff --git a/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt b/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt index ac41d11d73e..80a8c5e6602 100644 --- a/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt +++ b/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt @@ -17,6 +17,7 @@ package com.google.firebase.testing.sessions import android.os.Bundle +import com.google.firebase.perf.config.ConfigResolver import com.google.firebase.testing.sessions.databinding.ActivityMainBinding class MainActivity : BaseActivity() { From 919f3d7504973adc777814984571edcfc4262e43 Mon Sep 17 00:00:00 2001 From: Joseph Rodiz Date: Wed, 10 Dec 2025 11:52:45 -0600 Subject: [PATCH 3/4] TransportManager could not be initialized with sessionManager, changing provider --- .../firebase/perf/FirebasePerfRegistrar.java | 7 +-- .../perf/application/AppStateMonitor.java | 10 ++-- .../application/FragmentStateMonitor.java | 2 +- .../google/firebase/perf/metrics/Trace.java | 7 +-- .../perf/network/FirebasePerfHttpClient.java | 60 +++++++++++-------- .../firebase/perf/session/SessionManager.java | 10 +++- .../perf/transport/TransportManager.java | 4 -- 7 files changed, 56 insertions(+), 44 deletions(-) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java index ed0b7a1b68c..9a5348299c3 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/FirebasePerfRegistrar.java @@ -26,11 +26,8 @@ import com.google.firebase.components.Qualified; import com.google.firebase.installations.FirebaseInstallationsApi; import com.google.firebase.perf.injection.components.DaggerFirebasePerformanceComponent; -import com.google.firebase.perf.injection.components.DaggerSessionManagerComponent; import com.google.firebase.perf.injection.components.FirebasePerformanceComponent; -import com.google.firebase.perf.injection.components.SessionManagerComponent; import com.google.firebase.perf.injection.modules.FirebasePerformanceModule; -import com.google.firebase.perf.injection.modules.SessionManagerModule; import com.google.firebase.perf.session.SessionManager; import com.google.firebase.platforminfo.LibraryVersionComponent; import com.google.firebase.remoteconfig.RemoteConfigComponent; @@ -81,7 +78,9 @@ public List> getComponents() { container.get(uiExecutor), container.get(SessionManager.class))) .build(), - Component.builder(SessionManager.class).factory(container -> new SessionManager()).build(), + Component.builder(SessionManager.class).factory(container -> + SessionManager.getInstance() //TODO: JR: Remove getInstance in subsequent phases + ).build(), /** * Fireperf SDK is lazily by {@link FirebasePerformanceInitializer} during {@link * com.google.firebase.perf.application.AppStateMonitor#onActivityResumed(Activity)}. we use diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java b/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java index 4f9941fd83c..dcead5c124d 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/application/AppStateMonitor.java @@ -200,7 +200,7 @@ public synchronized void onActivityStarted(Activity activity) { // Starts recording frame metrics for this activity. activityToRecorderMap.get(activity).start(); // Start the Trace - Trace screenTrace = new Trace(getScreenTraceName(activity), transportManager, clock, this, sessionManager); + Trace screenTrace = new Trace(getScreenTraceName(activity), transportManager, clock, this); screenTrace.start(); activityToScreenTraceMap.put(activity, screenTrace); } @@ -416,6 +416,10 @@ private static boolean isScreenPerformanceRecordingSupported() { return FrameMetricsRecorder.isFrameMetricsRecordingSupported(); } + public SessionManager getSessionManager() { + return sessionManager; + } + /** An interface to be implemented by subscribers which needs to receive app state update. */ public static interface AppStateCallback { public void onUpdateAppState(ApplicationProcessState newState); @@ -466,10 +470,6 @@ public void setIsColdStart(boolean isColdStart) { this.isColdStart = isColdStart; } - public SessionManager getSessionManager() { - return sessionManager; - } - public void setSessionManager(SessionManager sessionManager) { this.sessionManager = sessionManager; } diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java b/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java index 1e1f08ceb44..462083ea209 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/application/FragmentStateMonitor.java @@ -67,7 +67,7 @@ public void onFragmentResumed(@NonNull FragmentManager fm, @NonNull Fragment f) // Start Fragment screen trace logger.debug("FragmentMonitor %s.onFragmentResumed", f.getClass().getSimpleName()); Trace fragmentTrace = - new Trace(getFragmentScreenTraceName(f), transportManager, clock, appStateMonitor, sessionManager); + new Trace(getFragmentScreenTraceName(f), transportManager, clock, appStateMonitor); fragmentTrace.start(); fragmentTrace.putAttribute( diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java index 5cc7aa86630..d82c954acf4 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/metrics/Trace.java @@ -181,11 +181,12 @@ public Trace( this.transportManager = transportManager; sessions = Collections.synchronizedList(new ArrayList<>()); this.gaugeManager = gaugeManager; - this.sessionManager = transportManager.getSessionManager(); + this.sessionManager = appStateMonitor.getSessionManager(); } private Trace(@NonNull Parcel in, boolean isDataOnly) { super(isDataOnly ? null : AppStateMonitor.getInstance()); + this.sessionManager = AppStateMonitor.getInstance().getSessionManager(); parent = in.readParcelable(Trace.class.getClassLoader()); name = in.readString(); subtraces = new ArrayList<>(); @@ -207,7 +208,6 @@ private Trace(@NonNull Parcel in, boolean isDataOnly) { clock = new Clock(); gaugeManager = GaugeManager.getInstance(); } - sessionManager = TransportManager.getInstance().getSessionManager(); } /** Starts this trace. */ @@ -437,8 +437,7 @@ static synchronized Trace getTrace( @NonNull String traceName, @NonNull TransportManager transportManager, @NonNull Clock clock, - @NonNull AppStateMonitor appStateMonitor, - @NonNull SessionManager sessionManager) { + @NonNull AppStateMonitor appStateMonitor) { Trace trace = traceNameToTraceMap.get(traceName); if (trace == null) { trace = diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java index 40c75e7df16..062e08e503d 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/network/FirebasePerfHttpClient.java @@ -15,7 +15,10 @@ package com.google.firebase.perf.network; import androidx.annotation.Keep; + +import com.google.firebase.perf.FirebasePerformance; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Timer; import java.io.IOException; @@ -45,7 +48,7 @@ private FirebasePerfHttpClient() {} @Keep public static HttpResponse execute(final HttpClient client, final HttpUriRequest request) throws IOException { - return execute(client, request, new Timer(), TransportManager.getInstance()); + return execute(client, request, new Timer(), TransportManager.getInstance(), SessionManager.getInstance()); } /** @@ -58,7 +61,7 @@ public static HttpResponse execute(final HttpClient client, final HttpUriRequest public static HttpResponse execute( final HttpClient client, final HttpUriRequest request, final HttpContext context) throws IOException { - return execute(client, request, context, new Timer(), TransportManager.getInstance()); + return execute(client, request, context, new Timer(), TransportManager.getInstance(), SessionManager.getInstance()); } /** @@ -73,7 +76,7 @@ public static T execute( final HttpUriRequest request, final ResponseHandler responseHandler) throws IOException { - return execute(client, request, responseHandler, new Timer(), TransportManager.getInstance()); + return execute(client, request, responseHandler, new Timer(), TransportManager.getInstance(), SessionManager.getInstance()); } /** @@ -90,7 +93,7 @@ public static T execute( final HttpContext context) throws IOException { return execute( - client, request, responseHandler, context, new Timer(), TransportManager.getInstance()); + client, request, responseHandler, context, new Timer(), TransportManager.getInstance(), SessionManager.getInstance()); } /** @@ -103,7 +106,7 @@ public static T execute( public static HttpResponse execute( final HttpClient client, final HttpHost target, final HttpRequest request) throws IOException { - return execute(client, target, request, new Timer(), TransportManager.getInstance()); + return execute(client, target, request, new Timer(), TransportManager.getInstance(), SessionManager.getInstance()); } /** @@ -119,7 +122,7 @@ public static HttpResponse execute( final HttpRequest request, final HttpContext context) throws IOException { - return execute(client, target, request, context, new Timer(), TransportManager.getInstance()); + return execute(client, target, request, context, new Timer(), TransportManager.getInstance(), SessionManager.getInstance()); } /** @@ -136,7 +139,7 @@ public static T execute( final ResponseHandler responseHandler) throws IOException { return execute( - client, target, request, responseHandler, new Timer(), TransportManager.getInstance()); + client, target, request, responseHandler, new Timer(), TransportManager.getInstance(), SessionManager.getInstance()); } /** @@ -160,7 +163,8 @@ public static T execute( responseHandler, context, new Timer(), - TransportManager.getInstance()); + TransportManager.getInstance(), + SessionManager.getInstance()); } /** @@ -173,10 +177,11 @@ static HttpResponse execute( final HttpClient client, final HttpUriRequest request, final Timer timer, - final TransportManager transportManager) + final TransportManager transportManager, + final SessionManager sessionManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -221,10 +226,11 @@ static HttpResponse execute( final HttpUriRequest request, final HttpContext context, final Timer timer, - final TransportManager transportManager) + final TransportManager transportManager, + final SessionManager sessionManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -270,9 +276,10 @@ static T execute( final HttpUriRequest request, final ResponseHandler responseHandler, final Timer timer, - final TransportManager transportManager) + final TransportManager transportManager, + final SessionManager sessionManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -307,9 +314,10 @@ static T execute( final ResponseHandler responseHandler, final HttpContext context, final Timer timer, - final TransportManager transportManager) + final TransportManager transportManager, + final SessionManager sessionManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { builder.setUrl(request.getURI().toString()).setHttpMethod(request.getMethod()); Long requestContentLength = @@ -344,10 +352,11 @@ static HttpResponse execute( final HttpHost target, final HttpRequest request, final Timer timer, - final TransportManager transportManager) + final TransportManager transportManager, + final SessionManager sessionManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) @@ -396,10 +405,11 @@ static HttpResponse execute( final HttpRequest request, final HttpContext context, final Timer timer, - final TransportManager transportManager) + final TransportManager transportManager, + final SessionManager sessionManager) throws IOException { HttpResponse response = null; - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) @@ -448,9 +458,10 @@ static T execute( final HttpRequest request, final ResponseHandler responseHandler, final Timer timer, - final TransportManager transportManager) + final TransportManager transportManager, + final SessionManager sessionManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) @@ -490,9 +501,10 @@ static T execute( final ResponseHandler responseHandler, final HttpContext context, final Timer timer, - final TransportManager transportManager) + final TransportManager transportManager, + final SessionManager sessionManager) throws IOException { - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, transportManager.getSessionManager()); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); try { builder .setUrl(target.toURI() + request.getRequestLine().getUri()) diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java index 7e81ec8f0e7..cac9ec47bd8 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/SessionManager.java @@ -36,7 +36,8 @@ /** Session manager to generate sessionIDs and broadcast to the application. */ @Keep // Needed because of b/117526359. public class SessionManager extends AppStateUpdateHandler { - + @SuppressLint("StaticFieldLeak") + private static final SessionManager instance = new SessionManager(); private final GaugeManager gaugeManager; private final AppStateMonitor appStateMonitor; private final Set> clients = new HashSet<>(); @@ -49,7 +50,12 @@ public final PerfSession perfSession() { return perfSession; } - public SessionManager() { + /** Returns the singleton instance of SessionManager. */ + public static SessionManager getInstance() { + return instance; + } + + private SessionManager() { // Generate a new sessionID for every cold start. this( GaugeManager.getInstance(), diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java b/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java index d9f74edd436..5566f2755ae 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java +++ b/firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java @@ -664,10 +664,6 @@ private String getConsoleUrl(TraceMetric traceMetric) { return ConsoleUrlGenerator.generateCustomTraceUrl(projectId, packageName, traceName); } } - - public SessionManager getSessionManager() { - return sessionManager; - } // endregion // region Visible for Testing From 2b313070683345213a05bb41942a28664857c214 Mon Sep 17 00:00:00 2001 From: Joseph Rodiz Date: Fri, 26 Dec 2025 21:25:19 -0600 Subject: [PATCH 4/4] Fix unit tests --- .../perf/FirebasePerfRegistrarTest.java | 5 ++- .../perf/FirebasePerformanceTestBase.java | 11 +++-- .../google/firebase/perf/PerformanceTests.kt | 16 ++++++- .../perf/application/AppStateMonitorTest.java | 35 ++++++++++++++- .../application/FragmentStateMonitorTest.java | 28 +++++++----- .../perf/metrics/AppStartTraceTest.java | 14 ++++++ .../firebase/perf/metrics/HttpMetricTest.java | 31 ++++++------- .../NetworkRequestMetricBuilderTest.java | 24 +++++++--- .../perf/metrics/TraceMetricBuilderTest.java | 13 ++++++ .../firebase/perf/metrics/TraceTest.java | 15 ++++++- .../FirebasePerfNetworkValidatorTest.java | 17 +++---- .../FirebasePerfTraceValidatorTest.java | 14 +++++- .../network/FirebasePerfHttpClientTest.java | 45 ++++++++++++------- .../network/FirebasePerfOkHttpClientTest.java | 17 ++++++- .../FirebasePerfUrlConnectionTest.java | 20 +++++++-- .../network/InstrHttpInputStreamTest.java | 14 +++++- .../network/InstrHttpOutputStreamTest.java | 15 ++++++- .../network/InstrHttpURLConnectionTest.java | 15 ++++++- .../network/InstrHttpsURLConnectionTest.java | 14 +++++- .../network/InstrURLConnectionBaseTest.java | 14 +++++- ...strumentApacheHttpResponseHandlerTest.java | 23 +++++++++- .../InstrumentOkHttpEnqueueCallbackTest.java | 25 ++++++++++- .../firebase/testing/sessions/MainActivity.kt | 1 - 23 files changed, 345 insertions(+), 81 deletions(-) diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerfRegistrarTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerfRegistrarTest.java index 7df39fe6a1e..38502745916 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerfRegistrarTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerfRegistrarTest.java @@ -24,6 +24,7 @@ import com.google.firebase.components.Dependency; import com.google.firebase.components.Qualified; import com.google.firebase.installations.FirebaseInstallationsApi; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.remoteconfig.RemoteConfigComponent; import java.util.List; import java.util.concurrent.Executor; @@ -39,13 +40,14 @@ public void testGetComponents() { FirebasePerfRegistrar firebasePerfRegistrar = new FirebasePerfRegistrar(); List> components = firebasePerfRegistrar.getComponents(); - assertThat(components).hasSize(3); + assertThat(components).hasSize(4); Component firebasePerfComponent = components.get(0); assertThat(firebasePerfComponent.getDependencies()) .containsExactly( Dependency.required(FirebaseApp.class), + Dependency.required(SessionManager.class), Dependency.requiredProvider(RemoteConfigComponent.class), Dependency.required(FirebaseInstallationsApi.class), Dependency.requiredProvider(TransportFactory.class), @@ -59,6 +61,7 @@ public void testGetComponents() { .containsExactly( Dependency.required(Qualified.qualified(UiThread.class, Executor.class)), Dependency.required(FirebaseApp.class), + Dependency.required(SessionManager.class), Dependency.optionalProvider(StartupTime.class)); assertThat(firebasePerfEarlyComponent.isLazy()).isFalse(); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTestBase.java b/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTestBase.java index b31696d963b..74c277bde96 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTestBase.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/FirebasePerformanceTestBase.java @@ -53,6 +53,9 @@ public class FirebasePerformanceTestBase { protected static final String FAKE_FIREBASE_PROJECT_ID = "fir-perftestapp"; protected Context appContext; + protected SessionManager provideSessionManager() { + return SessionManager.getInstance(); + } @Before public void setUpFirebaseApp() { @@ -85,19 +88,19 @@ protected static void forceSessionsFeatureDisabled() { ConfigResolver.getInstance().setMetadataBundle(new ImmutableBundle(bundle)); } - protected static void forceVerboseSession() { + protected void forceVerboseSession() { forceVerboseSessionWithSamplingPercentage(100); } - protected static void forceNonVerboseSession() { + protected void forceNonVerboseSession() { forceVerboseSessionWithSamplingPercentage(0); } - private static void forceVerboseSessionWithSamplingPercentage(long samplingPercentage) { + private void forceVerboseSessionWithSamplingPercentage(long samplingPercentage) { Bundle bundle = new Bundle(); bundle.putFloat("sessions_sampling_percentage", samplingPercentage); ConfigResolver.getInstance().setMetadataBundle(new ImmutableBundle(bundle)); - SessionManager.getInstance().setPerfSession(PerfSession.createWithId("sessionId")); + provideSessionManager().setPerfSession(PerfSession.createWithId("sessionId")); } } diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/PerformanceTests.kt b/firebase-perf/src/test/java/com/google/firebase/perf/PerformanceTests.kt index e8844e0cc43..bf81c525b0a 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/PerformanceTests.kt +++ b/firebase-perf/src/test/java/com/google/firebase/perf/PerformanceTests.kt @@ -26,10 +26,14 @@ import com.google.firebase.app import com.google.firebase.initialize import com.google.firebase.perf.FirebasePerformance.HttpMethod import com.google.firebase.perf.application.AppStateMonitor +import com.google.firebase.perf.config.ConfigResolver import com.google.firebase.perf.metrics.HttpMetric import com.google.firebase.perf.metrics.Trace import com.google.firebase.perf.metrics.getTraceCounter import com.google.firebase.perf.metrics.getTraceCounterCount +import com.google.firebase.perf.session.PerfSession +import com.google.firebase.perf.session.SessionManager +import com.google.firebase.perf.session.gauges.GaugeManager import com.google.firebase.perf.transport.TransportManager import com.google.firebase.perf.util.Clock import com.google.firebase.perf.util.Timer @@ -47,6 +51,7 @@ import org.mockito.ArgumentMatchers.nullable import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.doAnswer +import org.mockito.Mockito.doReturn import org.mockito.Mockito.verify import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations.initMocks @@ -103,8 +108,14 @@ class PerformanceTests : BaseTestCase() { @Mock lateinit var mockClock: Clock + @Mock lateinit var mockGaugeManager: GaugeManager + @Mock lateinit var mockAppStateMonitor: AppStateMonitor + private val session = PerfSession("sessionId", Clock()) + + private lateinit var sessionManager: SessionManager + @Captor lateinit var argMetricCaptor: ArgumentCaptor @Captor lateinit var argumentsCaptor: ArgumentCaptor @@ -119,6 +130,9 @@ class PerformanceTests : BaseTestCase() { `when`(timerMock.getMicros()).thenReturn(1000L) `when`(timerMock.getDurationMicros()).thenReturn(2000L).thenReturn(3000L) doAnswer { Timer(currentTime) }.`when`(mockClock).getTime() + + sessionManager = SessionManager(mockGaugeManager, session, mockAppStateMonitor) + `when`(mockAppStateMonitor.sessionManager).thenReturn(sessionManager) } @Test @@ -129,7 +143,7 @@ class PerformanceTests : BaseTestCase() { @Test fun `httpMetric wrapper test `() { val metric = - HttpMetric("https://www.google.com/", HttpMethod.GET, transportManagerMock, timerMock) + HttpMetric("https://www.google.com/", HttpMethod.GET, transportManagerMock, timerMock, sessionManager) metric.trace { setHttpResponseCode(200) } verify(transportManagerMock) diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/application/AppStateMonitorTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/application/AppStateMonitorTest.java index 0b7d4bbfc17..858b3a66d53 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/application/AppStateMonitorTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/application/AppStateMonitorTest.java @@ -39,6 +39,8 @@ import com.google.firebase.perf.config.DeviceCacheManager; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; import com.google.firebase.perf.metrics.Trace; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Clock; @@ -72,6 +74,12 @@ public class AppStateMonitorTest extends FirebasePerformanceTestBase { @Captor private ArgumentCaptor argTraceMetric; + @Mock private GaugeManager mockGaugeManager; + @Mock private AppStateMonitor mockAppStateMonitor; + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); + private long currentTime = 0; private Activity activity1; @@ -96,6 +104,7 @@ public void setUp() { @Test public void foregroundBackgroundEvent_activityStateChanges_fgBgEventsCreated() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); // activity1 comes to foreground. currentTime = 1; monitor.incrementCount("counter1", 10); @@ -156,6 +165,7 @@ public void foregroundBackgroundEvent_activityStateChanges_fgBgEventsCreated() { @Test public void testIncrementCount() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); monitor.incrementCount("counter1", 10); monitor.incrementCount("counter2", 20); @@ -176,6 +186,7 @@ public void testIncrementCount() { @Test public void testTwoActivities() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); // activity1 comes to foreground. currentTime = 1; monitor.onActivityResumed(activity1); @@ -250,6 +261,7 @@ public void testTwoActivities() { @Test public void testAppStateCallbackWithTrace() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Trace trace = new Trace("TRACE_1", transportManager, clock, monitor); // Trace is not started yet, default state is APPLICATION_PROCESS_STATE_UNKNOWN Assert.assertEquals( @@ -289,10 +301,11 @@ public void testAppStateCallbackWithTrace() { @Test public void testAppStateCallbackWithNetworkRequestMetricBuilder() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); // registerForAppState() is called by NetworkRequestMetricBuilder's constructor. NetworkRequestMetricBuilder builder = new NetworkRequestMetricBuilder( - mock(TransportManager.class), monitor, mock(GaugeManager.class)); + mock(TransportManager.class), monitor, mock(GaugeManager.class), sessionManager); Assert.assertEquals(ApplicationProcessState.BACKGROUND, builder.getAppState()); // activity1 comes to foreground. currentTime = 1; @@ -320,6 +333,7 @@ public void testAppStateCallbackWithNetworkRequestMetricBuilder() { @Test public void testRegisterActivityLifecycleCallbacks() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Context context = mock(Context.class); Application application = mock(Application.class); when(context.getApplicationContext()).thenReturn(application); @@ -334,6 +348,7 @@ public void testRegisterActivityLifecycleCallbacks() { @Test public void testUnregisterActivityLifecycleCallbacks() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Context context = mock(Context.class); Application application = mock(Application.class); when(context.getApplicationContext()).thenReturn(application); @@ -346,6 +361,7 @@ public void testUnregisterActivityLifecycleCallbacks() { @Test public void testUnregisterActivityLifecycleCallbacksBeforeItWasRegistered() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Context context = mock(Context.class); Application application = mock(Application.class); when(context.getApplicationContext()).thenReturn(application); @@ -357,6 +373,7 @@ public void testUnregisterActivityLifecycleCallbacksBeforeItWasRegistered() { @Test public void screenTrace_twoActivities_traceStartedAndStoppedWithActivityLifecycle() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Activity[] arr = {activity1, activity2}; for (int i = 0; i < arr.length; ++i) { @@ -376,6 +393,7 @@ public void screenTrace_twoActivities_traceStartedAndStoppedWithActivityLifecycl @Test public void screenTrace_noHardwareAccelerated_noExceptionThrown() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Activity activityWithNonHardwareAcceleratedView = createFakeActivity(/* isHardwareAccelerated= */ false); @@ -388,6 +406,7 @@ public void screenTrace_noHardwareAccelerated_noExceptionThrown() { @Test public void screenTrace_perfMonDisabledAtBuildTime_traceNotCreated() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Activity activityWithNonHardwareAcceleratedView = createFakeActivity(/* isHardwareAccelerated= */ true); @@ -404,6 +423,7 @@ public void screenTrace_perfMonDisabledAtBuildTime_traceNotCreated() { @Test public void screenTrace_perfMonEnabledSwitchAtRuntime_traceCreationDependsOnRuntime() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Activity activityWithNonHardwareAcceleratedView = createFakeActivity(/* isHardwareAccelerated= */ true); @@ -436,6 +456,7 @@ public void screenTrace_perfMonEnabledSwitchAtRuntime_traceCreationDependsOnRunt @Test public void screenTrace_perfMonDeactivated_traceNotCreated() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Activity activityWithNonHardwareAcceleratedView = createFakeActivity(/* isHardwareAccelerated= */ true); ConfigResolver configResolver = ConfigResolver.getInstance(); @@ -458,6 +479,7 @@ public void screenTrace_perfMonDeactivated_traceNotCreated() { @Test public void foregroundTrace_perfMonDisabledAtRuntime_traceNotCreated() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); // activity1 comes to foreground. currentTime = 1; @@ -488,6 +510,7 @@ public void foregroundTrace_perfMonDisabledAtRuntime_traceNotCreated() { @Test public void foregroundTrace_perfMonEnabledAtRuntime_traceCreated() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); // Firebase Performance is disabled at build time. Bundle bundle = new Bundle(); @@ -525,6 +548,7 @@ public void foregroundTrace_perfMonEnabledAtRuntime_traceCreated() { @Test public void foregroundTrace_perfMonDeactivated_traceCreated() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); // Firebase Performance is deactivated at build time. Bundle bundle = new Bundle(); @@ -560,6 +584,7 @@ public void foregroundTrace_perfMonDeactivated_traceCreated() { @Test public void backgroundTrace_perfMonDisabledAtRuntime_traceNotCreated() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); // activity1 comes to background. currentTime = 1; @@ -593,6 +618,7 @@ public void backgroundTrace_perfMonDisabledAtRuntime_traceNotCreated() { @Test public void backgroundTrace_perfMonEnabledAtRuntime_traceCreated() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); // Firebase Performance is disabled at build time. Bundle bundle = new Bundle(); @@ -631,6 +657,7 @@ public void backgroundTrace_perfMonEnabledAtRuntime_traceCreated() { @Test public void backgroundTrace_perfMonDeactivated_traceCreated() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); // Firebase Performance is deactivated at build time. Bundle bundle = new Bundle(); @@ -667,6 +694,7 @@ public void backgroundTrace_perfMonDeactivated_traceCreated() { @Test public void activityStateChanges_singleSubscriber_callbackIsCalled() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Map subscriberState = new HashMap<>(); // Register callbacks, but note that each callback is saved in a local variable. Otherwise @@ -687,6 +715,7 @@ public void activityStateChanges_singleSubscriber_callbackIsCalled() { @Test public void activityStateChanges_multipleSubscribers_callbackCalledOnEachSubscriber() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); Map subscriberState = new HashMap<>(); // Register callbacks, but note that each callback is saved in a local variable. Otherwise @@ -719,6 +748,7 @@ public void activityStateChanges_multipleSubscribers_callbackCalledOnEachSubscri @Test public void appColdStart_singleSubscriber_callbackIsCalled() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); FirebasePerformanceInitializer mockInitializer = mock(FirebasePerformanceInitializer.class); monitor.registerForAppColdStart(mockInitializer); @@ -730,6 +760,7 @@ public void appColdStart_singleSubscriber_callbackIsCalled() { @Test public void appHotStart_singleSubscriber_callbackIsNotCalled() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); FirebasePerformanceInitializer mockInitializer = mock(FirebasePerformanceInitializer.class); monitor.registerForAppColdStart(mockInitializer); @@ -748,6 +779,7 @@ public void appHotStart_singleSubscriber_callbackIsNotCalled() { @Test public void appColdStart_multipleSubscriber_callbackIsCalled() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); FirebasePerformanceInitializer mockInitializer1 = mock(FirebasePerformanceInitializer.class); FirebasePerformanceInitializer mockInitializer2 = mock(FirebasePerformanceInitializer.class); monitor.registerForAppColdStart(mockInitializer1); @@ -762,6 +794,7 @@ public void appColdStart_multipleSubscriber_callbackIsCalled() { @Test public void appColdStart_singleSubscriberRegistersForMultipleTimes_oneCallbackIsCalled() { AppStateMonitor monitor = new AppStateMonitor(transportManager, clock); + monitor.setSessionManager(sessionManager); FirebasePerformanceInitializer mockInitializer1 = mock(FirebasePerformanceInitializer.class); monitor.registerForAppColdStart(mockInitializer1); monitor.registerForAppColdStart(mockInitializer1); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/application/FragmentStateMonitorTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/application/FragmentStateMonitorTest.java index fd7814f8175..32e237a7257 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/application/FragmentStateMonitorTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/application/FragmentStateMonitorTest.java @@ -38,6 +38,9 @@ import com.google.firebase.perf.config.DeviceCacheManager; import com.google.firebase.perf.metrics.FrameMetricsCalculator.PerfFrameMetrics; import com.google.firebase.perf.metrics.Trace; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Constants; @@ -77,6 +80,9 @@ public class FragmentStateMonitorTest extends FirebasePerformanceTestBase { @Mock private Bundle savedInstanceState; @Mock private Fragment mockFragment1; @Mock private Fragment mockFragment2; + @Mock private GaugeManager mockGaugeManager; + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = new SessionManager(mockGaugeManager, session, appStateMonitor);; @Captor private ArgumentCaptor argTraceMetric; @@ -107,6 +113,8 @@ public void setUp() { appStateMonitor = mock(AppStateMonitor.class); mockFragment1 = mock(Fragment.class); mockFragment2 = mock(Fragment.class); + + when(appStateMonitor.getSessionManager()).thenReturn(sessionManager); } /************ Trace Creation Tests ****************/ @@ -114,7 +122,7 @@ public void setUp() { @Test public void fragmentTraceName_validFragment_validFragmentScreenTraceNameGenerated() { FragmentStateMonitor monitor = - new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder); + new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder, sessionManager); Fragment testFragment = new FragmentMonitorMockFragment(); assertThat(monitor.getFragmentScreenTraceName(testFragment)) .isEqualTo("_st_FragmentMonitorMockFragment"); @@ -124,7 +132,7 @@ public void fragmentTraceName_validFragment_validFragmentScreenTraceNameGenerate public void lifecycleCallbacks_differentFrameMetricsCapturedByFrameRecorder_logFragmentScreenTrace() { FragmentStateMonitor monitor = - new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder); + new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder, sessionManager); when(recorder.stopFragment(any())).thenReturn(Optional.of(frameCounts1)); monitor.onFragmentResumed(mockFragmentManager, mockFragment); verify(mockTransportManager, times(0)).log(any(TraceMetric.class), any()); @@ -141,7 +149,7 @@ public void fragmentTraceName_validFragment_validFragmentScreenTraceNameGenerate @Test public void lifecycleCallbacks_onPausedCalledTwice_logFragmentScreenTraceOnce() { FragmentStateMonitor monitor = - new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder); + new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder, sessionManager); when(recorder.stopFragment(any())).thenReturn(Optional.of(frameCounts1)); monitor.onFragmentResumed(mockFragmentManager, mockFragment); verify(mockTransportManager, times(0)).log(any(TraceMetric.class), any()); @@ -156,7 +164,7 @@ public void lifecycleCallbacks_onPausedCalledTwice_logFragmentScreenTraceOnce() @Test public void lifecycleCallbacks_onPausedCalledBeforeOnResume_doesNotLogFragmentScreenTrace() { FragmentStateMonitor monitor = - new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder); + new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder, sessionManager); when(recorder.stopFragment(any())).thenReturn(Optional.of(frameCounts1)); monitor.onFragmentPaused(mockFragmentManager, mockFragment); @@ -170,7 +178,7 @@ public void lifecycleCallbacks_onPausedCalledBeforeOnResume_doesNotLogFragmentSc public void lifecycleCallbacks_differentFrameMetricsCapturedByFrameRecorder_logFragmentScreenTraceWithCorrectFrames() { FragmentStateMonitor monitor = - new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder); + new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder, sessionManager); when(recorder.stopFragment(any())).thenReturn(Optional.of(frameCounts1)); monitor.onFragmentResumed(mockFragmentManager, mockFragment); verify(mockTransportManager, times(0)).log(any(TraceMetric.class), any()); @@ -196,7 +204,7 @@ public void lifecycleCallbacks_cleansUpMap_duringFragmentTransitions() { when(mockActivity.getSupportFragmentManager()).thenReturn(mockFragmentManager); FragmentStateMonitor fragmentMonitor = - new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder); + new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder, sessionManager); WeakHashMap fragmentToTraceMap = fragmentMonitor.getFragmentToTraceMap(); // Activity_A starts @@ -217,7 +225,7 @@ public void lifecycleCallbacks_cleansUpMap_duringFragmentTransitions() { @Test public void fragmentTraceCreation_whenFrameMetricsIsAbsent_dropsTrace() { FragmentStateMonitor monitor = - new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder); + new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder, sessionManager); when(recorder.stopFragment(any())).thenReturn(Optional.absent()); monitor.onFragmentResumed(mockFragmentManager, mockFragment); verify(mockTransportManager, times(0)).log(any(TraceMetric.class), any()); @@ -231,7 +239,7 @@ public void fragmentTraceCreation_dropsTrace_whenFragmentNameTooLong() { AppStateMonitor appStateMonitor = spy(new AppStateMonitor(mockTransportManager, clock, configResolver, true)); FragmentStateMonitor fragmentMonitor = - spy(new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder)); + spy(new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder, sessionManager)); when(appStateMonitor.isScreenTraceSupported()).thenReturn(true); doReturn(longFragmentName) .when(fragmentMonitor) @@ -247,7 +255,7 @@ public void fragmentTraceCreation_dropsTrace_whenFragmentNameTooLong() { @Test public void fragmentTraceCreation_hasParentFragment_addsParentFragmentAttribute() { FragmentStateMonitor monitor = - new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder); + new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder, sessionManager); when(recorder.stopFragment(any())).thenReturn(Optional.of(frameCounts1)); Fragment mockParent = mock(Fragment.class); when(mockFragment.getParentFragment()).thenReturn(mockParent); @@ -264,7 +272,7 @@ public void fragmentTraceCreation_hasParentFragment_addsParentFragmentAttribute( @Test public void fragmentTraceCreation_noParentFragment_addsSpecialAttributeValue() { FragmentStateMonitor monitor = - new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder); + new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder, sessionManager); when(recorder.stopFragment(any())).thenReturn(Optional.of(frameCounts1)); monitor.onFragmentResumed(mockFragmentManager, mockFragment); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/AppStartTraceTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/AppStartTraceTest.java index daa80ad29a2..0308d4fb6cb 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/AppStartTraceTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/AppStartTraceTest.java @@ -34,9 +34,11 @@ import android.view.View; import androidx.test.core.app.ApplicationProvider; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.config.ConfigResolver; import com.google.firebase.perf.session.PerfSession; import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Constants; @@ -68,6 +70,12 @@ public class AppStartTraceTest extends FirebasePerformanceTestBase { @Mock private Clock clock; @Mock private TransportManager transportManager; + + @Mock private GaugeManager mockGaugeManager; + @Mock private AppStateMonitor mockAppStateMonitor; + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); @Mock private ConfigResolver configResolver; @Mock private Activity activity1; @Mock private Activity activity2; @@ -106,6 +114,7 @@ public void testLaunchActivity() { FakeScheduledExecutorService fakeExecutorService = new FakeScheduledExecutorService(); AppStartTrace trace = new AppStartTrace(transportManager, clock, configResolver, fakeExecutorService); + trace.setSessionManager(sessionManager); trace.registerActivityLifecycleCallbacks(appContext); // first activity goes through onCreate()->onStart()->onResume() state change. currentTime = 1; @@ -180,6 +189,7 @@ public void testInterleavedActivity() { FakeScheduledExecutorService fakeExecutorService = new FakeScheduledExecutorService(); AppStartTrace trace = new AppStartTrace(transportManager, clock, configResolver, fakeExecutorService); + trace.setSessionManager(sessionManager); trace.registerActivityLifecycleCallbacks(appContext); // first activity onCreate() currentTime = 1; @@ -217,6 +227,7 @@ public void testDelayedAppStart() { FakeScheduledExecutorService fakeExecutorService = new FakeScheduledExecutorService(); AppStartTrace trace = new AppStartTrace(transportManager, clock, configResolver, fakeExecutorService); + trace.setSessionManager(sessionManager); trace.registerActivityLifecycleCallbacks(appContext); // Delays activity creation after 1 minute from app start time. currentTime = @@ -244,6 +255,7 @@ public void testStartFromBackground_within50ms() { Timer fakeTimer = spy(new Timer(currentTime)); AppStartTrace trace = new AppStartTrace(transportManager, clock, configResolver, fakeExecutorService); + trace.setSessionManager(sessionManager); trace.registerActivityLifecycleCallbacks(appContext); trace.setMainThreadRunnableTime(fakeTimer); @@ -272,6 +284,7 @@ public void testStartFromBackground_moreThan50ms() { Timer fakeTimer = spy(new Timer(currentTime)); AppStartTrace trace = new AppStartTrace(transportManager, clock, configResolver, fakeExecutorService); + trace.setSessionManager(sessionManager); trace.registerActivityLifecycleCallbacks(appContext); trace.setMainThreadRunnableTime(fakeTimer); @@ -305,6 +318,7 @@ public void timeToInitialDisplay_isLogged() { FakeScheduledExecutorService fakeExecutorService = new FakeScheduledExecutorService(); AppStartTrace trace = new AppStartTrace(transportManager, clock, configResolver, fakeExecutorService); + trace.setSessionManager(sessionManager); trace.registerActivityLifecycleCallbacks(appContext); // Simulate resume and manually stepping time forward ShadowSystemClock.advanceBy(Duration.ofMillis(1000)); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/HttpMetricTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/HttpMetricTest.java index 7b7e6a0072b..632bd4cfa8a 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/HttpMetricTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/HttpMetricTest.java @@ -21,6 +21,7 @@ import com.google.firebase.perf.FirebasePerformance.HttpMethod; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Constants; import com.google.firebase.perf.util.Timer; @@ -54,7 +55,7 @@ public void setUp() { @Test public void startStop() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.stop(); verify(transportManager) @@ -67,7 +68,7 @@ public void startStop() { @Test public void setHttpResponseCode() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.setHttpResponseCode(200); metric.stop(); @@ -83,7 +84,7 @@ public void setHttpResponseCode() { @Test public void setRequestSize() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.setRequestPayloadSize(256); metric.stop(); @@ -99,7 +100,7 @@ public void setRequestSize() { @Test public void setResponseSize() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.setResponsePayloadSize(256); metric.stop(); @@ -115,7 +116,7 @@ public void setResponseSize() { @Test public void setResponseContentType() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.setResponseContentType("text/html"); metric.stop(); @@ -131,7 +132,7 @@ public void setResponseContentType() { @Test public void markRequestComplete() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.markRequestComplete(); metric.stop(); @@ -151,7 +152,7 @@ public void markRequestComplete() { @Test public void markResponseStart() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.markResponseStart(); metric.stop(); @@ -171,7 +172,7 @@ public void markResponseStart() { @Test public void putAttribute() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.putAttribute("attr1", "free"); metric.stop(); @@ -192,7 +193,7 @@ public void putAttribute() { @Test public void putInvalidAttribute() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.putAttribute("_invalidattr1", "free"); metric.stop(); @@ -212,7 +213,7 @@ public void putInvalidAttribute() { @Test public void putAttributeAfterHttpMetricIsStopped() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.stop(); metric.putAttribute("attr1", "free"); @@ -232,7 +233,7 @@ public void putAttributeAfterHttpMetricIsStopped() { @Test public void removeAttribute() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.putAttribute("attr1", "free"); Map attributes = metric.getAttributes(); @@ -257,7 +258,7 @@ public void removeAttribute() { @Test public void removeAttributeAfterStopped() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.putAttribute("attr1", "free"); metric.stop(); @@ -279,7 +280,7 @@ public void removeAttributeAfterStopped() { @Test public void addAttributeWithSameName() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); metric.putAttribute("attr1", "free"); metric.putAttribute("attr1", "paid"); @@ -301,7 +302,7 @@ public void addAttributeWithSameName() { @Test public void testMaxAttributes() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); for (int i = 0; i <= Constants.MAX_TRACE_CUSTOM_ATTRIBUTES; i++) { metric.putAttribute("dim" + i, "value" + i); @@ -332,7 +333,7 @@ public void testMaxAttributes() { @Test public void testMoreThanMaxAttributes() { HttpMetric metric = - new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer); + new HttpMetric("https://www.google.com/", HttpMethod.GET, transportManager, timer, SessionManager.getInstance()); metric.start(); for (int i = 0; i <= Constants.MAX_TRACE_CUSTOM_ATTRIBUTES; i++) { metric.putAttribute("dim" + i, "value" + i); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilderTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilderTest.java index 61b3823741d..01478792533 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilderTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilderTest.java @@ -18,6 +18,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import com.google.firebase.perf.FirebasePerformanceTestBase; @@ -26,6 +27,7 @@ import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Constants; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.v1.NetworkRequestMetric; @@ -37,6 +39,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentMatchers; import org.mockito.Mock; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link com.google.firebase.perf.metrics.NetworkRequestMetricBuilder}. */ @@ -44,17 +47,26 @@ public class NetworkRequestMetricBuilderTest extends FirebasePerformanceTestBase { @Mock private TransportManager mockTransportManager; - @Mock private GaugeManager mockGaugeManager; - @Mock private AppStateMonitor mockAppStateMonitor; + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); private NetworkRequestMetricBuilder networkMetricBuilder; + @Override + protected SessionManager provideSessionManager() { + return sessionManager; + } + @Before public void setUp() { initMocks(this); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); networkMetricBuilder = new NetworkRequestMetricBuilder( - mockTransportManager, mockAppStateMonitor, mockGaugeManager); + mockTransportManager, mockAppStateMonitor, mockGaugeManager, sessionManager); } @Test @@ -218,7 +230,7 @@ public void testSessionIdsInNetworkRequestMetricAfterStarted() { @Test public void testSessionIdAdditionInNetworkRequestMetric() { NetworkRequestMetricBuilder metricBuilder = - NetworkRequestMetricBuilder.builder(mockTransportManager); + NetworkRequestMetricBuilder.builder(mockTransportManager, sessionManager); metricBuilder.setRequestStartTimeMicros(/* time= */ 2000); assertThat(this.networkMetricBuilder.getSessions()).isNotNull(); @@ -226,7 +238,7 @@ public void testSessionIdAdditionInNetworkRequestMetric() { int numberOfSessionIds = metricBuilder.getSessions().size(); PerfSession perfSession = PerfSession.createWithId("testSessionId"); - SessionManager.getInstance().updatePerfSession(perfSession); + sessionManager.updatePerfSession(perfSession); assertThat(metricBuilder.getSessions().size()).isEqualTo(numberOfSessionIds + 1); } @@ -234,7 +246,7 @@ public void testSessionIdAdditionInNetworkRequestMetric() { @Test public void testSessionIdNotAddedIfPerfSessionIsNull() { NetworkRequestMetricBuilder metricBuilder = - NetworkRequestMetricBuilder.builder(mockTransportManager); + NetworkRequestMetricBuilder.builder(mockTransportManager, sessionManager); metricBuilder.setRequestStartTimeMicros(/* time= */ 2000); assertThat(this.networkMetricBuilder.getSessions()).isNotNull(); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/TraceMetricBuilderTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/TraceMetricBuilderTest.java index fc019c51ce0..feed80aa0e1 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/TraceMetricBuilderTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/TraceMetricBuilderTest.java @@ -15,10 +15,14 @@ package com.google.firebase.perf.metrics; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import com.google.firebase.perf.FirebasePerformanceTestBase; import com.google.firebase.perf.application.AppStateMonitor; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Constants; @@ -30,6 +34,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; @@ -52,6 +57,12 @@ public class TraceMetricBuilderTest extends FirebasePerformanceTestBase { @Mock private AppStateMonitor appStateMonitor; + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, appStateMonitor); + @Before public void setUp() { currentTime = 0; @@ -65,6 +76,8 @@ public Timer answer(InvocationOnMock invocationOnMock) throws Throwable { }) .when(clock) .getTime(); + + when(appStateMonitor.getSessionManager()).thenReturn(sessionManager); } @Test diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/TraceTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/TraceTest.java index 0be443031f2..83c589c1da8 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/TraceTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/TraceTest.java @@ -24,6 +24,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import android.content.Context; @@ -49,6 +50,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; @@ -64,12 +66,22 @@ public class TraceTest extends FirebasePerformanceTestBase { @Mock private TransportManager mockTransportManager; @Mock private Clock mockClock; - @Mock private AppStateMonitor mockAppStateMonitor; + @Spy + private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); private ArgumentCaptor arguments; private long currentTime; + @Override + protected SessionManager provideSessionManager() { + return sessionManager; + } + @Before public void setUp() { currentTime = 1; @@ -84,6 +96,7 @@ public void setUp() { ConfigResolver configResolver = ConfigResolver.getInstance(); configResolver.setDeviceCacheManager(new DeviceCacheManager(new FakeDirectExecutorService())); configResolver.setApplicationContext(appContext); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); } @Test diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/validator/FirebasePerfNetworkValidatorTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/validator/FirebasePerfNetworkValidatorTest.java index d05dab68a99..7a3545d7946 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/validator/FirebasePerfNetworkValidatorTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/validator/FirebasePerfNetworkValidatorTest.java @@ -21,6 +21,7 @@ import androidx.test.core.app.ApplicationProvider; import com.google.firebase.perf.FirebasePerformanceTestBase; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.SessionManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.v1.NetworkRequestMetric; import com.google.firebase.perf.v1.NetworkRequestMetric.HttpMethod; @@ -98,7 +99,7 @@ public void testInvalidResponseCode() { @Test public void testNullResponseCode() { NetworkRequestMetricBuilder metricBuilder = - NetworkRequestMetricBuilder.builder(TransportManager.getInstance()); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), SessionManager.getInstance()); // Set all the required fields except response code metricBuilder.setUrl("https://www.google.com"); @@ -161,7 +162,7 @@ public void testInvalidResponsePayloadBytes() { @Test public void testClientStartTimeUs() { NetworkRequestMetricBuilder metricBuilder = - NetworkRequestMetricBuilder.builder(TransportManager.getInstance()); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), SessionManager.getInstance()); // Set all required fields except clientStartTimeUs metricBuilder.setUrl("https://www.google.com"); @@ -294,7 +295,7 @@ public void testValidContentType() { @Test public void testAbsenceOfUrlFailsValidation() { NetworkRequestMetricBuilder metricBuilder = - NetworkRequestMetricBuilder.builder(TransportManager.getInstance()); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), SessionManager.getInstance()); // Set all required fields except url metricBuilder.setHttpMethod("GET"); @@ -311,7 +312,7 @@ public void testAbsenceOfUrlFailsValidation() { @Test public void testAbsenceOfHttpMethodFailsValidation() { NetworkRequestMetricBuilder metricBuilder = - NetworkRequestMetricBuilder.builder(TransportManager.getInstance()); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), SessionManager.getInstance()); // Set all required fields except httpMethod metricBuilder.setUrl("https://www.google.com"); @@ -328,7 +329,7 @@ public void testAbsenceOfHttpMethodFailsValidation() { @Test public void testAbsenceOfHttpResponseCodeFailsValidation() { NetworkRequestMetricBuilder metricBuilder = - NetworkRequestMetricBuilder.builder(TransportManager.getInstance()); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), SessionManager.getInstance()); // Set all required fields except httpResponseCode metricBuilder.setUrl("https://www.google.com"); @@ -346,7 +347,7 @@ public void testAbsenceOfHttpResponseCodeFailsValidation() { @Test public void testAbsenceOfClientStartTimeUsFailsValidation() { NetworkRequestMetricBuilder metricBuilder = - NetworkRequestMetricBuilder.builder(TransportManager.getInstance()); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), SessionManager.getInstance()); // Set all required fields except httpResponseCode metricBuilder.setUrl("https://www.google.com"); @@ -364,7 +365,7 @@ public void testAbsenceOfClientStartTimeUsFailsValidation() { @Test public void testAbsenceOfTimeToResponseCompletedUsFailsValidation() { NetworkRequestMetricBuilder metricBuilder = - NetworkRequestMetricBuilder.builder(TransportManager.getInstance()); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), SessionManager.getInstance()); // Set all required fields except timeToResponseCompletedUs metricBuilder.setUrl("https://www.google.com"); @@ -382,7 +383,7 @@ public void testAbsenceOfTimeToResponseCompletedUsFailsValidation() { private NetworkRequestMetricBuilder createNetworkRequestMetricBuilderWithRequiredValuesPresent() { NetworkRequestMetricBuilder networkRequestMetricBuilder = - NetworkRequestMetricBuilder.builder(TransportManager.getInstance()); + NetworkRequestMetricBuilder.builder(TransportManager.getInstance(), SessionManager.getInstance()); networkRequestMetricBuilder.setUrl("https://www.google.com"); networkRequestMetricBuilder.setHttpMethod("GET"); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/validator/FirebasePerfTraceValidatorTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/validator/FirebasePerfTraceValidatorTest.java index 95245c7ffd4..546a1718e00 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/metrics/validator/FirebasePerfTraceValidatorTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/validator/FirebasePerfTraceValidatorTest.java @@ -17,12 +17,17 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; import com.google.firebase.perf.FirebasePerformanceTestBase; import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.metrics.Trace; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Constants; @@ -35,6 +40,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.robolectric.RobolectricTestRunner; @@ -47,6 +53,8 @@ public class FirebasePerfTraceValidatorTest extends FirebasePerformanceTestBase @Mock private Clock clock; + @Spy private AppStateMonitor appStateMonitor = AppStateMonitor.getInstance(); + @Before public void setUp() { initMocks(this); @@ -279,7 +287,11 @@ private TraceMetric.Builder createValidTraceMetric() { long expectedTraceDuration = 50; TransportManager transportManager = mock(TransportManager.class); - AppStateMonitor appStateMonitor = mock(AppStateMonitor.class); + when(appStateMonitor.getSessionManager()).thenReturn(new SessionManager( + mock(GaugeManager.class), + new PerfSession("sessionId", new Clock()), + appStateMonitor + )); ArgumentCaptor argMetric = ArgumentCaptor.forClass(TraceMetric.class); Trace trace = new Trace(traceName, transportManager, clock, appStateMonitor); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfHttpClientTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfHttpClientTest.java index d8fc249bfb6..2c8672e21a6 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfHttpClientTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfHttpClientTest.java @@ -26,7 +26,12 @@ import static org.mockito.MockitoAnnotations.initMocks; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.v1.ApplicationProcessState; import com.google.firebase.perf.v1.NetworkRequestMetric; @@ -53,6 +58,7 @@ import org.mockito.ArgumentMatchers; import org.mockito.Captor; import org.mockito.Mock; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link com.google.firebase.perf.network.FirebasePerfHttpClient}. */ @@ -66,11 +72,18 @@ private interface ResponseHandlerInterface extends ResponseHandler @Mock private Timer timer; @Captor private ArgumentCaptor networkArgumentCaptor; + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); + @Before public void setUp() { initMocks(this); when(timer.getMicros()).thenReturn((long) 1000); when(timer.getDurationMicros()).thenReturn((long) 2000); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); } @Test @@ -81,7 +94,7 @@ public void testExecuteRequest() throws IOException, URISyntaxException { when(client.execute(request)).thenReturn(response); HttpResponse httpResponse = - FirebasePerfHttpClient.execute(client, request, timer, transportManager); + FirebasePerfHttpClient.execute(client, request, timer, transportManager, sessionManager); assertSame(httpResponse, response); verify(timer).reset(); @@ -100,7 +113,7 @@ public void testExecuteRequestContext() throws IOException, URISyntaxException { when(client.execute(request, context)).thenReturn(response); HttpResponse httpResponse = - FirebasePerfHttpClient.execute(client, request, context, timer, transportManager); + FirebasePerfHttpClient.execute(client, request, context, timer, transportManager, sessionManager); assertSame(httpResponse, response); verify(transportManager) @@ -119,7 +132,7 @@ public void testExecuteHostRequest() throws IOException, URISyntaxException { when(client.execute(host, request)).thenReturn(response); HttpResponse httpResponse = - FirebasePerfHttpClient.execute(client, host, request, timer, transportManager); + FirebasePerfHttpClient.execute(client, host, request, timer, transportManager, sessionManager); assertSame(httpResponse, response); verify(transportManager) @@ -139,7 +152,7 @@ public void testExecuteHostRequestContext() throws IOException, URISyntaxExcepti when(client.execute(host, request, c)).thenReturn(response); HttpResponse httpResponse = - FirebasePerfHttpClient.execute(client, host, request, c, timer, transportManager); + FirebasePerfHttpClient.execute(client, host, request, c, timer, transportManager, sessionManager); assertSame(httpResponse, response); verify(transportManager) @@ -155,7 +168,7 @@ public void testRequestHandler() throws IOException, URISyntaxException { HttpUriRequest request = mockHttpUriRequest(); ResponseHandler handler = mock(ResponseHandlerInterface.class); - FirebasePerfHttpClient.execute(client, request, handler, timer, transportManager); + FirebasePerfHttpClient.execute(client, request, handler, timer, transportManager, sessionManager); ArgumentCaptor argRequest = ArgumentCaptor.forClass(HttpUriRequest.class); ArgumentCaptor argHandler = @@ -173,7 +186,7 @@ public void testRequestHandlerContext() throws IOException, URISyntaxException { HttpContext context = mock(HttpContext.class); ResponseHandler handler = mock(ResponseHandlerInterface.class); - FirebasePerfHttpClient.execute(client, request, handler, context, timer, transportManager); + FirebasePerfHttpClient.execute(client, request, handler, context, timer, transportManager, sessionManager); ArgumentCaptor argRequest = ArgumentCaptor.forClass(HttpUriRequest.class); ArgumentCaptor argHandler = @@ -193,7 +206,7 @@ public void testHostRequestHandler() throws IOException, URISyntaxException { HttpHost host = mockHttpHost(); ResponseHandler handler = mock(ResponseHandlerInterface.class); - FirebasePerfHttpClient.execute(client, host, request, handler, timer, transportManager); + FirebasePerfHttpClient.execute(client, host, request, handler, timer, transportManager, sessionManager); ArgumentCaptor argHost = ArgumentCaptor.forClass(HttpHost.class); ArgumentCaptor argRequest = ArgumentCaptor.forClass(HttpRequest.class); @@ -215,7 +228,7 @@ public void testHostRequestHandlerContext() throws IOException, URISyntaxExcepti ResponseHandler handler = mock(ResponseHandlerInterface.class); FirebasePerfHttpClient.execute( - client, host, request, handler, context, timer, transportManager); + client, host, request, handler, context, timer, transportManager, sessionManager); ArgumentCaptor argHost = ArgumentCaptor.forClass(HttpHost.class); ArgumentCaptor argRequest = ArgumentCaptor.forClass(HttpRequest.class); @@ -244,7 +257,7 @@ public void testExecuteRequestError() throws IOException, URISyntaxException { IOException.class, () -> { HttpResponse httpResponse = - FirebasePerfHttpClient.execute(client, request, timer, transportManager); + FirebasePerfHttpClient.execute(client, request, timer, transportManager, sessionManager); assertSame(httpResponse, response); }); verify(transportManager) @@ -267,7 +280,7 @@ public void testExecuteRequestContextError() throws IOException, URISyntaxExcept IOException.class, () -> { HttpResponse httpResponse = - FirebasePerfHttpClient.execute(client, request, context, timer, transportManager); + FirebasePerfHttpClient.execute(client, request, context, timer, transportManager, sessionManager); assertSame(httpResponse, response); }); verify(transportManager) @@ -290,7 +303,7 @@ public void testExecuteHostRequestError() throws IOException, URISyntaxException IOException.class, () -> { HttpResponse httpResponse = - FirebasePerfHttpClient.execute(client, host, request, timer, transportManager); + FirebasePerfHttpClient.execute(client, host, request, timer, transportManager, sessionManager); assertSame(httpResponse, response); }); verify(transportManager) @@ -314,7 +327,7 @@ public void testExecuteHostRequestContextError() throws IOException, URISyntaxEx IOException.class, () -> { HttpResponse httpResponse = - FirebasePerfHttpClient.execute(client, host, request, c, timer, transportManager); + FirebasePerfHttpClient.execute(client, host, request, c, timer, transportManager, sessionManager); assertSame(httpResponse, response); }); @@ -337,7 +350,7 @@ public void testRequestHandlerError() throws IOException, URISyntaxException { assertThrows( IOException.class, () -> { - FirebasePerfHttpClient.execute(client, request, handler, timer, transportManager); + FirebasePerfHttpClient.execute(client, request, handler, timer, transportManager, sessionManager); }); verify(transportManager) .log(networkArgumentCaptor.capture(), ArgumentMatchers.any(ApplicationProcessState.class)); @@ -362,7 +375,7 @@ public void testRequestHandlerContextError() throws IOException, URISyntaxExcept IOException.class, () -> { FirebasePerfHttpClient.execute( - client, request, handler, context, timer, transportManager); + client, request, handler, context, timer, transportManager, sessionManager); }); verify(transportManager) .log(networkArgumentCaptor.capture(), ArgumentMatchers.any(ApplicationProcessState.class)); @@ -386,7 +399,7 @@ public void testHostRequestHandlerError() throws IOException, URISyntaxException assertThrows( IOException.class, () -> { - FirebasePerfHttpClient.execute(client, host, request, handler, timer, transportManager); + FirebasePerfHttpClient.execute(client, host, request, handler, timer, transportManager, sessionManager); }); verify(transportManager) .log(networkArgumentCaptor.capture(), ArgumentMatchers.any(ApplicationProcessState.class)); @@ -413,7 +426,7 @@ public void testHostRequestHandlerContextError() throws IOException, URISyntaxEx IOException.class, () -> { FirebasePerfHttpClient.execute( - client, host, request, handler, context, timer, transportManager); + client, host, request, handler, context, timer, transportManager, sessionManager); }); verify(transportManager) .log(networkArgumentCaptor.capture(), ArgumentMatchers.any(ApplicationProcessState.class)); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfOkHttpClientTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfOkHttpClientTest.java index 77a14766b0a..2bf6a02d527 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfOkHttpClientTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfOkHttpClientTest.java @@ -16,10 +16,16 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.v1.ApplicationProcessState; import com.google.firebase.perf.v1.NetworkRequestMetric; import com.google.firebase.perf.v1.NetworkRequestMetric.HttpMethod; @@ -39,6 +45,7 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link com.google.firebase.perf.network.FirebasePerfOkHttpClient}. */ @@ -47,10 +54,16 @@ public class FirebasePerfOkHttpClientTest extends FirebasePerformanceTestBase { @Mock TransportManager transportManager; @Captor ArgumentCaptor networkArgumentCaptor; + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); @Before public void setUp() { MockitoAnnotations.initMocks(this); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); } @Test @@ -61,7 +74,7 @@ public void testSendMetric() throws IOException { RequestBody requestBody = RequestBody.create(MediaType.parse("text/html"), requestStr); HttpUrl url = new HttpUrl.Builder().scheme("https").host("www.google.com").build(); Request request = new Request.Builder().url(url).method("POST", requestBody).build(); - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); ResponseBody responseBody = ResponseBody.create(MediaType.parse("text/html"), "dummyresponse"); Response response = new Response.Builder() @@ -99,7 +112,7 @@ public void testSendMetricWithQueryURL() throws IOException { HttpUrl url = new HttpUrl.Builder().scheme("https").host("www.google.com").query("?").build(); RequestBody requestBody = RequestBody.create(MediaType.parse("text/html"), requestStr); Request request = new Request.Builder().url(url).method("POST", requestBody).build(); - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); ResponseBody responseBody = ResponseBody.create(MediaType.parse("text/html"), "dummyresponse"); Response response = new Response.Builder() diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfUrlConnectionTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfUrlConnectionTest.java index bdf9111bdaf..1dfd4f49f4f 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfUrlConnectionTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/network/FirebasePerfUrlConnectionTest.java @@ -23,7 +23,12 @@ import static org.mockito.MockitoAnnotations.initMocks; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.util.URLWrapper; import com.google.firebase.perf.v1.ApplicationProcessState; @@ -37,21 +42,28 @@ import org.mockito.ArgumentMatchers; import org.mockito.Captor; import org.mockito.Mock; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link com.google.firebase.perf.network.FirebasePerfUrlConnection}. */ @RunWith(RobolectricTestRunner.class) public class FirebasePerfUrlConnectionTest extends FirebasePerformanceTestBase { - @Mock private TransportManager transportManager; + @Spy private TransportManager transportManager = TransportManager.getInstance(); @Mock private Timer timer; @Captor private ArgumentCaptor networkArgumentCaptor; + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); @Before public void setUp() { initMocks(this); when(timer.getMicros()).thenReturn((long) 1000); when(timer.getDurationMicros()).thenReturn((long) 2000); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); } @Test @@ -61,7 +73,7 @@ public void testOpenStreamHttpConnectionError() throws IOException { when(wrapper.openConnection()).thenThrow(IOException.class); try { - FirebasePerfUrlConnection.openStream(wrapper, transportManager, timer); + FirebasePerfUrlConnection.openStream(wrapper, transportManager, timer, sessionManager); fail("expected IOException"); } catch (IOException e) { verify(transportManager) @@ -79,7 +91,7 @@ public void testGetContentError() throws IOException { when(wrapper.openConnection()).thenThrow(IOException.class); try { - FirebasePerfUrlConnection.getContent(wrapper, transportManager, timer); + FirebasePerfUrlConnection.getContent(wrapper, transportManager, timer, sessionManager); fail("expected IOException"); } catch (IOException e) { verify(transportManager) @@ -99,7 +111,7 @@ public void testGetContentClasses() throws IOException { when(wrapper.openConnection()).thenThrow(IOException.class); try { - FirebasePerfUrlConnection.getContent(wrapper, classes, transportManager, timer); + FirebasePerfUrlConnection.getContent(wrapper, classes, transportManager, timer, sessionManager); fail("expected IOException"); } catch (IOException e) { verify(transportManager) diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpInputStreamTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpInputStreamTest.java index e1f45c45329..e3c34565dbb 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpInputStreamTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpInputStreamTest.java @@ -22,8 +22,13 @@ import static org.mockito.Mockito.when; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.v1.ApplicationProcessState; import com.google.firebase.perf.v1.NetworkRequestMetric; @@ -39,6 +44,7 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** @@ -53,6 +59,11 @@ public class InstrHttpInputStreamTest extends FirebasePerformanceTestBase { @Mock TransportManager transportManager; @Mock Timer timer; @Captor ArgumentCaptor networkArgumentCaptor; + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); private NetworkRequestMetricBuilder networkMetricBuilder; @@ -61,7 +72,8 @@ public void setUp() { closeable = MockitoAnnotations.openMocks(this); when(timer.getMicros()).thenReturn((long) 1000); when(timer.getDurationMicros()).thenReturn((long) 2000); - networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); + networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); } @After diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpOutputStreamTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpOutputStreamTest.java index 3d049a6a746..9bca4f8e5d7 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpOutputStreamTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpOutputStreamTest.java @@ -21,8 +21,13 @@ import static org.mockito.Mockito.when; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.v1.ApplicationProcessState; import com.google.firebase.perf.v1.NetworkRequestMetric; @@ -37,6 +42,7 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link com.google.firebase.perf.network.InstrHttpOutputStream}. */ @@ -47,7 +53,11 @@ public class InstrHttpOutputStreamTest extends FirebasePerformanceTestBase { @Mock TransportManager transportManager; @Mock Timer timer; @Captor ArgumentCaptor networkArgumentCaptor; - + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); private NetworkRequestMetricBuilder networkMetricBuilder; @Before @@ -55,7 +65,8 @@ public void setUp() { MockitoAnnotations.initMocks(this); when(timer.getMicros()).thenReturn((long) 1000); when(timer.getDurationMicros()).thenReturn((long) 2000); - networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); + networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); } @Test diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpURLConnectionTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpURLConnectionTest.java index 1a12f87e9be..b3f5ef410f5 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpURLConnectionTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpURLConnectionTest.java @@ -24,8 +24,13 @@ import static org.mockito.MockitoAnnotations.initMocks; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.v1.ApplicationProcessState; import com.google.firebase.perf.v1.NetworkRequestMetric; @@ -47,6 +52,7 @@ import org.mockito.ArgumentMatchers; import org.mockito.Captor; import org.mockito.Mock; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link InstrHttpURLConnection}. */ @@ -56,7 +62,11 @@ public class InstrHttpURLConnectionTest extends FirebasePerformanceTestBase { @Mock private TransportManager transportManager; @Mock private Timer timer; @Captor private ArgumentCaptor networkArgumentCaptor; - + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); private NetworkRequestMetricBuilder networkMetricBuilder; @Before @@ -64,7 +74,8 @@ public void setUp() { initMocks(this); when(timer.getMicros()).thenReturn((long) 1000); when(timer.getDurationMicros()).thenReturn((long) 2000); - networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); + networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); } @Test diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpsURLConnectionTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpsURLConnectionTest.java index 96fa6a89b9d..fe39591f97b 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpsURLConnectionTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrHttpsURLConnectionTest.java @@ -21,8 +21,13 @@ import static org.mockito.MockitoAnnotations.initMocks; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.v1.ApplicationProcessState; import com.google.firebase.perf.v1.NetworkRequestMetric; @@ -52,6 +57,7 @@ import org.mockito.ArgumentMatchers; import org.mockito.Captor; import org.mockito.Mock; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link InstrHttpsURLConnection}. */ @@ -61,6 +67,11 @@ public class InstrHttpsURLConnectionTest extends FirebasePerformanceTestBase { @Mock private TransportManager transportManager; @Mock private Timer timer; @Captor private ArgumentCaptor networkArgumentCaptor; + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); private NetworkRequestMetricBuilder networkMetricBuilder; @@ -69,7 +80,8 @@ public void setUp() { initMocks(this); when(timer.getMicros()).thenReturn((long) 1000); when(timer.getDurationMicros()).thenReturn((long) 2000); - networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); + networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); } @Test diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrURLConnectionBaseTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrURLConnectionBaseTest.java index 9bf193efc95..0698fd651b6 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrURLConnectionBaseTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrURLConnectionBaseTest.java @@ -23,8 +23,13 @@ import static org.mockito.MockitoAnnotations.initMocks; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.v1.ApplicationProcessState; import com.google.firebase.perf.v1.NetworkRequestMetric; @@ -39,6 +44,7 @@ import org.mockito.ArgumentMatchers; import org.mockito.Captor; import org.mockito.Mock; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link InstrURLConnectionBase}. */ @@ -48,6 +54,11 @@ public class InstrURLConnectionBaseTest extends FirebasePerformanceTestBase { @Mock private TransportManager transportManager; @Mock private Timer timer; @Captor private ArgumentCaptor networkArgumentCaptor; + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); private NetworkRequestMetricBuilder networkMetricBuilder; @@ -56,7 +67,8 @@ public void setUp() { initMocks(this); when(timer.getMicros()).thenReturn((long) 1000); when(timer.getDurationMicros()).thenReturn((long) 2000); - networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); + networkMetricBuilder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); } @Test diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrumentApacheHttpResponseHandlerTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrumentApacheHttpResponseHandlerTest.java index b1b6aadfcf0..ba7e682de25 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrumentApacheHttpResponseHandlerTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrumentApacheHttpResponseHandlerTest.java @@ -19,10 +19,17 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; +import static org.mockito.MockitoAnnotations.openMocks; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; import com.google.firebase.perf.metrics.NetworkRequestMetricBuilder; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.v1.ApplicationProcessState; import com.google.firebase.perf.v1.NetworkRequestMetric; @@ -32,10 +39,12 @@ import org.apache.http.StatusLine; import org.apache.http.client.ResponseHandler; import org.apache.http.message.BasicHeader; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link InstrumentApacheHttpResponseHandler}. */ @@ -43,6 +52,18 @@ @SuppressWarnings("deprecation") public class InstrumentApacheHttpResponseHandlerTest extends FirebasePerformanceTestBase { + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); + + @Before + public void setUp() { + openMocks(this); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); + } + @Test public void testHandleResponse() throws IOException { // mocks what an app developer would use. Need to verify that the app's response handler @@ -56,7 +77,7 @@ public String handleResponse(HttpResponse httpResponse) throws IOException { }; TransportManager transportManager = mock(TransportManager.class); - NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager); + NetworkRequestMetricBuilder builder = NetworkRequestMetricBuilder.builder(transportManager, sessionManager); InstrumentApacheHttpResponseHandler instrumentResponseHandler = new InstrumentApacheHttpResponseHandler<>(responseHandler, mockTimer(), builder); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallbackTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallbackTest.java index 0a479b8bbd2..b84446f0821 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallbackTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/network/InstrumentOkHttpEnqueueCallbackTest.java @@ -18,9 +18,15 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.openMocks; import com.google.firebase.perf.FirebasePerformanceTestBase; +import com.google.firebase.perf.application.AppStateMonitor; +import com.google.firebase.perf.session.PerfSession; +import com.google.firebase.perf.session.SessionManager; +import com.google.firebase.perf.session.gauges.GaugeManager; import com.google.firebase.perf.transport.TransportManager; +import com.google.firebase.perf.util.Clock; import com.google.firebase.perf.util.Timer; import com.google.firebase.perf.v1.ApplicationProcessState; import com.google.firebase.perf.v1.NetworkRequestMetric; @@ -35,16 +41,31 @@ import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; + +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; +import org.mockito.Spy; import org.robolectric.RobolectricTestRunner; /** Unit tests for {@link com.google.firebase.perf.network.InstrumentOkHttpEnqueueCallback}. */ @RunWith(RobolectricTestRunner.class) public class InstrumentOkHttpEnqueueCallbackTest extends FirebasePerformanceTestBase { + @Spy private GaugeManager mockGaugeManager = GaugeManager.getInstance(); + @Spy private AppStateMonitor mockAppStateMonitor = AppStateMonitor.getInstance(); + private PerfSession session = new PerfSession("sessionId", new Clock()); + private SessionManager sessionManager = + new SessionManager(mockGaugeManager, session, mockAppStateMonitor); + + @Before + public void setUp() { + openMocks(this); + when(mockAppStateMonitor.getSessionManager()).thenReturn(sessionManager); + } + @Test public void testOnResponse() throws IOException { String urlStr = "www.google.com"; @@ -79,7 +100,7 @@ public void testOnResponse() throws IOException { InstrumentOkHttpEnqueueCallback enqueueCallback = new InstrumentOkHttpEnqueueCallback( - callback, transportManager, mockTimer(), startTimeMicros); + callback, transportManager, mockTimer(), startTimeMicros, sessionManager); enqueueCallback.onResponse(call, response); ArgumentCaptor argument = @@ -114,7 +135,7 @@ public void testOnFailure() throws IOException { long startTime = 1; InstrumentOkHttpEnqueueCallback enqueueCallback = - new InstrumentOkHttpEnqueueCallback(callback, transportManager, mockTimer(), startTime); + new InstrumentOkHttpEnqueueCallback(callback, transportManager, mockTimer(), startTime, sessionManager); enqueueCallback.onFailure(call, e); ArgumentCaptor argument = diff --git a/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt b/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt index 80a8c5e6602..ac41d11d73e 100644 --- a/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt +++ b/firebase-sessions/test-app/src/main/kotlin/com/google/firebase/testing/sessions/MainActivity.kt @@ -17,7 +17,6 @@ package com.google.firebase.testing.sessions import android.os.Bundle -import com.google.firebase.perf.config.ConfigResolver import com.google.firebase.testing.sessions.databinding.ActivityMainBinding class MainActivity : BaseActivity() {