| // 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. |
| |
| @TestOn('vm') |
| library; |
| |
| import 'dart:convert'; |
| import 'dart:io' as io; |
| |
| import 'package:dev_tools/check_engine_version.dart' as lib; |
| import 'package:file/memory.dart'; |
| import 'package:process_runner/process_runner.dart'; |
| import 'package:test/fake.dart'; |
| import 'package:test/test.dart'; |
| |
| void main() { |
| late MemoryFileSystem fileSystem; |
| late StringBuffer stderr; |
| late String versionPath; |
| late String scriptPath; |
| |
| setUp(() { |
| fileSystem = MemoryFileSystem.test(); |
| versionPath = fileSystem.path.join('bin', 'internal', 'engine.version'); |
| scriptPath = fileSystem.path.join('bin', 'internal', 'last_engine_commit.sh'); |
| |
| stderr = StringBuffer(); |
| }); |
| |
| tearDown(() { |
| printOnFailure('$stderr'); |
| }); |
| |
| test('skips check, returning true, if the file is missing', () async { |
| final ProcessRunner noRuns = FakeProcessRunner(<String, ProcessRunnerResult>{}); |
| await expectLater( |
| lib.checkEngineVersion( |
| versionPath: versionPath, |
| scriptPath: scriptPath, |
| fileSystem: fileSystem, |
| runner: noRuns, |
| stderr: stderr, |
| ), |
| completion(isTrue), |
| ); |
| |
| expect('$stderr', contains('does not exist, skipping engine.version check')); |
| }); |
| |
| test('skips check, returning true, if file was not changed', () async { |
| fileSystem |
| .directory('bin') |
| .childDirectory('internal') |
| .childFile('engine.version') |
| .createSync(recursive: true); |
| |
| final ProcessRunner gitExec = FakeProcessRunner(<String, ProcessRunnerResult>{ |
| 'git diff --name-only --relative master...HEAD -- $versionPath': ProcessRunnerResult( |
| 0, |
| utf8.encode('dev/another/file.txt\n'), |
| <int>[], |
| <int>[], |
| ), |
| }); |
| |
| await expectLater( |
| lib.checkEngineVersion( |
| versionPath: versionPath, |
| scriptPath: scriptPath, |
| fileSystem: fileSystem, |
| runner: gitExec, |
| stderr: stderr, |
| ), |
| completion(isTrue), |
| ); |
| |
| expect('$stderr', contains('has not changed, skipping engine.version check')); |
| }); |
| |
| test('fails if the SHAs are different', () async { |
| fileSystem.directory('bin').childDirectory('internal').childFile('engine.version') |
| ..createSync(recursive: true) |
| ..writeAsStringSync('def456'); |
| |
| final ProcessRunner scriptExec = FakeProcessRunner(<String, ProcessRunnerResult>{ |
| scriptPath: ProcessRunnerResult(0, utf8.encode('abc123'), <int>[], <int>[]), |
| }); |
| |
| await expectLater( |
| lib.checkEngineVersion( |
| versionPath: versionPath, |
| scriptPath: scriptPath, |
| fileSystem: fileSystem, |
| runner: scriptExec, |
| stderr: stderr, |
| onlyIfVersionChanged: false, |
| ), |
| completion(isFalse), |
| ); |
| |
| expect('$stderr', stringContainsInOrder(<String>['output abc123', 'is def456'])); |
| }); |
| |
| test('succeeds if the SHAs are the same', () async { |
| fileSystem.directory('bin').childDirectory('internal').childFile('engine.version') |
| ..createSync(recursive: true) |
| ..writeAsStringSync('abc123'); |
| |
| final ProcessRunner scriptExec = FakeProcessRunner(<String, ProcessRunnerResult>{ |
| scriptPath: ProcessRunnerResult(0, utf8.encode('abc123'), <int>[], <int>[]), |
| }); |
| |
| await expectLater( |
| lib.checkEngineVersion( |
| versionPath: versionPath, |
| scriptPath: scriptPath, |
| fileSystem: fileSystem, |
| runner: scriptExec, |
| stderr: stderr, |
| onlyIfVersionChanged: false, |
| ), |
| completion(isTrue), |
| ); |
| |
| expect('$stderr', isEmpty); |
| }); |
| } |
| |
| final class FakeProcessRunner extends Fake implements ProcessRunner { |
| FakeProcessRunner(this._cannedResponses); |
| final Map<String, ProcessRunnerResult> _cannedResponses; |
| |
| @override |
| Future<ProcessRunnerResult> runProcess( |
| List<String> commandLine, { |
| io.Directory? workingDirectory, |
| bool? printOutput, |
| bool failOk = false, |
| Stream<List<int>>? stdin, |
| bool runInShell = false, |
| io.ProcessStartMode startMode = io.ProcessStartMode.normal, |
| }) async { |
| final ProcessRunnerResult? command = _cannedResponses[commandLine.join(' ')]; |
| if (command == null) { |
| fail('Unexpected process: ${commandLine.join(' ')}'); |
| } |
| return command; |
| } |
| } |