arblant
Railynx / test / live / live_probe_test.dart
live_probe_test.dart122 lines · 3.9 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
// Live probe tests against the local mock server: real sockets, real TLS,
// real WebSocket upgrade and the real VLESS frame. Loopback only.

import 'dart:io';

import 'package:railway_clean_ip_scanner/engine/vless_scanner.dart';
import 'package:test/test.dart';

import 'mock_vless_server.dart';

const String uuid = '11111111-2222-3333-4444-555555555555';
const String domain = 'localhost';

void main() {
  group('probe against the mock (success path)', () {
    test('TLS, 101 and HTTP 204 make a clean IP', () async {
      final mock = MockVlessServer(MockMode.success204);
      await mock.start();
      addTearDown(mock.close);

      final r = await runSingleProbe('127.0.0.1', domain, uuid, port: mock.port);

      expect(r.isSuccess, isTrue, reason: 'error: ${r.error}');
      expect(r.error, isNull);
      expect(r.delayMs, greaterThanOrEqualTo(0));
      expect(mock.accepted, 1);
    });

    test('three confirmed probes give one averaged clean result', () async {
      final mock = MockVlessServer(MockMode.success204);
      await mock.start();
      addTearDown(mock.close);

      final r = await testIpRealDelay('127.0.0.1', domain, uuid, port: mock.port);

      expect(r.isSuccess, isTrue, reason: 'error: ${r.error}');
      expect(mock.accepted, 3);
    });

    test('doubleCheck off runs a single probe', () async {
      final mock = MockVlessServer(MockMode.success204);
      await mock.start();
      addTearDown(mock.close);

      final r = await testIpRealDelay(
        '127.0.0.1', domain, uuid, port: mock.port, doubleCheck: false);

      expect(r.isSuccess, isTrue, reason: 'error: ${r.error}');
      expect(mock.accepted, 1);
    });
  });

  group('probe against the mock (failure paths)', () {
    test('a 200 instead of 204 is not clean', () async {
      final mock = MockVlessServer(MockMode.wrong200);
      await mock.start();
      addTearDown(mock.close);

      final r = await runSingleProbe('127.0.0.1', domain, uuid, port: mock.port);

      expect(r.isSuccess, isFalse);
      expect(r.error, 'No valid Google 204 response');
      expect(mock.accepted, 0);
    });

    test('a refused upgrade reports the status line', () async {
      final mock = MockVlessServer(MockMode.upgradeRefused);
      await mock.start();
      addTearDown(mock.close);

      final r = await runSingleProbe('127.0.0.1', domain, uuid, port: mock.port);

      expect(r.isSuccess, isFalse);
      expect(r.error, startsWith('WS Upgrade failed: HTTP/1.1 400'));
    });

    test('a connection closed before any reply is not clean', () async {
      final mock = MockVlessServer(MockMode.closeBeforeUpgrade);
      await mock.start();
      addTearDown(mock.close);

      final r = await runSingleProbe('127.0.0.1', domain, uuid, port: mock.port);

      expect(r.isSuccess, isFalse);
      expect(r.error, isNotNull);
    });

    test('a closed port fails with an error, not an exception', () async {
      // Bind to get a free port, then release it so nothing listens there.
      final probe = await ServerSocket.bind(InternetAddress.loopbackIPv4, 0);
      final port = probe.port;
      await probe.close();

      final r = await runSingleProbe('127.0.0.1', domain, uuid, port: port);

      expect(r.isSuccess, isFalse);
      expect(r.error, isNotNull);
    });

    test('a failing first probe stops the three-probe check', () async {
      final mock = MockVlessServer(MockMode.wrong200);
      await mock.start();
      addTearDown(mock.close);

      final r = await testIpRealDelay('127.0.0.1', domain, uuid, port: mock.port);

      expect(r.isSuccess, isFalse);
      expect(r.error, 'No valid Google 204 response');
    });

    test('a bad UUID fails the probe cleanly', () async {
      final mock = MockVlessServer(MockMode.success204);
      await mock.start();
      addTearDown(mock.close);

      final r = await runSingleProbe('127.0.0.1', domain, 'not-a-uuid', port: mock.port);

      expect(r.isSuccess, isFalse);
      expect(r.error, isNotNull);
    });
  });
}