build: add supply-chain and regression verification
This commit is contained in:
1 parent
9f248eb218
commit
27f3bf908c
10 files changed
+9714
-3
No files matched your search
@@ -0,0 +1,98 @@
|
||||
import 'dart:io';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
void main() {
|
||||
test('native runtime is generation-scoped, readiness-gated and deadline-bound', () {
|
||||
const root = 'local_packages/flutter_vless_android-1.1.5/android/src/main/kotlin/com/github/tfox/flutter_vless';
|
||||
final plugin = File('$root/FlutterVlessPlugin.kt').readAsStringSync();
|
||||
final config = File('$root/xray/dto/XrayConfig.kt').readAsStringSync();
|
||||
final service = File('$root/xray/service/XrayVPNService.kt').readAsStringSync();
|
||||
final core = File('$root/xray/core/XrayCoreManager.kt').readAsStringSync();
|
||||
final timer = File('lib/logic/session_timer.dart').readAsStringSync();
|
||||
final vpn = File('lib/logic/vpn_connection.dart').readAsStringSync();
|
||||
final hivemind = File('lib/logic/hivemind_service.dart').readAsStringSync();
|
||||
final main = File('lib/main.dart').readAsStringSync();
|
||||
final mainActivity = File(
|
||||
'android/app/src/main/kotlin/com/paladinvpn/app/MainActivity.kt',
|
||||
).readAsStringSync();
|
||||
final support = File('lib/components/support_button.dart').readAsStringSync();
|
||||
final connectionSettings =
|
||||
File('lib/logic/connection_settings.dart').readAsStringSync();
|
||||
|
||||
expect(config, contains('var RUNTIME_TOKEN: String = ""'));
|
||||
expect(plugin, contains('expectedRuntimeToken'));
|
||||
expect(plugin, contains('runtimeToken != currentToken'));
|
||||
expect(plugin, contains('runtimeReady'));
|
||||
expect(plugin, contains('STOP_TIMEOUT'));
|
||||
expect(plugin, contains('setSessionDeadline'));
|
||||
expect(plugin, contains('result.error("NO_ACTIVITY"'));
|
||||
expect(plugin, isNot(contains('activity!!')));
|
||||
|
||||
expect(plugin, contains('if (token == null) {'));
|
||||
expect(plugin, contains('intent.putExtra("RUNTIME_TOKEN", token)'));
|
||||
expect(
|
||||
plugin,
|
||||
isNot(contains('if (token != null) intent.putExtra("RUNTIME_TOKEN", token)')),
|
||||
);
|
||||
expect(plugin, isNot(contains('"getServerDelay" ->')));
|
||||
expect(plugin, isNot(contains('"getConnectedServerDelay" ->')));
|
||||
|
||||
expect(
|
||||
service,
|
||||
contains('val requestedToken = intent.getStringExtra("RUNTIME_TOKEN").orEmpty()'),
|
||||
);
|
||||
expect(service, contains('requestedToken.isEmpty() ||'));
|
||||
expect(service, contains('requestedToken != activeToken'));
|
||||
expect(service, contains('stopAll(requestedToken)'));
|
||||
|
||||
expect(hivemind, contains('..followRedirects = false;'));
|
||||
|
||||
expect(plugin, contains('failPendingPermission("ENGINE_DETACHED"'));
|
||||
expect(plugin, contains('failPendingPermission("NO_ACTIVITY"'));
|
||||
|
||||
expect(service, contains('BOOTSTRAP_SESSION_SECONDS = 120L'));
|
||||
expect(service, contains('UPDATE_SESSION_DEADLINE'));
|
||||
expect(service, contains('SystemClock.elapsedRealtime()'));
|
||||
expect(service, contains('AlarmManager.RTC_WAKEUP'));
|
||||
expect(service, contains('setExactAndAllowWhileIdle'));
|
||||
expect(service, contains('setAndAllowWhileIdle'));
|
||||
expect(service, contains('PREF_EXPIRES_AT_MS'));
|
||||
expect(service, contains('PREF_RUNTIME_TOKEN'));
|
||||
expect(service, contains('markRuntimeReady(this, config)'));
|
||||
expect(service, contains('if (currentConfig == null) stopSelf()'));
|
||||
expect(service, isNot(contains('sessionDeadlineEpochMs')));
|
||||
expect(service, isNot(contains('active_session.bin')));
|
||||
expect(service, isNot(contains('ObjectOutputStream')));
|
||||
|
||||
expect(core, contains('AppConfigs.RUNTIME_READY = false'));
|
||||
expect(core, contains('fun markRuntimeReady'));
|
||||
expect(timer, contains('setNativeSessionDeadline(_remainingAtLastSync)'));
|
||||
expect(timer, contains('Future.microtask(_onVpnConnectionChanged)'));
|
||||
expect(timer, contains('Completer<void>? _syncCompletion'));
|
||||
expect(timer, contains('await active.future;'));
|
||||
expect(timer, contains('_sessionEpoch++;'));
|
||||
expect(timer, contains('_supportStateEpoch++;'));
|
||||
expect(timer, contains('_isDisconnecting = true;'));
|
||||
|
||||
expect(vpn, contains('bool _disposed = false;'));
|
||||
expect(vpn, contains('if (_disposed) return;'));
|
||||
expect(vpn, contains('_connectEpoch++;'));
|
||||
expect(vpn, contains('HivemindService.cancel();'));
|
||||
|
||||
expect(main, contains('ChangeNotifierProxyProvider<VpnConnection, SessionTimer>('));
|
||||
expect(main, contains('lazy: false'));
|
||||
expect(support, contains('await timer.syncNow();'));
|
||||
expect(vpn, contains("MethodChannel('flutter_vless')"));
|
||||
|
||||
expect(mainActivity, contains('manager.activeNotifications'));
|
||||
expect(mainActivity, contains('serviceStopAction'));
|
||||
expect(mainActivity, isNot(contains('V2RAY_SERVICE_COMMANDS.STOP_SERVICE')));
|
||||
expect(mainActivity, isNot(contains('XrayVPNService::class.java')));
|
||||
|
||||
expect(
|
||||
connectionSettings,
|
||||
contains('storedMode == ConnectionMode.proxy.name'),
|
||||
);
|
||||
expect(connectionSettings, isNot(contains("storedMode == 'ass'")));
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user