build_test.dart 5.39 KB
Newer Older
1 2 3 4 5
// 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 'package:args/args.dart';
6
import 'package:args/command_runner.dart';
7 8 9 10 11 12 13 14
import 'package:file/memory.dart';
import 'package:flutter_tools/src/artifacts.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/base/signals.dart';
import 'package:flutter_tools/src/base/terminal.dart';
15
import 'package:flutter_tools/src/build_info.dart';
16
import 'package:flutter_tools/src/build_system/build_system.dart';
17
import 'package:flutter_tools/src/commands/attach.dart';
18
import 'package:flutter_tools/src/commands/build.dart';
19 20 21 22
import 'package:flutter_tools/src/commands/build_aar.dart';
import 'package:flutter_tools/src/commands/build_apk.dart';
import 'package:flutter_tools/src/commands/build_appbundle.dart';
import 'package:flutter_tools/src/commands/build_ios.dart';
23
import 'package:flutter_tools/src/commands/build_ios_framework.dart';
24 25 26 27
import 'package:flutter_tools/src/commands/build_linux.dart';
import 'package:flutter_tools/src/commands/build_macos.dart';
import 'package:flutter_tools/src/commands/build_web.dart';
import 'package:flutter_tools/src/commands/build_windows.dart';
28
import 'package:flutter_tools/src/runner/flutter_command.dart';
29
import 'package:test/fake.dart';
30 31 32

import '../../src/common.dart';
import '../../src/context.dart';
33
import '../../src/fakes.dart';
34
import '../../src/test_build_system.dart';
35 36 37 38 39 40 41 42 43 44 45 46

class FakeTerminal extends Fake implements AnsiTerminal {
  FakeTerminal({this.stdinHasTerminal = true});

  @override
  final bool stdinHasTerminal;
}

class FakeProcessInfo extends Fake implements ProcessInfo {
  @override
  int maxRss = 0;
}
47 48 49

void main() {
  testUsingContext('All build commands support null safety options', () {
50 51 52
    final FileSystem fileSystem = MemoryFileSystem.test();
    final Platform platform = FakePlatform();
    final BufferLogger logger = BufferLogger.test();
53
    final List<FlutterCommand> commands = <FlutterCommand>[
54 55 56 57 58 59 60 61 62 63 64 65 66 67
      BuildWindowsCommand(logger: BufferLogger.test()),
      BuildLinuxCommand(logger: BufferLogger.test(), operatingSystemUtils: FakeOperatingSystemUtils()),
      BuildMacosCommand(logger: BufferLogger.test(), verboseHelp: false),
      BuildWebCommand(fileSystem: fileSystem, logger: BufferLogger.test(), verboseHelp: false),
      BuildApkCommand(logger: BufferLogger.test()),
      BuildIOSCommand(logger: BufferLogger.test(), verboseHelp: false),
      BuildIOSArchiveCommand(logger: BufferLogger.test(), verboseHelp: false),
      BuildAppBundleCommand(logger: BufferLogger.test()),
      BuildAarCommand(
        logger: BufferLogger.test(),
        androidSdk: FakeAndroidSdk(),
        fileSystem: fileSystem,
        verboseHelp: false,
      ),
68
      BuildIOSFrameworkCommand(
69
        logger: BufferLogger.test(),
70
        verboseHelp: false,
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
        buildSystem: FlutterBuildSystem(
          fileSystem: fileSystem,
          platform: platform,
          logger: logger,
        ),
      ),
      AttachCommand(
        artifacts: Artifacts.test(),
        stdio: FakeStdio(),
        logger: logger,
        terminal: FakeTerminal(),
        signals: Signals.test(),
        platform: platform,
        processInfo: FakeProcessInfo(),
        fileSystem: MemoryFileSystem.test(),
86
      ),
87 88
    ];

89
    for (final FlutterCommand command in commands) {
90 91 92 93 94 95 96 97 98
      final ArgResults results = command.argParser.parse(<String>[
        '--sound-null-safety',
        '--enable-experiment=non-nullable',
      ]);

      expect(results.wasParsed('sound-null-safety'), true);
      expect(results.wasParsed('enable-experiment'), true);
    }
  });
99

100 101
  testUsingContext('BuildSubCommand displays current null safety mode',
      () async {
102 103 104 105 106 107 108 109 110 111 112 113
    const BuildInfo unsound = BuildInfo(
      BuildMode.debug,
      '',
      nullSafetyMode: NullSafetyMode.unsound,
      treeShakeIcons: false,
    );
    const BuildInfo sound = BuildInfo(
      BuildMode.debug,
      '',
      treeShakeIcons: false,
    );

114 115 116
    final BufferLogger logger = BufferLogger.test();
    FakeBuildSubCommand(logger).test(unsound);
    expect(logger.statusText,
117
        contains('Building without sound null safety ⚠️'));
118

119 120 121
    logger.clear();
    FakeBuildSubCommand(logger).test(sound);
    expect(logger.statusText,
122
        contains('💪 Building with sound null safety 💪'));
123
  });
124 125

  testUsingContext('Include only supported sub commands', () {
126 127 128 129 130 131 132
    final BuildCommand command = BuildCommand(
      androidSdk: FakeAndroidSdk(),
      buildSystem: TestBuildSystem.all(BuildResult(success: true)),
      fileSystem: MemoryFileSystem.test(),
      logger: BufferLogger.test(),
      osUtils: FakeOperatingSystemUtils(),
    );
133 134 135 136
    for (final Command<void> x in command.subcommands.values) {
      expect((x as BuildSubCommand).supported, isTrue);
    }
  });
137 138 139
}

class FakeBuildSubCommand extends BuildSubCommand {
140
  FakeBuildSubCommand(Logger logger) : super(logger: logger, verboseHelp: false);
141

142 143 144 145 146 147 148 149 150 151 152 153 154 155
  @override
  String get description => throw UnimplementedError();

  @override
  String get name => throw UnimplementedError();

  void test(BuildInfo buildInfo) {
    displayNullSafetyMode(buildInfo);
  }

  @override
  Future<FlutterCommandResult> runCommand() {
    throw UnimplementedError();
  }
156
}