Skip to content

Commit 64af577

Browse files
committed
fix 1 test
1 parent 05c7a41 commit 64af577

File tree

1 file changed

+69
-40
lines changed

1 file changed

+69
-40
lines changed

firebase-perf/src/test/java/com/google/firebase/perf/application/FragmentStateMonitorTest.java

Lines changed: 69 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414

1515
package com.google.firebase.perf.application;
1616

17+
import static com.google.common.truth.Truth.assertThat;
1718
import static org.mockito.ArgumentMatchers.any;
1819
import static org.mockito.ArgumentMatchers.nullable;
1920
import static org.mockito.Mockito.doAnswer;
21+
import static org.mockito.Mockito.doNothing;
2022
import static org.mockito.Mockito.doReturn;
2123
import static org.mockito.Mockito.inOrder;
2224
import static org.mockito.Mockito.mock;
@@ -25,8 +27,11 @@
2527
import static org.mockito.Mockito.verify;
2628
import static org.mockito.MockitoAnnotations.initMocks;
2729

30+
import android.app.Activity;
2831
import android.os.Bundle;
2932
import android.util.SparseIntArray;
33+
import android.view.WindowManager;
34+
3035
import androidx.appcompat.app.AppCompatActivity;
3136
import androidx.core.app.FrameMetricsAggregator;
3237
import androidx.fragment.app.Fragment;
@@ -53,7 +58,9 @@
5358
import org.mockito.InOrder;
5459
import org.mockito.Mock;
5560
import org.mockito.stubbing.Answer;
61+
import org.robolectric.Robolectric;
5662
import org.robolectric.RobolectricTestRunner;
63+
import org.robolectric.android.controller.ActivityController;
5764

