Below four cores the runner carried the watched series in one process, and a relaunch after a base module took 2.5 to 3 s, over the 2 s budget of § 14.14. The configuration now reads the cores the process may use: from four, full processes and the whole series, as before; below, threads on every core, and the end-to-end test moves to the long series. No test disappears or changes behaviour. A guard refuses, in these series, what a thread refuses and a process accepts; the reporter names the mode. Checked: relaunch on 2 cores 1.0 to 1.3 s, was 2.5 to 3.0; on 4 cores 1.2 to 1.5 s; process.env is copied per thread, measured. --- FR --- [IMP] épreuves : la série surveillée suit les cœurs, threads sous 4 Sous quatre cœurs, le lanceur portait la série surveillée dans un seul processus, et une relance après un module de base prenait 2,5 à 3 s, au-delà du budget de 2 s du § 14.14. La configuration lit les cœurs que le processus peut occuper : à partir de quatre, processus complets et série entière, comme avant ; en deçà, threads sur tous les cœurs, et l'épreuve de bout en bout passe dans la série longue. Aucune épreuve ne disparaît ni ne change. Une garde refuse dans ces séries ce qu'un thread refuse et qu'un processus accepte ; le rapporteur nomme le mode. Vérifié : relance sur 2 cœurs en 1,0 à 1,3 s, contre 2,5 à 3,0 ; sur 4 cœurs en 1,2 à 1,5 s ; process.env est copié par thread, mesuré. Assisted-by: Claude Opus 5.5
104 lines
4.5 KiB
JavaScript
104 lines
4.5 KiB
JavaScript
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
||
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
||
|
||
// Les réglages des séries node selon le nombre de cœurs (§ 14.14), et leur
|
||
// application dans vitest.config.js.
|
||
import assert from 'node:assert/strict';
|
||
import { existsSync } from 'node:fs';
|
||
import { availableParallelism } from 'node:os';
|
||
import { join } from 'node:path';
|
||
import { fileURLToPath } from 'node:url';
|
||
import configuration from '../vitest.config.js';
|
||
import { describe, test } from './lanceur.js';
|
||
import { LOURDES, SEUIL_COEURS, coeursDisponibles, ligneMachine, reglagesSeries } from './machine.js';
|
||
|
||
const RACINE = fileURLToPath(new URL('..', import.meta.url));
|
||
const projet = (nom) => configuration.test.projects.find(({ test: { name } }) => name === nom).test;
|
||
|
||
describe('machine : les réglages selon le nombre de cœurs (§ 14.14)', () => {
|
||
test('à partir de quatre cœurs, des processus complets et la série surveillée entière', () => {
|
||
for (const coeurs of [SEUIL_COEURS, 8, 16, 64]) {
|
||
assert.deepEqual(reglagesSeries(coeurs), {
|
||
petiteMachine: false,
|
||
coeurs,
|
||
pool: 'forks',
|
||
maxWorkers: undefined,
|
||
horsSerieSurveillee: [],
|
||
}, `${coeurs} cœurs`);
|
||
}
|
||
});
|
||
|
||
test('en deçà de quatre cœurs, des threads sur tous les cœurs, et les épreuves lourdes en série longue', () => {
|
||
for (const coeurs of [1, 2, 3]) {
|
||
assert.deepEqual(reglagesSeries(coeurs), {
|
||
petiteMachine: true,
|
||
coeurs,
|
||
pool: 'threads',
|
||
maxWorkers: coeurs,
|
||
horsSerieSurveillee: [...LOURDES],
|
||
}, `${coeurs} cœurs`);
|
||
}
|
||
});
|
||
|
||
test('un nombre de cœurs qui n’est pas un entier ≥ 1 lève RangeError', () => {
|
||
for (const coeurs of [0, -1, 2.5, Number.NaN, '4', undefined]) {
|
||
assert.throws(() => reglagesSeries(coeurs), RangeError, String(coeurs));
|
||
}
|
||
});
|
||
|
||
test('les épreuves lourdes existent, sont de la série surveillée, et la liste n’est pas vide', () => {
|
||
assert.ok(LOURDES.length > 0, 'aucune épreuve lourde nommée');
|
||
for (const fichier of LOURDES) {
|
||
assert.ok(existsSync(join(RACINE, fichier)), `${fichier} absent`);
|
||
assert.match(fichier, /\.test\.js$/);
|
||
assert.doesNotMatch(fichier, /\.(long|navigateur)\.test\.js$/, `${fichier} n'est pas de la série surveillée`);
|
||
}
|
||
});
|
||
|
||
test('les cœurs disponibles suivent l’affinité du processus, comme availableParallelism', () => {
|
||
assert.equal(coeursDisponibles(), availableParallelism());
|
||
assert.ok(coeursDisponibles() >= 1);
|
||
});
|
||
|
||
test('la ligne annoncée dit le mode, sur une petite machine comme sur une grande', () => {
|
||
assert.equal(
|
||
ligneMachine(reglagesSeries(2)),
|
||
'Machine : 2 cœurs, en deçà de 4 — threads sur les 2 cœurs ; '
|
||
+ 'en série longue : src/moteur/integration.test.js.',
|
||
);
|
||
assert.equal(
|
||
ligneMachine(reglagesSeries(1)),
|
||
'Machine : 1 cœur, en deçà de 4 — threads sur son seul cœur ; '
|
||
+ 'en série longue : src/moteur/integration.test.js.',
|
||
);
|
||
assert.equal(ligneMachine(reglagesSeries(16)), 'Machine : 16 cœurs — processus complets, série surveillée entière.');
|
||
});
|
||
});
|
||
|
||
describe('machine : vitest.config.js applique les réglages de cette machine', () => {
|
||
const reglages = reglagesSeries(coeursDisponibles());
|
||
|
||
test('les projets node et node-long prennent le pool et le nombre de processus retenus', () => {
|
||
for (const nom of ['node', 'node-long']) {
|
||
assert.equal(projet(nom).pool, reglages.pool, nom);
|
||
assert.equal(projet(nom).maxWorkers, reglages.maxWorkers, nom);
|
||
}
|
||
});
|
||
|
||
test('une épreuve hors de la série surveillée entre dans la série longue, et nulle part ailleurs', () => {
|
||
for (const fichier of reglages.horsSerieSurveillee) {
|
||
assert.ok(projet('node').exclude.includes(fichier), `${fichier} reste dans node`);
|
||
assert.ok(projet('node-long').include.includes(fichier), `${fichier} manque à node-long`);
|
||
}
|
||
for (const fichier of LOURDES.filter((f) => !reglages.horsSerieSurveillee.includes(f))) {
|
||
assert.ok(!projet('node').exclude.includes(fichier), `${fichier} sort de node sur cette machine`);
|
||
assert.ok(!projet('node-long').include.includes(fichier), `${fichier} entre dans node-long sur cette machine`);
|
||
}
|
||
});
|
||
|
||
test('le projet navigateur ne prend aucun de ces réglages', () => {
|
||
const navigateur = projet('navigateur');
|
||
assert.equal(navigateur.pool, undefined);
|
||
assert.equal(navigateur.maxWorkers, undefined);
|
||
});
|
||
});
|