test(cert-manager): Laufzeitgrenzen der Scanner-Tests CI-tauglich
Tessera CI/CD / Lint & Type Check (push) Successful in 51s
Tessera CI/CD / Tests (push) Successful in 2m49s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 20s
Tessera CI/CD / Build & Publish Images (push) Successful in 3m43s

Der CI-Runner brauchte 141 ms fuer den 5-MiB-Fall, die Grenze lag bei
100 ms. Jetzt 1 s (der alte quadratische Scanner braeuchte Minuten),
der Mischfall 2 s.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-09 18:08:39 +02:00
parent cc713b503f
commit d15a470c5a
2 changed files with 15 additions and 11 deletions
+3 -3
View File
@@ -211,7 +211,7 @@ describe('detectBlob: ZIP', () => {
}); });
describe('detectBlob: viele BEGIN-Zeilen (Review CR-02)', () => { describe('detectBlob: viele BEGIN-Zeilen (Review CR-02)', () => {
it('5 MiB BEGIN-Zeilen ohne END werden in weit unter 100 ms verarbeitet', () => { it('5 MiB BEGIN-Zeilen ohne END werden in unter einer Sekunde (alt: Minuten) verarbeitet', () => {
const line = '-----BEGIN CERTIFICATE-----\n'; const line = '-----BEGIN CERTIFICATE-----\n';
const blob = Buffer.from(line.repeat(Math.ceil((5 * 1024 * 1024) / line.length))); const blob = Buffer.from(line.repeat(Math.ceil((5 * 1024 * 1024) / line.length)));
let best = Number.POSITIVE_INFINITY; let best = Number.POSITIVE_INFINITY;
@@ -221,7 +221,7 @@ describe('detectBlob: viele BEGIN-Zeilen (Review CR-02)', () => {
best = Math.min(best, performance.now() - started); best = Math.min(best, performance.now() - started);
expect(r.items).toEqual([]); expect(r.items).toEqual([]);
} }
expect(best).toBeLessThan(100); expect(best).toBeLessThan(1000);
}); });
it('ein echtes Zertifikat hinter vielen unvollstaendigen BEGIN-Zeilen wird gefunden', () => { it('ein echtes Zertifikat hinter vielen unvollstaendigen BEGIN-Zeilen wird gefunden', () => {
@@ -229,7 +229,7 @@ describe('detectBlob: viele BEGIN-Zeilen (Review CR-02)', () => {
const blob = Buffer.concat([Buffer.from(junk), fx('rsa-leaf.pem')]); const blob = Buffer.concat([Buffer.from(junk), fx('rsa-leaf.pem')]);
const started = performance.now(); const started = performance.now();
const r = detectBlob(blob, ctx('mix.pem')); const r = detectBlob(blob, ctx('mix.pem'));
expect(performance.now() - started).toBeLessThan(500); expect(performance.now() - started).toBeLessThan(2000);
expect(r.items.filter((i) => i.kind === 'certificate')).toHaveLength(1); expect(r.items.filter((i) => i.kind === 'certificate')).toHaveLength(1);
}); });
}); });
+12 -8
View File
@@ -49,7 +49,11 @@ describe('scanPemBlocks', () => {
describe('scanPemBlocks: Laufzeit (Review CR-02)', () => { describe('scanPemBlocks: Laufzeit (Review CR-02)', () => {
const MIB5 = 5 * 1024 * 1024; const MIB5 = 5 * 1024 * 1024;
/** Beste von drei Messungen: unabhaengig von Lastspitzen paralleler Testlaeufe (alt: Minuten). */ /**
* Beste von drei Messungen: unabhaengig von Lastspitzen paralleler Testlaeufe (alt: Minuten).
* Grenze 1 s statt 100 ms: der CI-Runner brauchte am 09.10.2026 141 ms (Lauf zu cc713b5);
* der quadratische alte Scanner laege um Groessenordnungen darueber.
*/
function timed(text: string): number { function timed(text: string): number {
let best = Number.POSITIVE_INFINITY; let best = Number.POSITIVE_INFINITY;
for (let i = 0; i < 3; i++) { for (let i = 0; i < 3; i++) {
@@ -60,13 +64,13 @@ describe('scanPemBlocks: Laufzeit (Review CR-02)', () => {
return best; return best;
} }
it('5 MiB gleiche BEGIN-Zeilen ohne END: weit unter 100 ms', () => { it('5 MiB gleiche BEGIN-Zeilen ohne END: unter einer Sekunde (alt: Minuten)', () => {
const line = '-----BEGIN A-----\n'; const line = '-----BEGIN A-----\n';
const text = line.repeat(Math.ceil(MIB5 / line.length)); const text = line.repeat(Math.ceil(MIB5 / line.length));
expect(timed(text)).toBeLessThan(100); expect(timed(text)).toBeLessThan(1000);
}); });
it('5 MiB BEGIN-Zeilen mit lauter verschiedenen Etiketten: weit unter 100 ms', () => { it('5 MiB BEGIN-Zeilen mit lauter verschiedenen Etiketten: unter einer Sekunde (alt: Minuten)', () => {
const parts: string[] = []; const parts: string[] = [];
let size = 0; let size = 0;
for (let i = 0; size < MIB5; i++) { for (let i = 0; size < MIB5; i++) {
@@ -74,7 +78,7 @@ describe('scanPemBlocks: Laufzeit (Review CR-02)', () => {
parts.push(line); parts.push(line);
size += line.length; size += line.length;
} }
expect(timed(parts.join(''))).toBeLessThan(100); expect(timed(parts.join(''))).toBeLessThan(1000);
}); });
it('5 MiB BEGIN-Zeilen und END-Zeilen mit anderem Etikett: unter einer Sekunde (alt: Minuten)', () => { it('5 MiB BEGIN-Zeilen und END-Zeilen mit anderem Etikett: unter einer Sekunde (alt: Minuten)', () => {
@@ -82,8 +86,8 @@ describe('scanPemBlocks: Laufzeit (Review CR-02)', () => {
expect(timed(pair.repeat(Math.ceil(MIB5 / pair.length)))).toBeLessThan(1000); expect(timed(pair.repeat(Math.ceil(MIB5 / pair.length)))).toBeLessThan(1000);
}); });
it('5 MiB "-----BEGIN " ohne Etikett und "-----END " Wiederholungen: weit unter 100 ms', () => { it('5 MiB "-----BEGIN " ohne Etikett und "-----END " Wiederholungen: unter einer Sekunde (alt: Minuten)', () => {
expect(timed('-----BEGIN '.repeat(Math.ceil(MIB5 / 11)))).toBeLessThan(100); expect(timed('-----BEGIN '.repeat(Math.ceil(MIB5 / 11)))).toBeLessThan(1000);
expect(timed(`${'-----END '.repeat(Math.ceil(MIB5 / 9))}-----BEGIN A-----`)).toBeLessThan(100); expect(timed(`${'-----END '.repeat(Math.ceil(MIB5 / 9))}-----BEGIN A-----`)).toBeLessThan(1000);
}); });
}); });