Skip to content

Commit e576a89

Browse files
chore: add unit test cases for instabug_navigator_observer
1 parent 953cb53 commit e576a89

File tree

3 files changed

+95
-29
lines changed

3 files changed

+95
-29
lines changed

lib/src/utils/instabug_navigator_observer.dart

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import 'package:instabug_flutter/src/utils/instabug_logger.dart';
66
import 'package:instabug_flutter/src/utils/repro_steps_constants.dart';
77
import 'package:instabug_flutter/src/utils/screen_loading/screen_loading_manager.dart';
88
import 'package:instabug_flutter/src/utils/screen_name_masker.dart';
9-
import 'package:instabug_flutter/src/utils/screen_rendering/instabug_screen_render_manager.dart';
109

1110
class InstabugNavigatorObserver extends NavigatorObserver {
1211
final List<InstabugRoute> _steps = [];
@@ -25,15 +24,7 @@ class InstabugNavigatorObserver extends NavigatorObserver {
2524
);
2625

2726
// Starts a the new UI trace which is exclusive to screen loading
28-
ScreenLoadingManager.I
29-
.startUiTrace(maskedScreenName, screenName)
30-
.then((uiTraceId) {
31-
if (uiTraceId != null &&
32-
InstabugScreenRenderManager.I.screenRenderEnabled) {
33-
InstabugScreenRenderManager.I
34-
.startScreenRenderCollectorForTraceId(uiTraceId);
35-
}
36-
});
27+
ScreenLoadingManager.I.startUiTrace(maskedScreenName, screenName);
3728

3829
// If there is a step that hasn't been pushed yet
3930
if (_steps.isNotEmpty) {

lib/src/utils/screen_rendering/instabug_screen_render_manager.dart

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -269,24 +269,28 @@ class InstabugScreenRenderManager {
269269
}
270270

271271
if (_isFrozen || _isSlow) {
272-
debugPrint("{\n\t$frameTiming\n\t"
273-
"Timestamps(${frameTiming.timestampInMicroseconds(
274-
FramePhase.buildStart,
275-
)}, ${frameTiming.timestampInMicroseconds(
276-
FramePhase.buildFinish,
277-
)}, ${frameTiming.timestampInMicroseconds(
278-
FramePhase.rasterStart,
279-
)}, ${frameTiming.timestampInMicroseconds(
280-
FramePhase.rasterFinish,
281-
)}, ${frameTiming.timestampInMicroseconds(
282-
FramePhase.vsyncStart,
283-
)}, ${frameTiming.timestampInMicroseconds(
284-
FramePhase.rasterFinishWallTime,
285-
)}"
286-
")\n}\n");
272+
debugPrint(
273+
"{\n\t$frameTiming\n\t"
274+
"Timestamps(${frameTiming.timestampInMicroseconds(
275+
FramePhase.buildStart,
276+
)}, ${frameTiming.timestampInMicroseconds(
277+
FramePhase.buildFinish,
278+
)}, ${frameTiming.timestampInMicroseconds(
279+
FramePhase.rasterStart,
280+
)}, ${frameTiming.timestampInMicroseconds(
281+
FramePhase.rasterFinish,
282+
)}, ${frameTiming.timestampInMicroseconds(
283+
FramePhase.vsyncStart,
284+
)}, ${frameTiming.timestampInMicroseconds(
285+
FramePhase.rasterFinishWallTime,
286+
)}"
287+
")\n}\n",
288+
);
287289
debugPrint("Device refresh rate: $_deviceRefreshRate FPS");
288-
debugPrint("Threshold: $_slowFrameThresholdMs ms\n"
289-
"===============================================================================");
290+
debugPrint(
291+
"Threshold: $_slowFrameThresholdMs ms\n"
292+
"===============================================================================",
293+
);
290294
}
291295
}
292296

test/utils/instabug_navigator_observer_test.dart

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,23 @@ import 'package:instabug_flutter/instabug_flutter.dart';
55
import 'package:instabug_flutter/src/generated/instabug.api.g.dart';
66
import 'package:instabug_flutter/src/utils/screen_loading/screen_loading_manager.dart';
77
import 'package:instabug_flutter/src/utils/screen_name_masker.dart';
8+
import 'package:instabug_flutter/src/utils/screen_rendering/instabug_screen_render_manager.dart';
89
import 'package:mockito/annotations.dart';
910
import 'package:mockito/mockito.dart';
1011

1112
import 'instabug_navigator_observer_test.mocks.dart';
1213

