analyze_size_test.dart 5.85 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 runDevToolsMessage = 'flutter pub global activate devtools; flutter pub global run devtools ';
20 21

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

    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();
42
    expect(fileSystem.file(fileSystem.path.join(workingDirectory, outputFilePath)), exists);
43
    expect(outputFilePath, contains('.flutter-devtools'));
44 45 46 47 48 49 50 51

    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);

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

55
  testWithoutContext('--analyze-size flag produces expected output on hello_world for iOS', () async {
56
    final String workingDirectory = fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world');
57 58
    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
    final ProcessResult result = await processManager.run(<String>[
59 60 61 62 63
      flutterBin,
      'build',
      'ios',
      '--analyze-size',
      '--no-codesign',
64
    ], workingDirectory: workingDirectory);
65 66 67 68 69 70 71 72 73 74

    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();
75 76 77 78 79 80 81 82 83
    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);

84
    expect(result.exitCode, 0);
85
  }, skip: true); // Extremely flaky due to https://github.com/flutter/flutter/issues/68144
86

87 88 89
  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>[
90 91 92 93 94 95
      flutterBin,
      'build',
      'apk',
      '--analyze-size',
      '--target-platform=android-arm64',
      '--debug',
96
    ], workingDirectory: fileSystem.path.join(getFlutterRoot(), 'examples', 'hello_world'));
97 98 99

    print(result.stdout);
    print(result.stderr);
100
    expect(result.stderr.toString(), contains('"--analyze-size" can only be used on release builds'));
101 102 103

    expect(result.exitCode, 1);
  });
104 105 106 107 108 109 110 111 112 113 114 115

  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'));

116
    expect(result.stderr.toString(), contains('"--analyze-size" cannot be combined with "--split-debug-info"'));
117 118 119

    expect(result.exitCode, 1);
  });
120 121 122

  testWithoutContext('--analyze-size allows overriding the directory for code size files', () async {
    final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter');
123
    final Directory tempDir = fileSystem.systemTempDirectory.createTempSync('flutter_size_test.');
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141

    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);
  });
142
}