| // Copyright 2016 The Chromium 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 'package:file/memory.dart'; |
| import 'package:flutter_tools/src/base/file_system.dart'; |
| import 'package:flutter_tools/src/cache.dart'; |
| import 'package:flutter_tools/src/commands/devices.dart'; |
| import 'package:flutter_tools/src/dart/dependencies.dart'; |
| import 'package:flutter_tools/src/dependency_checker.dart'; |
| |
| import 'src/common.dart'; |
| import 'src/context.dart'; |
| |
| void main() { |
| group('DependencyChecker', () { |
| final String dataPath = fs.path.join( |
| getFlutterRoot(), |
| 'packages', |
| 'flutter_tools', |
| 'test', |
| 'data', |
| 'dart_dependencies_test', |
| ); |
| |
| FileSystem testFileSystem; |
| |
| setUpAll(() { |
| Cache.disableLocking(); |
| }); |
| |
| setUp(() { |
| testFileSystem = MemoryFileSystem(); |
| }); |
| |
| testUsingContext('good', () { |
| final String testPath = fs.path.join(dataPath, 'good'); |
| final String mainPath = fs.path.join(testPath, 'main.dart'); |
| final String fooPath = fs.path.join(testPath, 'foo.dart'); |
| final String barPath = fs.path.join(testPath, 'lib', 'bar.dart'); |
| final String packagesPath = fs.path.join(testPath, '.packages'); |
| final DartDependencySetBuilder builder = |
| DartDependencySetBuilder(mainPath, packagesPath); |
| final DependencyChecker dependencyChecker = |
| DependencyChecker(builder, null); |
| |
| // Set file modification time on all dependencies to be in the past. |
| final DateTime baseTime = DateTime.now(); |
| updateFileModificationTime(packagesPath, baseTime, -10); |
| updateFileModificationTime(mainPath, baseTime, -10); |
| updateFileModificationTime(fooPath, baseTime, -10); |
| updateFileModificationTime(barPath, baseTime, -10); |
| expect(dependencyChecker.check(baseTime), isFalse); |
| |
| // Set .packages file modification time to be in the future. |
| updateFileModificationTime(packagesPath, baseTime, 20); |
| expect(dependencyChecker.check(baseTime), isTrue); |
| |
| // Reset .packages file modification time. |
| updateFileModificationTime(packagesPath, baseTime, 0); |
| expect(dependencyChecker.check(baseTime), isFalse); |
| |
| // Set 'package:self/bar.dart' file modification time to be in the future. |
| updateFileModificationTime(barPath, baseTime, 10); |
| expect(dependencyChecker.check(baseTime), isTrue); |
| }); |
| |
| testUsingContext('syntax error', () { |
| final String testPath = fs.path.join(dataPath, 'syntax_error'); |
| final String mainPath = fs.path.join(testPath, 'main.dart'); |
| final String fooPath = fs.path.join(testPath, 'foo.dart'); |
| final String packagesPath = fs.path.join(testPath, '.packages'); |
| |
| final DartDependencySetBuilder builder = |
| DartDependencySetBuilder(mainPath, packagesPath); |
| final DependencyChecker dependencyChecker = |
| DependencyChecker(builder, null); |
| |
| final DateTime baseTime = DateTime.now(); |
| |
| // Set file modification time on all dependencies to be in the past. |
| updateFileModificationTime(packagesPath, baseTime, -10); |
| updateFileModificationTime(mainPath, baseTime, -10); |
| updateFileModificationTime(fooPath, baseTime, -10); |
| |
| // Dependencies are considered dirty because there is a syntax error in |
| // the .dart file. |
| expect(dependencyChecker.check(baseTime), isTrue); |
| }); |
| |
| /// Test a flutter tool move. |
| /// |
| /// Tests that the flutter tool doesn't crash and displays a warning when its own location |
| /// changed since it was last referenced to in a package's .packages file. |
| testUsingContext('moved flutter sdk', () async { |
| final Directory tempDir = fs.systemTempDirectory.createTempSync('flutter_dependency_checker_test.'); |
| |
| // Copy the golden input and let the test run in an isolated temporary in-memory file system. |
| const LocalFileSystem localFileSystem = LocalFileSystem(); |
| final Directory sourcePath = localFileSystem.directory(localFileSystem.path.join(dataPath, 'changed_sdk_location')); |
| copyDirectorySync(sourcePath, tempDir); |
| fs.currentDirectory = tempDir; |
| |
| // Doesn't matter what commands we run. Arbitrarily list devices here. |
| await createTestCommandRunner(DevicesCommand()).run(<String>['devices']); |
| expect(testLogger.errorText, contains('.packages')); |
| tryToDelete(tempDir); |
| }, overrides: <Type, Generator>{ |
| FileSystem: () => testFileSystem, |
| }); |
| }); |
| } |