76 lines
2.4 KiB
JavaScript
76 lines
2.4 KiB
JavaScript
import http from 'k6/http';
|
|
import { check, sleep } from 'k6';
|
|
import { randomString } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
|
|
|
|
export const options = {
|
|
vus: 20,
|
|
duration: '30s',
|
|
thresholds: {
|
|
'http_req_duration': ['p(95)<500'], // 95% of requests must complete below 500ms
|
|
},
|
|
};
|
|
|
|
const BASE_URL = __ENV.API_URL || 'http://localhost:8080/api/v1';
|
|
|
|
export default function () {
|
|
// 1. Initiate Upload
|
|
const userID = '00000000-0000-0000-0000-000000000001'; // Mock User ID
|
|
const initPayload = JSON.stringify({
|
|
filename: `loadtest_${randomString(8)}.mp3`,
|
|
total_size: 1024 * 1024 * 3, // 3MB
|
|
total_chunks: 3,
|
|
});
|
|
|
|
const params = {
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
// Assuming dev/test environment with bypassed auth or mock token
|
|
'Authorization': 'Bearer local-dev-token',
|
|
},
|
|
};
|
|
|
|
const initRes = http.post(`${BASE_URL}/tracks/upload/init`, initPayload, params);
|
|
|
|
const isInitSuccess = check(initRes, {
|
|
'init status is 200': (r) => r.status === 200,
|
|
'has upload_id': (r) => r.json('upload_id') !== undefined,
|
|
});
|
|
|
|
if (!isInitSuccess) {
|
|
console.error(`Init failed: ${initRes.status} ${initRes.body}`);
|
|
sleep(1);
|
|
return;
|
|
}
|
|
|
|
const uploadID = initRes.json('upload_id');
|
|
|
|
// 2. Upload Chunks (3 chunks)
|
|
// We use a dummy file content. In K6, usually we send multipart/form-data.
|
|
// For simplicity and speed in this specific check, we assume the server handles the multipart correctly.
|
|
|
|
for (let i = 1; i <= 3; i++) {
|
|
const chunkData = {
|
|
file: http.file(randomString(1024 * 1024), `chunk_${i}.bin`), // 1MB dummy chunk
|
|
chunk_number: i.toString(),
|
|
total_chunks: '3',
|
|
};
|
|
|
|
const chunkRes = http.post(`${BASE_URL}/tracks/upload/${uploadID}`, chunkData, {
|
|
headers: { 'Authorization': 'Bearer local-dev-token' } // Boundary is handled automatically
|
|
});
|
|
|
|
check(chunkRes, {
|
|
[`chunk ${i} status is 200`]: (r) => r.status === 200,
|
|
});
|
|
|
|
sleep(0.1); // Small think time
|
|
}
|
|
|
|
// 3. Finish Upload
|
|
const finishRes = http.post(`${BASE_URL}/tracks/upload/${uploadID}/finish`, null, params);
|
|
|
|
check(finishRes, {
|
|
'finish status is 200': (r) => r.status === 200,
|
|
'has file_path': (r) => r.json('file_path') !== undefined,
|
|
});
|
|
}
|