Skip to content

Commit 2021560

Browse files
a7medevHeshamMegid
authored andcommitted
feat: support network logs omission (#382)
Jira ID: MOB-12524
1 parent 25c288b commit 2021560

File tree

5 files changed

+106
-0
lines changed

5 files changed

+106
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Added
66

77
- Add network logs obfuscation support using the new `NetworkLogger.obfuscateLog` API ([#380](https://github.com/Instabug/Instabug-Flutter/pull/380)).
8+
- Add network logs omission support using the new `NetworkLogger.omitLog` API ([#382](https://github.com/Instabug/Instabug-Flutter/pull/382)).
89

910
### Changed
1011

lib/src/modules/network_logger.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,33 @@ class NetworkLogger {
4343
_manager.setObfuscateLogCallback(callback);
4444
}
4545

46+
/// Registers a callback to selectively omit network log data.
47+
///
48+
/// Use this method to set a callback function that determines whether
49+
/// specific network log data should be excluded before recording it.
50+
///
51+
/// The [callback] function takes a [NetworkData] object as its argument and
52+
/// should return a boolean value indicating whether the data should be omitted
53+
/// (`true`) or included (`false`).
54+
///
55+
/// Example:
56+
///
57+
/// ```dart
58+
/// NetworkLogger.omitLog((data) {
59+
/// // Implement logic to decide whether to omit the data.
60+
/// // For example, ignore requests to a specific URL:
61+
/// return data.url.startsWith('https://example.com');
62+
/// });
63+
/// ```
64+
static void omitLog(OmitLogCallback callback) {
65+
_manager.setOmitLogCallback(callback);
66+
}
67+
4668
Future<void> networkLog(NetworkData data) async {
69+
final omit = await _manager.omitLog(data);
70+
71+
if (omit) return;
72+
4773
final obfuscated = await _manager.obfuscateLog(data);
4874

4975
await _host.networkLog(obfuscated.toJson());

lib/src/utils/network_manager.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,37 @@ import 'dart:async';
33
import 'package:instabug_flutter/instabug_flutter.dart';
44

55
typedef ObfuscateLogCallback = FutureOr<NetworkData> Function(NetworkData data);
6+
typedef OmitLogCallback = FutureOr<bool> Function(NetworkData data);
67

78
/// Mockable [NetworkManager] responsible for processing network logs
89
/// before they are sent to the native SDKs.
910
class NetworkManager {
1011
ObfuscateLogCallback? _obfuscateLogCallback;
12+
OmitLogCallback? _omitLogCallback;
1113

1214
// ignore: use_setters_to_change_properties
1315
void setObfuscateLogCallback(ObfuscateLogCallback callback) {
1416
_obfuscateLogCallback = callback;
1517
}
1618

19+
// ignore: use_setters_to_change_properties
20+
void setOmitLogCallback(OmitLogCallback callback) {
21+
_omitLogCallback = callback;
22+
}
23+
1724
FutureOr<NetworkData> obfuscateLog(NetworkData data) {
1825
if (_obfuscateLogCallback == null) {
1926
return data;
2027
}
2128

2229
return _obfuscateLogCallback!(data);
2330
}
31+
32+
FutureOr<bool> omitLog(NetworkData data) {
33+
if (_omitLogCallback == null) {
34+
return false;
35+
}
36+
37+
return _omitLogCallback!(data);
38+
}
2439
}

test/network_logger_test.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ void main() {
5151
test('[networkLog] should call 1 host method on iOS', () async {
5252
when(mBuildInfo.isAndroid).thenReturn(false);
5353
when(mManager.obfuscateLog(data)).thenReturn(data);
54+
when(mManager.omitLog(data)).thenReturn(false);
5455

5556
await logger.networkLog(data);
5657

@@ -66,6 +67,7 @@ void main() {
6667
test('[networkLog] should call 2 host methods on Android', () async {
6768
when(mBuildInfo.isAndroid).thenReturn(true);
6869
when(mManager.obfuscateLog(data)).thenReturn(data);
70+
when(mManager.omitLog(data)).thenReturn(false);
6971

7072
await logger.networkLog(data);
7173

@@ -83,6 +85,7 @@ void main() {
8385

8486
when(mBuildInfo.isAndroid).thenReturn(true);
8587
when(mManager.obfuscateLog(data)).thenReturn(obfuscated);
88+
when(mManager.omitLog(data)).thenReturn(false);
8689

8790
await logger.networkLog(data);
8891

@@ -99,6 +102,28 @@ void main() {
99102
).called(1);
100103
});
101104

105+
test('[networkLog] should not log data if it should be omitted', () async {
106+
const omit = true;
107+
108+
when(mBuildInfo.isAndroid).thenReturn(true);
109+
when(mManager.obfuscateLog(data)).thenReturn(data);
110+
when(mManager.omitLog(data)).thenReturn(omit);
111+
112+
await logger.networkLog(data);
113+
114+
verify(
115+
mManager.omitLog(data),
116+
).called(1);
117+
118+
verifyNever(
119+
mInstabugHost.networkLog(data.toJson()),
120+
);
121+
122+
verifyNever(
123+
mApmHost.networkLogAndroid(data.toJson()),
124+
);
125+
});
126+
102127
test('[obfuscateLog] should set obfuscation callback on manager', () async {
103128
FutureOr<NetworkData> callback(NetworkData data) => data;
104129

@@ -108,4 +133,14 @@ void main() {
108133
mManager.setObfuscateLogCallback(callback),
109134
).called(1);
110135
});
136+
137+
test('[omitLog] should set omission callback on manager', () async {
138+
FutureOr<bool> callback(NetworkData data) => true;
139+
140+
NetworkLogger.omitLog(callback);
141+
142+
verify(
143+
mManager.setOmitLogCallback(callback),
144+
).called(1);
145+
});
111146
}

test/network_manager_test.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,33 @@ void main() {
4747

4848
expect(result, equals(obfuscated));
4949
});
50+
51+
test('[omitLog] should return false when no omit log callback', () async {
52+
const expected = false;
53+
54+
final result = await manager.omitLog(data);
55+
56+
expect(result, equals(expected));
57+
});
58+
59+
test(
60+
'[omitLog] should use omit callback when [setOmitLogCallback] has set a callback',
61+
() async {
62+
const omit = true;
63+
final completer = Completer<NetworkData>();
64+
FutureOr<bool> callback(NetworkData data) {
65+
completer.complete(data);
66+
return omit;
67+
}
68+
69+
manager.setOmitLogCallback(callback);
70+
71+
final result = await manager.omitLog(data);
72+
73+
expect(completer.isCompleted, isTrue);
74+
75+
expect(await completer.future, data);
76+
77+
expect(result, equals(omit));
78+
});
5079
}

0 commit comments

Comments
 (0)