Skip to content

Commit a1e7ebd

Browse files
author
Ali Abdelfattah
authored
Merge pull request #228 from Instabug/fix/enable-apm-traces-tests
Fix APM's Execution Traces Unit Tests
2 parents 37f8dbc + dd36597 commit a1e7ebd

File tree

6 files changed

+65
-50
lines changed

6 files changed

+65
-50
lines changed

android/src/main/java/com/instabug/instabugflutter/InstabugFlutterPlugin.java

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1031,23 +1031,19 @@ public void run() {
10311031
* Starts an execution trace
10321032
* @param name string name of the trace.
10331033
*/
1034-
public void startExecutionTrace(final String name, final String id) {
1035-
new Handler(Looper.getMainLooper()).post(new Runnable() {
1036-
@Override
1037-
public void run() {
1038-
try {
1039-
String result = null;
1040-
ExecutionTrace trace = APM.startExecutionTrace(name);
1041-
if (trace != null) {
1042-
result = id;
1043-
traces.put(id, trace);
1044-
}
1045-
channel.invokeMethod("startExecutionTraceCallBack", result);
1046-
} catch (Exception e) {
1047-
e.printStackTrace();
1048-
}
1034+
public String startExecutionTrace(final String name, final String id) {
1035+
try {
1036+
String result = null;
1037+
ExecutionTrace trace = APM.startExecutionTrace(name);
1038+
if (trace != null) {
1039+
result = id;
1040+
traces.put(id, trace);
10491041
}
1050-
});
1042+
return result;
1043+
} catch (Exception e) {
1044+
e.printStackTrace();
1045+
return null;
1046+
}
10511047
}
10521048

10531049
/**

ios/Classes/InstabugFlutterPlugin.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@
476476
*/
477477
+ (void)setColdAppLaunchEnabled:(NSNumber *)isEnabled;
478478

479-
+ (void)startExecutionTrace:(NSString *)name id:(NSString *)id;
479+
+ (NSString *)startExecutionTrace:(NSString *)name id:(NSString *)id;
480480

481481
+ (void)setExecutionTraceAttribute:(NSString *)id key:(NSString *)key value:(NSString *)value;
482482

ios/Classes/InstabugFlutterPlugin.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -897,13 +897,13 @@ + (void)setColdAppLaunchEnabled:(NSNumber *)isEnabled {
897897
* @param {string} name of the trace.
898898
* @param {string} id of the trace.
899899
*/
900-
+ (void)startExecutionTrace:(NSString *)name id:(NSString *)id {
900+
+ (NSString *)startExecutionTrace:(NSString *)name id:(NSString *)id {
901901
IBGExecutionTrace *trace = [IBGAPM startExecutionTraceWithName:name];
902902
if (trace != nil) {
903903
[traces setObject: trace forKey: id];
904-
[channel invokeMethod:@"startExecutionTraceCallBack" arguments:id];
904+
return id;
905905
} else {
906-
[channel invokeMethod:@"startExecutionTraceCallBack" arguments:nil];
906+
return nil;
907907
}
908908
}
909909

lib/APM.dart

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:io';
66
import 'package:flutter/services.dart';
77
import 'package:instabug_flutter/models/network_data.dart';
88
import 'package:instabug_flutter/models/trace.dart';
9+
import 'package:instabug_flutter/utils/ibg_date_time.dart';
910

1011
enum LogLevel {
1112
none,
@@ -23,14 +24,6 @@ class APM {
2324
static Future<String?> get platformVersion async =>
2425
await _channel.invokeMethod<String>('getPlatformVersion');
2526

26-
static Future<dynamic> _handleMethod(MethodCall call) async {
27-
switch (call.method) {
28-
case 'startExecutionTraceCallBack':
29-
_startExecutionTraceCallback(call.arguments);
30-
return;
31-
}
32-
}
33-
3427
/// Enables or disables APM feature.
3528
/// [boolean] isEnabled
3629
static Future<void> setEnabled(bool isEnabled) async {
@@ -54,24 +47,20 @@ class APM {
5447

5548
/// Starts an execution trace.
5649
/// [String] name of the trace.
57-
static Future<dynamic> startExecutionTrace(String name) async {
58-
final String TRACE_NOT_STARTED_APM_NOT_ENABLED = "Execution trace " +
59-
name +
60-
" wasn't created. Please make sure to enable APM first by following the instructions at this link: https://docs.instabug.com/reference#enable-or-disable-apm";
61-
final DateTime id = DateTime.now();
62-
final Completer completer = new Completer<Trace>();
63-
final List<dynamic> params = <dynamic>[name.toString(), id.toString()];
64-
_channel.setMethodCallHandler(_handleMethod);
65-
final Function callback = (String idBack) async {
66-
if (idBack != null) {
67-
completer.complete(Trace(idBack, name));
68-
} else {
69-
completer.completeError(TRACE_NOT_STARTED_APM_NOT_ENABLED);
70-
}
71-
};
72-
_startExecutionTraceCallback = callback;
73-
await _channel.invokeMethod<Object>('startExecutionTrace:id:', params);
74-
return completer.future;
50+
static Future<Trace> startExecutionTrace(String name) async {
51+
final DateTime id = IBGDateTime.instance.now();
52+
final List<dynamic> params = <dynamic>[name, id.toString()];
53+
final traceId =
54+
await _channel.invokeMethod<String?>('startExecutionTrace:id:', params);
55+
56+
if (traceId == null) {
57+
return Future.error(
58+
"Execution trace $name wasn't created. Please make sure to enable APM first by following "
59+
'the instructions at this link: https://docs.instabug.com/reference#enable-or-disable-apm',
60+
);
61+
}
62+
63+
return Trace(traceId, name);
7564
}
7665

7766
/// Sets attribute of an execution trace.
@@ -114,6 +103,7 @@ class APM {
114103
static Future<void> endUITrace() async {
115104
await _channel.invokeMethod<Object>('endUITrace');
116105
}
106+
117107
/// Ends UI trace.
118108
static void endAppLaunch() async {
119109
await _channel.invokeMethod<Object>('endAppLaunch');

lib/utils/ibg_date_time.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'package:meta/meta.dart';
2+
3+
/// Mockable [DateTime] class.
4+
class IBGDateTime {
5+
IBGDateTime._();
6+
7+
static IBGDateTime _instance = IBGDateTime._();
8+
static IBGDateTime get instance => _instance;
9+
10+
/// Shorthand for [instance]
11+
static IBGDateTime get I => instance;
12+
13+
@visibleForTesting
14+
static void setInstance(IBGDateTime instance) {
15+
_instance = instance;
16+
}
17+
18+
DateTime now() => DateTime.now();
19+
}

test/instabug_flutter_test.dart

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import 'package:instabug_flutter/models/crash_data.dart';
1919
import 'package:instabug_flutter/models/exception_data.dart';
2020
import 'package:instabug_flutter/models/network_data.dart';
2121
import 'package:instabug_flutter/models/trace.dart' as execution_trace;
22+
import 'package:instabug_flutter/utils/ibg_date_time.dart';
2223
import 'package:instabug_flutter/utils/platform_manager.dart';
2324
import 'package:mockito/annotations.dart';
2425
import 'package:mockito/mockito.dart';
@@ -28,6 +29,7 @@ import 'instabug_flutter_test.mocks.dart';
2829

2930
@GenerateMocks([
3031
PlatformManager,
32+
IBGDateTime,
3133
])
3234
void main() {
3335
TestWidgetsFlutterBinding.ensureInitialized();
@@ -83,6 +85,8 @@ void main() {
8385
switch (methodCall.method) {
8486
case 'getTags':
8587
return <String>['tag1', 'tag2'];
88+
case 'startExecutionTrace:id:':
89+
return methodCall.arguments[0];
8690
case 'getUserAttributeForKey:':
8791
return userAttribute;
8892
case 'getUserAttributes':
@@ -1063,17 +1067,23 @@ void main() {
10631067
});
10641068

10651069
test('startExecutionTrace: Test', () async {
1066-
const String name = 'test_trace';
1070+
const String name = 'test-trace';
10671071
final DateTime timestamp = DateTime.now();
1068-
final List<dynamic> args = <dynamic>[name.toString(), timestamp.toString()];
1072+
final List<dynamic> args = <dynamic>[name, timestamp.toString()];
1073+
1074+
final mockDateTime = MockIBGDateTime();
1075+
IBGDateTime.setInstance(mockDateTime);
1076+
when(mockDateTime.now()).thenAnswer((_) => timestamp);
1077+
10691078
await APM.startExecutionTrace(name);
1079+
10701080
expect(log, <Matcher>[
10711081
isMethodCall(
10721082
'startExecutionTrace:id:',
10731083
arguments: args,
10741084
)
10751085
]);
1076-
}, skip: 'TODO: mock timestamp');
1086+
});
10771087

10781088
test('setExecutionTraceAttribute: Test', () async {
10791089
const String name = 'test_trace';
@@ -1089,7 +1099,7 @@ void main() {
10891099
arguments: args,
10901100
)
10911101
]);
1092-
}, skip: 'TODO: mock timestamp');
1102+
});
10931103

10941104
test('setCrashReportingEnabled: Test', () async {
10951105
const bool isEnabled = false;

0 commit comments

Comments
 (0)