5865
/** Unit tests for {@link com.google.firebase.perf.application.FragmentStateMonitor}. */
5966
@RunWith(RobolectricTestRunner.class)
@@ -64,7 +71,6 @@ public class FragmentStateMonitorTest extends FirebasePerformanceTestBase {
6471
@Mock private FragmentManager mockFragmentManager;
6572
@Mock private TransportManager mockTransportManager;
6673
@Mock private AppCompatActivity mockActivity;
67-
@Mock private AppCompatActivity mockActivityB;
6874
@Mock private AppStateMonitor appStateMonitor;
6975
@Mock private FrameMetricsRecorder recorder;
7076
@Mock private PerfFrameMetrics frameCounts1;
@@ -73,6 +79,7 @@ public class FragmentStateMonitorTest extends FirebasePerformanceTestBase {
7379

7480
@Captor private ArgumentCaptor<TraceMetric> argTraceMetric;
7581

82+
private Activity activity;
7683
private long currentTime = 0;
7784
private static final String longFragmentName =
7885
"_st_NeverGonnaGiveYouUpNeverGonnaLetYouDownNeverGonnaRunAroundAndDesertYouNeverGonnaMakeYouCryNeverGonnaSayGoodbyeNeverGonnaTellALieAndHurtYou";
@@ -92,13 +99,14 @@ public void setUp() {
9299
doAnswer((Answer<Timer>) invocationOnMock -> new Timer(currentTime)).when(clock).getTime();
93100

94101
DeviceCacheManager.clearInstance();
95-
96-
// ConfigResolver configResolver = ConfigResolver.getInstance();
97-
// configResolver.setDeviceCacheManager(new DeviceCacheManager(new
98-
// FakeDirectExecutorService()));
99-
// ConfigResolver spyConfigResolver = spy(configResolver);
100102
doReturn(true).when(configResolver).isPerformanceMonitoringEnabled();
101-
// this.configResolver = spyConfigResolver;
103+
104+
doNothing().when(recorder).start();
105+
doNothing().when(recorder).startFragment(any());
106+
doReturn(Optional.of(frameCounts1)).when(recorder).stopFragment(any());
107+
doReturn(Optional.of(frameCounts2)).when(recorder).stopFragment(any());
108+
109+
activity = createFakeActivity(true);
102110

103111
// fmaMetrics1 should have 1+3+1=5 total frames, 3+1=4 slow frames, and 1 frozen frames.
104112
SparseIntArray sparseIntArray = new SparseIntArray();
@@ -124,13 +132,13 @@ public void setUp() {
124132
public void lifecycleCallbacks_differentFrameMetricsCapturedByFma_logFragmentScreenTrace() {
125133
FragmentStateMonitor monitor =
126134
new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder);
127-
doReturn(Optional.of(frameCounts1)).when(recorder).stopSubTrace(any());
135+
doReturn(Optional.of(frameCounts1)).when(recorder).stopFragment(any());
128136
monitor.onFragmentResumed(mockFragmentManager, mockFragment);
129137
verify(mockTransportManager, times(0)).log(any(TraceMetric.class), any());
130138
monitor.onFragmentPaused(mockFragmentManager, mockFragment);
131139
verify(mockTransportManager, times(1)).log(any(TraceMetric.class), any());
132140

133-
doReturn(Optional.of(frameCounts2)).when(recorder).stopSubTrace(any());
141+
doReturn(Optional.of(frameCounts2)).when(recorder).stopFragment(any());
134142
monitor.onFragmentResumed(mockFragmentManager, mockFragment);
135143
verify(mockTransportManager, times(1)).log(any(TraceMetric.class), any());
136144
monitor.onFragmentPaused(mockFragmentManager, mockFragment);
@@ -141,7 +149,7 @@ public void lifecycleCallbacks_differentFrameMetricsCapturedByFma_logFragmentScr
141149
public void lifecycleCallbacks_onPausedCalledTwice_logFragmentScreenTraceOnce() {
142150
FragmentStateMonitor monitor =
143151
new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder);
144-
doReturn(Optional.of(frameCounts1)).when(recorder).stopSubTrace(any());
152+
doReturn(Optional.of(frameCounts1)).when(recorder).stopFragment(any());
145153
monitor.onFragmentResumed(mockFragmentManager, mockFragment);
146154
verify(mockTransportManager, times(0)).log(any(TraceMetric.class), any());
147155

@@ -156,7 +164,7 @@ public void lifecycleCallbacks_onPausedCalledTwice_logFragmentScreenTraceOnce()
156164
public void lifecycleCallbacks_onPausedCalledBeforeOnResume_doesNotLogFragmentScreenTrace() {
157165
FragmentStateMonitor monitor =
158166
new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder);
159-
doReturn(Optional.of(frameCounts1)).when(recorder).stopSubTrace(any());
167+
doReturn(Optional.of(frameCounts1)).when(recorder).stopFragment(any());
160168

161169
monitor.onFragmentPaused(mockFragmentManager, mockFragment);
162170
verify(mockTransportManager, times(0)).log(any(TraceMetric.class), any());
@@ -170,7 +178,7 @@ public void lifecycleCallbacks_onPausedCalledBeforeOnResume_doesNotLogFragmentSc
170178
lifecycleCallbacks_differentFrameMetricsCapturedByFma_logFragmentScreenTraceWithCorrectFrames() {
171179
FragmentStateMonitor monitor =
172180
new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder);
173-
doReturn(Optional.of(frameCounts1)).when(recorder).stopSubTrace(any());
181+
doReturn(Optional.of(frameCounts1)).when(recorder).stopFragment(any());
174182
monitor.onFragmentResumed(mockFragmentManager, mockFragment);
175183
verify(mockTransportManager, times(0)).log(any(TraceMetric.class), any());
176184

@@ -191,39 +199,42 @@ public void lifecycleCallbacks_onPausedCalledBeforeOnResume_doesNotLogFragmentSc
191199
3, (long) metric.getCountersMap().get(Constants.CounterNames.FRAMES_FROZEN.toString()));
192200
}
193201

202+
/**
203+
* Simulate call order of activity + fragment lifecycle events
204+
*/
194205
@Test
195206
public void lifecycleCallbacks_cleansUpMap_duringActivityTransitions() {
196-
// Simulate call order of activity + fragment lifecycle events
197207
Bundle savedInstanceState = mock(Bundle.class);
198-
AppStateMonitor appStateMonitor =
199-
new AppStateMonitor(mockTransportManager, clock, configResolver, true);
208+
AppStateMonitor appStateMonitor = mock(AppStateMonitor.class);
209+
Fragment mockFragment1 = mock(Fragment.class);
210+
Fragment mockFragment2 = mock(Fragment.class);
211+
doNothing().when(recorder).startFragment(any());
212+
doReturn(mockFragmentManager).when(mockActivity).getSupportFragmentManager();
213+
200214
FragmentStateMonitor fragmentMonitor =
201215
new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder);
202-
doReturn(true).when(configResolver).isPerformanceMonitoringEnabled();
203216
WeakHashMap<Fragment, Trace> fragmentToTraceMap = fragmentMonitor.getFragmentToTraceMap();
204-
// Activity_A onCreate registers FragmentStateMonitor, then:
205-
appStateMonitor.onActivityCreated(mockActivity, savedInstanceState);
206-
appStateMonitor.onActivityStarted(mockActivity);
207-
Assert.assertEquals(0, fragmentToTraceMap.size());
208-
appStateMonitor.onActivityResumed(mockActivity);
209-
fragmentMonitor.onFragmentResumed(mockFragmentManager, mockFragment);
210-
Assert.assertEquals(1, fragmentToTraceMap.size());
211-
appStateMonitor.onActivityPaused(mockActivity);
212-
fragmentMonitor.onFragmentPaused(mockFragmentManager, mockFragment);
213-
Assert.assertEquals(0, fragmentToTraceMap.size());
214-
// Activity_B onCreate registers FragmentStateMonitor, then:
215-
appStateMonitor.onActivityStarted(mockActivityB);
216-
appStateMonitor.onActivityResumed(mockActivityB);
217-
fragmentMonitor.onFragmentResumed(mockFragmentManager, mockFragment);
218-
appStateMonitor.onActivityStopped(mockActivity);
219-
Assert.assertEquals(1, fragmentToTraceMap.size());
217+
218+
// Activity_A starts
219+
fragmentMonitor.onFragmentCreated(mockFragmentManager, mockFragment1, savedInstanceState);
220+
fragmentMonitor.onFragmentStarted(mockFragmentManager, mockFragment1);
221+
assertThat(fragmentToTraceMap.size()).isEqualTo(0);
222+
fragmentMonitor.onFragmentResumed(mockFragmentManager, mockFragment1);
223+
assertThat(fragmentToTraceMap.size()).isEqualTo(1);
224+
// Activity A is starting Activity B
225+
fragmentMonitor.onFragmentPaused(mockFragmentManager, mockFragment1);
226+
assertThat(fragmentToTraceMap.size()).isEqualTo(0);
227+
fragmentMonitor.onFragmentCreated(mockFragmentManager, mockFragment2, savedInstanceState);
228+
fragmentMonitor.onFragmentStarted(mockFragmentManager, mockFragment2);
229+
fragmentMonitor.onFragmentResumed(mockFragmentManager, mockFragment2);
230+
assertThat(fragmentToTraceMap.size()).isEqualTo(1);
220231
}
221232

222233
@Test
223234
public void fragmentTraceCreation_whenFrameMetricsIsAbsent_dropsTrace() {
224235
FragmentStateMonitor monitor =
225236
new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder);
226-
doReturn(Optional.absent()).when(recorder).stopSubTrace(any());
237+
doReturn(Optional.absent()).when(recorder).stopFragment(any());
227238
monitor.onFragmentResumed(mockFragmentManager, mockFragment);
228239
verify(mockTransportManager, times(0)).log(any(TraceMetric.class), any());
229240

@@ -241,7 +252,7 @@ public void fragmentTraceCreation_dropsTrace_whenFragmentNameTooLong() {
241252
doReturn(longFragmentName)
242253
.when(fragmentMonitor)
243254
.getFragmentScreenTraceName(nullable(Fragment.class));
244-
doReturn(Optional.of(frameCounts1)).when(recorder).stopSubTrace(any());
255+
doReturn(Optional.of(frameCounts1)).when(recorder).stopFragment(any());
245256

246257
fragmentMonitor.onFragmentResumed(mockFragmentManager, mockFragment);
247258
verify(mockTransportManager, times(0)).log(any(TraceMetric.class), any());
@@ -258,20 +269,38 @@ public void onFragmentPaused_processFrameMetrics_beforeReset() {
258269
spy(new AppStateMonitor(mockTransportManager, clock, configResolver, true));
259270
FragmentStateMonitor fragmentMonitor =
260271
new FragmentStateMonitor(clock, mockTransportManager, appStateMonitor, recorder);
272+
doReturn(true).when(configResolver).isPerformanceMonitoringEnabled();
261273
doReturn(true).when(appStateMonitor).isScreenTraceSupported();
262-
doReturn(Optional.of(frameCounts1)).when(recorder).stopSubTrace(any());
263274
// Activity_A onCreate registers FragmentStateMonitor, then:
264-
appStateMonitor.onActivityStarted(mockActivity);
275+
appStateMonitor.onActivityStarted(activity);
265276
fragmentMonitor.onFragmentStarted(mockFragmentManager, mockFragment);
266-
appStateMonitor.onActivityResumed(mockActivity);
277+
appStateMonitor.onActivityResumed(activity);
267278
fragmentMonitor.onFragmentResumed(mockFragmentManager, mockFragment);
268-
appStateMonitor.onActivityPaused(mockActivity);
279+
appStateMonitor.onActivityPaused(activity);
269280
fragmentMonitor.onFragmentPaused(mockFragmentManager, mockFragment);
270-
appStateMonitor.onActivityStopped(mockActivity);
281+
appStateMonitor.onActivityStopped(activity);
271282
fragmentMonitor.onFragmentStopped(mockFragmentManager, mockFragment);
272283
// reset() is only called after fragment is done collecting its metrics
273284
InOrder orderVerifier = inOrder(recorder);
274-
orderVerifier.verify(recorder, times(1)).stopSubTrace(any());
285+
orderVerifier.verify(recorder, times(1)).stopFragment(any());
275286
orderVerifier.verify(recorder, times(1)).stop();
276287
}
288+
289+
private static Activity createFakeActivity(boolean isHardwareAccelerated) {
290+
ActivityController<Activity> fakeActivityController = Robolectric.buildActivity(Activity.class);
291+
292+
if (isHardwareAccelerated) {
293+
fakeActivityController
294+
.get()
295+
.getWindow()
296+
.addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
297+
} else {
298+
fakeActivityController
299+
.get()
300+
.getWindow()
301+
.clearFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
302+
}
303+
304+
return fakeActivityController.start().get();
305+
}
277306
}

0 commit comments

Comments
 (0)