blob: 17c102632b0cef0bd755ae6034cc6a150502ac19 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'dart:typed_data';
import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/common.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/symbolize.dart';
import 'package:flutter_tools/src/convert.dart';
import 'package:mockito/mockito.dart';
import '../../src/common.dart';
import '../../src/context.dart';
import '../../src/mocks.dart';
void main() {
MemoryFileSystem fileSystem;
MockStdio stdio;
SymbolizeCommand command;
MockDwarfSymbolizationService mockDwarfSymbolizationService;
setUpAll(() {
Cache.disableLocking();
});
setUp(() {
fileSystem = MemoryFileSystem.test();
stdio = MockStdio();
mockDwarfSymbolizationService = MockDwarfSymbolizationService();
command = SymbolizeCommand(
stdio: stdio,
fileSystem: fileSystem,
dwarfSymbolizationService: mockDwarfSymbolizationService,
);
applyMocksToCommand(command);
});
testUsingContext('Regression test for type error in codec', () async {
final DwarfSymbolizationService symbolizationService = DwarfSymbolizationService.test();
final StreamController<List<int>> output = StreamController<List<int>>();
unawaited(symbolizationService.decode(
input: Stream<Uint8List>.fromIterable(<Uint8List>[
utf8.encode('Hello, World\n') as Uint8List,
]),
symbols: Uint8List(0),
output: IOSink(output.sink),
));
await expectLater(
output.stream.transform(utf8.decoder),
emits('Hello, World'),
);
});
testUsingContext('symbolize exits when --debug-info argument is missing', () async {
final Future<void> result = createTestCommandRunner(command)
.run(const <String>['symbolize']);
expect(result, throwsToolExit(message: '"--debug-info" is required to symbolicate stack traces.'));
});
testUsingContext('symbolize exits when --debug-info file is missing', () async {
final Future<void> result = createTestCommandRunner(command)
.run(const <String>['symbolize', '--debug-info=app.debug']);
expect(result, throwsToolExit(message: 'app.debug does not exist.'));
});
testUsingContext('symbolize exits when --input file is missing', () async {
fileSystem.file('app.debug').createSync();
final Future<void> result = createTestCommandRunner(command)
.run(const <String>['symbolize', '--debug-info=app.debug', '--input=foo.stack', '--output=results/foo.result']);
expect(result, throwsToolExit(message: ''));
});
testUsingContext('symbolize succeedes when DwarfSymbolizationService does not throw', () async {
fileSystem.file('app.debug').writeAsBytesSync(<int>[1, 2, 3]);
fileSystem.file('foo.stack').writeAsStringSync('hello');
when(mockDwarfSymbolizationService.decode(
input: anyNamed('input'),
output: anyNamed('output'),
symbols: anyNamed('symbols'))
).thenAnswer((Invocation invocation) async {
// Data is passed correctly to service
expect((await (invocation.namedArguments[#input] as Stream<List<int>>).toList()).first,
utf8.encode('hello'));
expect(invocation.namedArguments[#symbols] as Uint8List, <int>[1, 2, 3,]);
return;
});
await createTestCommandRunner(command)
.run(const <String>['symbolize', '--debug-info=app.debug', '--input=foo.stack', '--output=results/foo.result']);
});
testUsingContext('symbolize throws when DwarfSymbolizationService throws', () async {
fileSystem.file('app.debug').writeAsBytesSync(<int>[1, 2, 3]);
fileSystem.file('foo.stack').writeAsStringSync('hello');
when(mockDwarfSymbolizationService.decode(
input: anyNamed('input'),
output: anyNamed('output'),
symbols: anyNamed('symbols'))
).thenThrow(ToolExit('test'));
expect(
createTestCommandRunner(command).run(const <String>[
'symbolize', '--debug-info=app.debug', '--input=foo.stack', '--output=results/foo.result']),
throwsToolExit(message: 'test'),
);
});
}
class MockDwarfSymbolizationService extends Mock implements DwarfSymbolizationService {}