| // 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. |
| |
| // @dart = 2.8 |
| |
| import 'package:file/file.dart'; |
| import 'package:file/memory.dart'; |
| import 'package:file_testing/file_testing.dart'; |
| import 'package:flutter_tools/src/base/template.dart'; |
| import 'package:flutter_tools/src/flutter_plugins.dart'; |
| import 'package:flutter_tools/src/isolated/mustache_template.dart'; |
| import 'package:flutter_tools/src/platform_plugins.dart'; |
| import 'package:flutter_tools/src/plugins.dart'; |
| import 'package:flutter_tools/src/project.dart'; |
| |
| import '../../src/common.dart'; |
| import '../../src/fakes.dart'; |
| |
| const TemplateRenderer renderer = MustacheTemplateRenderer(); |
| |
| const String kPluginDependencies = r''' |
| { |
| "info":"This is a generated file; do not edit or check into version control.", |
| "plugins":{ |
| "windows":[ |
| { |
| "name":"example","path":"C:\\\\example\\\\", |
| "dependencies":[] |
| } |
| ] |
| } |
| } |
| '''; |
| |
| void main() { |
| |
| testWithoutContext('Win32 injects Win32 plugins', () async { |
| final FileSystem fileSystem = MemoryFileSystem.test(); |
| setUpProject(fileSystem); |
| final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); |
| |
| await writeWindowsPluginFiles(flutterProject, <Plugin>[ |
| Plugin( |
| name: 'test', |
| path: 'foo', |
| defaultPackagePlatforms: const <String, String>{}, |
| pluginDartClassPlatforms: const <String, String>{}, |
| platforms: const <String, PluginPlatform>{ |
| WindowsPlugin.kConfigKey: WindowsPlugin( |
| name: 'test', |
| pluginClass: 'Foo', |
| variants: <PluginPlatformVariant>{PluginPlatformVariant.win32}, |
| )}, |
| dependencies: <String>[], |
| isDirectDependency: true, |
| ), |
| ], renderer); |
| |
| final Directory managed = flutterProject.windows.managedDirectory; |
| expect(flutterProject.windows.generatedPluginCmakeFile, exists); |
| expect(managed.childFile('generated_plugin_registrant.h'), exists); |
| expect( |
| managed.childFile('generated_plugin_registrant.cc').readAsStringSync(), |
| contains('#include <test/foo.h>'), |
| ); |
| }); |
| |
| testWithoutContext('UWP injects plugins marked as UWP-compatible', () async { |
| final FileSystem fileSystem = MemoryFileSystem.test(); |
| setUpProject(fileSystem); |
| final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); |
| |
| await writeWindowsUwpPluginFiles(flutterProject, <Plugin>[ |
| Plugin( |
| name: 'test', |
| path: 'foo', |
| defaultPackagePlatforms: const <String, String>{}, |
| pluginDartClassPlatforms: const <String, String>{}, |
| platforms: const <String, PluginPlatform>{ |
| WindowsPlugin.kConfigKey: WindowsPlugin( |
| name: 'test', |
| pluginClass: 'Foo', |
| variants: <PluginPlatformVariant>{PluginPlatformVariant.winuwp}, |
| )}, |
| dependencies: <String>[], |
| isDirectDependency: true, |
| ), |
| ], renderer); |
| |
| final Directory managed = flutterProject.windowsUwp.managedDirectory; |
| expect(flutterProject.windowsUwp.generatedPluginCmakeFile, exists); |
| expect(managed.childFile('generated_plugin_registrant.h'), exists); |
| expect( |
| managed.childFile('generated_plugin_registrant.cc').readAsStringSync(), |
| contains('#include <test/foo.h>'), |
| ); |
| }); |
| |
| testWithoutContext('UWP does not inject Win32-only plugins', () async { |
| final FileSystem fileSystem = MemoryFileSystem.test(); |
| setUpProject(fileSystem); |
| final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); |
| |
| await writeWindowsUwpPluginFiles(flutterProject, <Plugin>[ |
| Plugin( |
| name: 'test', |
| path: 'foo', |
| defaultPackagePlatforms: const <String, String>{}, |
| pluginDartClassPlatforms: const <String, String>{}, |
| platforms: const <String, PluginPlatform>{ |
| WindowsPlugin.kConfigKey: WindowsPlugin( |
| name: 'test', |
| pluginClass: 'Foo', |
| variants: <PluginPlatformVariant>{PluginPlatformVariant.win32}, |
| )}, |
| dependencies: <String>[], |
| isDirectDependency: true, |
| ), |
| ], renderer); |
| |
| final Directory managed = flutterProject.windowsUwp.managedDirectory; |
| expect(flutterProject.windowsUwp.generatedPluginCmakeFile, exists); |
| expect(managed.childFile('generated_plugin_registrant.h'), exists); |
| expect( |
| managed.childFile('generated_plugin_registrant.cc').readAsStringSync(), |
| isNot(contains('#include <test/foo.h>')), |
| ); |
| }); |
| |
| testWithoutContext('Symlink injection treats UWP as Win32', () { |
| final FileSystem fileSystem = MemoryFileSystem.test(); |
| setUpProject(fileSystem); |
| final FlutterProject flutterProject = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); |
| flutterProject.flutterPluginsDependenciesFile.writeAsStringSync(kPluginDependencies); |
| |
| createPluginSymlinks( |
| flutterProject, |
| featureFlagsOverride: TestFeatureFlags(isWindowsUwpEnabled: true), |
| ); |
| |
| expect(flutterProject.windowsUwp.pluginSymlinkDirectory, exists); |
| |
| final Link link = flutterProject.windowsUwp.pluginSymlinkDirectory.listSync().single as Link; |
| |
| expect(link.path, '/winuwp/flutter/ephemeral/.plugin_symlinks/example'); |
| expect(link.targetSync(), r'C:\\example\\'); |
| }); |
| } |
| |
| void setUpProject(FileSystem fileSystem) { |
| fileSystem.file('pubspec.yaml').createSync(); |
| fileSystem.file('winuwp/CMakeLists.txt') |
| .createSync(recursive: true); |
| fileSystem.file('winuwp/project_version') |
| ..createSync(recursive: true) |
| ..writeAsStringSync('0'); |
| } |