18
18
import static com .google .common .truth .Truth .assertThat ;
19
19
import static org .mockito .ArgumentMatchers .any ;
20
20
import static org .mockito .Mockito .doReturn ;
21
- import static org .mockito .Mockito .times ;
22
- import static org .mockito .Mockito .verify ;
23
21
import static org .mockito .MockitoAnnotations .initMocks ;
24
22
25
23
import android .app .Activity ;
31
29
import com .google .firebase .perf .metrics .FrameMetricsCalculator .PerfFrameMetrics ;
32
30
import com .google .firebase .perf .util .Optional ;
33
31
import java .util .HashMap ;
34
- import java .util .List ;
35
32
import org .junit .Before ;
36
33
import org .junit .Test ;
37
34
import org .junit .runner .RunWith ;
38
- import org .mockito .ArgumentCaptor ;
39
35
import org .mockito .Mock ;
40
36
import org .robolectric .Robolectric ;
41
37
import org .robolectric .RobolectricTestRunner ;
@@ -61,56 +57,39 @@ public void setUp() {
61
57
stubFrameMetricsAggregatorData (fma , frameTimesDefault );
62
58
}
63
59
64
- /** FrameMetricsAggregator misuse prevention tests. Only 1 Activity per FMA. */
65
60
@ Test
66
- public void frameMetricsAggregator_shouldOnlyUseTheSameSingleActivity () {
67
- ArgumentCaptor <Activity > activityCaptor = ArgumentCaptor .forClass (Activity .class );
68
- recorder .start ();
69
- recorder .stop ();
61
+ public void stop_whileNotStarted_returnsEmptyResult () {
62
+ // nothing ever started
63
+ Optional <PerfFrameMetrics > result = recorder .stop ();
64
+ assertThat (result .isAvailable ()).isFalse ();
65
+ // previous recording ended but no one has not started
70
66
recorder .start ();
71
67
recorder .stop ();
72
- verify (fma , times (2 )).add (activityCaptor .capture ());
73
- verify (fma , times (2 )).remove (activityCaptor .capture ());
74
- List <Activity > activities = activityCaptor .getAllValues ();
75
- assertThat (activities .stream ().allMatch (a -> a == activity )).isTrue ();
76
- }
77
-
78
- @ Test
79
- public void start_whileAlreadyStarted_doesNotCallFMATwice () {
80
- recorder .start ();
81
- recorder .start ();
82
- verify (fma , times (1 )).add (any ());
68
+ Optional <PerfFrameMetrics > result2 = recorder .stop ();
69
+ assertThat (result2 .isAvailable ()).isFalse ();
83
70
}
84
71
85
72
@ Test
86
- public void start_afterPreviousEnded_doesCallFMASuccessfully () {
73
+ public void startAndStop_calledTwice_ignoresSecondCall () {
87
74
recorder .start ();
88
- recorder .stop ();
89
- recorder .start ();
90
- verify (fma , times (2 )).add (any ());
91
- }
75
+ recorder .start (); // 2nd call is ignored
76
+ stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 1 }, {17 , 3 }, {800 , 1 }});
77
+ Optional <PerfFrameMetrics > result1 = recorder .stop ();
78
+ stubFrameMetricsAggregatorData (fma , frameTimes2 ); // 2nd call is ignored
79
+ Optional <PerfFrameMetrics > result2 = recorder .stop ();
92
80
93
- @ Test
94
- public void stop_whileNotStarted_returnsEmptyResult () {
95
- Optional <PerfFrameMetrics > result ;
96
- result = recorder .stop ();
97
- assertThat (result .isAvailable ()).isFalse ();
98
- }
81
+ assertThat (result1 .isAvailable ()).isTrue ();
82
+ assertThat (result2 .isAvailable ()).isFalse ();
99
83
100
- @ Test
101
- public void stop_calledTwice_returnsEmptyResult () {
102
- Optional <PerfFrameMetrics > result ;
103
- recorder .start ();
104
- recorder .stop ();
105
- result = recorder .stop ();
106
- assertThat (result .isAvailable ()).isFalse ();
84
+ assertThat (result1 .get ().getTotalFrames ()).isEqualTo (1 + 3 + 1 );
85
+ assertThat (result1 .get ().getTotalFrames ()).isEqualTo (3 + 1 );
86
+ assertThat (result1 .get ().getTotalFrames ()).isEqualTo (1 );
107
87
}
108
88
109
89
@ Test
110
90
public void startAndStop_calledInCorrectOrder_returnsValidResult () {
111
- Optional <PerfFrameMetrics > result ;
112
91
recorder .start ();
113
- result = recorder .stop ();
92
+ Optional < PerfFrameMetrics > result = recorder .stop ();
114
93
assertThat (result .isAvailable ()).isTrue ();
115
94
assertThat (result .get ().getTotalFrames ()).isEqualTo (3 );
116
95
assertThat (result .get ().getSlowFrames ()).isEqualTo (2 );
@@ -120,76 +99,74 @@ public void startAndStop_calledInCorrectOrder_returnsValidResult() {
120
99
@ Test
121
100
public void startAndStopSubTrace_activityRecordingNeverStarted_returnsEmptyResult () {
122
101
Fragment fragment = new Fragment ();
123
- Optional <PerfFrameMetrics > result ;
124
102
125
103
stubFrameMetricsAggregatorData (fma , frameTimes1 );
126
104
recorder .startSubTrace (fragment );
127
105
stubFrameMetricsAggregatorData (fma , frameTimes2 );
128
- result = recorder .stopSubTrace (fragment );
106
+ Optional < PerfFrameMetrics > result = recorder .stopSubTrace (fragment );
129
107
assertThat (result .isAvailable ()).isFalse ();
130
108
}
131
109
132
110
@ Test
133
111
public void startAndStopSubTrace_activityRecordingHasEnded_returnsEmptyResult () {
134
112
Fragment fragment = new Fragment ();
135
- Optional <PerfFrameMetrics > result ;
136
113
137
114
recorder .start ();
138
115
recorder .stop ();
139
116
stubFrameMetricsAggregatorData (fma , frameTimes1 );
140
117
recorder .startSubTrace (fragment );
141
118
stubFrameMetricsAggregatorData (fma , frameTimes2 );
142
- result = recorder .stopSubTrace (fragment );
119
+ Optional < PerfFrameMetrics > result = recorder .stopSubTrace (fragment );
143
120
assertThat (result .isAvailable ()).isFalse ();
144
121
}
145
122
123
+ /**
124
+ * This scenario happens only when we hook on to the same instance of fragment twice, which should
125
+ * never happen
126
+ */
146
127
@ Test
147
128
public void startAndStopSubTrace_whenCalledTwice_ignoresSecondCall () {
148
129
Fragment fragment = new Fragment ();
149
- Optional <PerfFrameMetrics > result1 ;
150
- Optional <PerfFrameMetrics > result2 ;
151
130
152
- // Happens only when we hook on to the same instance of fragment twice. Very unlikely.
131
+ // comments are in this format: total frames, slow frames, frozen frames
153
132
recorder .start ();
154
133
stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 1 }, {17 , 1 }, {800 , 1 }}); // 3, 2, 1
155
134
recorder .startSubTrace (fragment );
156
- stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 2 }, {17 , 3 }, {800 , 2 }}); // 7, 5, 2
157
- recorder .startSubTrace (fragment );
135
+ stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 2 }, {17 , 3 }, {800 , 2 }}); // ignored
136
+ recorder .startSubTrace (fragment ); // this call is ignored
158
137
stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 5 }, {17 , 4 }, {800 , 5 }}); // 14, 9, 5
159
- result1 = recorder .stopSubTrace (fragment );
160
- stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 6 }, {17 , 5 }, {800 , 5 }}); // 16, 10, 5
161
- result2 = recorder .stopSubTrace (fragment );
138
+ Optional < PerfFrameMetrics > result1 = recorder .stopSubTrace (fragment );
139
+ stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 6 }, {17 , 5 }, {800 , 5 }}); // ignored
140
+ Optional < PerfFrameMetrics > result2 = recorder .stopSubTrace (fragment ); // this call is ignored
162
141
163
142
// total = 14 - 3 = 11, slow = 9 - 2 = 7, frozen = 5 - 1 = 4
164
- assertThat (result1 .get ().getTotalFrames ()).isEqualTo (11 );
165
- assertThat (result1 .get ().getSlowFrames ()).isEqualTo (7 );
166
- assertThat (result1 .get ().getFrozenFrames ()).isEqualTo (4 );
143
+ assertThat (result1 .get ().getTotalFrames ()).isEqualTo (14 - 3 );
144
+ assertThat (result1 .get ().getSlowFrames ()).isEqualTo (9 - 2 );
145
+ assertThat (result1 .get ().getFrozenFrames ()).isEqualTo (5 - 1 );
167
146
assertThat (result2 .isAvailable ()).isFalse ();
168
147
}
169
148
170
149
@ Test
171
150
public void stopAndStopSubTrace_whenNoSubTraceWithGivenKeyExists_returnsEmptyResult () {
172
151
Fragment fragment1 = new Fragment ();
173
152
Fragment fragment2 = new Fragment ();
174
- Optional <PerfFrameMetrics > result ;
175
153
176
154
recorder .start ();
177
155
178
156
recorder .startSubTrace (fragment1 );
179
- result = recorder .stopSubTrace (fragment2 );
157
+ Optional < PerfFrameMetrics > result = recorder .stopSubTrace (fragment2 );
180
158
181
159
assertThat (result .isAvailable ()).isFalse ();
182
160
}
183
161
184
162
@ Test
185
163
public void startAndStopSubTrace_duringActivityRecording_returnsValidResult () {
186
164
Fragment fragment = new Fragment ();
187
- Optional <PerfFrameMetrics > result ;
188
165
recorder .start ();
189
166
stubFrameMetricsAggregatorData (fma , frameTimes1 );
190
167
recorder .startSubTrace (fragment );
191
168
stubFrameMetricsAggregatorData (fma , frameTimes2 );
192
- result = recorder .stopSubTrace (fragment );
169
+ Optional < PerfFrameMetrics > result = recorder .stopSubTrace (fragment );
193
170
assertThat (result .isAvailable ()).isTrue ();
194
171
// frameTimes2 - frameTimes1
195
172
assertThat (result .get ().getTotalFrames ()).isEqualTo (9 );
@@ -201,26 +178,25 @@ public void startAndStopSubTrace_duringActivityRecording_returnsValidResult() {
201
178
public void startAndStopSubTrace_whenTwoSubTracesOverlap_returnsCorrectResults () {
202
179
Fragment fragment1 = new Fragment ();
203
180
Fragment fragment2 = new Fragment ();
204
- Optional <PerfFrameMetrics > subTrace1 ;
205
- Optional <PerfFrameMetrics > subTrace2 ;
206
181
recorder .start ();
182
+ // comments are in this format: total frames, slow frames, frozen frames
207
183
stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 1 }, {17 , 1 }, {800 , 1 }}); // 3, 2, 1
208
184
recorder .startSubTrace (fragment1 );
209
185
stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 2 }, {17 , 3 }, {800 , 2 }}); // 7, 5, 2
210
186
recorder .startSubTrace (fragment2 );
211
187
stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 5 }, {17 , 4 }, {800 , 5 }}); // 14, 9, 5
212
- subTrace1 = recorder .stopSubTrace (fragment1 );
188
+ Optional < PerfFrameMetrics > subTrace1 = recorder .stopSubTrace (fragment1 );
213
189
stubFrameMetricsAggregatorData (fma , new int [][] {{1 , 6 }, {17 , 5 }, {800 , 5 }}); // 16, 10, 5
214
- subTrace2 = recorder .stopSubTrace (fragment2 );
215
-
216
- // total = 14 - 3 = 11, slow = 9 - 2 = 7, frozen = 5 - 1 = 4
217
- assertThat (subTrace1 .get ().getTotalFrames ()).isEqualTo (11 );
218
- assertThat (subTrace1 .get ().getSlowFrames ()).isEqualTo (7 );
219
- assertThat (subTrace1 .get ().getFrozenFrames ()).isEqualTo (4 );
220
- // total = 16 - 7 = 9, slow = 10 - 5 = 5, frozen = 5 - 2 = 3
221
- assertThat (subTrace2 .get ().getTotalFrames ()).isEqualTo (9 );
222
- assertThat (subTrace2 .get ().getSlowFrames ()).isEqualTo (5 );
223
- assertThat (subTrace2 .get ().getFrozenFrames ()).isEqualTo (3 );
190
+ Optional < PerfFrameMetrics > subTrace2 = recorder .stopSubTrace (fragment2 );
191
+
192
+ // 3rd snapshot - 1st snapshot
193
+ assertThat (subTrace1 .get ().getTotalFrames ()).isEqualTo (14 - 3 );
194
+ assertThat (subTrace1 .get ().getSlowFrames ()).isEqualTo (9 - 2 );
195
+ assertThat (subTrace1 .get ().getFrozenFrames ()).isEqualTo (5 - 1 );
196
+ // 4th snapshot - 2nd snapshot
197
+ assertThat (subTrace2 .get ().getTotalFrames ()).isEqualTo (16 - 7 );
198
+ assertThat (subTrace2 .get ().getSlowFrames ()).isEqualTo (10 - 5 );
199
+ assertThat (subTrace2 .get ().getFrozenFrames ()).isEqualTo (5 - 2 );
224
200
}
225
201
226
202
private static Activity createFakeActivity (boolean isHardwareAccelerated ) {
0 commit comments