angular/scripts/benchmarks/results.mts
Joey Perrott 9dbe6fc18b refactor: update license text to point to angular.dev (#57901)
Update license text to point to angular.dev instead of angular.io

PR Close #57901
2024-09-24 15:33:00 +02:00

91 lines
2.3 KiB
TypeScript

/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.dev/license
*/
import path from 'path';
import Zip from 'adm-zip';
import type {JsonReport} from '../../packages/benchpress/src/reporter/json_file_reporter_types.js';
import {bold} from '@angular/ng-dev';
/** Results of an individual benchmark scenario. */
export interface ScenarioResult {
id: string;
data: JsonReport;
summaryConsoleText: string;
summaryMarkdownText: string;
}
/**
* Overall result of a benchmark target.
* A benchmark target may contain multiple scenarios.
*/
export interface OverallResult {
scenarios: ScenarioResult[];
summaryConsoleText: string;
summaryMarkdownText: string;
}
/** Collects and parses the benchmark results of the given Bazel target testlog directory. */
export function collectBenchmarkResults(testlogDir: string): OverallResult {
const z = new Zip(path.join(testlogDir, 'test.outputs/outputs.zip'));
const scenarioResults: ScenarioResult[] = [];
for (const e of z.getEntries()) {
if (path.extname(e.entryName) !== '.json') {
continue;
}
const data = JSON.parse(z.readAsText(e.entryName));
// Skip files that do not look like benchpress reports.
if (!isJsonReport(data)) {
continue;
}
scenarioResults.push({
id: data.description.id,
data,
// Output used for console output when running locally/CI.
summaryConsoleText: `\
${data.metricsText}
${data.validSampleTexts.join('\n')}
${data.statsText}`,
// Output used for e.g. GitHub actions.
summaryMarkdownText: `\
<details><summary>Full example results</summary>
\`\`\`
${data.metricsText}
${data.validSampleTexts.join('\n')}
${data.statsText}
\`\`\`
</details>
\`\`\`
${data.metricsText}
${data.statsText}
\`\`\``,
});
}
return {
scenarios: scenarioResults,
summaryConsoleText: scenarioResults
.map((s) => `${bold(s.id)}\n\n${s.summaryConsoleText}`)
.join('`\n'),
summaryMarkdownText: scenarioResults
.map((s) => `### ${s.id}\n\n${s.summaryMarkdownText}`)
.join('`\n'),
};
}
/** Whether the object corresponds to a benchpress JSON report. */
function isJsonReport(data: any): data is JsonReport {
return data['completeSample'] !== undefined;
}