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 14f27aa0233..b1da99a1fde 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 @@ -36,7 +36,10 @@ public class FirebasePerfEarly { public FirebasePerfEarly( - FirebaseApp app, @Nullable StartupTime startupTime, Executor uiExecutor, SessionManager sessionManager) { + FirebaseApp app, + @Nullable StartupTime startupTime, + Executor uiExecutor, + SessionManager sessionManager) { Context context = app.getApplicationContext(); // Initialize ConfigResolver early for accessing device caching layer. @@ -45,9 +48,10 @@ public FirebasePerfEarly( // Register FirebasePerformance as a subscriber ASAP - which will start collecting gauges if the // FirebaseSession is verbose. - FirebaseSessionsDependencies.register(new FirebasePerformanceSessionSubscriber(configResolver, sessionManager)); + FirebaseSessionsDependencies.register( + new FirebasePerformanceSessionSubscriber(configResolver, sessionManager)); - AppStateMonitor appStateMonitor = AppStateMonitor.getInstance(); + AppStateMonitor appStateMonitor = AppStateMonitor.getInstance(sessionManager); appStateMonitor.registerActivityLifecycleCallbacks(context); appStateMonitor.registerForAppColdStart(new FirebasePerformanceInitializer()); 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 7473f9e03de..abf4eb99a3d 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 @@ -88,7 +88,9 @@ public List> getComponents() { container.get(SessionManager.class))) .build(), Component.builder(SessionManager.class) - .factory(container -> SessionManager.getInstance()) + .factory( + container -> + new SessionManager(GaugeManager.getInstance(), PerfSession.createWithId(null))) .build(), /** * Fireperf SDK is lazily by {@link FirebasePerformanceInitializer} during {@link 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 2a9eb992ecb..89ce0477211 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 @@ -171,7 +171,8 @@ public static FirebasePerformance getInstance() { FirebaseSessionsEnforcementCheck.setEnforcement(BuildConfig.ENFORCE_LEGACY_SESSIONS); TransportManager.getInstance() - .initialize(firebaseApp, firebaseInstallationsApi, transportFactoryProvider, sessionManager); + .initialize( + firebaseApp, firebaseInstallationsApi, transportFactoryProvider, sessionManager); Context appContext = firebaseApp.getApplicationContext(); mMetadataBundle = extractMetadata(appContext); 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 d44db9d83a7..0b7dd0a307b 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 @@ -26,7 +26,9 @@ 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.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; @@ -81,11 +83,34 @@ public class AppStateMonitor implements ActivityLifecycleCallbacks { private boolean isRegisteredForLifecycleCallbacks = false; private boolean isColdStart = true; + public static AppStateMonitor getInstance(SessionManager sessionManager) { + if (instance == null) { + synchronized (AppStateMonitor.class) { + if (instance == null) { + instance = + new AppStateMonitor(TransportManager.getInstance(), new Clock(), sessionManager); + } + } + } + return instance; + } + + /** + * Returns the singleton instance, creating it with a default {@link SessionManager} if not + * already initialized. In production, {@link #getInstance(SessionManager)} is always called + * first by {@link com.google.firebase.perf.FirebasePerfEarly}, so the pre-seeded instance is + * returned. This overload exists for call sites that run after early initialization (e.g. + * {@link com.google.firebase.perf.application.AppStateUpdateHandler}) and for test environments. + */ public static AppStateMonitor getInstance() { if (instance == null) { synchronized (AppStateMonitor.class) { if (instance == null) { - instance = new AppStateMonitor(TransportManager.getInstance(), new Clock(), SessionManager.getInstance()); + instance = + new AppStateMonitor( + TransportManager.getInstance(), + new Clock(), + new SessionManager(GaugeManager.getInstance(), PerfSession.createWithId(null))); } } } @@ -115,6 +140,15 @@ public static AppStateMonitor getInstance() { this.screenPerformanceRecordingSupported = screenPerformanceRecordingSupported; } + public SessionManager getSessionManager() { + return sessionManager; + } + + @VisibleForTesting + public static void resetInstance() { + instance = null; + } + public synchronized void registerActivityLifecycleCallbacks(Context context) { // Make sure the callback is registered only once. if (isRegisteredForLifecycleCallbacks) { 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..77cb8428ad4 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 @@ -75,7 +75,7 @@ public ConfigResolver( @Nullable ImmutableBundle metadataBundle, @Nullable DeviceCacheManager deviceCacheManager) { this.remoteConfigManager = - remoteConfigManager == null ? RemoteConfigManager.getInstance() : remoteConfigManager; + remoteConfigManager == null ? new RemoteConfigManager() : remoteConfigManager; this.metadataBundle = metadataBundle == null ? new ImmutableBundle() : metadataBundle; this.deviceCacheManager = deviceCacheManager == null ? DeviceCacheManager.getInstance() : deviceCacheManager; @@ -916,4 +916,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 0bcda21c26c..1f39aa9a243 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 @@ -71,7 +71,7 @@ Provider providesTransportFactoryProvider() { @Provides RemoteConfigManager providesRemoteConfigManager() { - return RemoteConfigManager.getInstance(); + return ConfigResolver.getInstance().getRemoteConfigManager(); } @Provides 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 e38944ed0d2..b948ee27b7c 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 @@ -168,12 +168,15 @@ public static void setLauncherActivityOnResumeTime(String activity) { } public static AppStartTrace getInstance(SessionManager sessionManager) { - return instance != null ? instance : getInstance(TransportManager.getInstance(), new Clock(), sessionManager); + return instance != null + ? instance + : getInstance(TransportManager.getInstance(), new Clock(), sessionManager); } // TODO(b/258263016): Migrate to go/firebase-android-executors @SuppressLint("ThreadPoolCreation") - static AppStartTrace getInstance(TransportManager transportManager, Clock clock, SessionManager sessionManager) { + static AppStartTrace getInstance( + TransportManager transportManager, Clock clock, SessionManager sessionManager) { if (instance == null) { synchronized (AppStartTrace.class) { if (instance == null) { @@ -564,11 +567,12 @@ public static boolean isAnyAppProcessInForeground(Context appContext) { if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { continue; } -// if (appProcess.processName.equals(appProcessName) -// || appProcess.processName.startsWith(allowedAppProcessNamePrefix)) { -// // Returns true if the process with `IMPORTANCE_FOREGROUND` matches current process. -// return true; -// } + // if (appProcess.processName.equals(appProcessName) + // || appProcess.processName.startsWith(allowedAppProcessNamePrefix)) { + // // Returns true if the process with `IMPORTANCE_FOREGROUND` matches current + // process. + // return true; + // } } } 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 db78d61ff9c..45043d340a5 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 @@ -90,7 +90,11 @@ public static NetworkRequestMetricBuilder builder(TransportManager transportMana * initialize them. */ private NetworkRequestMetricBuilder(TransportManager transportManager) { - this(transportManager, AppStateMonitor.getInstance(), GaugeManager.getInstance(), SessionManager.getInstance()); + this( + transportManager, + AppStateMonitor.getInstance(), + GaugeManager.getInstance(), + AppStateMonitor.getInstance().getSessionManager()); } /** 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 0f5651da156..262ac9e817f 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 @@ -157,13 +157,25 @@ public Trace( } public Trace( - @NonNull String name, - @NonNull TransportManager transportManager, - @NonNull Clock clock, - @NonNull AppStateMonitor appStateMonitor, - @NonNull GaugeManager gaugeManager) { - this(name, transportManager, clock, appStateMonitor, gaugeManager, SessionManager.getInstance()); + @NonNull String name, + @NonNull TransportManager transportManager, + @NonNull Clock clock, + @NonNull AppStateMonitor appStateMonitor, + @NonNull GaugeManager gaugeManager) { + this( + name, + transportManager, + clock, + appStateMonitor, + gaugeManager, + sessionManagerFrom(appStateMonitor)); + } + + private static SessionManager sessionManagerFrom(AppStateMonitor appStateMonitor) { + SessionManager sm = appStateMonitor.getSessionManager(); + return sm != null ? sm : new SessionManager(null, PerfSession.createWithId(null)); } + /** * Creates a Trace object with the given name. TransportManager, Clock and GaugeManager instances * are for testing. @@ -213,7 +225,7 @@ private Trace(@NonNull Parcel in, boolean isDataOnly) { clock = new Clock(); gaugeManager = GaugeManager.getInstance(); } - sessionManager = SessionManager.getInstance(); + sessionManager = TransportManager.getInstance().getSessionManager(); } /** Starts this trace. */ @@ -272,8 +284,7 @@ public void stop() { transportManager.log(new TraceMetricBuilder(this).build(), getAppState()); if (sessionManager.perfSession().isVerbose()) { - gaugeManager.collectGaugeMetricOnce( - sessionManager.perfSession().getTimer()); + gaugeManager.collectGaugeMetricOnce(sessionManager.perfSession().getTimer()); } } else { logger.error("Trace name is empty, no log is sent to server"); diff --git a/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt b/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt index 2e51a1498d1..2ed18337797 100644 --- a/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt +++ b/firebase-perf/src/main/java/com/google/firebase/perf/session/FirebasePerformanceSessionSubscriber.kt @@ -20,7 +20,10 @@ import com.google.firebase.perf.config.ConfigResolver import com.google.firebase.perf.logging.FirebaseSessionsEnforcementCheck.Companion.checkSession import com.google.firebase.sessions.api.SessionSubscriber -class FirebasePerformanceSessionSubscriber(val configResolver: ConfigResolver, private val sessionManager: SessionManager) : SessionSubscriber { +class FirebasePerformanceSessionSubscriber( + val configResolver: ConfigResolver, + private val sessionManager: SessionManager +) : SessionSubscriber { override val sessionSubscriberName: SessionSubscriber.Name = SessionSubscriber.Name.PERFORMANCE 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 873965d7aaa..a7b3f62ac11 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 @@ -14,7 +14,6 @@ package com.google.firebase.perf.session; -import android.annotation.SuppressLint; import android.content.Context; import androidx.annotation.Keep; import androidx.annotation.VisibleForTesting; @@ -30,30 +29,17 @@ /** Session manager to generate sessionIDs and broadcast to the application. */ @Keep // Needed because of b/117526359. public class SessionManager { - @SuppressLint("StaticFieldLeak") - private static final SessionManager instance = new SessionManager(); private final GaugeManager gaugeManager; private final Set> clients = new HashSet<>(); private PerfSession perfSession; - /** 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() { - // Creates a legacy session by default. This is a safety net to allow initializing - // SessionManager - but the current implementation replaces it immediately. - this(GaugeManager.getInstance(), PerfSession.createWithId(null)); - } - @VisibleForTesting public SessionManager(GaugeManager gaugeManager, PerfSession perfSession) { this.gaugeManager = gaugeManager; @@ -65,7 +51,9 @@ public SessionManager(GaugeManager gaugeManager, PerfSession perfSession) { * (currently that is before onResume finishes) to ensure gauge collection starts on time. */ public void setApplicationContext(final Context appContext) { - gaugeManager.initializeGaugeMetadataManager(appContext); + if (gaugeManager != null) { + gaugeManager.initializeGaugeMetadataManager(appContext); + } } /** @@ -74,7 +62,7 @@ public void setApplicationContext(final Context appContext) { * @see PerfSession#isSessionRunningTooLong() */ public void stopGaugeCollectionIfSessionRunningTooLong() { - if (perfSession.isSessionRunningTooLong()) { + if (perfSession.isSessionRunningTooLong() && gaugeManager != null) { gaugeManager.stopCollectingGauges(); } } @@ -151,12 +139,15 @@ public void unregisterForSessionUpdates(WeakReference client } private void logGaugeMetadataIfCollectionEnabled() { - if (perfSession.isVerbose()) { + if (perfSession.isVerbose() && gaugeManager != null) { gaugeManager.logGaugeMetadata(perfSession.sessionId()); } } private void startOrStopCollectingGauges() { + if (gaugeManager == null) { + return; + } if (perfSession.isVerbose()) { gaugeManager.startCollectingGauges(perfSession); } else { 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 f40a2eaf5ad..d4abf5140b5 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 @@ -166,7 +166,8 @@ void initializeForTest( RateLimiter rateLimiter, AppStateMonitor appStateMonitor, FlgTransport flgTransport, - ExecutorService executorService) { + ExecutorService executorService, + SessionManager sessionManager) { this.firebaseApp = firebaseApp; this.projectId = firebaseApp.getOptions().getProjectId(); @@ -179,6 +180,7 @@ void initializeForTest( this.appStateMonitor = appStateMonitor; this.flgTransport = flgTransport; this.executorService = executorService; + this.sessionManager = sessionManager; // Re-init the cache, otherwise the cache might get consumed/exhausted after a few tests cacheMap.put(KEY_AVAILABLE_TRACES_FOR_CACHING, MAX_TRACE_METRICS_CACHE_SIZE); @@ -396,6 +398,11 @@ private void syncLog(PerfMetric.Builder perfMetricBuilder, ApplicationProcessSta } } + /** Returns the {@link SessionManager} associated with this transport. */ + public SessionManager getSessionManager() { + return sessionManager; + } + @WorkerThread private boolean isAllowedToCache(PerfMetricOrBuilder perfMetricOrBuilder) { final int availableTracesForCaching = cacheMap.get(KEY_AVAILABLE_TRACES_FOR_CACHING); 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..49d01bdca6d 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,7 +40,8 @@ public void testGetComponents() { FirebasePerfRegistrar firebasePerfRegistrar = new FirebasePerfRegistrar(); List> components = firebasePerfRegistrar.getComponents(); - assertThat(components).hasSize(3); + // FirebasePerformance, FirebasePerfEarly, SessionManager, LibraryVersionComponent + assertThat(components).hasSize(4); Component firebasePerfComponent = components.get(0); @@ -49,7 +51,8 @@ public void testGetComponents() { Dependency.requiredProvider(RemoteConfigComponent.class), Dependency.required(FirebaseInstallationsApi.class), Dependency.requiredProvider(TransportFactory.class), - Dependency.required(FirebasePerfEarly.class)); + Dependency.required(FirebasePerfEarly.class), + Dependency.required(SessionManager.class)); assertThat(firebasePerfComponent.isLazy()).isTrue(); @@ -59,7 +62,8 @@ public void testGetComponents() { .containsExactly( Dependency.required(Qualified.qualified(UiThread.class, Executor.class)), Dependency.required(FirebaseApp.class), - Dependency.optionalProvider(StartupTime.class)); + Dependency.optionalProvider(StartupTime.class), + Dependency.required(SessionManager.class)); assertThat(firebasePerfEarlyComponent.isLazy()).isFalse(); } 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..5c6d5d8d943 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 @@ -36,7 +36,10 @@ import com.google.firebase.perf.config.ConfigResolver; import com.google.firebase.perf.config.DeviceCacheManager; import com.google.firebase.perf.config.RemoteConfigManager; +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.util.Clock; import com.google.firebase.perf.util.Constants; import com.google.firebase.perf.util.ImmutableBundle; import com.google.firebase.remoteconfig.RemoteConfigComponent; @@ -100,11 +103,14 @@ public void setUp() throws NameNotFoundException { sharedPreferences.edit().clear().commit(); DeviceCacheManager.clearInstance(); - spyRemoteConfigManager = spy(RemoteConfigManager.getInstance()); ConfigResolver.clearInstance(); spyConfigResolver = spy(ConfigResolver.getInstance()); + spyRemoteConfigManager = spy(ConfigResolver.getInstance().getRemoteConfigManager()); - spySessionManager = spy(SessionManager.getInstance()); + spySessionManager = + spy( + new SessionManager( + mock(GaugeManager.class), new PerfSession("sessionId", new Clock()))); fakeDirectExecutorService = new FakeDirectExecutorService(); } 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 de193c2066e..6722f183db0 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 @@ -40,7 +40,6 @@ 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; @@ -53,7 +52,6 @@ import java.lang.ref.WeakReference; import java.util.HashMap; import java.util.Map; -import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -80,7 +78,6 @@ public class AppStateMonitorTest extends FirebasePerformanceTestBase { private Activity activity1; private Activity activity2; - @Before public void setUp() { currentTime = 0; 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); } 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 ba1b907c386..291000c1cd7 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,11 +34,8 @@ 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; @@ -99,7 +96,7 @@ public Timer answer(InvocationOnMock invocationOnMock) throws Throwable { @After public void reset() { - SessionManager.getInstance().updatePerfSession(PerfSession.createWithId("randomSessionId")); + sessionManager.updatePerfSession(PerfSession.createWithId("randomSessionId")); } /** Test activity sequentially goes through onCreate()->onStart()->onResume() state change. */ @@ -107,7 +104,8 @@ public void reset() { public void testLaunchActivity() { FakeScheduledExecutorService fakeExecutorService = new FakeScheduledExecutorService(); AppStartTrace trace = - new AppStartTrace(transportManager, clock, configResolver, sessionManager, fakeExecutorService); + new AppStartTrace( + transportManager, clock, configResolver, sessionManager, fakeExecutorService); trace.registerActivityLifecycleCallbacks(appContext); // first activity goes through onCreate()->onStart()->onResume() state change. currentTime = 1; @@ -181,7 +179,8 @@ private void verifyFinalState( public void testInterleavedActivity() { FakeScheduledExecutorService fakeExecutorService = new FakeScheduledExecutorService(); AppStartTrace trace = - new AppStartTrace(transportManager, clock, configResolver, sessionManager, fakeExecutorService); + new AppStartTrace( + transportManager, clock, configResolver, sessionManager, fakeExecutorService); trace.registerActivityLifecycleCallbacks(appContext); // first activity onCreate() currentTime = 1; @@ -218,7 +217,8 @@ public void testInterleavedActivity() { public void testDelayedAppStart() { FakeScheduledExecutorService fakeExecutorService = new FakeScheduledExecutorService(); AppStartTrace trace = - new AppStartTrace(transportManager, clock, configResolver, sessionManager, fakeExecutorService); + new AppStartTrace( + transportManager, clock, configResolver, sessionManager, fakeExecutorService); trace.registerActivityLifecycleCallbacks(appContext); // Delays activity creation after 1 minute from app start time. currentTime = @@ -245,7 +245,8 @@ public void testStartFromBackground_within50ms() { FakeScheduledExecutorService fakeExecutorService = new FakeScheduledExecutorService(); Timer fakeTimer = spy(new Timer(currentTime)); AppStartTrace trace = - new AppStartTrace(transportManager, clock, configResolver, sessionManager, fakeExecutorService); + new AppStartTrace( + transportManager, clock, configResolver, sessionManager, fakeExecutorService); trace.registerActivityLifecycleCallbacks(appContext); trace.setMainThreadRunnableTime(fakeTimer); @@ -273,7 +274,8 @@ public void testStartFromBackground_moreThan50ms() { FakeScheduledExecutorService fakeExecutorService = new FakeScheduledExecutorService(); Timer fakeTimer = spy(new Timer(currentTime)); AppStartTrace trace = - new AppStartTrace(transportManager, clock, configResolver, sessionManager, fakeExecutorService); + new AppStartTrace( + transportManager, clock, configResolver, sessionManager, fakeExecutorService); trace.registerActivityLifecycleCallbacks(appContext); trace.setMainThreadRunnableTime(fakeTimer); @@ -306,7 +308,8 @@ public void timeToInitialDisplay_isLogged() { when(configResolver.getIsExperimentTTIDEnabled()).thenReturn(true); FakeScheduledExecutorService fakeExecutorService = new FakeScheduledExecutorService(); AppStartTrace trace = - new AppStartTrace(transportManager, clock, configResolver, sessionManager, fakeExecutorService); + new AppStartTrace( + transportManager, clock, configResolver, sessionManager, fakeExecutorService); 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/NetworkRequestMetricBuilderTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/metrics/NetworkRequestMetricBuilderTest.java index 9a0a7c46c58..c5e7af0bcf2 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 @@ -61,6 +61,8 @@ protected SessionManager provideSessionManager() { @Before public void setUp() { initMocks(this); + AppStateMonitor.resetInstance(); + AppStateMonitor.getInstance(sessionManager); networkMetricBuilder = new NetworkRequestMetricBuilder( mockTransportManager, mockAppStateMonitor, mockGaugeManager, sessionManager); @@ -235,7 +237,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); } 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 ca86a1a86b6..d57daeda632 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 @@ -79,6 +79,8 @@ public void setUp() { DeviceCacheManager.clearInstance(); ConfigResolver.clearInstance(); + AppStateMonitor.resetInstance(); + AppStateMonitor.getInstance(sessionManager); appContext.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit().clear().commit(); ConfigResolver configResolver = ConfigResolver.getInstance(); @@ -1017,7 +1019,7 @@ public void testSessionIdAdditionInTrace() { int numberOfSessionIds = trace.getSessions().size(); PerfSession perfSession = PerfSession.createWithId("test_session_id"); - SessionManager.getInstance().updatePerfSession(perfSession); + sessionManager.updatePerfSession(perfSession); assertThat(trace.getSessions()).hasSize(numberOfSessionIds + 1); trace.stop(); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/session/SessionManagerTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/session/SessionManagerTest.java index ab8cce7aab5..137fc275ae8 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/session/SessionManagerTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/session/SessionManagerTest.java @@ -61,13 +61,6 @@ public void setUp() { initMocks(this); when(mockPerfSession.sessionId()).thenReturn(testSessionId(5)); when(mockAppStateMonitor.isColdStart()).thenReturn(false); - AppStateMonitor.getInstance().setIsColdStart(false); - } - - @Test - public void testInstanceCreation() { - assertThat(SessionManager.getInstance()).isNotNull(); - assertThat(SessionManager.getInstance()).isEqualTo(SessionManager.getInstance()); } @Test diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/GaugeManagerTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/GaugeManagerTest.java index 9dd0e9e82d8..eaee6c7a218 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/GaugeManagerTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/session/gauges/GaugeManagerTest.java @@ -83,7 +83,6 @@ public static void setUpBeforeClass() { GaugeCounter.resetCounter(); } - @Before public void setUp() { fakeScheduledExecutorService = new FakeScheduledExecutorService(); diff --git a/firebase-perf/src/test/java/com/google/firebase/perf/transport/TransportManagerTest.java b/firebase-perf/src/test/java/com/google/firebase/perf/transport/TransportManagerTest.java index 07b50c4377d..6f451ad02d4 100644 --- a/firebase-perf/src/test/java/com/google/firebase/perf/transport/TransportManagerTest.java +++ b/firebase-perf/src/test/java/com/google/firebase/perf/transport/TransportManagerTest.java @@ -41,7 +41,6 @@ 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.SessionManager; import com.google.firebase.perf.shadows.ShadowPreconditions; import com.google.firebase.perf.util.Constants; import com.google.firebase.perf.util.Constants.CounterNames; @@ -1206,14 +1205,14 @@ public void logTraceMetric_perfSessionExpired_doesNotUpdateSessionId() { when(mockPerfSession.sessionId()).thenReturn("sessionId"); when(mockPerfSession.isSessionRunningTooLong()).thenReturn(true); - SessionManager.getInstance().setPerfSession(mockPerfSession); - String oldSessionId = SessionManager.getInstance().perfSession().sessionId(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + sessionManager.setPerfSession(mockPerfSession); + String oldSessionId = sessionManager.perfSession().sessionId(); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); testTransportManager.log(createValidTraceMetric(), ApplicationProcessState.BACKGROUND); fakeExecutorService.runAll(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); } @Test @@ -1223,14 +1222,14 @@ public void logNetworkMetric_perfSessionExpired_doesNotUpdateSessionId() { when(mockPerfSession.sessionId()).thenReturn("sessionId"); when(mockPerfSession.isSessionRunningTooLong()).thenReturn(true); - SessionManager.getInstance().setPerfSession(mockPerfSession); - String oldSessionId = SessionManager.getInstance().perfSession().sessionId(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + sessionManager.setPerfSession(mockPerfSession); + String oldSessionId = sessionManager.perfSession().sessionId(); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); testTransportManager.log(createValidNetworkRequestMetric(), ApplicationProcessState.BACKGROUND); fakeExecutorService.runAll(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); } @Test @@ -1240,14 +1239,14 @@ public void logGaugeMetric_perfSessionExpired_doesNotUpdateSessionId() { when(mockPerfSession.sessionId()).thenReturn("sessionId"); when(mockPerfSession.isSessionRunningTooLong()).thenReturn(true); - SessionManager.getInstance().setPerfSession(mockPerfSession); - String oldSessionId = SessionManager.getInstance().perfSession().sessionId(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + sessionManager.setPerfSession(mockPerfSession); + String oldSessionId = sessionManager.perfSession().sessionId(); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); testTransportManager.log(createValidGaugeMetric(), ApplicationProcessState.FOREGROUND); fakeExecutorService.runAll(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); } @Test @@ -1257,14 +1256,14 @@ public void logTraceMetric_perfSessionNotExpired_doesNotUpdateSessionId() { when(mockPerfSession.sessionId()).thenReturn("sessionId"); when(mockPerfSession.isSessionRunningTooLong()).thenReturn(false); - SessionManager.getInstance().setPerfSession(mockPerfSession); - String oldSessionId = SessionManager.getInstance().perfSession().sessionId(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + sessionManager.setPerfSession(mockPerfSession); + String oldSessionId = sessionManager.perfSession().sessionId(); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); testTransportManager.log(createValidTraceMetric(), ApplicationProcessState.BACKGROUND); fakeExecutorService.runAll(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); } @Test @@ -1274,14 +1273,14 @@ public void logNetworkMetric_perfSessionNotExpired_doesNotUpdateSessionId() { when(mockPerfSession.sessionId()).thenReturn("sessionId"); when(mockPerfSession.isSessionRunningTooLong()).thenReturn(false); - SessionManager.getInstance().setPerfSession(mockPerfSession); - String oldSessionId = SessionManager.getInstance().perfSession().sessionId(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + sessionManager.setPerfSession(mockPerfSession); + String oldSessionId = sessionManager.perfSession().sessionId(); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); testTransportManager.log(createValidNetworkRequestMetric(), ApplicationProcessState.BACKGROUND); fakeExecutorService.runAll(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); } @Test @@ -1291,14 +1290,14 @@ public void logGaugeMetric_perfSessionNotExpired_doesNotUpdateSessionId() { when(mockPerfSession.sessionId()).thenReturn("sessionId"); when(mockPerfSession.isSessionRunningTooLong()).thenReturn(false); - SessionManager.getInstance().setPerfSession(mockPerfSession); - String oldSessionId = SessionManager.getInstance().perfSession().sessionId(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + sessionManager.setPerfSession(mockPerfSession); + String oldSessionId = sessionManager.perfSession().sessionId(); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); testTransportManager.log(createValidGaugeMetric(), ApplicationProcessState.FOREGROUND); fakeExecutorService.runAll(); - assertThat(oldSessionId).isEqualTo(SessionManager.getInstance().perfSession().sessionId()); + assertThat(oldSessionId).isEqualTo(sessionManager.perfSession().sessionId()); } // endregion @@ -1423,7 +1422,8 @@ private void initializeTransport(boolean shouldInitialize) { mockRateLimiter, mockAppStateMonitor, mockFlgTransport, - fakeExecutorService); + fakeExecutorService, + sessionManager); } else { testTransportManager.setInitialized(false);