///
import { describe, expect, it } from 'vitest';
import {
canEnableTls,
canEnableReality,
canEnableTlsFlow,
canEnableStream,
canEnableVisionSeed,
isSS2022,
isSSMultiUser,
} from '@/lib/xray/protocol-capabilities';
// Pure-function tests for the capability predicates. Each fixture × stream
// case is locked via snapshot — these were captured at the close of the
// legacy class migration and verified byte-equal to the legacy Inbound
// class instance methods. Drift past this baseline is a regression.
const fixtures = import.meta.glob(
'./golden/fixtures/inbound/*.json',
{ eager: true, import: 'default' },
);
interface FixtureShape { protocol: string; settings: Record }
const STREAM_CASES: { network: string; security: string }[] = [
{ network: 'tcp', security: 'none' },
{ network: 'tcp', security: 'tls' },
{ network: 'tcp', security: 'reality' },
{ network: 'ws', security: 'none' },
{ network: 'ws', security: 'tls' },
{ network: 'grpc', security: 'none' },
{ network: 'grpc', security: 'tls' },
{ network: 'grpc', security: 'reality' },
{ network: 'kcp', security: 'none' },
{ network: 'httpupgrade', security: 'none' },
{ network: 'httpupgrade', security: 'tls' },
{ network: 'xhttp', security: 'none' },
{ network: 'xhttp', security: 'tls' },
{ network: 'xhttp', security: 'reality' },
];
function fixtureName(path: string): string {
return (path.split('/').pop() ?? path).replace(/\.json$/, '');
}
describe('protocol capability predicates', () => {
const entries = Object.entries(fixtures).sort(([a], [b]) => a.localeCompare(b));
for (const [path, raw] of entries) {
const name = fixtureName(path);
const fix = raw as FixtureShape;
for (const stream of STREAM_CASES) {
it(`${name} :: ${stream.network}/${stream.security}`, () => {
const values = {
protocol: fix.protocol,
streamSettings: { network: stream.network, security: stream.security },
settings: fix.settings,
};
const result = {
canEnableTls: canEnableTls(values),
canEnableReality: canEnableReality(values),
canEnableTlsFlow: canEnableTlsFlow(values),
canEnableStream: canEnableStream(values),
canEnableVisionSeed: canEnableVisionSeed(values),
isSS2022: isSS2022(values),
isSSMultiUser: isSSMultiUser(values),
};
expect(result).toMatchSnapshot();
});
}
}
});