generate_synthetic_packages_test.dart 9.83 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 7
import 'dart:async';

8 9 10 11 12 13
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/logger.dart';
import 'package:flutter_tools/src/build_system/build_system.dart';
import 'package:flutter_tools/src/build_system/targets/localizations.dart';
14
import 'package:flutter_tools/src/dart/generate_synthetic_packages.dart';
15 16 17

import '../../src/common.dart';
import '../../src/fake_process_manager.dart';
18
import '../../src/test_build_system.dart';
19 20

void main() {
21
  testWithoutContext('calls buildSystem.build with blank l10n.yaml file', () async {
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
    // Project directory setup for gen_l10n logic
    final MemoryFileSystem fileSystem = MemoryFileSystem.test();

    // Add generate:true to pubspec.yaml.
    final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync();
    final String content = pubspecFile.readAsStringSync().replaceFirst(
      '\nflutter:\n',
      '\nflutter:\n  generate: true\n',
    );
    pubspecFile.writeAsStringSync(content);

    // Create an l10n.yaml file
    fileSystem.file('l10n.yaml').createSync();

    final BufferLogger mockBufferLogger = BufferLogger.test();
37
    final Artifacts artifacts = Artifacts.test();
38 39 40 41
    final Environment environment = Environment.test(
      fileSystem.currentDirectory,
      fileSystem: fileSystem,
      logger: mockBufferLogger,
42
      artifacts: artifacts,
43
      processManager: FakeProcessManager.any(),
44
    );
45 46
    final Completer<void> completer = Completer<void>();
    final BuildResult exception = BuildResult(success: false, exceptions: <String, ExceptionMeasurement>{
47
      'hello': ExceptionMeasurement('hello', const FormatException('illegal character in input string'), StackTrace.current),
48 49 50 51 52 53
    });
    final TestBuildSystem buildSystem = TestBuildSystem.all(exception, (Target target, Environment environment) {
      expect(target, const GenerateLocalizationsTarget());
      expect(environment, environment);
      completer.complete();
    });
54

55
    await expectLater(
56 57 58 59
      () => generateLocalizationsSyntheticPackage(
        environment: environment,
        buildSystem: buildSystem,
      ),
60 61 62 63 64
      throwsToolExit(message:
        'Generating synthetic localizations package failed with 1 error:'
        '\n\n'
        'FormatException: illegal character in input string',
      ),
65
    );
66
    await completer.future;
67 68
  });

69
  testWithoutContext('calls buildSystem.build with l10n.yaml synthetic-package: true', () async {
70 71 72 73 74 75 76 77 78 79 80 81 82 83
    // Project directory setup for gen_l10n logic
    final MemoryFileSystem fileSystem = MemoryFileSystem.test();

    // Add generate:true to pubspec.yaml.
    final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync();
    final String content = pubspecFile.readAsStringSync().replaceFirst(
      '\nflutter:\n',
      '\nflutter:\n  generate: true\n',
    );
    pubspecFile.writeAsStringSync(content);

    // Create an l10n.yaml file
    fileSystem.file('l10n.yaml').writeAsStringSync('synthetic-package: true');

84
    final FakeProcessManager fakeProcessManager = FakeProcessManager.any();
85
    final BufferLogger mockBufferLogger = BufferLogger.test();
86
    final Artifacts artifacts = Artifacts.test();
87 88 89 90
    final Environment environment = Environment.test(
      fileSystem.currentDirectory,
      fileSystem: fileSystem,
      logger: mockBufferLogger,
91
      artifacts: artifacts,
92
      processManager: fakeProcessManager,
93
    );
94 95
    final Completer<void> completer = Completer<void>();
    final BuildResult exception = BuildResult(success: false, exceptions: <String, ExceptionMeasurement>{
96
      'hello': ExceptionMeasurement('hello', const FormatException('illegal character in input string'), StackTrace.current),
97 98 99 100 101 102
    });
    final TestBuildSystem buildSystem = TestBuildSystem.all(exception, (Target target, Environment environment) {
      expect(target, const GenerateLocalizationsTarget());
      expect(environment, environment);
      completer.complete();
    });
103

104
    await expectLater(
105 106 107 108
      () => generateLocalizationsSyntheticPackage(
        environment: environment,
        buildSystem: buildSystem,
      ),
109 110 111 112 113
      throwsToolExit(message:
        'Generating synthetic localizations package failed with 1 error:'
        '\n\n'
        'FormatException: illegal character in input string',
      ),
114
    );
115
    await completer.future;
116 117
  });

118
  testWithoutContext('calls buildSystem.build with l10n.yaml synthetic-package: null', () async {
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
    // Project directory setup for gen_l10n logic
    final MemoryFileSystem fileSystem = MemoryFileSystem.test();

    // Add generate:true to pubspec.yaml.
    final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync();
    final String content = pubspecFile.readAsStringSync().replaceFirst(
      '\nflutter:\n',
      '\nflutter:\n  generate: true\n',
    );
    pubspecFile.writeAsStringSync(content);

    // Create an l10n.yaml file
    fileSystem.file('l10n.yaml').writeAsStringSync('synthetic-package: null');

    final BufferLogger mockBufferLogger = BufferLogger.test();
    final Environment environment = Environment.test(
      fileSystem.currentDirectory,
      fileSystem: fileSystem,
      logger: mockBufferLogger,
138
      artifacts: Artifacts.test(),
139
      processManager: FakeProcessManager.any(),
140
    );
141 142
    final Completer<void> completer = Completer<void>();
    final BuildResult exception = BuildResult(success: false, exceptions: <String, ExceptionMeasurement>{
143
      'hello': ExceptionMeasurement('hello', const FormatException('illegal character in input string'), StackTrace.current),
144 145 146 147 148 149
    });
    final TestBuildSystem buildSystem = TestBuildSystem.all(exception, (Target target, Environment environment) {
      expect(target, const GenerateLocalizationsTarget());
      expect(environment, environment);
      completer.complete();
    });
150

151
    await expectLater(
152 153 154 155
      () => generateLocalizationsSyntheticPackage(
        environment: environment,
        buildSystem: buildSystem,
      ),
156 157 158 159 160
      throwsToolExit(message:
        'Generating synthetic localizations package failed with 1 error:'
        '\n\n'
        'FormatException: illegal character in input string',
      ),
161
    );
162
    await completer.future;
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
  });

  testWithoutContext('does not call buildSystem.build when l10n.yaml is not present', () async {
    // Project directory setup for gen_l10n logic
    final MemoryFileSystem fileSystem = MemoryFileSystem.test();

    // Add generate:true to pubspec.yaml.
    final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync();
    final String content = pubspecFile.readAsStringSync().replaceFirst(
      '\nflutter:\n',
      '\nflutter:\n  generate: true\n',
    );
    pubspecFile.writeAsStringSync(content);

    final BufferLogger mockBufferLogger = BufferLogger.test();
    final Environment environment = Environment.test(
      fileSystem.currentDirectory,
      fileSystem: fileSystem,
      logger: mockBufferLogger,
182
      artifacts: Artifacts.test(),
183
      processManager: FakeProcessManager.any(),
184
    );
185 186
    // Will throw if build is called.
    final TestBuildSystem buildSystem = TestBuildSystem.all(null);
187 188 189 190 191 192 193

    await generateLocalizationsSyntheticPackage(
      environment: environment,
      buildSystem: buildSystem,
    );
  });

194
  testWithoutContext('does not call buildSystem.build with incorrect l10n.yaml format', () async {
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
    // Project directory setup for gen_l10n logic
    final MemoryFileSystem fileSystem = MemoryFileSystem.test();

    // Add generate:true to pubspec.yaml.
    final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync();
    final String content = pubspecFile.readAsStringSync().replaceFirst(
      '\nflutter:\n',
      '\nflutter:\n  generate: true\n',
    );
    pubspecFile.writeAsStringSync(content);

    // Create an l10n.yaml file
    fileSystem.file('l10n.yaml').writeAsStringSync('helloWorld');

    final BufferLogger mockBufferLogger = BufferLogger.test();
    final Environment environment = Environment.test(
      fileSystem.currentDirectory,
      fileSystem: fileSystem,
      logger: mockBufferLogger,
214
      artifacts: Artifacts.test(),
215
      processManager: FakeProcessManager.any(),
216
    );
217 218
    // Will throw if build is called.
    final TestBuildSystem buildSystem = TestBuildSystem.all(null);
219

220
    await expectLater(
221 222 223 224 225 226 227 228
      () => generateLocalizationsSyntheticPackage(
        environment: environment,
        buildSystem: buildSystem,
      ),
      throwsToolExit(message: 'to contain a map, instead was helloWorld'),
    );
  });

229
  testWithoutContext('does not call buildSystem.build with non-bool "synthetic-package" value', () async {
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
    // Project directory setup for gen_l10n logic
    final MemoryFileSystem fileSystem = MemoryFileSystem.test();

    // Add generate:true to pubspec.yaml.
    final File pubspecFile = fileSystem.file('pubspec.yaml')..createSync();
    final String content = pubspecFile.readAsStringSync().replaceFirst(
      '\nflutter:\n',
      '\nflutter:\n  generate: true\n',
    );
    pubspecFile.writeAsStringSync(content);

    // Create an l10n.yaml file
    fileSystem.file('l10n.yaml').writeAsStringSync('synthetic-package: nonBoolValue');

    final BufferLogger mockBufferLogger = BufferLogger.test();
    final Environment environment = Environment.test(
      fileSystem.currentDirectory,
      fileSystem: fileSystem,
      logger: mockBufferLogger,
249
      artifacts: Artifacts.test(),
250
      processManager: FakeProcessManager.any(),
251
    );
252 253
    // Will throw if build is called.
    final TestBuildSystem buildSystem = TestBuildSystem.all(null);
254

255
    await expectLater(
256 257 258 259 260 261 262 263
      () => generateLocalizationsSyntheticPackage(
        environment: environment,
        buildSystem: buildSystem,
      ),
      throwsToolExit(message: 'to have a bool value, instead was "nonBoolValue"'),
    );
  });
}