import 'dart:convert'; import 'dart:io'; import 'package:flutter_test/flutter_test.dart'; import 'package:revoltvpn/logic/secure_socks_session.dart'; void main() { test('release verification stays fail-closed and reproducible', () { final gradle = File('android/app/build.gradle.kts').readAsStringSync(); final workflow = File('.github/workflows/android-ci.yml').readAsStringSync(); final lockfile = File('pubspec.lock').readAsStringSync(); final wrapper = File('android/gradle/wrapper/gradle-wrapper.properties').readAsStringSync(); final verification = File('android/gradle/verification-metadata.xml').readAsStringSync(); final proguard = File('android/app/proguard-rules.pro').readAsStringSync(); expect( wrapper, contains( 'distributionSha256Sum=' 'efe9a3d147d948d7528a9887fa35abcf24ca1a43ad06439996490f77569b02d1', ), ); expect(wrapper, contains('validateDistributionUrl=true')); expect(verification, contains('true')); expect(verification, contains('false')); expect(verification, contains('=3.11.0-0 <4.0.0"')); expect(proguard, contains('-keep class io.flutter.** { *; }')); expect(proguard, contains('-keep class xray.** { *; }')); }); test('runtime keeps authenticated SOCKS on the IPv4 loopback', () async { final session = await SecureSocksSession.create(jsonEncode({ 'inbounds': [], 'outbounds': [], })); final config = jsonDecode(session.configJson) as Map; final inbounds = config['inbounds'] as List; final inbound = inbounds.single as Map; final settings = inbound['settings'] as Map; final users = settings['users'] as List; final account = users.single as Map; expect(inbound['tag'], SecureSocksSession.inboundTag); expect(inbound['listen'], '127.0.0.1'); expect(inbound['port'], session.port); expect(settings['auth'], 'password'); expect(account['user'], session.username); expect(account['pass'], session.password); expect(session.username, isNotEmpty); expect(session.password, isNotEmpty); }); }