| // 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:file/memory.dart'; |
| import 'package:flutter_tools/src/base/logger.dart'; |
| import 'package:flutter_tools/src/build_info.dart'; |
| import 'package:flutter_tools/src/build_system/build_system.dart'; |
| import 'package:flutter_tools/src/build_system/targets/web.dart'; |
| import 'package:flutter_tools/src/project.dart'; |
| import 'package:flutter_tools/src/reporting/reporting.dart'; |
| import 'package:flutter_tools/src/version.dart'; |
| import 'package:flutter_tools/src/web/compile.dart'; |
| import 'package:flutter_tools/src/web/file_generators/flutter_service_worker_js.dart'; |
| |
| import '../../src/common.dart'; |
| import '../../src/context.dart'; |
| import '../../src/fakes.dart'; |
| import '../../src/test_build_system.dart'; |
| |
| void main() { |
| late MemoryFileSystem fileSystem; |
| late TestUsage testUsage; |
| late BufferLogger logger; |
| late FlutterVersion flutterVersion; |
| late FlutterProject flutterProject; |
| |
| setUp(() { |
| fileSystem = MemoryFileSystem.test(); |
| testUsage = TestUsage(); |
| logger = BufferLogger.test(); |
| flutterVersion = FakeFlutterVersion(frameworkVersion: '1.0.0', engineRevision: '9.8.7'); |
| |
| flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); |
| fileSystem.file('.packages').createSync(); |
| }); |
| |
| testUsingContext('WebBuilder sets environment on success', () async { |
| final TestBuildSystem buildSystem = |
| TestBuildSystem.all(BuildResult(success: true), (Target target, Environment environment) { |
| final WebServiceWorker webServiceWorker = target as WebServiceWorker; |
| expect(webServiceWorker.isWasm, isTrue, reason: 'should be wasm'); |
| expect(webServiceWorker.webRenderer, WebRendererMode.auto); |
| |
| expect(environment.defines, <String, String>{ |
| 'TargetFile': 'target', |
| 'HasWebPlugins': 'false', |
| 'ServiceWorkerStrategy': ServiceWorkerStrategy.offlineFirst.cliName, |
| 'WasmOmitTypeChecks': 'false', |
| 'RunWasmOpt': 'none', |
| 'BuildMode': 'debug', |
| 'DartObfuscation': 'false', |
| 'TrackWidgetCreation': 'true', |
| 'TreeShakeIcons': 'false', |
| }); |
| |
| expect(environment.engineVersion, '9.8.7'); |
| expect(environment.generateDartPluginRegistry, isFalse); |
| }); |
| |
| final WebBuilder webBuilder = WebBuilder( |
| logger: logger, |
| processManager: FakeProcessManager.any(), |
| buildSystem: buildSystem, |
| usage: testUsage, |
| flutterVersion: flutterVersion, |
| fileSystem: fileSystem, |
| ); |
| await webBuilder.buildWeb( |
| flutterProject, |
| 'target', |
| BuildInfo.debug, |
| ServiceWorkerStrategy.offlineFirst, |
| compilerConfig: const WasmCompilerConfig( |
| omitTypeChecks: false, |
| wasmOpt: WasmOptLevel.none, |
| ), |
| ); |
| |
| expect(logger.statusText, contains('Compiling target for the Web...')); |
| expect(logger.errorText, isEmpty); |
| // Runs ScrubGeneratedPluginRegistrant migrator. |
| expect( |
| logger.traceText, |
| contains('generated_plugin_registrant.dart not found. Skipping.'), |
| ); |
| |
| // Sends build config event |
| expect( |
| testUsage.events, |
| unorderedEquals( |
| <TestUsageEvent>[ |
| const TestUsageEvent( |
| 'build', |
| 'web', |
| label: 'web-compile', |
| parameters: CustomDimensions( |
| buildEventSettings: |
| 'RunWasmOpt: none; WasmOmitTypeChecks: false; wasm-compile: true; web-renderer: auto;', |
| ), |
| ), |
| ], |
| ), |
| ); |
| |
| // Sends timing event. |
| final TestTimingEvent timingEvent = testUsage.timings.single; |
| expect(timingEvent.category, 'build'); |
| expect(timingEvent.variableName, 'dart2wasm'); |
| }); |
| |
| testUsingContext('WebBuilder throws tool exit on failure', () async { |
| final TestBuildSystem buildSystem = TestBuildSystem.all(BuildResult( |
| success: false, |
| exceptions: <String, ExceptionMeasurement>{ |
| 'hello': ExceptionMeasurement( |
| 'hello', |
| const FormatException('illegal character in input string'), |
| StackTrace.current, |
| ), |
| }, |
| )); |
| |
| final WebBuilder webBuilder = WebBuilder( |
| logger: logger, |
| processManager: FakeProcessManager.any(), |
| buildSystem: buildSystem, |
| usage: testUsage, |
| flutterVersion: flutterVersion, |
| fileSystem: fileSystem, |
| ); |
| await expectLater( |
| () async => webBuilder.buildWeb( |
| flutterProject, |
| 'target', |
| BuildInfo.debug, |
| ServiceWorkerStrategy.offlineFirst, |
| compilerConfig: const JsCompilerConfig.run(nativeNullAssertions: true), |
| ), |
| throwsToolExit(message: 'Failed to compile application for the Web.')); |
| |
| expect(logger.errorText, contains('Target hello failed: FormatException: illegal character in input string')); |
| expect(testUsage.timings, isEmpty); |
| }); |
| } |