blob: bc7fbc03c66b5794911f67be389a519a5d2ecde5 [file] [log] [blame]
// 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));
});
}