// Copyright 2019 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 'dart:convert'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_runner/build_runner.dart'; import 'package:mockito/mockito.dart'; import 'package:process/process.dart'; import '../src/common.dart'; import '../src/context.dart'; void main() { group('experimentalBuildEnabled', () { final MockProcessManager mockProcessManager = MockProcessManager(); final MockPlatform mockPlatform = MockPlatform(); final MockFileSystem mockFileSystem = MockFileSystem(); setUp(() { experimentalBuildEnabled = null; }); testUsingContext('is enabled if environment variable is enabled and project ' 'contains a dependency on flutter_build and build_runner', () async { final MockDirectory projectDirectory = MockDirectory(); final MockDirectory exampleDirectory = MockDirectory(); final MockFile packagesFile = MockFile(); final MockFile pubspecFile = MockFile(); final MockFile examplePubspecFile = MockFile(); const String packages = r''' flutter_build:file:///Users/tester/.pub-cache/hosted/pub.dartlang.org/flutter_build/lib/ build_runner:file:///Users/tester/.pub-cache/hosted/pub.dartlang.org/build_runner/lib/ example:lib/ '''; when(mockPlatform.environment).thenReturn({'FLUTTER_EXPERIMENTAL_BUILD': 'true'}); when(mockFileSystem.currentDirectory).thenReturn(projectDirectory); when(mockFileSystem.isFileSync(any)).thenReturn(false); when(projectDirectory.childFile('pubspec.yaml')).thenReturn(pubspecFile); when(projectDirectory.childFile('.packages')).thenReturn(packagesFile); when(projectDirectory.childDirectory('example')).thenReturn(exampleDirectory); when(exampleDirectory.childFile('pubspec.yaml')).thenReturn(examplePubspecFile); when(packagesFile.path).thenReturn('/test/.packages'); when(pubspecFile.path).thenReturn('/test/pubspec.yaml'); when(examplePubspecFile.path).thenReturn('/test/example/pubspec.yaml'); when(mockFileSystem.file('/test/.packages')).thenReturn(packagesFile); when(packagesFile.readAsBytesSync()).thenReturn(utf8.encode(packages)); expect(await experimentalBuildEnabled, true); }, overrides: { ProcessManager: () => mockProcessManager, Platform: () => mockPlatform, FileSystem: () => mockFileSystem, }); testUsingContext('is not enabled if environment variable is enabled and project ' 'does not contain a dependency on flutter_build', () async { final MockDirectory projectDirectory = MockDirectory(); final MockDirectory exampleDirectory = MockDirectory(); final MockFile packagesFile = MockFile(); final MockFile pubspecFile = MockFile(); final MockFile examplePubspecFile = MockFile(); const String packages = r''' build_runner:file:///Users/tester/.pub-cache/hosted/pub.dartlang.org/build_runner/lib/ example:lib/ '''; when(mockPlatform.environment).thenReturn({'FLUTTER_EXPERIMENTAL_BUILD': 'true'}); when(mockFileSystem.currentDirectory).thenReturn(projectDirectory); when(mockFileSystem.isFileSync(any)).thenReturn(false); when(projectDirectory.childFile('pubspec.yaml')).thenReturn(pubspecFile); when(projectDirectory.childFile('.packages')).thenReturn(packagesFile); when(projectDirectory.childDirectory('example')).thenReturn(exampleDirectory); when(exampleDirectory.childFile('pubspec.yaml')).thenReturn(examplePubspecFile); when(packagesFile.path).thenReturn('/test/.packages'); when(pubspecFile.path).thenReturn('/test/pubspec.yaml'); when(examplePubspecFile.path).thenReturn('/test/example/pubspec.yaml'); when(mockFileSystem.file('/test/.packages')).thenReturn(packagesFile); when(packagesFile.readAsBytesSync()).thenReturn(utf8.encode(packages)); expect(await experimentalBuildEnabled, false); }, overrides: { ProcessManager: () => mockProcessManager, Platform: () => mockPlatform, FileSystem: () => mockFileSystem, }); testUsingContext('is not enabed if environment varable is not enabled', () async { when(mockPlatform.environment).thenReturn({}); expect(await experimentalBuildEnabled, false); }, overrides: { ProcessManager: () => mockProcessManager, Platform: () => mockPlatform, FileSystem: () => mockFileSystem, }); }); } class MockProcessManager extends Mock implements ProcessManager {} class MockPlatform extends Mock implements Platform {} class MockFileSystem extends Mock implements FileSystem {} class MockDirectory extends Mock implements Directory {} class MockFile extends Mock implements File {}