diff --git a/test/dns_proxy_test.dart b/test/dns_proxy_test.dart index 4017c48..a8ea5be 100644 --- a/test/dns_proxy_test.dart +++ b/test/dns_proxy_test.dart @@ -55,8 +55,16 @@ void main() { await t.start(); addTearDown(t.close); final r = DnsResolver(config: () => custom('127.0.0.1'), port: t.port); - expect((await r.lookup('big.test')).single.address, '10.9.9.9'); - expect(t.tcpQueries, greaterThan(0)); + // 전체 실행에서만 실패한 적이 있다 - 실패하면 실제 오류와 가짜 DNS 의 기록을 남긴다 + try { + expect((await r.lookup('big.test')).single.address, '10.9.9.9'); + expect(t.tcpQueries, greaterThan(0)); + } catch (e, st) { + // ignore: avoid_print + print('TC 시험 실패: $e (${e.runtimeType}${e is SocketException ? ', errno ${e.osError?.errorCode}' : ''})\n' + '가짜 DNS: port ${t.port}, ${t.events}, 질문 ${t.queries}\n$st'); + rethrow; + } }); test('서버에 닿지 않으면 unreachable 오류 (기기 DNS 로 바꾸지 않음)', () async { diff --git a/test/support/fake_dns.dart b/test/support/fake_dns.dart index c0f1032..83ef0ee 100644 --- a/test/support/fake_dns.dart +++ b/test/support/fake_dns.dart @@ -13,6 +13,9 @@ class FakeDns { final queries = []; int tcpQueries = 0; + /// 시작 · 응답 중에 생긴 일 (시험이 실패하면 남겨 원인을 본다) + final events = []; + FakeDns(this.records, {this.truncateUdp = false, this.ttl = 300}); int get port => _udp.port; @@ -29,8 +32,10 @@ class FakeDns { try { _udp = await RawDatagramSocket.bind(InternetAddress.loopbackIPv4, tcp.port); _tcp = tcp; + events.add('bound tcp+udp ${tcp.port} (try $i)'); break; - } on SocketException { + } on SocketException catch (e) { + events.add('udp bind ${tcp.port} failed: ${e.osError?.errorCode} ${e.message}'); await tcp.close(); if (i > 50) rethrow; } @@ -43,6 +48,7 @@ class FakeDns { _udp.send(_answer(d.data, tc: truncateUdp), d.address, d.port); }); _tcp?.listen((s) async { + events.add('tcp accepted ${s.remotePort}'); final buf = BytesBuilder(); await for (final c in s) { buf.add(c);