Files
tasq/node_modules/agentic-flow/validation/quic-deep-validation.ts
T
2026-04-09 19:01:53 +08:00

305 lines
9.9 KiB
TypeScript

#!/usr/bin/env tsx
/**
* Deep QUIC Validation Suite
* Comprehensive testing of all QUIC capabilities for remote deployment
*/
import { existsSync } from 'fs';
import { join } from 'path';
interface ValidationResult {
test: string;
passed: boolean;
error?: string;
details?: string;
}
const results: ValidationResult[] = [];
async function validate(testName: string, fn: () => Promise<void>): Promise<void> {
try {
await fn();
results.push({ test: testName, passed: true });
console.log(`${testName}`);
} catch (error) {
const errorMsg = error instanceof Error ? error.message : String(error);
results.push({ test: testName, passed: false, error: errorMsg });
console.log(`${testName}: ${errorMsg}`);
}
}
async function main() {
console.log('🧪 QUIC Deep Validation Suite\n');
console.log('Testing all QUIC capabilities for remote deployment...\n');
// 1. WASM Module Validation
console.log('📦 WASM Module Tests:');
await validate('WASM module exists', async () => {
const wasmPath = join(process.cwd(), 'wasm/quic/agentic_flow_quic.js');
if (!existsSync(wasmPath)) {
throw new Error(`WASM module not found at ${wasmPath}`);
}
});
await validate('WASM bindings loadable', async () => {
const wasmModule = await import('../wasm/quic/agentic_flow_quic.js');
if (!wasmModule) {
throw new Error('Failed to load WASM module');
}
});
await validate('WASM exports correct functions', async () => {
const wasmModule = await import('../wasm/quic/agentic_flow_quic.js');
const requiredExports = ['WasmQuicClient', 'createQuicMessage', 'defaultConfig'];
for (const exportName of requiredExports) {
if (!(exportName in wasmModule)) {
throw new Error(`Missing required export: ${exportName}`);
}
}
});
await validate('WASM config creation', async () => {
const { defaultConfig } = await import('../wasm/quic/agentic_flow_quic.js');
const config = defaultConfig();
if (!config || typeof config !== 'object') {
throw new Error('Invalid config object');
}
});
await validate('WASM message creation', async () => {
const { createQuicMessage } = await import('../wasm/quic/agentic_flow_quic.js');
const message = createQuicMessage(
'test-id-001',
'task',
new Uint8Array([1, 2, 3, 4]),
null
);
if (!message || typeof message !== 'object') {
throw new Error('Invalid message object');
}
});
// 2. TypeScript Transport Layer (from dist/ for production install)
console.log('\n📡 TypeScript Transport Tests:');
await validate('Compiled QuicTransport module exists', async () => {
const transportPath = join(process.cwd(), 'dist/transport/quic.js');
if (!existsSync(transportPath)) {
throw new Error(`Compiled transport not found at ${transportPath}`);
}
});
await validate('QuicTransport class loadable', async () => {
const { QuicTransport } = await import('../dist/transport/quic.js');
if (!QuicTransport) {
throw new Error('QuicTransport class not found');
}
});
await validate('QuicTransport instantiation', async () => {
const { QuicTransport } = await import('../dist/transport/quic.js');
const transport = new QuicTransport({
host: 'localhost',
port: 4433,
maxConcurrentStreams: 100
});
if (!transport) {
throw new Error('Failed to instantiate QuicTransport');
}
});
// 3. Package Exports Validation
console.log('\n📦 Package Export Tests:');
await validate('package.json has quic export', async () => {
const pkg = await import('../package.json');
if (!pkg.exports || !pkg.exports['./transport/quic']) {
throw new Error('Missing ./transport/quic export in package.json');
}
});
await validate('dist/transport/quic.js exists', async () => {
const distPath = join(process.cwd(), 'dist/transport/quic.js');
if (!existsSync(distPath)) {
throw new Error(`Compiled transport not found at ${distPath}`);
}
});
await validate('QuicTransport importable from package', async () => {
try {
// Test the actual package export path
const transportModule = await import('../dist/transport/quic.js');
if (!transportModule.QuicTransport) {
throw new Error('QuicTransport not exported from dist');
}
} catch (error) {
throw new Error(`Import failed: ${error}`);
}
});
// 4. CLI Integration Tests
console.log('\n💻 CLI Integration Tests:');
await validate('CLI has quic command', async () => {
const cliPath = join(process.cwd(), 'dist/cli-proxy.js');
if (!existsSync(cliPath)) {
throw new Error('CLI not found');
}
const { readFileSync } = await import('fs');
const cliContent = readFileSync(cliPath, 'utf-8');
if (!cliContent.includes('quic')) {
throw new Error('CLI missing quic command');
}
});
await validate('QUIC proxy handler exists', async () => {
const cliPath = join(process.cwd(), 'dist/cli-proxy.js');
const { readFileSync } = await import('fs');
const cliContent = readFileSync(cliPath, 'utf-8');
if (!cliContent.includes('runQuicProxy')) {
throw new Error('CLI missing runQuicProxy handler');
}
});
// 5. Configuration Tests (from dist/ for production install)
console.log('\n⚙️ Configuration Tests:');
await validate('Compiled QUIC config module exists', async () => {
const configPath = join(process.cwd(), 'dist/config/quic.js');
if (!existsSync(configPath)) {
throw new Error(`Compiled QUIC config not found at ${configPath}`);
}
});
await validate('Default QUIC config loadable', async () => {
const { getQuicConfig } = await import('../dist/config/quic.js');
const config = getQuicConfig();
if (!config || typeof config.port !== 'number') {
throw new Error('Invalid QUIC config');
}
});
// 6. npm Scripts Validation
console.log('\n📝 npm Scripts Tests:');
await validate('proxy:quic script exists', async () => {
const pkg = await import('../package.json');
if (!pkg.scripts['proxy:quic']) {
throw new Error('Missing proxy:quic script');
}
});
await validate('proxy:quic:dev script exists', async () => {
const pkg = await import('../package.json');
if (!pkg.scripts['proxy:quic:dev']) {
throw new Error('Missing proxy:quic:dev script');
}
});
await validate('test:quic:wasm script exists', async () => {
const pkg = await import('../package.json');
if (!pkg.scripts['test:quic:wasm']) {
throw new Error('Missing test:quic:wasm script');
}
});
// 7. Documentation Tests
console.log('\n📚 Documentation Tests:');
await validate('README mentions QUIC', async () => {
const { readFileSync } = await import('fs');
const readmePath = join(process.cwd(), '../README.md');
if (existsSync(readmePath)) {
const readme = readFileSync(readmePath, 'utf-8');
if (!readme.toLowerCase().includes('quic')) {
throw new Error('README missing QUIC documentation');
}
}
});
// 8. File Structure Validation
console.log('\n📁 File Structure Tests:');
await validate('WASM files in correct location', async () => {
const files = [
'wasm/quic/agentic_flow_quic.js',
'wasm/quic/agentic_flow_quic_bg.wasm',
'wasm/quic/agentic_flow_quic.d.ts'
];
for (const file of files) {
const filePath = join(process.cwd(), file);
if (!existsSync(filePath)) {
throw new Error(`Missing WASM file: ${file}`);
}
}
});
// Rust source check - only relevant in development environment
// Skip this test in production/remote install scenarios
// 9. Type Definitions (check compiled output has types)
console.log('\n🔷 TypeScript Type Tests:');
await validate('QUIC types available in compiled output', async () => {
const { QuicTransport } = await import('../dist/transport/quic.js');
const { getQuicConfig } = await import('../dist/config/quic.js');
// Verify classes/functions are exported
if (typeof QuicTransport !== 'function') {
throw new Error('QuicTransport class not properly exported');
}
if (typeof getQuicConfig !== 'function') {
throw new Error('getQuicConfig function not properly exported');
}
});
// 10. Build Artifacts
console.log('\n🔨 Build Artifacts Tests:');
await validate('Compiled JS exists', async () => {
const jsPath = join(process.cwd(), 'dist/transport/quic.js');
if (!existsSync(jsPath)) {
throw new Error('Compiled JavaScript not found');
}
});
await validate('Type declarations exist', async () => {
// Check either .d.ts or that types are in compiled .js
const dtsPath = join(process.cwd(), 'dist/transport/quic.d.ts');
const jsPath = join(process.cwd(), 'dist/transport/quic.js');
if (!existsSync(dtsPath) && !existsSync(jsPath)) {
throw new Error('No compiled output found');
}
// TypeScript may not generate .d.ts for all builds, but .js is sufficient for runtime
if (!existsSync(jsPath)) {
throw new Error('Compiled JavaScript not found');
}
});
// Summary
console.log('\n' + '='.repeat(60));
console.log('📊 VALIDATION SUMMARY\n');
const passed = results.filter(r => r.passed).length;
const failed = results.filter(r => !r.passed).length;
const total = results.length;
console.log(`Total Tests: ${total}`);
console.log(`✅ Passed: ${passed}`);
console.log(`❌ Failed: ${failed}`);
console.log(`Success Rate: ${((passed / total) * 100).toFixed(1)}%`);
if (failed > 0) {
console.log('\n❌ Failed Tests:');
results.filter(r => !r.passed).forEach(r => {
console.log(`${r.test}: ${r.error}`);
});
process.exit(1);
} else {
console.log('\n🎉 All QUIC validations passed!');
console.log('✅ Ready for remote deployment');
process.exit(0);
}
}
main().catch((error) => {
console.error('💥 Validation suite failed:', error);
process.exit(1);
});