analyze_size_test.dart 8.16 KB
Newer Older
1 2 3 4
// 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.

5 6
// @dart = 2.8

7
import 'package:file/file.dart';
8 9 10 11
import 'package:file_testing/file_testing.dart';
import 'package:flutter_tools/src/base/io.dart';

import '../src/common.dart';
12
import 'test_utils.dart';
13

14 15 16
// This test file does not use [getLocalEngineArguments] because it requires
// multiple specific artifact output types.

17 18
const String apkDebugMessage = 'A summary of your APK analysis can be found at: ';
const String iosDebugMessage = 'A summary of your iOS bundle analysis can be found at: ';
19
const String macOSDebugMessage = 'A summary of your macOS bundle analysis can be found at: ';
20
const String runDevToolsMessage = 'flutter pub global activate devtools; flutter pub global run devtools ';
21 22

void main() {
23
  testWithoutContext('--analyze-size flag produces expected output on hello_world for Android', () async {
24
    final String workingDirectory = fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world');
25 26
    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
    final ProcessResult result = await processManager.run(<String>[
27 28 29 30 31
      flutterBin,
      'build',
      'apk',
      '--analyze-size',
      '--target-platform=android-arm64'
32
    ], workingDirectory: workingDirectory);
33 34 35 36 37 38 39 40 41 42

    print(result.stdout);
    print(result.stderr);
    expect(result.stdout.toString(), contains('app-release.apk (total compressed)'));

    final String line = result.stdout.toString()
      .split('\n')
      .firstWhere((String line) => line.contains(apkDebugMessage));

    final String outputFilePath = line.split(apkDebugMessage).last.trim();
43
    expect(fileSystem.file(fileSystem.path.join(workingDirectory, outputFilePath)), exists);
44
    expect(outputFilePath, contains('.flutter-devtools'));
45 46 47 48 49 50 51 52

    final String devToolsCommand = result.stdout.toString()
        .split('\n')
        .firstWhere((String line) => line.contains(runDevToolsMessage));
    final String commandArguments = devToolsCommand.split(runDevToolsMessage).last.trim();
    final String relativeAppSizePath = outputFilePath.split('.flutter-devtools/').last.trim();
    expect(commandArguments.contains('--appSizeBase=$relativeAppSizePath'), isTrue);

53 54 55
    expect(result.exitCode, 0);
  });

56
  testWithoutContext('--analyze-size flag produces expected output on hello_world for iOS', () async {
57
    final String workingDirectory = fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world');
58
    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
59 60
    final Directory tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_size_test.');
    final Directory codeSizeDir = tempDir.childDirectory('code size dir')..createSync();
61
    final ProcessResult result = await processManager.run(<String>[
62 63 64 65
      flutterBin,
      'build',
      'ios',
      '--analyze-size',
66
      '--code-size-directory=${codeSizeDir.path}',
67
      '--no-codesign',
68
    ], workingDirectory: workingDirectory);
69 70 71 72 73 74 75 76 77 78

    print(result.stdout);
    print(result.stderr);
    expect(result.stdout.toString(), contains('Dart AOT symbols accounted decompressed size'));

    final String line = result.stdout.toString()
      .split('\n')
      .firstWhere((String line) => line.contains(iosDebugMessage));

    final String outputFilePath = line.split(iosDebugMessage).last.trim();
79 80 81 82 83 84 85
    expect(fileSystem.file(fileSystem.path.join(workingDirectory, outputFilePath)), exists);

    final String devToolsCommand = result.stdout.toString()
        .split('\n')
        .firstWhere((String line) => line.contains(runDevToolsMessage));
    final String commandArguments = devToolsCommand.split(runDevToolsMessage).last.trim();
    final String relativeAppSizePath = outputFilePath.split('.flutter-devtools/').last.trim();
86

87
    expect(commandArguments.contains('--appSizeBase=$relativeAppSizePath'), isTrue);
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
    expect(codeSizeDir.existsSync(), true);
    expect(result.exitCode, 0);
    tempDir.deleteSync(recursive: true);
  }, skip: !platform.isMacOS);

  testWithoutContext('--analyze-size flag produces expected output on hello_world for macOS', () async {
    final String workingDirectory = fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world');
    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
    final Directory tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_size_test.');
    final Directory codeSizeDir = tempDir.childDirectory('code size dir')..createSync();

    final ProcessResult configResult = await processManager.run(<String>[
      flutterBin,
      'config',
      '--enable-macos-desktop',
    ], workingDirectory: workingDirectory);
104

105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
    print(configResult.stdout);
    print(configResult.stderr);

    final ProcessResult result = await processManager.run(<String>[
      flutterBin,
      'build',
      'macos',
      '--analyze-size',
      '--code-size-directory=${codeSizeDir.path}',
    ], workingDirectory: workingDirectory);

    print(result.stdout);
    print(result.stderr);
    expect(result.stdout.toString(), contains('Dart AOT symbols accounted decompressed size'));

    final String line = result.stdout.toString()
      .split('\n')
      .firstWhere((String line) => line.contains(macOSDebugMessage));

    final String outputFilePath = line.split(macOSDebugMessage).last.trim();
    expect(fileSystem.file(fileSystem.path.join(workingDirectory, outputFilePath)), exists);

    final String devToolsCommand = result.stdout.toString()
        .split('\n')
        .firstWhere((String line) => line.contains(runDevToolsMessage));
    final String commandArguments = devToolsCommand.split(runDevToolsMessage).last.trim();
    final String relativeAppSizePath = outputFilePath.split('.flutter-devtools/').last.trim();

    expect(commandArguments.contains('--appSizeBase=$relativeAppSizePath'), isTrue);
    expect(codeSizeDir.existsSync(), true);
135
    expect(result.exitCode, 0);
136 137
    tempDir.deleteSync(recursive: true);
  }, skip: !platform.isMacOS);
138

139 140 141
  testWithoutContext('--analyze-size is only supported in release mode', () async {
    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
    final ProcessResult result = await processManager.run(<String>[
142 143 144 145 146 147
      flutterBin,
      'build',
      'apk',
      '--analyze-size',
      '--target-platform=android-arm64',
      '--debug',
148
    ], workingDirectory: fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world'));
149 150 151

    print(result.stdout);
    print(result.stderr);
152
    expect(result.stderr.toString(), contains('"--analyze-size" can only be used on release builds'));
153 154 155

    expect(result.exitCode, 1);
  });
156 157 158 159 160 161 162 163 164 165 166 167

  testWithoutContext('--analyze-size is not supported in combination with --split-debug-info', () async {
    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
    final ProcessResult result = await processManager.run(<String>[
      flutterBin,
      'build',
      'apk',
      '--analyze-size',
      '--target-platform=android-arm64',
      '--split-debug-info=infos'
    ], workingDirectory: fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world'));

168
    expect(result.stderr.toString(), contains('"--analyze-size" cannot be combined with "--split-debug-info"'));
169 170 171

    expect(result.exitCode, 1);
  });
172 173 174

  testWithoutContext('--analyze-size allows overriding the directory for code size files', () async {
    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
175
    final Directory tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_size_test.');
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193

    final ProcessResult result = await processManager.run(<String>[
      flutterBin,
      'build',
      'apk',
      '--analyze-size',
      '--code-size-directory=${tempDir.path}',
      '--target-platform=android-arm64',
      '--release',
    ], workingDirectory: fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world'));

    expect(result.exitCode, 0);
    expect(tempDir.existsSync(), true);
    expect(tempDir.childFile('snapshot.arm64-v8a.json').existsSync(), true);
    expect(tempDir.childFile('trace.arm64-v8a.json').existsSync(), true);

    tempDir.deleteSync(recursive: true);
  });
194
}