blob: eab269ee6518cd27fffad7e56ef565229e29b5ee [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:convert';
import 'dart:typed_data';
import 'package:flutter_tools/src/test/flutter_web_platform.dart';
import 'package:flutter_tools/src/test/test_compiler.dart';
import 'package:flutter_tools/src/globals.dart' as globals;
import 'package:mockito/mockito.dart';
import 'package:process/process.dart';
import '../../src/common.dart';
import '../../src/mocks.dart';
import '../../src/testbed.dart';
void main() {
group('Test that TestGoldenComparator', () {
Testbed testbed;
Uri goldenKey;
Uri goldenKey2;
Uri testUri;
Uri testUri2;
Uint8List imageBytes;
MockProcessManager mockProcessManager;
MockTestCompiler mockCompiler;
setUp(() {
goldenKey = Uri.parse('file://golden_key');
goldenKey2 = Uri.parse('file://second_golden_key');
testUri = Uri.parse('file://test_uri');
testUri2 = Uri.parse('file://second_test_uri');
imageBytes = Uint8List.fromList(<int>[1,2,3,4,5]);
mockProcessManager = MockProcessManager();
mockCompiler = MockTestCompiler();
when(mockCompiler.compile(any)).thenAnswer((_) => Future<String>.value('compiler_output'));
testbed = Testbed(overrides: <Type, Generator>{
ProcessManager: () {
print('in get process manager');
return mockProcessManager;
}
});
});
test('succeed when golden comparison succeed', () => testbed.run(() async {
final Map<String, dynamic> expectedResponse = <String, dynamic>{
'success': true,
'message': 'some message',
};
when(mockProcessManager.start(any, environment: anyNamed('environment')))
.thenAnswer((Invocation invocation) async {
return FakeProcess(
exitCode: Future<int>.value(0),
stdout: stdoutFromString(jsonEncode(expectedResponse) + '\n'),
);
});
final TestGoldenComparator comparator = TestGoldenComparator(
'shell',
() => mockCompiler,
);
final String result = await comparator.compareGoldens(testUri, imageBytes, goldenKey, false);
expect(result, null);
}));
test('fail with error message when golden comparison failed', () => testbed.run(() async {
final Map<String, dynamic> expectedResponse = <String, dynamic>{
'success': false,
'message': 'some message',
};
when(mockProcessManager.start(any, environment: anyNamed('environment')))
.thenAnswer((Invocation invocation) async {
return FakeProcess(
exitCode: Future<int>.value(0),
stdout: stdoutFromString(jsonEncode(expectedResponse) + '\n'),
);
});
final TestGoldenComparator comparator = TestGoldenComparator(
'shell',
() => mockCompiler,
);
final String result = await comparator.compareGoldens(testUri, imageBytes, goldenKey, false);
expect(result, 'some message');
}));
test('reuse the process for the same test file', () => testbed.run(() async {
final Map<String, dynamic> expectedResponse1 = <String, dynamic>{
'success': false,
'message': 'some message',
};
final Map<String, dynamic> expectedResponse2 = <String, dynamic>{
'success': false,
'message': 'some other message',
};
when(mockProcessManager.start(any, environment: anyNamed('environment')))
.thenAnswer((Invocation invocation) async {
return FakeProcess(
exitCode: Future<int>.value(0),
stdout: stdoutFromString(jsonEncode(expectedResponse1) + '\n' + jsonEncode(expectedResponse2) + '\n'),
);
});
final TestGoldenComparator comparator = TestGoldenComparator(
'shell',
() => mockCompiler,
);
final String result1 = await comparator.compareGoldens(testUri, imageBytes, goldenKey, false);
expect(result1, 'some message');
final String result2 = await comparator.compareGoldens(testUri, imageBytes, goldenKey2, false);
expect(result2, 'some other message');
verify(mockProcessManager.start(any, environment: anyNamed('environment'))).called(1);
}));
test('does not reuse the process for different test file', () => testbed.run(() async {
final Map<String, dynamic> expectedResponse1 = <String, dynamic>{
'success': false,
'message': 'some message',
};
final Map<String, dynamic> expectedResponse2 = <String, dynamic>{
'success': false,
'message': 'some other message',
};
when(mockProcessManager.start(any, environment: anyNamed('environment')))
.thenAnswer((Invocation invocation) async {
return FakeProcess(
exitCode: Future<int>.value(0),
stdout: stdoutFromString(jsonEncode(expectedResponse1) + '\n' + jsonEncode(expectedResponse2) + '\n'),
);
});
final TestGoldenComparator comparator = TestGoldenComparator(
'shell',
() => mockCompiler,
);
final String result1 = await comparator.compareGoldens(testUri, imageBytes, goldenKey, false);
expect(result1, 'some message');
final String result2 = await comparator.compareGoldens(testUri2, imageBytes, goldenKey2, false);
expect(result2, 'some message');
verify(mockProcessManager.start(any, environment: anyNamed('environment'))).called(2);
}));
test('removes all temporary files when closed', () => testbed.run(() async {
final Map<String, dynamic> expectedResponse = <String, dynamic>{
'success': true,
'message': 'some message',
};
when(mockProcessManager.start(any, environment: anyNamed('environment')))
.thenAnswer((Invocation invocation) async {
return FakeProcess(
exitCode: Future<int>.value(0),
stdout: stdoutFromString(jsonEncode(expectedResponse) + '\n'),
);
});
final TestGoldenComparator comparator = TestGoldenComparator(
'shell',
() => mockCompiler,
);
final String result = await comparator.compareGoldens(testUri, imageBytes, goldenKey, false);
expect(result, null);
await comparator.close();
expect(globals.fs.systemTempDirectory.listSync(recursive: true), isEmpty);
}));
});
}
Stream<List<int>> stdoutFromString(String string) => Stream<List<int>>.fromIterable(<List<int>>[
utf8.encode(string),
]);
class MockProcessManager extends Mock implements ProcessManager {}
class MockTestCompiler extends Mock implements TestCompiler {}