Support for app flavors in flutter tooling, #11676 retake (#11734)

diff --git a/packages/flutter_tools/test/android/gradle_test.dart b/packages/flutter_tools/test/android/gradle_test.dart
index 457ba81..daf399f 100644
--- a/packages/flutter_tools/test/android/gradle_test.dart
+++ b/packages/flutter_tools/test/android/gradle_test.dart
@@ -2,33 +2,89 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'package:file/file.dart';
-import 'package:file/memory.dart';
 import 'package:flutter_tools/src/android/gradle.dart';
+import 'package:flutter_tools/src/base/file_system.dart';
+import 'package:flutter_tools/src/build_info.dart';
 import 'package:test/test.dart';
 
-import '../src/context.dart';
 
 const String _kBuildDirectory = '/build/app/outputs';
 
 void main() {
-  FileSystem fs;
+  group('gradle project', () {
+    GradleProject projectFrom(String properties) => new GradleProject.fromAppProperties(properties);
 
-  setUp(() {
-    fs = new MemoryFileSystem();
-    fs.directory('$_kBuildDirectory/release').createSync(recursive: true);
-    fs.file('$_kBuildDirectory/app-debug.apk').createSync();
-    fs.file('$_kBuildDirectory/release/app-release.apk').createSync();
-  });
-
-  group('gradle', () {
-    testUsingContext('findApkFile', () {
-      expect(findApkFile(_kBuildDirectory, 'debug').path,
-             '/build/app/outputs/app-debug.apk');
-      expect(findApkFile(_kBuildDirectory, 'release').path,
-             '/build/app/outputs/release/app-release.apk');
-    }, overrides: <Type, Generator>{
-      FileSystem: () => fs,
+    test('should extract build directory from app properties', () {
+      final GradleProject project = projectFrom('''
+someProperty: someValue
+buildDir: /Users/some/apps/hello/build/app
+someOtherProperty: someOtherValue
+      ''');
+      expect(project.apkDirectory, fs.path.normalize('/Users/some/apps/hello/build/app/outputs/apk'));
+    });
+    test('should extract default build variants from app properties', () {
+      final GradleProject project = projectFrom('''
+someProperty: someValue
+assemble: task ':app:assemble'
+assembleAndroidTest: task ':app:assembleAndroidTest'
+assembleDebug: task ':app:assembleDebug'
+assembleProfile: task ':app:assembleProfile'
+assembleRelease: task ':app:assembleRelease'
+buildDir: /Users/some/apps/hello/build/app
+someOtherProperty: someOtherValue
+      ''');
+      expect(project.buildTypes, <String>['debug', 'profile', 'release']);
+      expect(project.productFlavors, isEmpty);
+    });
+    test('should extract custom build variants from app properties', () {
+      final GradleProject project = projectFrom('''
+someProperty: someValue
+assemble: task ':app:assemble'
+assembleAndroidTest: task ':app:assembleAndroidTest'
+assembleDebug: task ':app:assembleDebug'
+assembleFree: task ':app:assembleFree'
+assembleFreeAndroidTest: task ':app:assembleFreeAndroidTest'
+assembleFreeDebug: task ':app:assembleFreeDebug'
+assembleFreeProfile: task ':app:assembleFreeProfile'
+assembleFreeRelease: task ':app:assembleFreeRelease'
+assemblePaid: task ':app:assemblePaid'
+assemblePaidAndroidTest: task ':app:assemblePaidAndroidTest'
+assemblePaidDebug: task ':app:assemblePaidDebug'
+assemblePaidProfile: task ':app:assemblePaidProfile'
+assemblePaidRelease: task ':app:assemblePaidRelease'
+assembleProfile: task ':app:assembleProfile'
+assembleRelease: task ':app:assembleRelease'
+buildDir: /Users/some/apps/hello/build/app
+someOtherProperty: someOtherValue
+      ''');
+      expect(project.buildTypes, <String>['debug', 'profile', 'release']);
+      expect(project.productFlavors, <String>['free', 'paid']);
+    });
+    test('should provide apk file name for default build types', () {
+      final GradleProject project = new GradleProject(<String>['debug', 'profile', 'release'], <String>[], '/some/dir');
+      expect(project.apkFileFor(BuildInfo.debug), 'app-debug.apk');
+      expect(project.apkFileFor(BuildInfo.profile), 'app-profile.apk');
+      expect(project.apkFileFor(BuildInfo.release), 'app-release.apk');
+      expect(project.apkFileFor(const BuildInfo(BuildMode.release, 'unknown')), isNull);
+    });
+    test('should provide apk file name for flavored build types', () {
+      final GradleProject project = new GradleProject(<String>['debug', 'profile', 'release'], <String>['free', 'paid'], '/some/dir');
+      expect(project.apkFileFor(const BuildInfo(BuildMode.debug, 'free')), 'app-free-debug.apk');
+      expect(project.apkFileFor(const BuildInfo(BuildMode.release, 'paid')), 'app-paid-release.apk');
+      expect(project.apkFileFor(const BuildInfo(BuildMode.release, 'unknown')), isNull);
+    });
+    test('should provide assemble task name for default build types', () {
+      final GradleProject project = new GradleProject(<String>['debug', 'profile', 'release'], <String>[], '/some/dir');
+      expect(project.assembleTaskFor(BuildInfo.debug), 'assembleDebug');
+      expect(project.assembleTaskFor(BuildInfo.profile), 'assembleProfile');
+      expect(project.assembleTaskFor(BuildInfo.release), 'assembleRelease');
+      expect(project.assembleTaskFor(const BuildInfo(BuildMode.release, 'unknown')), isNull);
+    });
+    test('should provide assemble task name for flavored build types', () {
+      final GradleProject project = new GradleProject(<String>['debug', 'profile', 'release'], <String>['free', 'paid'], '/some/dir');
+      expect(project.assembleTaskFor(const BuildInfo(BuildMode.debug, 'free')), 'assembleFreeDebug');
+      expect(project.assembleTaskFor(const BuildInfo(BuildMode.release, 'paid')), 'assemblePaidRelease');
+      expect(project.assembleTaskFor(const BuildInfo(BuildMode.release, 'unknown')), isNull);
     });
   });
 }