tasq/node_modules/agentic-flow/validation/quic-deep-validation.ts

305 lines
9.9 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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);
});