2024-11-15 17:46:01 -05:00
|
|
|
|
import { attemptLoginOrRegister, createRoomContainer } from './utility/apiServices.js';
|
|
|
|
|
|
import { Student } from './class/student.js';
|
|
|
|
|
|
import { Teacher } from './class/teacher.js';
|
2024-11-15 20:09:56 -05:00
|
|
|
|
import { writeMetricsToFile } from './utility/writeMetrics.js';
|
2024-11-15 17:46:01 -05:00
|
|
|
|
|
|
|
|
|
|
const BASE_URL = 'http://localhost';
|
2024-11-15 19:35:41 -05:00
|
|
|
|
const user = { username: 'admin@example.com', password: 'adminPassword' };
|
|
|
|
|
|
const numberRooms = 5;
|
2024-11-15 19:57:55 -05:00
|
|
|
|
const studentPerRoom = 59; // Max : 60, 1 place réservée pour le professeur
|
2024-11-15 17:46:01 -05:00
|
|
|
|
const roomAssociations = {};
|
2024-11-15 19:57:55 -05:00
|
|
|
|
const allSockets = []; // Suivi de toutes les connexions WebSocket actives
|
|
|
|
|
|
|
|
|
|
|
|
// Métriques
|
|
|
|
|
|
const metrics = {
|
|
|
|
|
|
roomsCreated: 0,
|
|
|
|
|
|
roomsFailed: 0,
|
|
|
|
|
|
teachersConnected: 0,
|
|
|
|
|
|
teachersFailed: 0,
|
|
|
|
|
|
studentsConnected: 0,
|
|
|
|
|
|
studentsFailed: 0,
|
|
|
|
|
|
startTime: null,
|
|
|
|
|
|
endTime: null,
|
|
|
|
|
|
};
|
2024-11-15 17:46:01 -05:00
|
|
|
|
|
2024-11-15 19:35:41 -05:00
|
|
|
|
async function createRoomContainers(token) {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.time('Temps de création des salles');
|
2024-11-15 19:35:41 -05:00
|
|
|
|
const roomCreationPromises = Array.from({ length: numberRooms }, async () => {
|
|
|
|
|
|
const room = await createRoomContainer(BASE_URL, token);
|
|
|
|
|
|
if (room?.id) {
|
|
|
|
|
|
roomAssociations[room.id] = { teacher: null, students: [] };
|
2024-11-15 19:57:55 -05:00
|
|
|
|
metrics.roomsCreated++;
|
|
|
|
|
|
console.log(`Salle créée avec l'ID : ${room.id}`);
|
2024-11-15 19:35:41 -05:00
|
|
|
|
} else {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
metrics.roomsFailed++;
|
|
|
|
|
|
console.warn('Échec de la création d’une salle.');
|
2024-11-15 19:35:41 -05:00
|
|
|
|
}
|
|
|
|
|
|
});
|
2024-11-15 17:46:01 -05:00
|
|
|
|
|
|
|
|
|
|
await Promise.allSettled(roomCreationPromises);
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.timeEnd('Temps de création des salles');
|
|
|
|
|
|
console.log(`Nombre total de salles créées : ${Object.keys(roomAssociations).length}`);
|
2024-11-15 17:46:01 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-15 19:35:41 -05:00
|
|
|
|
async function addAndConnectTeachers() {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.time('Temps de connexion des enseignants');
|
2024-11-15 19:35:41 -05:00
|
|
|
|
const teacherCreationPromises = Object.keys(roomAssociations).map(async (roomId, index) => {
|
|
|
|
|
|
const teacher = new Teacher(`teacher_${index}`, roomId);
|
2024-11-15 19:57:55 -05:00
|
|
|
|
const start = Date.now();
|
2024-11-15 19:35:41 -05:00
|
|
|
|
const socket = await teacher.connectToRoom(BASE_URL);
|
2024-11-15 19:57:55 -05:00
|
|
|
|
const latency = Date.now() - start;
|
2024-11-15 19:35:41 -05:00
|
|
|
|
|
|
|
|
|
|
if (socket.connected) {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
allSockets.push(socket);
|
2024-11-15 19:35:41 -05:00
|
|
|
|
roomAssociations[roomId].teacher = teacher;
|
2024-11-15 19:57:55 -05:00
|
|
|
|
metrics.teachersConnected++;
|
|
|
|
|
|
console.log(`Enseignant ${teacher.username} connecté à la salle ${roomId}. Latence : ${latency}ms`);
|
2024-11-15 19:35:41 -05:00
|
|
|
|
} else {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
metrics.teachersFailed++;
|
|
|
|
|
|
console.warn(`Échec de la connexion de l'enseignant ${index} à la salle ${roomId}`);
|
2024-11-15 17:46:01 -05:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2024-11-15 19:35:41 -05:00
|
|
|
|
await Promise.allSettled(teacherCreationPromises);
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.timeEnd('Temps de connexion des enseignants');
|
|
|
|
|
|
console.log('Tous les enseignants ont été ajoutés et connectés à leurs salles respectives.');
|
2024-11-15 17:46:01 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function addAndConnectStudents() {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.time('Temps de connexion des étudiants');
|
2024-11-15 19:35:41 -05:00
|
|
|
|
const studentCreationPromises = Object.entries(roomAssociations).flatMap(([roomId, association], roomIndex) =>
|
|
|
|
|
|
Array.from({ length: studentPerRoom }, async (_, i) => {
|
2024-11-15 17:46:01 -05:00
|
|
|
|
const student = new Student(`student_${roomIndex}_${i}`, roomId);
|
2024-11-15 19:57:55 -05:00
|
|
|
|
const start = Date.now();
|
2024-11-15 19:35:41 -05:00
|
|
|
|
const socket = await student.connectToRoom(BASE_URL);
|
2024-11-15 19:57:55 -05:00
|
|
|
|
const latency = Date.now() - start;
|
2024-11-15 19:35:41 -05:00
|
|
|
|
|
|
|
|
|
|
if (socket.connected) {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
allSockets.push(socket);
|
2024-11-15 19:35:41 -05:00
|
|
|
|
association.students.push(student);
|
2024-11-15 19:57:55 -05:00
|
|
|
|
metrics.studentsConnected++;
|
|
|
|
|
|
console.log(`Étudiant ${student.username} connecté à la salle ${roomId}. Latence : ${latency}ms`);
|
2024-11-15 19:35:41 -05:00
|
|
|
|
} else {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
metrics.studentsFailed++;
|
|
|
|
|
|
console.warn(`Échec de la connexion de l'étudiant ${roomIndex}_${i} à la salle ${roomId}`);
|
2024-11-15 19:35:41 -05:00
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
);
|
2024-11-15 17:46:01 -05:00
|
|
|
|
|
|
|
|
|
|
await Promise.allSettled(studentCreationPromises);
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.timeEnd('Temps de connexion des étudiants');
|
|
|
|
|
|
console.log('Tous les étudiants ont été ajoutés et connectés à leurs salles respectives.');
|
2024-11-15 17:46:01 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function closeAllSockets() {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.log('Fermeture de toutes les connexions Socket.IO...');
|
2024-11-15 17:46:01 -05:00
|
|
|
|
allSockets.forEach((socket) => {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
if (socket && socket.connected) {
|
2024-11-15 19:35:41 -05:00
|
|
|
|
try {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
socket.disconnect();
|
|
|
|
|
|
console.log('Connexion Socket.IO déconnectée.');
|
2024-11-15 19:35:41 -05:00
|
|
|
|
} catch (error) {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.error('Erreur lors de la déconnexion du socket Socket.IO :', error.message);
|
2024-11-15 17:46:01 -05:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.log('Toutes les connexions Socket.IO ont été déconnectées.');
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-15 20:09:56 -05:00
|
|
|
|
function generateReport() {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.log('Toutes les tâches ont été terminées.');
|
2024-11-15 20:09:56 -05:00
|
|
|
|
console.log('--- Résultats du test de charge ---');
|
|
|
|
|
|
console.log(`Salles créées : ${metrics.roomsCreated}`);
|
|
|
|
|
|
console.log(`Échecs de création de salles : ${metrics.roomsFailed}`);
|
|
|
|
|
|
console.log(`Enseignants connectés : ${metrics.teachersConnected}`);
|
|
|
|
|
|
console.log(`Échecs de connexion des enseignants : ${metrics.teachersFailed}`);
|
|
|
|
|
|
console.log(`Étudiants connectés : ${metrics.studentsConnected}`);
|
|
|
|
|
|
console.log(`Échecs de connexion des étudiants : ${metrics.studentsFailed}`);
|
|
|
|
|
|
console.log(`Durée totale d'exécution : ${(metrics.endTime - metrics.startTime) / 1000}s`);
|
|
|
|
|
|
console.log('Utilisation de la mémoire :', process.memoryUsage());
|
|
|
|
|
|
writeMetricsToFile( metrics);
|
2024-11-15 17:46:01 -05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async function main() {
|
|
|
|
|
|
try {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
metrics.startTime = new Date();
|
2024-11-15 17:46:01 -05:00
|
|
|
|
const token = await attemptLoginOrRegister(BASE_URL, user.username, user.password);
|
2024-11-15 19:57:55 -05:00
|
|
|
|
if (!token) throw new Error('Échec de la connexion.');
|
2024-11-15 17:46:01 -05:00
|
|
|
|
|
2024-11-15 19:57:55 -05:00
|
|
|
|
await createRoomContainers(token);
|
|
|
|
|
|
await addAndConnectTeachers();
|
|
|
|
|
|
await addAndConnectStudents();
|
2024-11-15 17:46:01 -05:00
|
|
|
|
|
2024-11-15 19:57:55 -05:00
|
|
|
|
metrics.endTime = new Date();
|
2024-11-15 20:09:56 -05:00
|
|
|
|
|
2024-11-15 19:57:55 -05:00
|
|
|
|
generateReport();
|
2024-11-15 17:46:01 -05:00
|
|
|
|
} catch (error) {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.error('Une erreur est survenue :', error.message);
|
2024-11-15 17:46:01 -05:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-15 19:57:55 -05:00
|
|
|
|
// Gestion de l'interruption et de la fermeture
|
2024-11-15 17:46:01 -05:00
|
|
|
|
process.on('SIGINT', () => {
|
2024-11-15 19:57:55 -05:00
|
|
|
|
console.log('Script interrompu (Ctrl+C).');
|
2024-11-15 17:46:01 -05:00
|
|
|
|
closeAllSockets();
|
2024-11-15 19:35:41 -05:00
|
|
|
|
process.exit(0);
|
2024-11-15 17:46:01 -05:00
|
|
|
|
});
|
|
|
|
|
|
|
2024-11-15 19:35:41 -05:00
|
|
|
|
process.on('exit', closeAllSockets);
|
2024-11-15 17:46:01 -05:00
|
|
|
|
|
|
|
|
|
|
main();
|