plugin_parsing_test.dart 6.7 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter_tools/src/platform_plugins.dart';
import 'package:flutter_tools/src/plugins.dart';
import 'package:yaml/yaml.dart';

import '../src/common.dart';

const String _kTestPluginName = 'test_plugin_name';
const String _kTestPluginPath = 'test_plugin_path';

void main() {
  group('PluginParsing', () {
    test('Legacy Format', () {
      const String pluginYamlRaw = 'androidPackage: com.flutter.dev\n'
          'iosPrefix: FLT\n'
          'pluginClass: SamplePlugin\n';

21
      final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
22
      final Plugin plugin =
23
          Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml, const <String>[]);
24 25

      final AndroidPlugin androidPlugin =
26 27
          plugin.platforms[AndroidPlugin.kConfigKey] as AndroidPlugin;
      final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey] as IOSPlugin;
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
      final String androidPluginClass = androidPlugin.pluginClass;
      final String iosPluginClass = iosPlugin.pluginClass;

      expect(iosPluginClass, 'SamplePlugin');
      expect(androidPluginClass, 'SamplePlugin');
      expect(iosPlugin.classPrefix, 'FLT');
      expect(androidPlugin.package, 'com.flutter.dev');
    });

    test('Multi-platform Format', () {
      const String pluginYamlRaw = 'platforms:\n'
          ' android:\n'
          '  package: com.flutter.dev\n'
          '  pluginClass: ASamplePlugin\n'
          ' ios:\n'
43
          '  pluginClass: ISamplePlugin\n'
44 45 46 47
          ' linux:\n'
          '  pluginClass: LSamplePlugin\n'
          ' macos:\n'
          '  pluginClass: MSamplePlugin\n'
48
          ' web:\n'
49 50 51 52
          '  pluginClass: WebSamplePlugin\n'
          '  fileName: web_plugin.dart\n'
          ' windows:\n'
          '  pluginClass: WinSamplePlugin\n';
53

54
      final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
55
      final Plugin plugin =
56
          Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml, const <String>[]);
57 58

      final AndroidPlugin androidPlugin =
59 60
          plugin.platforms[AndroidPlugin.kConfigKey] as AndroidPlugin;
      final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey] as IOSPlugin;
61
      final LinuxPlugin linuxPlugin =
62
          plugin.platforms[LinuxPlugin.kConfigKey] as LinuxPlugin;
63
      final MacOSPlugin macOSPlugin =
64 65
          plugin.platforms[MacOSPlugin.kConfigKey] as MacOSPlugin;
      final WebPlugin webPlugin = plugin.platforms[WebPlugin.kConfigKey] as WebPlugin;
66
      final WindowsPlugin windowsPlugin =
67
          plugin.platforms[WindowsPlugin.kConfigKey] as WindowsPlugin;
68 69 70 71 72 73 74
      final String androidPluginClass = androidPlugin.pluginClass;
      final String iosPluginClass = iosPlugin.pluginClass;

      expect(iosPluginClass, 'ISamplePlugin');
      expect(androidPluginClass, 'ASamplePlugin');
      expect(iosPlugin.classPrefix, '');
      expect(androidPlugin.package, 'com.flutter.dev');
75
      expect(linuxPlugin.pluginClass, 'LSamplePlugin');
76
      expect(macOSPlugin.pluginClass, 'MSamplePlugin');
77
      expect(webPlugin.pluginClass, 'WebSamplePlugin');
78
      expect(webPlugin.fileName, 'web_plugin.dart');
79
      expect(windowsPlugin.pluginClass, 'WinSamplePlugin');
80
    });
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

    test('Unknown fields are allowed (allows some future compatibility)', () {
      const String pluginYamlRaw = 'implements: same_plugin\n' // this should be ignored by the tool
          'platforms:\n'
          ' android:\n'
          '  package: com.flutter.dev\n'
          '  pluginClass: ASamplePlugin\n'
          '  anUnknownField: ASamplePlugin\n' // this should be ignored by the tool
          ' ios:\n'
          '  pluginClass: ISamplePlugin\n'
          ' linux:\n'
          '  pluginClass: LSamplePlugin\n'
          ' macos:\n'
          '  pluginClass: MSamplePlugin\n'
          ' web:\n'
          '  pluginClass: WebSamplePlugin\n'
          '  fileName: web_plugin.dart\n'
          ' windows:\n'
          '  pluginClass: WinSamplePlugin\n';

      final dynamic pluginYaml = loadYaml(pluginYamlRaw);
      final Plugin plugin =
103 104 105 106 107 108 109 110
      Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml as YamlMap, const <String>[]);

      final AndroidPlugin androidPlugin = plugin.platforms[AndroidPlugin.kConfigKey] as AndroidPlugin;
      final IOSPlugin iosPlugin = plugin.platforms[IOSPlugin.kConfigKey] as IOSPlugin;
      final LinuxPlugin linuxPlugin = plugin.platforms[LinuxPlugin.kConfigKey] as LinuxPlugin;
      final MacOSPlugin macOSPlugin = plugin.platforms[MacOSPlugin.kConfigKey] as MacOSPlugin;
      final WebPlugin webPlugin = plugin.platforms[WebPlugin.kConfigKey] as WebPlugin;
      final WindowsPlugin windowsPlugin = plugin.platforms[WindowsPlugin.kConfigKey] as WindowsPlugin;
111 112 113 114 115 116 117 118 119 120 121 122 123
      final String androidPluginClass = androidPlugin.pluginClass;
      final String iosPluginClass = iosPlugin.pluginClass;

      expect(iosPluginClass, 'ISamplePlugin');
      expect(androidPluginClass, 'ASamplePlugin');
      expect(iosPlugin.classPrefix, '');
      expect(androidPlugin.package, 'com.flutter.dev');
      expect(linuxPlugin.pluginClass, 'LSamplePlugin');
      expect(macOSPlugin.pluginClass, 'MSamplePlugin');
      expect(webPlugin.pluginClass, 'WebSamplePlugin');
      expect(webPlugin.fileName, 'web_plugin.dart');
      expect(windowsPlugin.pluginClass, 'WinSamplePlugin');
    });
124

125 126 127 128 129 130 131 132 133 134 135 136 137
    test('Legacy Format and Multi-Platform Format together is not allowed and error message contains plugin name', () {
      const String pluginYamlRaw = 'androidPackage: com.flutter.dev\n'
          'platforms:\n'
          ' android:\n'
          '  package: com.flutter.dev\n';

      final YamlMap pluginYaml = loadYaml(pluginYamlRaw) as YamlMap;
      expect(
        () => Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml, const <String>[]),
        throwsToolExit(message: _kTestPluginName),
      );
    });

138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
    test('A default_package field is allowed', () {
      const String pluginYamlRaw =
          'platforms:\n'
          ' android:\n'
          '  default_package: sample_package_android\n'
          ' ios:\n'
          '  default_package: sample_package_ios\n'
          ' linux:\n'
          '  default_package: sample_package_linux\n'
          ' macos:\n'
          '  default_package: sample_package_macos\n'
          ' web:\n'
          '  default_package: sample_package_web\n'
          ' windows:\n'
          '  default_package: sample_package_windows\n';

      final dynamic pluginYaml = loadYaml(pluginYamlRaw);
      final Plugin plugin =
156
      Plugin.fromYaml(_kTestPluginName, _kTestPluginPath, pluginYaml as YamlMap, const <String>[]);
157 158 159

      expect(plugin.platforms, <String, PluginPlatform> {});
    });
160 161
  });
}