码桶

发现社区成员的开源项目

main
NodeNanny/test-usability-classify.js
test-usability-classify.js2.8 KB
'use strict';

// 2026-07-15新增,2026-07-27更新(任务清单第5项:修复硬编码中文串透传到多语言面板的问题,
// socksHttpProbe内部错误消息全部从中文改成了英文,这里的断言同步跟着改,行为本身不变):
// 验证 usability-check.js(二层"真实可用性检测",给主节点自己用的,
// 不是流量池那套 pool-checker.js)的超时阶段感知分类逻辑。
// 背景:此前 socksHttpProbe 里所有阶段(greeting/connect/http)超时都抛同一句
// 消息,runUsabilityCheck 的 catch 分支只认"CONNECT failed"这一种情况,
// 导致 connect/http 阶段超时(隧道已经往前走了一段,是节点/目标那头的问题)
// 被误判成 check_error(本机检测设施问题)。这个函数不依赖真实 xray,直接单测。

const assert = require('assert');
const { _internal: { classifyUsabilityError } } = require('./core/usability-check');

let passed = 0;
function test(name, fn) {
  try {
    fn();
    passed++;
    console.log(`  ok - ${name}`);
  } catch (err) {
    console.error(`  FAIL - ${name}`);
    console.error(err);
    process.exitCode = 1;
  }
}

console.log('classifyUsabilityError 阶段感知分类:');

test('greeting阶段超时 -> check_error(本机xray客户端自己没反应)', () => {
  const err = new Error('Probe timed out [stage:greeting]');
  assert.strictEqual(classifyUsabilityError(err), 'check_error');
});

test('connect阶段超时 -> down(隧道已经往前走了一段,是节点连不上目标)', () => {
  const err = new Error('Probe timed out [stage:connect]');
  assert.strictEqual(classifyUsabilityError(err), 'down');
});

test('http阶段超时 -> down(隧道通了但目标半天没响应,节点实际不可用)', () => {
  const err = new Error('Probe timed out [stage:http]');
  assert.strictEqual(classifyUsabilityError(err), 'down');
});

test('没有阶段标记的旧格式消息 -> 兜底check_error', () => {
  const err = new Error('Probe timed out');
  assert.strictEqual(classifyUsabilityError(err), 'check_error');
});

test('SOCKS5 CONNECT失败(非超时类) -> down不变', () => {
  const err = new Error('SOCKS5 CONNECT failed, proxy could not reach the target address (likely the node is actually down)');
  assert.strictEqual(classifyUsabilityError(err), 'down');
});

test('SOCKS5握手失败 -> check_error不变', () => {
  const err = new Error('SOCKS5 handshake failed (xray client may not have started, or config mismatch)');
  assert.strictEqual(classifyUsabilityError(err), 'check_error');
});

test('完全未知的错误 -> 兜底check_error(宁可错杀检测本身也不错杀节点)', () => {
  const err = new Error('some totally unexpected internal error');
  assert.strictEqual(classifyUsabilityError(err), 'check_error');
});

console.log(`\n${passed} 项通过`);
if (process.exitCode) {
  console.error('存在失败项');
  process.exit(1);
}