| // 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/file_system.dart'; |
| import 'package:flutter_tools/src/base/logger.dart'; |
| import 'package:flutter_tools/src/custom_devices/custom_device_config.dart'; |
| import 'package:flutter_tools/src/custom_devices/custom_devices_config.dart'; |
| |
| import '../../src/common.dart'; |
| import '../../src/custom_devices_common.dart'; |
| |
| Map<String, dynamic> copyJsonObjectWith( |
| Map<String, dynamic> object, |
| Map<String, dynamic> overrides |
| ) => Map<String, dynamic>.of(object)..addAll(overrides); |
| |
| void main() { |
| testWithoutContext("CustomDevicesConfig logs no error when 'custom-devices' key is missing in config", () { |
| final BufferLogger logger = BufferLogger.test(); |
| final MemoryFileSystem fileSystem = MemoryFileSystem.test(); |
| final Directory directory = fileSystem.directory('custom_devices_config'); |
| |
| writeCustomDevicesConfigFile( |
| directory |
| ); |
| |
| final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( |
| fileSystem: fileSystem, |
| directory: directory, |
| logger: logger |
| ); |
| |
| expect(customDevicesConfig.devices, hasLength(0)); |
| expect(logger.errorText, hasLength(0)); |
| }); |
| |
| testWithoutContext("CustomDevicesConfig logs error when 'custom-devices' key is not a JSON array", () { |
| final BufferLogger logger = BufferLogger.test(); |
| final MemoryFileSystem fileSystem = MemoryFileSystem.test(); |
| final Directory directory = fileSystem.directory('custom_devices_config'); |
| |
| writeCustomDevicesConfigFile( |
| directory, |
| json: <String, dynamic>{ |
| 'test': 'testvalue', |
| } |
| ); |
| |
| final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( |
| fileSystem: fileSystem, |
| directory: directory, |
| logger: logger |
| ); |
| |
| const String msg = "Could not load custom devices config. config['custom-devices'] is not a JSON array."; |
| expect(() => customDevicesConfig.devices, throwsA(const CustomDeviceRevivalException(msg))); |
| expect(logger.errorText, contains(msg)); |
| }); |
| |
| testWithoutContext('CustomDeviceRevivalException serialization', () { |
| expect( |
| const CustomDeviceRevivalException('testmessage').toString(), |
| equals('testmessage') |
| ); |
| expect( |
| const CustomDeviceRevivalException.fromDescriptions('testfielddescription', 'testexpectedvaluedescription').toString(), |
| equals('Expected testfielddescription to be testexpectedvaluedescription.') |
| ); |
| }); |
| |
| testWithoutContext('CustomDevicesConfig can load test config and logs no errors', () { |
| final BufferLogger logger = BufferLogger.test(); |
| final MemoryFileSystem fileSystem = MemoryFileSystem.test(); |
| final Directory directory = fileSystem.directory('custom_devices_config'); |
| |
| writeCustomDevicesConfigFile( |
| directory, |
| json: <dynamic>[ |
| testConfigJson, |
| ], |
| ); |
| |
| final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( |
| fileSystem: fileSystem, |
| directory: directory, |
| logger: logger |
| ); |
| |
| final List<CustomDeviceConfig> devices = customDevicesConfig.devices; |
| expect(logger.errorText, hasLength(0)); |
| expect(devices, hasLength(1)); |
| expect(devices.first, equals(testConfig)); |
| }); |
| |
| testWithoutContext('CustomDevicesConfig logs error when id is null', () { |
| final BufferLogger logger = BufferLogger.test(); |
| final MemoryFileSystem fileSystem = MemoryFileSystem.test(); |
| final Directory directory = fileSystem.directory('custom_devices_config'); |
| |
| writeCustomDevicesConfigFile( |
| directory, |
| json: <dynamic>[ |
| copyJsonObjectWith( |
| testConfigJson, |
| <String, dynamic>{ |
| 'id': null, |
| }, |
| ), |
| ], |
| ); |
| |
| final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( |
| fileSystem: fileSystem, |
| directory: directory, |
| logger: logger, |
| ); |
| |
| const String msg = 'Could not load custom device from config index 0: Expected id to be a string.'; |
| expect(() => customDevicesConfig.devices, throwsA(const CustomDeviceRevivalException(msg))); |
| expect(logger.errorText, contains(msg)); |
| }); |
| |
| testWithoutContext('CustomDevicesConfig logs error when id is not a string', () { |
| final BufferLogger logger = BufferLogger.test(); |
| final MemoryFileSystem fileSystem = MemoryFileSystem.test(); |
| final Directory directory = fileSystem.directory('custom_devices_config'); |
| |
| writeCustomDevicesConfigFile( |
| directory, |
| json: <dynamic>[ |
| copyJsonObjectWith( |
| testConfigJson, |
| <String, dynamic>{ |
| 'id': 1, |
| }, |
| ), |
| ], |
| ); |
| |
| final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( |
| fileSystem: fileSystem, |
| directory: directory, |
| logger: logger, |
| ); |
| |
| const String msg = 'Could not load custom device from config index 0: Expected id to be a string.'; |
| expect(() => customDevicesConfig.devices, throwsA(const CustomDeviceRevivalException(msg))); |
| expect(logger.errorText, contains(msg)); |
| }); |
| |
| testWithoutContext('CustomDevicesConfig logs error when label is not a string', () { |
| final BufferLogger logger = BufferLogger.test(); |
| final MemoryFileSystem fileSystem = MemoryFileSystem.test(); |
| final Directory directory = fileSystem.directory('custom_devices_config'); |
| |
| writeCustomDevicesConfigFile( |
| directory, |
| json: <dynamic>[ |
| copyJsonObjectWith( |
| testConfigJson, |
| <String, dynamic>{ |
| 'label': 1, |
| }, |
| ), |
| ], |
| ); |
| |
| final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( |
| fileSystem: fileSystem, |
| directory: directory, |
| logger: logger, |
| ); |
| |
| const String msg = 'Could not load custom device from config index 0: Expected label to be a string.'; |
| expect(() => customDevicesConfig.devices, throwsA(const CustomDeviceRevivalException(msg))); |
| expect(logger.errorText, contains(msg)); |
| }); |
| |
| testWithoutContext('CustomDevicesConfig loads config when postBuild is null', () { |
| final BufferLogger logger = BufferLogger.test(); |
| final MemoryFileSystem fileSystem = MemoryFileSystem.test(); |
| final Directory directory = fileSystem.directory('custom_devices_config'); |
| |
| writeCustomDevicesConfigFile( |
| directory, |
| json: <dynamic>[ |
| copyJsonObjectWith( |
| testConfigJson, |
| <String, dynamic>{ |
| 'postBuild': null, |
| }, |
| ), |
| ], |
| ); |
| |
| final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( |
| fileSystem: fileSystem, |
| directory: directory, |
| logger: logger, |
| ); |
| |
| expect(customDevicesConfig.devices, hasLength(1)); |
| }); |
| |
| testWithoutContext('CustomDevicesConfig loads config without port forwarding', () { |
| final BufferLogger logger = BufferLogger.test(); |
| final MemoryFileSystem fileSystem = MemoryFileSystem.test(); |
| final Directory directory = fileSystem.directory('custom_devices_config'); |
| |
| writeCustomDevicesConfigFile( |
| directory, |
| json: <dynamic>[ |
| copyJsonObjectWith( |
| testConfigJson, |
| <String, dynamic>{ |
| 'forwardPort': null, |
| 'forwardPortSuccessRegex': null, |
| }, |
| ), |
| ], |
| ); |
| |
| final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( |
| fileSystem: fileSystem, |
| directory: directory, |
| logger: logger, |
| ); |
| |
| final List<CustomDeviceConfig> devices = customDevicesConfig.devices; |
| |
| expect(devices, hasLength(1)); |
| expect(devices.first.usesPortForwarding, false); |
| }); |
| |
| testWithoutContext('CustomDevicesConfig logs error when port forward command is given but not regex', () { |
| final BufferLogger logger = BufferLogger.test(); |
| final MemoryFileSystem fileSystem = MemoryFileSystem.test(); |
| final Directory directory = fileSystem.directory('custom_devices_config'); |
| |
| writeCustomDevicesConfigFile( |
| directory, |
| json: <dynamic>[ |
| copyJsonObjectWith( |
| testConfigJson, |
| <String, dynamic>{ |
| 'forwardPortSuccessRegex': null, |
| }, |
| ), |
| ], |
| ); |
| |
| final CustomDevicesConfig customDevicesConfig = CustomDevicesConfig.test( |
| fileSystem: fileSystem, |
| directory: directory, |
| logger: logger, |
| ); |
| |
| const String msg = 'Could not load custom device from config index 0: When forwardPort is given, forwardPortSuccessRegex must be specified too.'; |
| expect(() => customDevicesConfig.devices, throwsA(const CustomDeviceRevivalException(msg))); |
| expect(logger.errorText, contains(msg)); |
| }); |
| } |