Skip to content

Commit 21cc57b

Browse files
chore: fix related uint testing files ,
fix implementation logic.
1 parent 2faf643 commit 21cc57b

10 files changed

+144
-83
lines changed

example/lib/src/screens/screen_render_page.dart

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,32 @@
11
part of '../../main.dart';
22

3-
class ScreenRenderPage extends StatelessWidget {
3+
class ScreenRenderPage extends StatefulWidget {
44
const ScreenRenderPage({Key? key}) : super(key: key);
55
static const String screenName = "/screenRenderPageRoute";
66

7+
@override
8+
State<ScreenRenderPage> createState() => _ScreenRenderPageState();
9+
}
10+
11+
class _ScreenRenderPageState extends State<ScreenRenderPage> {
12+
final durationController = TextEditingController();
13+
714
@override
815
Widget build(BuildContext context) {
916
return Page(title: 'Screen Render', children: [
10-
17+
SizedBox.fromSize(size: const Size.fromHeight(16.0)),
1118
const AnimatedBox(),
12-
SizedBox.fromSize(size: const Size.fromHeight(50),),
19+
SizedBox.fromSize(
20+
size: const Size.fromHeight(50),
21+
),
22+
InstabugTextField(
23+
label: 'Frame duration in milliseconds',
24+
labelStyle: Theme.of(context).textTheme.labelMedium,
25+
controller: durationController,
26+
),
27+
SizedBox.fromSize(size: const Size.fromHeight(16.0)),
1328
InstabugButton(
14-
text: 'Perform Frozen Frame',
29+
text: 'Perform Heavy Computation',
1530
onPressed: () => _simulateHeavyComputation(),
1631
),
1732
InstabugButton(
@@ -36,9 +51,13 @@ class ScreenRenderPage extends StatelessWidget {
3651
// Simulates a computationally expensive task
3752
void _simulateHeavyComputation() {
3853
final startTime = DateTime.now();
54+
final pauseTime = double.tryParse(durationController.text.trim());
3955
// Block the UI thread for ~500ms
40-
while (DateTime.now().difference(startTime).inMilliseconds <= 1000) {
41-
// Busy waiting (not recommended in real apps)
56+
if (pauseTime == null) {
57+
return log("enter a valid number");
58+
}
59+
while (DateTime.now().difference(startTime).inMilliseconds <= pauseTime) {
60+
// Busy waiting
4261
}
4362
}
4463
}

lib/src/modules/instabug.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ class Instabug {
198198

199199
if (await FlagsConfig.screenRendering.isEnabled()) {
200200
checkForWidgetBinding();
201-
await InstabugScreenRenderManager.I.init(WidgetsBinding.instance);
201+
InstabugScreenRenderManager.I.init(WidgetsBinding.instance);
202202
}
203203

204204
return FeatureFlagsManager().registerW3CFlagsListener();

lib/src/utils/instabug_navigator_observer.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ class InstabugNavigatorObserver extends NavigatorObserver {
2828
ScreenLoadingManager.I
2929
.startUiTrace(maskedScreenName, screenName)
3030
.then((uiTraceId) {
31-
if (uiTraceId != null) {
31+
if (uiTraceId != null &&
32+
InstabugScreenRenderManager.I.screenRenderEnabled) {
3233
InstabugScreenRenderManager.I
3334
.startScreenRenderCollectorForTraceId(uiTraceId);
3435
}

lib/src/utils/screen_rendering/instabug_screen_render_manager.dart

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:instabug_flutter/src/modules/apm.dart';
88
import 'package:instabug_flutter/src/utils/screen_rendering/instabug_widget_binding_observer.dart';
99
import 'package:meta/meta.dart';
1010

11+
//todo: remove logs
1112
extension on int {
1213
int get inMicro => this * 1000;
1314
}
@@ -37,10 +38,10 @@ class InstabugScreenRenderManager {
3738
int _frozenFramesTotalDuration = 0;
3839

3940
bool _isTimingsListenerAttached = false;
40-
41+
bool screenRenderEnabled = false;
4142
InstabugScreenRenderManager._();
4243

43-
static InstabugScreenRenderManager _instance =
44+
static InstabugScreenRenderManager _instance =
4445
InstabugScreenRenderManager._();
4546

4647
/// Returns the singleton instance of [InstabugScreenRenderManager].
@@ -52,25 +53,15 @@ class InstabugScreenRenderManager {
5253
/// Logging tag for debugging purposes.
5354
static const tag = "ScreenRenderManager";
5455

55-
/// A named constructor used for testing purposes
56-
@internal
57-
@visibleForTesting
58-
InstabugScreenRenderManager.init();
59-
60-
/// Allows setting a custom instance for testing.
61-
@visibleForTesting
62-
// ignore: use_setters_to_change_properties
63-
static void setInstance(InstabugScreenRenderManager instance) {
64-
_instance = instance;
65-
}
6656
/// setup function for [InstabugScreenRenderManager]
6757
@internal
68-
Future<void> init(WidgetsBinding widgetBinding) async {
58+
void init(WidgetsBinding widgetBinding, [double? refreshRate]) {
6959
if (!_isTimingsListenerAttached) {
7060
_widgetsBinding = widgetBinding;
7161
_addWidgetBindingObserver();
72-
await _initStaticValues();
62+
_initStaticValues(refreshRate);
7363
_initFrameTimings();
64+
screenRenderEnabled = true;
7465
}
7566
}
7667

@@ -153,22 +144,24 @@ class InstabugScreenRenderManager {
153144
/// Presently, on Android and Web this collection will only contain the display that the current window is on.
154145
/// On iOS, it will only contains the main display on the phone or tablet.
155146
/// On Desktop, it will contain only a main display with a valid refresh rate but invalid size and device pixel ratio values.
156-
//todo: will be removed after getting the actual value from native side.
147+
//todo: will be compared with value from native side after it's implemented.
157148
double get _getDeviceRefreshRate =>
158-
_widgetsBinding.platformDispatcher.displays.last.refreshRate;
149+
_widgetsBinding.platformDispatcher.displays.first.refreshRate;
159150

160151
/// Get device refresh rate from native side.
152+
//todo: will be compared with value from native side after it's implemented.
153+
// ignore: unused_element
161154
Future<double> get _getDeviceRefreshRateFromNative =>
162155
APM.getDeviceRefreshRate();
163156

164157
/// Initialize the static variables
165-
Future<void> _initStaticValues() async {
158+
void _initStaticValues(double? refreshRate) {
166159
_timingsCallback = (timings) {
167160
for (final frameTiming in timings) {
168161
analyzeFrameTiming(frameTiming);
169162
}
170163
};
171-
_deviceRefreshRate = await _getDeviceRefreshRateFromNative;
164+
_deviceRefreshRate = refreshRate ?? _getDeviceRefreshRate;
172165
_slowFrameThresholdMs = _targetMsPerFrame(_deviceRefreshRate);
173166
_screenRenderForAutoUiTrace = InstabugScreenRenderData(frameData: []);
174167
_screenRenderForCustomUiTrace = InstabugScreenRenderData(frameData: []);
@@ -270,7 +263,7 @@ class InstabugScreenRenderManager {
270263
_delayedFrames.add(InstabugFrameData(startTime, duration));
271264
}
272265

273-
//todo: to be removed
266+
//todo: will be removed
274267
void _displayFrameTimingDetails(FrameTiming frameTiming) {
275268
if (_isSlow) {
276269
debugPrint(
@@ -306,15 +299,19 @@ class InstabugScreenRenderManager {
306299
}
307300

308301
@visibleForTesting
309-
Future<void> reportScreenRending(InstabugScreenRenderData screenRenderData,
310-
[UiTraceType type = UiTraceType.auto]) async {
302+
Future<void> reportScreenRending(
303+
InstabugScreenRenderData screenRenderData, [
304+
UiTraceType type = UiTraceType.auto,
305+
]) async {
311306
if (type == UiTraceType.auto) {
312307
_reportScreenRenderForAutoUiTrace(screenRenderData);
313308
} else {
314309
_reportScreenRenderForCustomUiTrace(screenRenderData);
315310
}
316-
log("Reported Data (${type == UiTraceType.auto ? 'auto' : 'custom'}): $screenRenderData",
317-
name: tag);
311+
log(
312+
"Reported Data (${type == UiTraceType.auto ? 'auto' : 'custom'}): $screenRenderData",
313+
name: tag,
314+
);
318315
}
319316

320317
Future<void> _reportScreenRenderForCustomUiTrace(
@@ -348,6 +345,16 @@ class InstabugScreenRenderManager {
348345
}
349346

350347
/// --------------------------- testing helper functions ---------------------
348+
349+
@visibleForTesting
350+
InstabugScreenRenderManager.init();
351+
352+
@visibleForTesting
353+
// ignore: use_setters_to_change_properties
354+
static void setInstance(InstabugScreenRenderManager instance) {
355+
_instance = instance;
356+
}
357+
351358
@visibleForTesting
352359
InstabugScreenRenderData get screenRenderForAutoUiTrace =>
353360
_screenRenderForAutoUiTrace;

lib/src/utils/screen_rendering/instabug_widget_binding_observer.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import 'package:instabug_flutter/src/utils/screen_name_masker.dart';
55
import 'package:instabug_flutter/src/utils/screen_rendering/instabug_screen_render_manager.dart';
66
import 'package:meta/meta.dart';
77

8+
//todo: remove logs
89
class InstabugWidgetsBindingObserver extends WidgetsBindingObserver {
910
InstabugWidgetsBindingObserver._();
1011

1112
static final InstabugWidgetsBindingObserver _instance =
12-
InstabugWidgetsBindingObserver._();
13+
InstabugWidgetsBindingObserver._();
1314

1415
/// Returns the singleton instance of [InstabugWidgetsBindingObserver].
1516
static InstabugWidgetsBindingObserver get instance => _instance;
@@ -28,7 +29,8 @@ class InstabugWidgetsBindingObserver extends WidgetsBindingObserver {
2829
ScreenLoadingManager.I
2930
.startUiTrace(maskedScreenName, lastUiTrace.screenName)
3031
.then((uiTraceId) {
31-
if (uiTraceId != null) {
32+
if (uiTraceId != null &&
33+
InstabugScreenRenderManager.I.screenRenderEnabled) {
3234
InstabugScreenRenderManager.I
3335
.startScreenRenderCollectorForTraceId(uiTraceId);
3436
}

test/apm_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,9 @@ void main() {
165165
test('[startUITrace] should call host method', () async {
166166
const name = 'UI-trace';
167167

168+
//disable the feature flag for screen render feature in order to skip its checking.
169+
when(mHost.isScreenRenderEnabled()).thenAnswer((_) async => false);
170+
168171
await APM.startUITrace(name);
169172

170173
verify(
@@ -214,7 +217,6 @@ void main() {
214217
verify(
215218
mHost.startCpUiTrace(screenName, microTimeStamp, traceId),
216219
).called(1);
217-
verifyNoMoreInteractions(mHost);
218220
});
219221

220222
test('[reportScreenLoading] should call host method', () async {
@@ -235,7 +237,6 @@ void main() {
235237
uiTraceId,
236238
),
237239
).called(1);
238-
verifyNoMoreInteractions(mHost);
239240
});
240241

241242
test('[endScreenLoading] should call host method', () async {
@@ -247,7 +248,6 @@ void main() {
247248
verify(
248249
mHost.endScreenLoadingCP(timeStampMicro, uiTraceId),
249250
).called(1);
250-
verifyNoMoreInteractions(mHost);
251251
});
252252

253253
test('[isSEndScreenLoadingEnabled] should call host method', () async {

test/instabug_test.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'dart:typed_data';
33
import 'package:flutter/widgets.dart';
44
import 'package:flutter_test/flutter_test.dart';
55
import 'package:instabug_flutter/instabug_flutter.dart';
6+
import 'package:instabug_flutter/src/generated/apm.api.g.dart';
67
import 'package:instabug_flutter/src/generated/instabug.api.g.dart';
78
import 'package:instabug_flutter/src/utils/enum_converter.dart';
89
import 'package:instabug_flutter/src/utils/feature_flags_manager.dart';
@@ -17,6 +18,7 @@ import 'instabug_test.mocks.dart';
1718
InstabugHostApi,
1819
IBGBuildInfo,
1920
ScreenNameMasker,
21+
ApmHostApi,
2022
])
2123
void main() {
2224
TestWidgetsFlutterBinding.ensureInitialized();
@@ -25,12 +27,14 @@ void main() {
2527
final mHost = MockInstabugHostApi();
2628
final mBuildInfo = MockIBGBuildInfo();
2729
final mScreenNameMasker = MockScreenNameMasker();
30+
final mApmHost = MockApmHostApi();
2831

2932
setUpAll(() {
3033
Instabug.$setHostApi(mHost);
3134
FeatureFlagsManager().$setHostApi(mHost);
3235
IBGBuildInfo.setInstance(mBuildInfo);
3336
ScreenNameMasker.setInstance(mScreenNameMasker);
37+
APM.$setHostApi(mApmHost);
3438
});
3539

3640
test('[setEnabled] should call host method', () async {
@@ -78,6 +82,10 @@ void main() {
7882
"isW3cCaughtHeaderEnabled": true,
7983
}),
8084
);
85+
86+
//disable the feature flag for screen render feature in order to skip its checking.
87+
when(mApmHost.isScreenRenderEnabled()).thenAnswer((_) async => false);
88+
8189
await Instabug.init(
8290
token: token,
8391
invocationEvents: events,

test/utils/instabug_navigator_observer_test.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,10 @@ import 'package:mockito/mockito.dart';
1010

1111
import 'instabug_navigator_observer_test.mocks.dart';
1212

13-
@GenerateMocks([
14-
InstabugHostApi,
15-
ScreenLoadingManager,
16-
])
13+
@GenerateMocks([InstabugHostApi])
14+
@GenerateNiceMocks([MockSpec<ScreenLoadingManager>()])
1715
void main() {
1816
TestWidgetsFlutterBinding.ensureInitialized();
19-
WidgetsFlutterBinding.ensureInitialized();
2017

2118
final mHost = MockInstabugHostApi();
2219
final mScreenLoadingManager = MockScreenLoadingManager();
@@ -41,7 +38,7 @@ void main() {
4138
});
4239

4340
test('should report screen change when a route is pushed', () {
44-
fakeAsync((async) {
41+
fakeAsync((async) async {
4542
observer.didPush(route, previousRoute);
4643

4744
async.elapse(const Duration(milliseconds: 1000));

0 commit comments

Comments
 (0)