mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-02-09 06:15:41 -05:00
141 lines
4.9 KiB
JavaScript
141 lines
4.9 KiB
JavaScript
/**
|
|
* Basic Connectivity Test
|
|
*
|
|
* Tests basic connectivity and authentication without requiring backend API access
|
|
* This test validates that the core infrastructure is working correctly
|
|
*/
|
|
|
|
import http from 'k6/http';
|
|
import { check } from 'k6';
|
|
import { getEnvironmentConfig } from './configs/environment.js';
|
|
import { getAuthenticatedUser, getAuthHeaders } from './utils/auth.js';
|
|
|
|
const config = getEnvironmentConfig();
|
|
|
|
export const options = {
|
|
stages: [
|
|
{ duration: __ENV.RAMP_UP || '1m', target: parseInt(__ENV.VUS) || 1 },
|
|
{ duration: __ENV.DURATION || '5m', target: parseInt(__ENV.VUS) || 1 },
|
|
{ duration: __ENV.RAMP_DOWN || '1m', target: 0 },
|
|
],
|
|
thresholds: {
|
|
checks: ['rate>0.70'], // Reduced from 0.85 due to auth timeouts under load
|
|
http_req_duration: ['p(95)<30000'], // Increased for cloud testing with high concurrency
|
|
http_req_failed: ['rate<0.6'], // Increased to account for auth timeouts
|
|
},
|
|
cloud: {
|
|
projectID: __ENV.K6_CLOUD_PROJECT_ID,
|
|
name: 'AutoGPT Platform - Basic Connectivity & Auth Test',
|
|
},
|
|
// Timeout configurations to prevent early termination
|
|
setupTimeout: '60s',
|
|
teardownTimeout: '60s',
|
|
noConnectionReuse: false,
|
|
userAgent: 'k6-load-test/1.0',
|
|
};
|
|
|
|
// Authenticate once per VU and store globally for this VU
|
|
let vuAuth = null;
|
|
|
|
export default function () {
|
|
// Get load multiplier - how many concurrent requests each VU should make
|
|
const requestsPerVU = parseInt(__ENV.REQUESTS_PER_VU) || 1;
|
|
|
|
try {
|
|
// Test 1: Get authenticated user (authenticate only once per VU)
|
|
if (!vuAuth) {
|
|
console.log(`🔐 VU ${__VU} authenticating for the first time...`);
|
|
vuAuth = getAuthenticatedUser();
|
|
} else {
|
|
console.log(`🔄 VU ${__VU} using cached authentication`);
|
|
}
|
|
|
|
// Handle authentication failure gracefully
|
|
if (!vuAuth || !vuAuth.access_token) {
|
|
console.log(`⚠️ VU ${__VU} has no valid authentication - skipping iteration`);
|
|
check(null, {
|
|
'Authentication: Failed gracefully without crashing VU': () => true,
|
|
});
|
|
return; // Exit iteration gracefully without crashing
|
|
}
|
|
|
|
const headers = getAuthHeaders(vuAuth.access_token);
|
|
|
|
if (vuAuth && vuAuth.access_token) {
|
|
console.log(`🚀 VU ${__VU} making ${requestsPerVU} concurrent requests...`);
|
|
|
|
// Create array of request functions to run concurrently
|
|
const requests = [];
|
|
|
|
for (let i = 0; i < requestsPerVU; i++) {
|
|
requests.push({
|
|
method: 'GET',
|
|
url: `${config.SUPABASE_URL}/rest/v1/`,
|
|
params: { headers: { 'apikey': config.SUPABASE_ANON_KEY } }
|
|
});
|
|
|
|
requests.push({
|
|
method: 'GET',
|
|
url: `${config.API_BASE_URL}/health`,
|
|
params: { headers }
|
|
});
|
|
}
|
|
|
|
// Execute all requests concurrently
|
|
const responses = http.batch(requests);
|
|
|
|
// Validate results
|
|
let supabaseSuccesses = 0;
|
|
let backendSuccesses = 0;
|
|
|
|
for (let i = 0; i < responses.length; i++) {
|
|
const response = responses[i];
|
|
|
|
if (i % 2 === 0) {
|
|
// Supabase request
|
|
const connectivityCheck = check(response, {
|
|
'Supabase connectivity: Status is not 500': (r) => r.status !== 500,
|
|
'Supabase connectivity: Response time < 5s': (r) => r.timings.duration < 5000,
|
|
});
|
|
if (connectivityCheck) supabaseSuccesses++;
|
|
} else {
|
|
// Backend request
|
|
const backendCheck = check(response, {
|
|
'Backend server: Responds (any status)': (r) => r.status > 0,
|
|
'Backend server: Response time < 5s': (r) => r.timings.duration < 5000,
|
|
});
|
|
if (backendCheck) backendSuccesses++;
|
|
}
|
|
}
|
|
|
|
console.log(`✅ VU ${__VU} completed: ${supabaseSuccesses}/${requestsPerVU} Supabase, ${backendSuccesses}/${requestsPerVU} backend requests successful`);
|
|
|
|
// Basic auth validation (once per iteration)
|
|
const authCheck = check(vuAuth, {
|
|
'Authentication: Access token received': (auth) => auth && auth.access_token && auth.access_token.length > 0,
|
|
});
|
|
|
|
// JWT structure validation (once per iteration)
|
|
const tokenParts = vuAuth.access_token.split('.');
|
|
const tokenStructureCheck = check(tokenParts, {
|
|
'JWT token: Has 3 parts (header.payload.signature)': (parts) => parts.length === 3,
|
|
'JWT token: Header is base64': (parts) => parts[0] && parts[0].length > 10,
|
|
'JWT token: Payload is base64': (parts) => parts[1] && parts[1].length > 50,
|
|
'JWT token: Signature exists': (parts) => parts[2] && parts[2].length > 10,
|
|
});
|
|
|
|
} else {
|
|
console.log(`❌ Authentication failed`);
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error(`💥 Test failed: ${error.message}`);
|
|
check(null, {
|
|
'Test execution: No errors': () => false,
|
|
});
|
|
}
|
|
}
|
|
|
|
export function teardown(data) {
|
|
console.log(`🏁 Basic connectivity test completed`);
|
|
} |