assemble_test.dart 5.87 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:args/command_runner.dart';
6
import 'package:flutter_tools/src/base/file_system.dart';
7 8 9 10
import 'package:flutter_tools/src/build_system/build_system.dart';
import 'package:flutter_tools/src/cache.dart';
import 'package:flutter_tools/src/commands/assemble.dart';
import 'package:mockito/mockito.dart';
11
import 'package:flutter_tools/src/globals.dart' as globals;
12

13
import '../../src/common.dart';
14
import '../../src/context.dart';
15
import '../../src/testbed.dart';
16 17

void main() {
18
  Cache.disableLocking();
19 20 21
  final Testbed testbed = Testbed(overrides: <Type, Generator>{
    BuildSystem: ()  => MockBuildSystem(),
    Cache: () => FakeCache(),
22
  });
23

24 25
  testbed.test('Can run a build', () async {
    when(buildSystem.build(any, any, buildSystemConfig: anyNamed('buildSystemConfig')))
26 27 28
      .thenAnswer((Invocation invocation) async {
        return BuildResult(success: true);
      });
29
    final CommandRunner<void> commandRunner = createTestCommandRunner(AssembleCommand());
30
    await commandRunner.run(<String>['assemble', '-o Output', 'debug_macos_bundle_flutter_assets']);
31 32 33 34 35 36 37 38 39 40 41 42

    expect(testLogger.traceText, contains('build succeeded.'));
  });

  testbed.test('Can parse defines whose values contain =', () async {
    when(buildSystem.build(any, any, buildSystemConfig: anyNamed('buildSystemConfig')))
      .thenAnswer((Invocation invocation) async {
        expect((invocation.positionalArguments[1] as Environment).defines, containsPair('FooBar', 'fizz=2'));
        return BuildResult(success: true);
      });
    final CommandRunner<void> commandRunner = createTestCommandRunner(AssembleCommand());
    await commandRunner.run(<String>['assemble', '-o Output', '-dFooBar=fizz=2', 'debug_macos_bundle_flutter_assets']);
43

44
    expect(testLogger.traceText, contains('build succeeded.'));
45
  });
46

47 48
  testbed.test('Throws ToolExit if not provided with output', () async {
    when(buildSystem.build(any, any, buildSystemConfig: anyNamed('buildSystemConfig')))
49 50 51
      .thenAnswer((Invocation invocation) async {
        return BuildResult(success: true);
      });
52 53
    final CommandRunner<void> commandRunner = createTestCommandRunner(AssembleCommand());

54
    expect(commandRunner.run(<String>['assemble', 'debug_macos_bundle_flutter_assets']),
Dan Field's avatar
Dan Field committed
55
      throwsToolExit());
56
  });
57

58 59
  testbed.test('Throws ToolExit if called with non-existent rule', () async {
    when(buildSystem.build(any, any, buildSystemConfig: anyNamed('buildSystemConfig')))
60 61 62
      .thenAnswer((Invocation invocation) async {
        return BuildResult(success: true);
      });
63 64
    final CommandRunner<void> commandRunner = createTestCommandRunner(AssembleCommand());

65
    expect(commandRunner.run(<String>['assemble', '-o Output', 'undefined']),
Dan Field's avatar
Dan Field committed
66
      throwsToolExit());
67 68 69 70 71 72 73 74 75 76 77 78 79
  });

  testbed.test('Does not log stack traces during build failure', () async {
    final StackTrace testStackTrace = StackTrace.current;
    when(buildSystem.build(any, any, buildSystemConfig: anyNamed('buildSystemConfig')))
      .thenAnswer((Invocation invocation) async {
        return BuildResult(success: false, exceptions: <String, ExceptionMeasurement>{
          'hello': ExceptionMeasurement('hello', 'bar', testStackTrace),
        });
      });
    final CommandRunner<void> commandRunner = createTestCommandRunner(AssembleCommand());

    await expectLater(commandRunner.run(<String>['assemble', '-o Output', 'debug_macos_bundle_flutter_assets']),
Dan Field's avatar
Dan Field committed
80
      throwsToolExit());
81 82
    expect(testLogger.errorText, contains('bar'));
    expect(testLogger.errorText, isNot(contains(testStackTrace.toString())));
83
  });
84

85 86
  testbed.test('Only writes input and output files when the values change', () async {
    when(buildSystem.build(any, any, buildSystemConfig: anyNamed('buildSystemConfig')))
87 88 89
      .thenAnswer((Invocation invocation) async {
        return BuildResult(
          success: true,
90 91
          inputFiles: <File>[globals.fs.file('foo')..createSync()],
          outputFiles: <File>[globals.fs.file('bar')..createSync()],
92 93
        );
      });
94 95

    final CommandRunner<void> commandRunner = createTestCommandRunner(AssembleCommand());
96 97 98 99 100 101 102
    await commandRunner.run(<String>[
      'assemble',
      '-o Output',
      '--build-outputs=outputs',
      '--build-inputs=inputs',
      'debug_macos_bundle_flutter_assets',
    ]);
103

104 105
    final File inputs = globals.fs.file('inputs');
    final File outputs = globals.fs.file('outputs');
106 107 108 109 110 111
    expect(inputs.readAsStringSync(), contains('foo'));
    expect(outputs.readAsStringSync(), contains('bar'));

    final DateTime theDistantPast = DateTime(1991, 8, 23);
    inputs.setLastModifiedSync(theDistantPast);
    outputs.setLastModifiedSync(theDistantPast);
112 113 114 115 116 117 118
    await commandRunner.run(<String>[
      'assemble',
      '-o Output',
      '--build-outputs=outputs',
      '--build-inputs=inputs',
      'debug_macos_bundle_flutter_assets',
    ]);
119 120 121 122

    expect(inputs.lastModifiedSync(), theDistantPast);
    expect(outputs.lastModifiedSync(), theDistantPast);

123
    when(buildSystem.build(any, any, buildSystemConfig: anyNamed('buildSystemConfig')))
124 125 126
      .thenAnswer((Invocation invocation) async {
        return BuildResult(
          success: true,
127 128
          inputFiles: <File>[globals.fs.file('foo'), globals.fs.file('fizz')..createSync()],
          outputFiles: <File>[globals.fs.file('bar'), globals.fs.file(globals.fs.path.join('.dart_tool', 'fizz2'))..createSync(recursive: true)]);
129
      });
130 131 132 133 134 135 136
    await commandRunner.run(<String>[
      'assemble',
      '-o Output',
      '--build-outputs=outputs',
      '--build-inputs=inputs',
      'debug_macos_bundle_flutter_assets',
    ]);
137 138 139 140

    expect(inputs.readAsStringSync(), contains('foo'));
    expect(inputs.readAsStringSync(), contains('fizz'));
    expect(inputs.lastModifiedSync(), isNot(theDistantPast));
141
  });
142 143 144
}

class MockBuildSystem extends Mock implements BuildSystem {}