Repository navigation
Expand file tree
/
Copy pathtest-table.mjs
More file actions
89 lines (76 loc) · 4.13 KB
/
Copy pathtest-table.mjs
File metadata and controls
89 lines (76 loc) · 4.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/**
* 표 보기가 '버퍼에 있는 모든 샘플'을 싣는지.
*
* 예전에는 최근 14행으로 잘라서, 그래프에 60개가 그려지는 동안 표에는 13초까지만
* 나왔다. 게다가 표 아래 최소·평균·최고는 버퍼 전체에서 뽑히므로, 표에 없는 행의
* 값이 '최고'로 찍히는 상태였다.
*
* 스모크 테스트는 10초만 돌아 샘플이 9개뿐이라 14행 상한에 닿지 못한다 —
* 그래서 이 회귀는 거기서 잡히지 않는다. 여기서는 25초를 모아 20개를 넘긴다.
*
* node scripts/test-table.mjs
*/
import {
sleep, launch, watchProblems, loadExtension, newTab, setSettings,
serveLoadPage, dom, isolatedWorld, checklist, verdict,
} from './lib/harness.mjs';
const PORT = 8751, DEBUG = 9353;
const COLLECT_MS = 25000;
const OLD_CAP = 14; // 고치기 전의 상한
const page = await serveLoadPage({ port: PORT, title: '표 행 수 테스트', chunkKB: 16 });
const { cdp, targets, contexts, close } = await launch({ debugPort: DEBUG });
const problems = watchProblems(cdp);
const checks = checklist();
try {
const { sw } = await loadExtension(cdp, targets);
await setSettings(cdp, sw, { autoStart: true, theme: 'dark', lang: 'ko', defaultRange: 60 });
const { session: pg } = await newTab(cdp);
const D = dom(cdp, pg);
contexts.length = 0;
await cdp.send('Page.navigate', { url: page.url }, pg);
console.log(`샘플을 ${COLLECT_MS / 1000}초간 모으는 중…`);
await sleep(COLLECT_MS);
const world = isolatedWorld(contexts, pg);
if (!world) throw new Error('isolated world 를 찾지 못했습니다');
const cap = await cdp.eval('WW.Metrics.CAP', { session: pg, contextId: world.id });
/* 표 보기로 전환 */
await D.clickId('table-toggle');
await sleep(1800);
/* 버퍼 길이와 행 수는 1초 틱을 사이에 두고 어긋날 수 있으므로 바로 붙여서 읽는다 */
const samples = await cdp.eval('WW.Metrics.buffers[60].length', { session: pg, contextId: world.id });
const tbody = await D.byId('tbody');
if (!tbody) throw new Error('tbody 를 찾지 못했습니다');
const rows = (tbody.children ?? []).filter(c => c.nodeName === 'TR');
/** tr 의 i번째 <td> 안 텍스트 */
const cell = (tr, i) => tr?.children?.[i]?.children?.[0]?.nodeValue ?? null;
const first = cell(rows[0], 0);
const last = cell(rows[rows.length - 1], 0);
console.log(`버퍼 샘플 수: ${samples} (CAP ${cap})`);
console.log(`표 행 수: ${rows.length}`);
console.log(` 첫 행: ${first} 마지막 행: ${last}`);
checks.add('옛 상한(14행)을 넘김', rows.length > OLD_CAP, `rows=${rows.length}`);
// 두 값을 읽는 사이에 1초 틱이 끼어들 수 있으므로 ±1 을 허용한다
checks.add('행 수 ≈ 버퍼 샘플 수', Math.abs(rows.length - samples) <= 1,
`rows=${rows.length}, samples=${samples}`);
checks.add('맨 위가 최신', first === '지금', `first=${first}`);
checks.add('구간이 끊김 없이 이어짐', last === `${rows.length - 1}초 전`, `last=${last}`);
/* 표와 요약이 같은 구간을 보는지 — 요약의 '최고'가 표 안에 실제로 있어야 한다.
예전에는 요약만 버퍼 전체에서 뽑혀서, 표에 없는 행의 값이 '최고'로 찍혔다. */
const tsum = await D.byId('tsum');
const sumRows = (tsum?.children ?? []).filter(c => c.nodeName === 'TR');
const maxCpu = cell(sumRows[2], 1); // 3번째 행(최고)의 CPU 열
const cpuColumn = rows.map(tr => cell(tr, 1));
console.log(` 요약 최고 CPU: ${maxCpu} · 표 안에 있음? ${cpuColumn.includes(maxCpu)}`);
// null 끼리 비교해 거짓 통과하지 않도록 값이 실제로 읽혔는지 먼저 못 박는다
checks.add('요약 행을 읽었다', maxCpu != null && cpuColumn.every(v => v != null),
`max=${maxCpu}, 첫 행 CPU=${cpuColumn[0]}`);
checks.add('요약의 최고값이 표 안에 존재', maxCpu != null && cpuColumn.includes(maxCpu),
`max=${maxCpu}, 표=${cpuColumn.length}행`);
verdict(checks, problems);
} catch (e) {
console.error('\n실패:', e.message);
process.exitCode = 1;
} finally {
await close();
page.close();
}