| // 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 'dart:io' as io; |
| import 'dart:typed_data'; |
| |
| import 'package:flutter_tools/src/base/io.dart'; |
| import 'package:flutter_tools/src/base/platform.dart'; |
| import 'package:flutter_tools/src/doctor_validator.dart'; |
| import 'package:flutter_tools/src/proxy_validator.dart'; |
| |
| import '../../src/common.dart'; |
| |
| void main() { |
| setUp(() { |
| setNetworkInterfaceLister( |
| ({ |
| bool includeLoopback = true, |
| bool includeLinkLocal = true, |
| InternetAddressType type = InternetAddressType.any, |
| }) async { |
| final List<FakeNetworkInterface> interfaces = <FakeNetworkInterface>[ |
| FakeNetworkInterface(<FakeInternetAddress>[ |
| const FakeInternetAddress('127.0.0.1'), |
| ]), |
| FakeNetworkInterface(<FakeInternetAddress>[ |
| const FakeInternetAddress('::1'), |
| ]), |
| ]; |
| |
| return Future<List<NetworkInterface>>.value(interfaces); |
| }); |
| }); |
| |
| tearDown(() { |
| resetNetworkInterfaceLister(); |
| }); |
| |
| testWithoutContext('ProxyValidator does not show if HTTP_PROXY is not set', () { |
| final Platform platform = FakePlatform(environment: <String, String>{}); |
| |
| expect(ProxyValidator(platform: platform).shouldShow, isFalse); |
| }); |
| |
| testWithoutContext('ProxyValidator does not show if HTTP_PROXY is only whitespace', () { |
| final Platform platform = FakePlatform(environment: <String, String>{'HTTP_PROXY': ' '}); |
| |
| expect(ProxyValidator(platform: platform).shouldShow, isFalse); |
| }); |
| |
| testWithoutContext('ProxyValidator shows when HTTP_PROXY is set', () { |
| final Platform platform = FakePlatform(environment: <String, String>{'HTTP_PROXY': 'fakeproxy.local'}); |
| |
| expect(ProxyValidator(platform: platform).shouldShow, isTrue); |
| }); |
| |
| testWithoutContext('ProxyValidator shows when http_proxy is set', () { |
| final Platform platform = FakePlatform(environment: <String, String>{'http_proxy': 'fakeproxy.local'}); |
| |
| expect(ProxyValidator(platform: platform).shouldShow, isTrue); |
| }); |
| |
| testWithoutContext('ProxyValidator reports success when NO_PROXY is configured correctly', () async { |
| final Platform platform = FakePlatform( |
| environment: <String, String>{ |
| 'HTTP_PROXY': 'fakeproxy.local', |
| 'NO_PROXY': 'localhost,127.0.0.1,::1', |
| }, |
| ); |
| final ValidationResult results = await ProxyValidator(platform: platform).validate(); |
| |
| expect(results.messages, const <ValidationMessage>[ |
| ValidationMessage('HTTP_PROXY is set'), |
| ValidationMessage('NO_PROXY is localhost,127.0.0.1,::1'), |
| ValidationMessage('NO_PROXY contains localhost'), |
| ValidationMessage('NO_PROXY contains 127.0.0.1'), |
| ValidationMessage('NO_PROXY contains ::1'), |
| ]); |
| }); |
| |
| testWithoutContext('ProxyValidator reports success when no_proxy is configured correctly', () async { |
| final Platform platform = FakePlatform( |
| environment: <String, String>{ |
| 'http_proxy': 'fakeproxy.local', |
| 'no_proxy': 'localhost,127.0.0.1,::1', |
| }, |
| ); |
| final ValidationResult results = await ProxyValidator(platform: platform).validate(); |
| |
| expect(results.messages, const <ValidationMessage>[ |
| ValidationMessage('HTTP_PROXY is set'), |
| ValidationMessage('NO_PROXY is localhost,127.0.0.1,::1'), |
| ValidationMessage('NO_PROXY contains localhost'), |
| ValidationMessage('NO_PROXY contains 127.0.0.1'), |
| ValidationMessage('NO_PROXY contains ::1'), |
| ]); |
| }); |
| |
| testWithoutContext('ProxyValidator reports issues when NO_PROXY is missing localhost', () async { |
| final Platform platform = FakePlatform( |
| environment: <String, String>{ |
| 'HTTP_PROXY': 'fakeproxy.local', |
| 'NO_PROXY': '127.0.0.1,::1', |
| }, |
| ); |
| final ValidationResult results = await ProxyValidator(platform: platform).validate(); |
| |
| expect(results.messages, const <ValidationMessage>[ |
| ValidationMessage('HTTP_PROXY is set'), |
| ValidationMessage('NO_PROXY is 127.0.0.1,::1'), |
| ValidationMessage.hint('NO_PROXY does not contain localhost'), |
| ValidationMessage('NO_PROXY contains 127.0.0.1'), |
| ValidationMessage('NO_PROXY contains ::1'), |
| ]); |
| }); |
| |
| testWithoutContext('ProxyValidator reports issues when NO_PROXY is missing 127.0.0.1', () async { |
| final Platform platform = FakePlatform(environment: <String, String>{ |
| 'HTTP_PROXY': 'fakeproxy.local', |
| 'NO_PROXY': 'localhost,::1', |
| }); |
| final ValidationResult results = await ProxyValidator(platform: platform).validate(); |
| |
| expect(results.messages, const <ValidationMessage>[ |
| ValidationMessage('HTTP_PROXY is set'), |
| ValidationMessage('NO_PROXY is localhost,::1'), |
| ValidationMessage('NO_PROXY contains localhost'), |
| ValidationMessage.hint('NO_PROXY does not contain 127.0.0.1'), |
| ValidationMessage('NO_PROXY contains ::1'), |
| ]); |
| }); |
| |
| testWithoutContext('ProxyValidator reports issues when NO_PROXY is missing ::1', () async { |
| final Platform platform = FakePlatform(environment: <String, String>{ |
| 'HTTP_PROXY': 'fakeproxy.local', |
| 'NO_PROXY': 'localhost,127.0.0.1', |
| }); |
| final ValidationResult results = await ProxyValidator(platform: platform).validate(); |
| |
| expect(results.messages, const <ValidationMessage>[ |
| ValidationMessage('HTTP_PROXY is set'), |
| ValidationMessage('NO_PROXY is localhost,127.0.0.1'), |
| ValidationMessage('NO_PROXY contains localhost'), |
| ValidationMessage('NO_PROXY contains 127.0.0.1'), |
| ValidationMessage.hint('NO_PROXY does not contain ::1'), |
| ]); |
| }); |
| |
| testWithoutContext('ProxyValidator reports issues when NO_PROXY is missing localhost, 127.0.0.1', () async { |
| final Platform platform = FakePlatform( |
| environment: <String, String>{ |
| 'HTTP_PROXY': 'fakeproxy.local', |
| 'NO_PROXY': '::1', |
| }, |
| ); |
| final ValidationResult results = await ProxyValidator(platform: platform).validate(); |
| |
| expect(results.messages, const <ValidationMessage>[ |
| ValidationMessage('HTTP_PROXY is set'), |
| ValidationMessage('NO_PROXY is ::1'), |
| ValidationMessage.hint('NO_PROXY does not contain localhost'), |
| ValidationMessage.hint('NO_PROXY does not contain 127.0.0.1'), |
| ValidationMessage('NO_PROXY contains ::1'), |
| ]); |
| }); |
| |
| testWithoutContext('ProxyValidator reports issues when NO_PROXY is missing localhost, ::1', () async { |
| final Platform platform = FakePlatform( |
| environment: <String, String>{ |
| 'HTTP_PROXY': 'fakeproxy.local', |
| 'NO_PROXY': '127.0.0.1', |
| }, |
| ); |
| final ValidationResult results = await ProxyValidator(platform: platform).validate(); |
| |
| expect(results.messages, const <ValidationMessage>[ |
| ValidationMessage('HTTP_PROXY is set'), |
| ValidationMessage('NO_PROXY is 127.0.0.1'), |
| ValidationMessage.hint('NO_PROXY does not contain localhost'), |
| ValidationMessage('NO_PROXY contains 127.0.0.1'), |
| ValidationMessage.hint('NO_PROXY does not contain ::1'), |
| ]); |
| }); |
| |
| testWithoutContext('ProxyValidator reports issues when NO_PROXY is missing 127.0.0.1, ::1', () async { |
| final Platform platform = FakePlatform( |
| environment: <String, String>{ |
| 'HTTP_PROXY': 'fakeproxy.local', |
| 'NO_PROXY': 'localhost', |
| }, |
| ); |
| final ValidationResult results = await ProxyValidator(platform: platform).validate(); |
| |
| expect(results.messages, const <ValidationMessage>[ |
| ValidationMessage('HTTP_PROXY is set'), |
| ValidationMessage('NO_PROXY is localhost'), |
| ValidationMessage('NO_PROXY contains localhost'), |
| ValidationMessage.hint('NO_PROXY does not contain 127.0.0.1'), |
| ValidationMessage.hint('NO_PROXY does not contain ::1'), |
| ]); |
| }); |
| } |
| |
| class FakeNetworkInterface extends NetworkInterface { |
| FakeNetworkInterface(List<FakeInternetAddress> addresses): |
| super(FakeNetworkInterfaceDelegate(addresses)); |
| |
| @override |
| String get name => 'FakeNetworkInterface$index'; |
| } |
| |
| class FakeNetworkInterfaceDelegate implements io.NetworkInterface { |
| FakeNetworkInterfaceDelegate(this._fakeAddresses); |
| |
| final List<FakeInternetAddress> _fakeAddresses; |
| |
| @override |
| List<io.InternetAddress> get addresses => _fakeAddresses; |
| |
| @override |
| int get index => addresses.length; |
| |
| @override |
| String get name => 'FakeNetworkInterfaceDelegate$index'; |
| } |
| |
| class FakeInternetAddress implements io.InternetAddress { |
| const FakeInternetAddress(this._fakeAddress); |
| |
| final String _fakeAddress; |
| |
| @override |
| String get address => _fakeAddress; |
| |
| @override |
| String get host => throw UnimplementedError(); |
| |
| @override |
| bool get isLinkLocal => throw UnimplementedError(); |
| |
| @override |
| bool get isLoopback => true; |
| |
| @override |
| bool get isMulticast => throw UnimplementedError(); |
| |
| @override |
| Uint8List get rawAddress => throw UnimplementedError(); |
| |
| @override |
| Future<io.InternetAddress> reverse() => |
| throw UnimplementedError(); |
| |
| @override |
| io.InternetAddressType get type => throw UnimplementedError(); |
| } |