From ac764bdbe17d9f72450d9f9be435945fdd8f98f7 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 3 Mar 2021 08:34:58 -0800 Subject: [PATCH 1/4] migrate mdns to null safety --- packages/multicast_dns/CHANGELOG.md | 4 ++ packages/multicast_dns/lib/multicast_dns.dart | 25 ++++++----- packages/multicast_dns/lib/src/constants.dart | 8 ++-- .../lib/src/lookup_resolver.dart | 4 +- .../lib/src/native_protocol_client.dart | 12 ++--- packages/multicast_dns/lib/src/packet.dart | 14 +++--- .../lib/src/resource_record.dart | 44 +++++++------------ packages/multicast_dns/pubspec.yaml | 10 ++--- packages/multicast_dns/test/client_test.dart | 22 +++++++--- packages/multicast_dns/test/decode_test.dart | 24 +++++----- .../test/lookup_resolver_test.dart | 10 ++--- 11 files changed, 86 insertions(+), 91 deletions(-) diff --git a/packages/multicast_dns/CHANGELOG.md b/packages/multicast_dns/CHANGELOG.md index 267e7307d9b4..fa64e2639256 100644 --- a/packages/multicast_dns/CHANGELOG.md +++ b/packages/multicast_dns/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.0 + +* Migrate package to null safety. + ## 0.2.2 * Fixes parsing of TXT records. Continues parsing on non-utf8 strings. diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 3b8fa47abfaa..32e88b073bba 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -48,14 +48,14 @@ class MDnsClient { bool _starting = false; bool _started = false; - RawDatagramSocket _incoming; final List _sockets = []; final LookupResolver _resolver = LookupResolver(); final ResourceRecordCache _cache = ResourceRecordCache(); final RawDatagramSocketFactory _rawDatagramSocketFactory; - InternetAddress _mDnsAddress; - int _mDnsPort; + InternetAddress? _mDnsAddress; + late int _mDnsPort; + late RawDatagramSocket _incoming; /// Find all network interfaces with an the [InternetAddressType] specified. static NetworkInterfacesFactory allInterfacesFactory = @@ -82,10 +82,10 @@ class MDnsClient { /// for the mDNS query. If not provided, defaults to either `224.0.0.251` or /// or `FF02::FB`. Future start({ - InternetAddress listenAddress, - NetworkInterfacesFactory interfacesFactory, + InternetAddress? listenAddress, + NetworkInterfacesFactory? interfacesFactory, int mDnsPort = mDnsPort, - InternetAddress mDnsAddress, + InternetAddress? mDnsAddress, }) async { listenAddress ??= InternetAddress.anyIPv4; interfacesFactory ??= allInterfacesFactory; @@ -119,7 +119,7 @@ class MDnsClient { : mDnsAddressIPv6; final List interfaces = - await interfacesFactory(listenAddress.type); + (await interfacesFactory(listenAddress.type)).toList(); for (NetworkInterface interface in interfaces) { // Create a socket for sending on each adapter. @@ -147,7 +147,7 @@ class MDnsClient { )); } // Join multicast on this interface. - _incoming.joinMulticast(_mDnsAddress, interface); + _incoming.joinMulticast(_mDnsAddress!, interface); } _incoming.listen(_handleIncoming); _started = true; @@ -207,7 +207,7 @@ class MDnsClient { // Send the request on all interfaces. final List packet = query.encode(); for (RawDatagramSocket socket in _sockets) { - socket.send(packet, _mDnsAddress, _mDnsPort); + socket.send(packet, _mDnsAddress!, _mDnsPort); } return results; } @@ -215,10 +215,13 @@ class MDnsClient { // Process incoming datagrams. void _handleIncoming(RawSocketEvent event) { if (event == RawSocketEvent.read) { - final Datagram datagram = _incoming.receive(); + final Datagram? datagram = _incoming.receive(); + if (datagram == null) { + return; + } // Check for published responses. - final List response = decodeMDnsResponse(datagram.data); + final List? response = decodeMDnsResponse(datagram.data); if (response != null) { _cache.updateRecords(response); _resolver.handleResponse(response); diff --git a/packages/multicast_dns/lib/src/constants.dart b/packages/multicast_dns/lib/src/constants.dart index 2a222649b64d..061329d95b73 100644 --- a/packages/multicast_dns/lib/src/constants.dart +++ b/packages/multicast_dns/lib/src/constants.dart @@ -14,20 +14,20 @@ final InternetAddress mDnsAddressIPv6 = InternetAddress('FF02::FB'); const int mDnsPort = 5353; /// Enumeration of supported resource record class types. -class ResourceRecordClass { +abstract class ResourceRecordClass { // This class is intended to be used as a namespace, and should not be // extended directly. - factory ResourceRecordClass._() => null; + ResourceRecordClass._(); /// Internet address class ("IN"). static const int internet = 1; } /// Enumeration of DNS question types. -class QuestionType { +abstract class QuestionType { // This class is intended to be used as a namespace, and should not be // extended directly. - factory QuestionType._() => null; + QuestionType._(); /// "QU" Question. static const int unicast = 0x8000; diff --git a/packages/multicast_dns/lib/src/lookup_resolver.dart b/packages/multicast_dns/lib/src/lookup_resolver.dart index b374e9f0449a..40cc86b1a4be 100644 --- a/packages/multicast_dns/lib/src/lookup_resolver.dart +++ b/packages/multicast_dns/lib/src/lookup_resolver.dart @@ -25,7 +25,7 @@ class PendingRequest extends LinkedListEntry { final StreamController controller; /// The timer for the request. - Timer timer; + Timer? timer; } /// Class for keeping track of pending lookups and processing incoming @@ -89,7 +89,7 @@ class LookupResolver { while (_pendingRequests.isNotEmpty) { final PendingRequest request = _pendingRequests.first; request.unlink(); - request.timer.cancel(); + request.timer?.cancel(); request.controller.close(); } } diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 553d564577c4..54d4704b29ee 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -29,7 +29,7 @@ class ResourceRecordCache { for (final SplayTreeMap> map in _cache.values) { for (final List records in map.values) { - count += records?.length; + count += records.length; } } return count; @@ -45,14 +45,14 @@ class ResourceRecordCache { // TODO(dnfield): Update this to use set literal syntax when we're able to bump the SDK constraint. seenRecordTypes[record.resourceRecordType] ??= Set(); // ignore: prefer_collection_literals - if (seenRecordTypes[record.resourceRecordType].add(record.name)) { + if (seenRecordTypes[record.resourceRecordType]!.add(record.name)) { _cache[record.resourceRecordType] ??= SplayTreeMap>(); - _cache[record.resourceRecordType] + _cache[record.resourceRecordType]! [record.name] = [record]; } else { - _cache[record.resourceRecordType][record.name].add(record); + _cache[record.resourceRecordType]![record.name]!.add(record); } } } @@ -62,12 +62,12 @@ class ResourceRecordCache { String name, int type, List results) { assert(ResourceRecordType.debugAssertValid(type)); final int time = DateTime.now().millisecondsSinceEpoch; - final SplayTreeMap> candidates = _cache[type]; + final SplayTreeMap>? candidates = _cache[type]; if (candidates == null) { return; } - final List candidateRecords = candidates[name]; + final List? candidateRecords = candidates[name]; if (candidateRecords == null) { return; } diff --git a/packages/multicast_dns/lib/src/packet.dart b/packages/multicast_dns/lib/src/packet.dart index 2dae398e70ce..99056898f23d 100644 --- a/packages/multicast_dns/lib/src/packet.dart +++ b/packages/multicast_dns/lib/src/packet.dart @@ -23,7 +23,6 @@ const int _kHeaderSize = 12; /// Will attempt to append 'local' if the name is something like '_http._tcp', /// and '._tcp.local' if name is something like '_http'. List processDnsNameParts(String name) { - assert(name != null); final List parts = name.split('.'); if (parts.length == 1) { return [parts[0], '_tcp', 'local']; @@ -47,9 +46,7 @@ List encodeMDnsQuery( int type = ResourceRecordType.addressIPv4, bool multicast = true, }) { - assert(name != null); assert(ResourceRecordType.debugAssertValid(type)); - assert(multicast != null); final List nameParts = processDnsNameParts(name); final List> rawNameParts = @@ -179,7 +176,7 @@ _FQDNReadResult _readFQDN( /// If decoding fails (e.g. due to an invalid packet), `null` is returned. /// /// See https://tools.ietf.org/html/rfc1035 for format. -ResourceRecordQuery decodeMDnsQuery(List packet) { +ResourceRecordQuery? decodeMDnsQuery(List packet) { final int length = packet.length; if (length < _kHeaderSize) { return null; @@ -214,7 +211,7 @@ ResourceRecordQuery decodeMDnsQuery(List packet) { /// If decoding fails (e.g. due to an invalid packet) `null` is returned. /// /// See https://tools.ietf.org/html/rfc1035 for the format. -List decodeMDnsResponse(List packet) { +List? decodeMDnsResponse(List packet) { final int length = packet.length; if (length < _kHeaderSize) { return null; @@ -242,7 +239,7 @@ List decodeMDnsResponse(List packet) { } } - ResourceRecord readResourceRecord() { + ResourceRecord? readResourceRecord() { // First read the FQDN. final _FQDNReadResult result = _readFQDN(data, packetBytes, offset, length); final String fqdn = result.fqdn; @@ -319,7 +316,6 @@ List decodeMDnsResponse(List packet) { priority: priority, weight: weight, ); - break; case ResourceRecordType.serverPointer: checkLength(offset + readDataLength); final _FQDNReadResult result = @@ -373,7 +369,7 @@ List decodeMDnsResponse(List packet) { offset += 4; } for (int i = 0; i < remainingCount; i++) { - final ResourceRecord record = readResourceRecord(); + final ResourceRecord? record = readResourceRecord(); if (record != null) { result.add(record); } @@ -391,7 +387,7 @@ class MDnsDecodeException implements Exception { /// specified [offset]. /// /// The [offset] parameter should not be null. - const MDnsDecodeException(this.offset) : assert(offset != null); + const MDnsDecodeException(this.offset); /// The offset in the packet at which the exception occurred. final int offset; diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index e4be5f30d6de..d605aae4afb1 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -6,7 +6,6 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; -import 'package:meta/meta.dart'; import 'package:multicast_dns/src/constants.dart'; import 'package:multicast_dns/src/packet.dart'; @@ -19,7 +18,6 @@ int _combineHash(int current, int hash) => (current & _multipleHashPrime) ^ hash; int _hashValues(List values) { - assert(values != null); assert(values.isNotEmpty); return values.fold( @@ -29,10 +27,10 @@ int _hashValues(List values) { } /// Enumeration of support resource record types. -class ResourceRecordType { +abstract class ResourceRecordType { // This class is intended to be used as a namespace, and should not be // extended directly. - factory ResourceRecordType._() => null; + ResourceRecordType._(); /// An IPv4 Address record, also known as an "A" record. It has a value of 1. static const int addressIPv4 = 1; @@ -94,8 +92,7 @@ class ResourceRecordQuery { this.resourceRecordType, this.fullyQualifiedName, this.questionType, - ) : assert(fullyQualifiedName != null), - assert(ResourceRecordType.debugAssertValid(resourceRecordType)); + ) : assert(ResourceRecordType.debugAssertValid(resourceRecordType)); /// An A (IPv4) query. ResourceRecordQuery.addressIPv4( @@ -191,8 +188,7 @@ class ResourceRecordQuery { /// Base implementation of DNS resource records (RRs). abstract class ResourceRecord { /// Creates a new ResourceRecord. - const ResourceRecord(this.resourceRecordType, this.name, this.validUntil) - : assert(name != null); + const ResourceRecord(this.resourceRecordType, this.name, this.validUntil); /// The FQDN for this record. final String name; @@ -207,14 +203,13 @@ abstract class ResourceRecord { @override String toString() => - '$runtimeType{$name, validUntil: ${DateTime.fromMillisecondsSinceEpoch(validUntil ?? 0)}, $_additionalInfo}'; + '$runtimeType{$name, validUntil: ${DateTime.fromMillisecondsSinceEpoch(validUntil)}, $_additionalInfo}'; @override bool operator ==(Object other) { - return other.runtimeType == runtimeType && _equals(other); + return other is ResourceRecord && _equals(other); } - @protected bool _equals(ResourceRecord other) { return other.name == name && other.validUntil == validUntil && @@ -233,7 +228,6 @@ abstract class ResourceRecord { // Subclasses of this class should use _hashValues to create a hash code // that will then get hashed in with the common values on this class. - @protected int get _hashCode; /// Low level method for encoding this record into an mDNS packet. @@ -250,9 +244,8 @@ class PtrResourceRecord extends ResourceRecord { PtrResourceRecord( String name, int validUntil, { - @required this.domainName, - }) : assert(domainName != null), - super(ResourceRecordType.serverPointer, name, validUntil); + required this.domainName, + }) : super(ResourceRecordType.serverPointer, name, validUntil); /// The FQDN for this record. final String domainName; @@ -282,7 +275,7 @@ class IPAddressResourceRecord extends ResourceRecord { IPAddressResourceRecord( String name, int validUntil, { - @required this.address, + required this.address, }) : super( address.type == InternetAddressType.IPv4 ? ResourceRecordType.addressIPv4 @@ -316,15 +309,11 @@ class SrvResourceRecord extends ResourceRecord { SrvResourceRecord( String name, int validUntil, { - @required this.target, - @required this.port, - @required this.priority, - @required this.weight, - }) : assert(target != null), - assert(port != null), - assert(priority != null), - assert(weight != null), - super(ResourceRecordType.service, name, validUntil); + required this.target, + required this.port, + required this.priority, + required this.weight, + }) : super(ResourceRecordType.service, name, validUntil); /// The hostname for this record. final String target; @@ -378,9 +367,8 @@ class TxtResourceRecord extends ResourceRecord { TxtResourceRecord( String name, int validUntil, { - @required this.text, - }) : assert(text != null), - super(ResourceRecordType.text, name, validUntil); + required this.text, + }) : super(ResourceRecordType.text, name, validUntil); /// The raw text from this record. final String text; diff --git a/packages/multicast_dns/pubspec.yaml b/packages/multicast_dns/pubspec.yaml index 98c75aeca20a..d59445f7eb9f 100644 --- a/packages/multicast_dns/pubspec.yaml +++ b/packages/multicast_dns/pubspec.yaml @@ -1,14 +1,10 @@ name: multicast_dns description: Dart package for mDNS queries (e.g. Bonjour, Avahi). homepage: https://github.com/flutter/packages/tree/master/packages/multicast_dns -version: 0.2.2 - -dependencies: - meta: ^1.1.6 +version: 0.3.0 dev_dependencies: - mockito: "^4.1.0" - test: "^1.3.4" + test: "^1.16.5" environment: - sdk: ">=2.2.0 <3.0.0" + sdk: ">=2.12.0-0 <3.0.0" diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index f327c20e0969..43ea300530fa 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -2,23 +2,23 @@ // for details. 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:async'; import 'dart:io'; import 'package:multicast_dns/multicast_dns.dart'; -import 'package:mockito/mockito.dart'; +import 'package:test/fake.dart'; import 'package:test/test.dart'; void main() { test('Can inject datagram socket factory and configure mdns port', () async { - int lastPort; - final MockRawDatagramSocket mockRawDatagramSocket = MockRawDatagramSocket(); + late int lastPort; + final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); final MDnsClient client = MDnsClient(rawDatagramSocketFactory: (dynamic host, int port, - {bool reuseAddress, bool reusePort, int ttl = 1}) async { + {bool reuseAddress = true, bool reusePort = true, int ttl = 1}) async { lastPort = port; - return mockRawDatagramSocket; + return datagramSocket; }); - when(mockRawDatagramSocket.address).thenReturn(InternetAddress.anyIPv4); await client.start( mDnsPort: 1234, @@ -29,4 +29,12 @@ void main() { }); } -class MockRawDatagramSocket extends Mock implements RawDatagramSocket {} +class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { + @override + InternetAddress get address => InternetAddress.anyIPv4; + + @override + StreamSubscription listen(void Function(RawSocketEvent event)? onData, {Function? onError, void Function()? onDone, bool? cancelOnError}) { + return const Stream.empty().listen(onData, onError: onError, cancelOnError: cancelOnError, onDone: onDone); + } +} diff --git a/packages/multicast_dns/test/decode_test.dart b/packages/multicast_dns/test/decode_test.dart index f11f4d9b94ff..e8c1afabbb9a 100644 --- a/packages/multicast_dns/test/decode_test.dart +++ b/packages/multicast_dns/test/decode_test.dart @@ -21,23 +21,23 @@ void main() { void testValidPackages() { test('Can decode valid packets', () { - List result = decodeMDnsResponse(package1); + List result = decodeMDnsResponse(package1)!; expect(result, isNotNull); expect(result.length, 1); - IPAddressResourceRecord ipResult = result[0]; + IPAddressResourceRecord ipResult = result[0] as IPAddressResourceRecord; expect(ipResult.name, 'raspberrypi.local'); expect(ipResult.address.address, '192.168.1.191'); - result = decodeMDnsResponse(package2); + result = decodeMDnsResponse(package2)!; expect(result.length, 2); - ipResult = result[0]; + ipResult = result[0] as IPAddressResourceRecord; expect(ipResult.name, 'raspberrypi.local'); expect(ipResult.address.address, '192.168.1.191'); - ipResult = result[1]; + ipResult = result[1] as IPAddressResourceRecord; expect(ipResult.name, 'raspberrypi.local'); expect(ipResult.address.address, '169.254.95.83'); - result = decodeMDnsResponse(package3); + result = decodeMDnsResponse(package3)!; expect(result.length, 8); expect(result, [ TxtResourceRecord( @@ -85,7 +85,7 @@ void testValidPackages() { ), ]); - result = decodeMDnsResponse(packagePtrResponse); + result = decodeMDnsResponse(packagePtrResponse)!; expect(6, result.length); expect(result, [ PtrResourceRecord( @@ -127,7 +127,7 @@ void testValidPackages() { // Fixes https://github.com/flutter/flutter/issues/31854 test('Can decode packages with question, answer and additional', () { final List result = - decodeMDnsResponse(packetWithQuestionAnArCount); + decodeMDnsResponse(packetWithQuestionAnArCount)!; expect(result, isNotNull); expect(result.length, 2); expect(result, [ @@ -148,7 +148,7 @@ void testValidPackages() { test('Can decode packages without question and with answer and additional', () { final List result = - decodeMDnsResponse(packetWithoutQuestionWithAnArCount); + decodeMDnsResponse(packetWithoutQuestionWithAnArCount)!; expect(result, isNotNull); expect(result.length, 2); expect(result, [ @@ -166,7 +166,7 @@ void testValidPackages() { }); test('Can decode packages with a long text resource', () { - final List result = decodeMDnsResponse(packetWithLongTxt); + final List result = decodeMDnsResponse(packetWithLongTxt)!; expect(result, isNotNull); expect(result.length, 2); expect(result, [ @@ -210,10 +210,10 @@ void testSRVRData() { void testNonUtf8DomainName() { test('Returns non-null for non-utf8 domain name', () { - final List result = decodeMDnsResponse(nonUtf8Package); + final List result = decodeMDnsResponse(nonUtf8Package)!; expect(result, isNotNull); expect(result[0] is TxtResourceRecord, isTrue); - final TxtResourceRecord txt = result[0]; + final TxtResourceRecord txt = result[0] as TxtResourceRecord; expect(txt.name, contains('�')); }); } diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index 6a311fd1bad8..ace917d4092f 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -40,7 +40,7 @@ void testResult() { final ResourceRecord response = ip4Result('xxx.local', InternetAddress('1.2.3.4')); resolver.handleResponse([response]); - final IPAddressResourceRecord result = await futureResult.first; + final IPAddressResourceRecord result = await futureResult.first as IPAddressResourceRecord; expect('1.2.3.4', result.address.address); resolver.clearPendingRequests(); }); @@ -59,8 +59,8 @@ void testResult2() { final ResourceRecord response2 = ip4Result('yyy.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response2, response1]); - final IPAddressResourceRecord result1 = await futureResult1.first; - final IPAddressResourceRecord result2 = await futureResult2.first; + final IPAddressResourceRecord result1 = await futureResult1.first as IPAddressResourceRecord; + final IPAddressResourceRecord result2 = await futureResult2.first as IPAddressResourceRecord; expect('1.2.3.4', result1.address.address); expect('2.3.4.5', result2.address.address); resolver.clearPendingRequests(); @@ -88,8 +88,8 @@ void testResult3() { resolver.handleResponse([response0]); resolver.handleResponse([response2, response1]); resolver.handleResponse([response0]); - final IPAddressResourceRecord result1 = await futureResult1.first; - final IPAddressResourceRecord result2 = await futureResult2.first; + final IPAddressResourceRecord result1 = await futureResult1.first as IPAddressResourceRecord; + final IPAddressResourceRecord result2 = await futureResult2.first as IPAddressResourceRecord; expect('1.2.3.4', result1.address.address); expect('2.3.4.5', result2.address.address); resolver.clearPendingRequests(); From fcd4b38d0b4e1c83d3f144278d877cf569cfd52b Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 3 Mar 2021 08:42:52 -0800 Subject: [PATCH 2/4] Dart format --- .../lib/src/native_protocol_client.dart | 5 +++-- .../multicast_dns/lib/src/resource_record.dart | 8 ++++---- packages/multicast_dns/test/client_test.dart | 13 ++++++++++--- .../multicast_dns/test/lookup_resolver_test.dart | 15 ++++++++++----- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/packages/multicast_dns/lib/src/native_protocol_client.dart b/packages/multicast_dns/lib/src/native_protocol_client.dart index 54d4704b29ee..734412b27afb 100644 --- a/packages/multicast_dns/lib/src/native_protocol_client.dart +++ b/packages/multicast_dns/lib/src/native_protocol_client.dart @@ -49,8 +49,9 @@ class ResourceRecordCache { _cache[record.resourceRecordType] ??= SplayTreeMap>(); - _cache[record.resourceRecordType]! - [record.name] = [record]; + _cache[record.resourceRecordType]![record.name] = [ + record + ]; } else { _cache[record.resourceRecordType]![record.name]!.add(record); } diff --git a/packages/multicast_dns/lib/src/resource_record.dart b/packages/multicast_dns/lib/src/resource_record.dart index d605aae4afb1..eae21bf7bd13 100644 --- a/packages/multicast_dns/lib/src/resource_record.dart +++ b/packages/multicast_dns/lib/src/resource_record.dart @@ -92,7 +92,7 @@ class ResourceRecordQuery { this.resourceRecordType, this.fullyQualifiedName, this.questionType, - ) : assert(ResourceRecordType.debugAssertValid(resourceRecordType)); + ) : assert(ResourceRecordType.debugAssertValid(resourceRecordType)); /// An A (IPv4) query. ResourceRecordQuery.addressIPv4( @@ -245,7 +245,7 @@ class PtrResourceRecord extends ResourceRecord { String name, int validUntil, { required this.domainName, - }) : super(ResourceRecordType.serverPointer, name, validUntil); + }) : super(ResourceRecordType.serverPointer, name, validUntil); /// The FQDN for this record. final String domainName; @@ -313,7 +313,7 @@ class SrvResourceRecord extends ResourceRecord { required this.port, required this.priority, required this.weight, - }) : super(ResourceRecordType.service, name, validUntil); + }) : super(ResourceRecordType.service, name, validUntil); /// The hostname for this record. final String target; @@ -368,7 +368,7 @@ class TxtResourceRecord extends ResourceRecord { String name, int validUntil, { required this.text, - }) : super(ResourceRecordType.text, name, validUntil); + }) : super(ResourceRecordType.text, name, validUntil); /// The raw text from this record. final String text; diff --git a/packages/multicast_dns/test/client_test.dart b/packages/multicast_dns/test/client_test.dart index 43ea300530fa..85ab0b19e28b 100644 --- a/packages/multicast_dns/test/client_test.dart +++ b/packages/multicast_dns/test/client_test.dart @@ -15,7 +15,9 @@ void main() { final FakeRawDatagramSocket datagramSocket = FakeRawDatagramSocket(); final MDnsClient client = MDnsClient(rawDatagramSocketFactory: (dynamic host, int port, - {bool reuseAddress = true, bool reusePort = true, int ttl = 1}) async { + {bool reuseAddress = true, + bool reusePort = true, + int ttl = 1}) async { lastPort = port; return datagramSocket; }); @@ -34,7 +36,12 @@ class FakeRawDatagramSocket extends Fake implements RawDatagramSocket { InternetAddress get address => InternetAddress.anyIPv4; @override - StreamSubscription listen(void Function(RawSocketEvent event)? onData, {Function? onError, void Function()? onDone, bool? cancelOnError}) { - return const Stream.empty().listen(onData, onError: onError, cancelOnError: cancelOnError, onDone: onDone); + StreamSubscription listen( + void Function(RawSocketEvent event)? onData, + {Function? onError, + void Function()? onDone, + bool? cancelOnError}) { + return const Stream.empty().listen(onData, + onError: onError, cancelOnError: cancelOnError, onDone: onDone); } } diff --git a/packages/multicast_dns/test/lookup_resolver_test.dart b/packages/multicast_dns/test/lookup_resolver_test.dart index ace917d4092f..3423a68d697e 100644 --- a/packages/multicast_dns/test/lookup_resolver_test.dart +++ b/packages/multicast_dns/test/lookup_resolver_test.dart @@ -40,7 +40,8 @@ void testResult() { final ResourceRecord response = ip4Result('xxx.local', InternetAddress('1.2.3.4')); resolver.handleResponse([response]); - final IPAddressResourceRecord result = await futureResult.first as IPAddressResourceRecord; + final IPAddressResourceRecord result = + await futureResult.first as IPAddressResourceRecord; expect('1.2.3.4', result.address.address); resolver.clearPendingRequests(); }); @@ -59,8 +60,10 @@ void testResult2() { final ResourceRecord response2 = ip4Result('yyy.local', InternetAddress('2.3.4.5')); resolver.handleResponse([response2, response1]); - final IPAddressResourceRecord result1 = await futureResult1.first as IPAddressResourceRecord; - final IPAddressResourceRecord result2 = await futureResult2.first as IPAddressResourceRecord; + final IPAddressResourceRecord result1 = + await futureResult1.first as IPAddressResourceRecord; + final IPAddressResourceRecord result2 = + await futureResult2.first as IPAddressResourceRecord; expect('1.2.3.4', result1.address.address); expect('2.3.4.5', result2.address.address); resolver.clearPendingRequests(); @@ -88,8 +91,10 @@ void testResult3() { resolver.handleResponse([response0]); resolver.handleResponse([response2, response1]); resolver.handleResponse([response0]); - final IPAddressResourceRecord result1 = await futureResult1.first as IPAddressResourceRecord; - final IPAddressResourceRecord result2 = await futureResult2.first as IPAddressResourceRecord; + final IPAddressResourceRecord result1 = + await futureResult1.first as IPAddressResourceRecord; + final IPAddressResourceRecord result2 = + await futureResult2.first as IPAddressResourceRecord; expect('1.2.3.4', result1.address.address); expect('2.3.4.5', result2.address.address); resolver.clearPendingRequests(); From d75d10a14aa72afe67833b2c5d2bc13ee9c089e2 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Wed, 3 Mar 2021 14:49:20 -0800 Subject: [PATCH 3/4] use int? for mDNSPort field --- packages/multicast_dns/lib/multicast_dns.dart | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 32e88b073bba..948467b35370 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -54,7 +54,7 @@ class MDnsClient { final RawDatagramSocketFactory _rawDatagramSocketFactory; InternetAddress? _mDnsAddress; - late int _mDnsPort; + int? _mDnsPort; late RawDatagramSocket _incoming; /// Find all network interfaces with an the [InternetAddressType] specified. @@ -89,7 +89,7 @@ class MDnsClient { }) async { listenAddress ??= InternetAddress.anyIPv4; interfacesFactory ??= allInterfacesFactory; - _mDnsPort = mDnsPort; + final int selectedMDnsPort = _mDnsPort = mDnsPort; _mDnsAddress = mDnsAddress; assert(listenAddress.address == InternetAddress.anyIPv4.address || @@ -103,7 +103,7 @@ class MDnsClient { // Listen on all addresses. _incoming = await _rawDatagramSocketFactory( listenAddress.address, - _mDnsPort, + selectedMDnsPort, reuseAddress: true, reusePort: true, ttl: 255, @@ -126,7 +126,7 @@ class MDnsClient { final InternetAddress targetAddress = interface.addresses[0]; final RawDatagramSocket socket = await _rawDatagramSocketFactory( targetAddress, - _mDnsPort, + selectedMDnsPort, reuseAddress: true, reusePort: true, ttl: 255, @@ -186,7 +186,8 @@ class MDnsClient { ResourceRecordQuery query, { Duration timeout = const Duration(seconds: 5), }) { - if (!_started) { + final int? selectedMDnsPort = _mDnsPort; + if (!_started || selectedMDnsPort == null) { throw StateError('mDNS client must be started before calling lookup.'); } // Look for entries in the cache. @@ -207,7 +208,7 @@ class MDnsClient { // Send the request on all interfaces. final List packet = query.encode(); for (RawDatagramSocket socket in _sockets) { - socket.send(packet, _mDnsAddress!, _mDnsPort); + socket.send(packet, _mDnsAddress!, selectedMDnsPort); } return results; } From af03ca16cf8bd467aa04347c9e107a13cf81e19f Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Thu, 4 Mar 2021 11:24:44 -0800 Subject: [PATCH 4/4] remove incoming field --- packages/multicast_dns/lib/multicast_dns.dart | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/multicast_dns/lib/multicast_dns.dart b/packages/multicast_dns/lib/multicast_dns.dart index 948467b35370..148a4b0b01e5 100644 --- a/packages/multicast_dns/lib/multicast_dns.dart +++ b/packages/multicast_dns/lib/multicast_dns.dart @@ -55,7 +55,6 @@ class MDnsClient { InternetAddress? _mDnsAddress; int? _mDnsPort; - late RawDatagramSocket _incoming; /// Find all network interfaces with an the [InternetAddressType] specified. static NetworkInterfacesFactory allInterfacesFactory = @@ -101,7 +100,7 @@ class MDnsClient { _starting = true; // Listen on all addresses. - _incoming = await _rawDatagramSocketFactory( + final RawDatagramSocket incoming = await _rawDatagramSocketFactory( listenAddress.address, selectedMDnsPort, reuseAddress: true, @@ -110,11 +109,11 @@ class MDnsClient { ); // Can't send to IPv6 any address. - if (_incoming.address != InternetAddress.anyIPv6) { - _sockets.add(_incoming); + if (incoming.address != InternetAddress.anyIPv6) { + _sockets.add(incoming); } - _mDnsAddress ??= _incoming.address.type == InternetAddressType.IPv4 + _mDnsAddress ??= incoming.address.type == InternetAddressType.IPv4 ? mDnsAddressIPv4 : mDnsAddressIPv6; @@ -147,9 +146,9 @@ class MDnsClient { )); } // Join multicast on this interface. - _incoming.joinMulticast(_mDnsAddress!, interface); + incoming.joinMulticast(_mDnsAddress!, interface); } - _incoming.listen(_handleIncoming); + incoming.listen((RawSocketEvent event) => _handleIncoming(event, incoming)); _started = true; _starting = false; } @@ -214,9 +213,9 @@ class MDnsClient { } // Process incoming datagrams. - void _handleIncoming(RawSocketEvent event) { + void _handleIncoming(RawSocketEvent event, RawDatagramSocket incoming) { if (event == RawSocketEvent.read) { - final Datagram? datagram = _incoming.receive(); + final Datagram? datagram = incoming.receive(); if (datagram == null) { return; }