74 lines
3.4 KiB
Dart
74 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 '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'] ?? Directory.systemTemp.createTempSync('jj_dns_block_').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;
|
|
});
|
|
}
|