JJ_MKVMaker/integration_test/dns_block_real_test.dart

75 lines
3.4 KiB
Dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:jj_mkvmaker/app/app_controller.dart';
import 'package:jj_mkvmaker/app/bookmarks_controller.dart';
import 'package:jj_mkvmaker/app/net_guard.dart';
import 'package:jj_mkvmaker/platform/windows/desktop_storage_service.dart';
import 'package:jj_mkvmaker/platform/windows/process_media_tool.dart';
import 'package:jj_mkvmaker/services/platform_services.dart';
import 'package:jj_mkvmaker/ui/app_actions.dart';
import 'package:jj_mkvmaker/ui/browser_page.dart';
import 'support/temp_dir.dart';
import 'package:path/path.dart' as p;
/// 250 실제 엔진 (Windows Edge WebView2): DNS 강제 서버에 닿지 않으면 (TEST-NET 192.0.2.1) 엔진의 오류 화면
/// (net::ERR_TUNNEL_CONNECTION_FAILED) 대신 앱의 덮개 "DNS 서버 (…) 에 닿지 않아 … 을(를) 열 수 없습니다" 가 뜨는지.
/// 데이터는 JJ_MKVMAKER_DATA (없으면 임시 폴더) 에만 - 사용자 앱 데이터를 건드리지 않는다.
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('250: 닿지 않는 DNS → 브라우저에 앱 덮개 (Edge 실제)', (tester) async {
final data = Platform.environment['JJ_MKVMAKER_DATA'] ?? testTempDir('jj_dns_block_', heldByApp: true).path;
Directory(data).createSync(recursive: true);
final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService()));
c.settings
..webViewDataDir = p.join(data, 'webview')
..dnsMode = 'custom'
..dnsPrimary = '192.0.2.1'
..dnsSecondary = '';
final logs = <String>[];
final g = NetGuard.instance
..config = (() => c.settings.dnsConfig)
..log = logs.add;
await tester.runAsync(g.ensure);
Future<void> wait(int ms) async {
for (var i = 0; i < ms ~/ 200; i++) {
await tester.runAsync(() => Future<void>.delayed(const Duration(milliseconds: 200)));
await tester.pump();
}
}
final bm = BookmarksController(p.join(data, 'bm.json'));
await tester.pumpWidget(MaterialApp(
builder: (context, child) => AppScope(controller: c, bookmarks: bm, child: child!),
home: BrowserPage(c: c, bookmarks: bm, initialUrl: 'https://example.org/'),
));
final cover = find.textContaining('에 닿지 않아 example.org 을(를) 열 수 없습니다');
for (var i = 0; i < 90 && cover.evaluate().isEmpty; i++) {
await wait(400);
}
// ignore: avoid_print
print('RESULT 덮개: ${cover.evaluate().isNotEmpty} / 알림: ${g.failure.value?.server} / 기록: ${c.logs.where((l) => l.contains('웹 페이지')).toList()}');
expect(cover, findsOneWidget);
expect(find.text('시스템 DNS 로 바꾸기'), findsWidgets);
expect(find.text('다시 시도'), findsOneWidget);
// [다시 시도]: 덮개를 걷고 다시 읽는다 → 여전히 닿지 않으니 다시 덮개
await tester.tap(find.text('다시 시도'));
await tester.pump();
expect(cover, findsNothing);
for (var i = 0; i < 90 && cover.evaluate().isEmpty; i++) {
await wait(400);
}
// ignore: avoid_print
print('RESULT 다시 시도 뒤 덮개: ${cover.evaluate().isNotEmpty}');
expect(cover, findsOneWidget);
await tester.pumpWidget(const SizedBox());
await wait(1000);
g.config = () => c.settings.dnsConfig;
});
}