13-
@GenerateMocks([InstabugHostApi])
14-
@GenerateNiceMocks([MockSpec<ScreenLoadingManager>()])
14+
@GenerateMocks([
15+
InstabugHostApi,
16+
ScreenLoadingManager,
17+
InstabugScreenRenderManager,
18+
])
1519
void main() {
1620
TestWidgetsFlutterBinding.ensureInitialized();
1721

1822
final mHost = MockInstabugHostApi();
1923
final mScreenLoadingManager = MockScreenLoadingManager();
24+
final mScreenRenderManager = MockInstabugScreenRenderManager();
2025

2126
late InstabugNavigatorObserver observer;
2227
const screen = '/screen';
@@ -35,6 +40,7 @@ void main() {
3540
previousRoute = createRoute(previousScreen);
3641

3742
ScreenNameMasker.I.setMaskingCallback(null);
43+
when(mScreenRenderManager.screenRenderEnabled).thenReturn(false);
3844
});
3945

4046
test('should report screen change when a route is pushed', () {
@@ -57,6 +63,9 @@ void main() {
5763
'should report screen change when a route is popped and previous is known',
5864
() {
5965
fakeAsync((async) {
66+
when(mScreenLoadingManager.startUiTrace(previousScreen, previousScreen))
67+
.thenAnswer((realInvocation) async => null);
68+
6069
observer.didPop(route, previousRoute);
6170

6271
async.elapse(const Duration(milliseconds: 1000));
@@ -94,6 +103,9 @@ void main() {
94103
final route = createRoute('');
95104
const fallback = 'N/A';
96105

106+
when(mScreenLoadingManager.startUiTrace(fallback, fallback))
107+
.thenAnswer((realInvocation) async => null);
108+
97109
observer.didPush(route, previousRoute);
98110

99111
async.elapse(const Duration(milliseconds: 1000));
@@ -111,6 +123,9 @@ void main() {
111123
test('should mask screen name when masking callback is set', () {
112124
const maskedScreen = 'maskedScreen';
113125

126+
when(mScreenLoadingManager.startUiTrace(maskedScreen, screen))
127+
.thenAnswer((realInvocation) async => null);
128+
114129
ScreenNameMasker.I.setMaskingCallback((_) => maskedScreen);
115130

116131
fakeAsync((async) {
@@ -127,6 +142,62 @@ void main() {
127142
).called(1);
128143
});
129144
});
145+
146+
test('should start new screen render collector when a route is pushed', () {
147+
fakeAsync((async) async {
148+
const traceID = 123;
149+
150+
when(mScreenLoadingManager.startUiTrace(screen, screen))
151+
.thenAnswer((_) async => traceID);
152+
when(mScreenRenderManager.screenRenderEnabled).thenReturn(true);
153+
154+
observer.didPush(route, previousRoute);
155+
156+
async.elapse(const Duration(milliseconds: 1000));
157+
158+
verify(
159+
mScreenRenderManager.startScreenRenderCollectorForTraceId(traceID),
160+
).called(1);
161+
});
162+
});
163+
164+
test(
165+
'should not start new screen render collector when a route is pushed and [traceID] is null',
166+
() {
167+
fakeAsync((async) async {
168+
when(mScreenLoadingManager.startUiTrace(screen, screen))
169+
.thenAnswer((_) async => null);
170+
171+
when(mScreenRenderManager.screenRenderEnabled).thenReturn(true);
172+
173+
observer.didPush(route, previousRoute);
174+
175+
async.elapse(const Duration(milliseconds: 1000));
176+
177+
verifyNever(
178+
mScreenRenderManager.startScreenRenderCollectorForTraceId(any),
179+
);
180+
});
181+
});
182+
183+
test(
184+
'should not start new screen render collector when a route is pushed and [mScreenRenderManager.screenRenderEnabled] is false',
185+
() {
186+
fakeAsync((async) async {
187+
when(mScreenLoadingManager.startUiTrace(screen, screen))
188+
.thenAnswer((_) async => 123);
189+
190+
when(mScreenRenderManager.screenRenderEnabled).thenReturn(false);
191+
192+
observer.didPush(route, previousRoute);
193+
194+
async.elapse(const Duration(milliseconds: 1000));
195+
196+
verifyNever(
197+
mScreenRenderManager.startScreenRenderCollectorForTraceId(any),
198+
);
199+
});
200+
});
130201
}
131202

132203
Route createRoute(String? name) {

0 commit comments

Comments
 (0)