blob: da6dafffb1e211c04a621cdc353eabc9b097d4d0 [file] [log] [blame]
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('$Crashlytics', () {
final List<MethodCall> log = <MethodCall>[];
final Crashlytics crashlytics = Crashlytics.instance;
setUp(() async {
Crashlytics.channel
.setMockMethodCallHandler((MethodCall methodCall) async {
log.add(methodCall);
switch (methodCall.method) {
case 'Crashlytics#onError':
return 'Error reported to Crashlytics.';
case 'Crashlytics#isDebuggable':
return true;
case 'Crashlytics#setUserEmail':
return true;
case 'Crashlytics#setUserIdentifier':
return true;
case 'Crashlytics#setUserName':
return true;
case 'Crashlytics#getVersion':
return '0.0.0+1';
default:
return false;
}
});
log.clear();
});
test('recordFlutterError', () async {
final FlutterErrorDetails details = FlutterErrorDetails(
exception: 'foo exception',
stack: StackTrace.current,
library: 'foo library',
informationCollector: () => <DiagnosticsNode>[
DiagnosticsNode.message('test message'),
DiagnosticsNode.message('second message'),
],
context: ErrorDescription('foo context'),
);
crashlytics.enableInDevMode = true;
crashlytics.log('foo');
crashlytics.setBool('testBool', true);
crashlytics.setInt('testInt', 42);
crashlytics.setDouble('testDouble', 42.0);
crashlytics.setString('testString', 'bar');
await crashlytics.recordFlutterError(details);
expect(log[0].method, 'Crashlytics#onError');
expect(log[0].arguments['exception'], 'foo exception');
expect(log[0].arguments['context'], 'foo context');
expect(log[0].arguments['information'], 'test message\nsecond message');
expect(log[0].arguments['logs'], isNotEmpty);
expect(log[0].arguments['logs'], contains('foo'));
expect(log[0].arguments['keys'][0]['key'], 'testBool');
expect(log[0].arguments['keys'][0]['value'], isTrue);
expect(log[0].arguments['keys'][0]['type'], 'boolean');
expect(log[0].arguments['keys'][1]['key'], 'testInt');
expect(log[0].arguments['keys'][1]['value'], 42);
expect(log[0].arguments['keys'][1]['type'], 'int');
expect(log[0].arguments['keys'][2]['key'], 'testDouble');
expect(log[0].arguments['keys'][2]['value'], 42.0);
expect(log[0].arguments['keys'][2]['type'], 'double');
expect(log[0].arguments['keys'][3]['key'], 'testString');
expect(log[0].arguments['keys'][3]['value'], 'bar');
expect(log[0].arguments['keys'][3]['type'], 'string');
});
test('recordError', () async {
crashlytics.enableInDevMode = true;
crashlytics.log('foo');
await crashlytics.recordError('foo exception', StackTrace.current,
context: "context");
expect(log[0].method, 'Crashlytics#onError');
expect(log[0].arguments['exception'], 'foo exception');
expect(log[0].arguments['context'], "context");
expect(log[0].arguments['logs'], isNotEmpty);
expect(log[0].arguments['logs'], contains('foo'));
expect(log[0].arguments['keys'][0]['key'], 'testBool');
expect(log[0].arguments['keys'][0]['value'], isTrue);
expect(log[0].arguments['keys'][0]['type'], 'boolean');
expect(log[0].arguments['keys'][1]['key'], 'testInt');
expect(log[0].arguments['keys'][1]['value'], 42);
expect(log[0].arguments['keys'][1]['type'], 'int');
expect(log[0].arguments['keys'][2]['key'], 'testDouble');
expect(log[0].arguments['keys'][2]['value'], 42.0);
expect(log[0].arguments['keys'][2]['type'], 'double');
expect(log[0].arguments['keys'][3]['key'], 'testString');
expect(log[0].arguments['keys'][3]['value'], 'bar');
expect(log[0].arguments['keys'][3]['type'], 'string');
});
test('isDebuggable', () async {
expect(await crashlytics.isDebuggable(), true);
expect(
log,
<Matcher>[
isMethodCall(
'Crashlytics#isDebuggable',
arguments: null,
)
],
);
});
test('crash', () {
expect(() => crashlytics.crash(), throwsStateError);
});
test('getVersion', () async {
await crashlytics.getVersion();
expect(log,
<Matcher>[isMethodCall('Crashlytics#getVersion', arguments: null)]);
});
test('setUserEmail', () async {
await crashlytics.setUserEmail('foo');
expect(log, <Matcher>[
isMethodCall('Crashlytics#setUserEmail',
arguments: <String, dynamic>{'email': 'foo'})
]);
});
test('setUserIdentifier', () async {
await crashlytics.setUserIdentifier('foo');
expect(log, <Matcher>[
isMethodCall('Crashlytics#setUserIdentifier',
arguments: <String, dynamic>{'identifier': 'foo'})
]);
});
test('setUserName', () async {
await crashlytics.setUserName('foo');
expect(log, <Matcher>[
isMethodCall('Crashlytics#setUserName',
arguments: <String, dynamic>{'name': 'foo'})
]);
});
test('getStackTraceElements with character index', () async {
final List<String> lines = <String>[
'package:flutter/src/widgets/framework.dart 3825:27 StatefulElement.build'
];
final List<Map<String, String>> elements =
crashlytics.getStackTraceElements(lines);
expect(elements.length, 1);
expect(elements.first, <String, String>{
'class': 'StatefulElement',
'method': 'build',
'file': 'package:flutter/src/widgets/framework.dart',
'line': '3825',
});
});
test('getStackTraceElements without character index', () async {
final List<String> lines = <String>[
'package:flutter/src/widgets/framework.dart 3825 StatefulElement.build'
];
final List<Map<String, String>> elements =
crashlytics.getStackTraceElements(lines);
expect(elements.length, 1);
expect(elements.first, <String, String>{
'class': 'StatefulElement',
'method': 'build',
'file': 'package:flutter/src/widgets/framework.dart',
'line': '3825',
});
});
test('getStackTraceElements without class', () async {
final List<String> lines = <String>[
'package:firebase_crashlytics/test/main.dart 12 main'
];
final List<Map<String, String>> elements =
crashlytics.getStackTraceElements(lines);
expect(elements.length, 1);
expect(elements.first, <String, String>{
'method': 'main',
'file': 'package:firebase_crashlytics/test/main.dart',
'line': '12',
});
});
});
}