#!/usr/bin/env node /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import { readFile } from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' const scriptPath = fileURLToPath(import.meta.url) const scriptsRoot = path.resolve(path.dirname(scriptPath), '..') const files = { browserRuntime: path.join(scriptsRoot, 'verify-browser-runtime.mjs'), adminRuntime: path.join(scriptsRoot, 'verify-admin-runtime.mjs'), screenshots: path.join(scriptsRoot, 'capture-admin-screenshots.mjs'), chromeCdp: path.join(scriptsRoot, 'lib/chrome-cdp.mjs'), network: path.join(scriptsRoot, 'lib/runtime-network.mjs') } const sources = Object.fromEntries(await Promise.all( Object.entries(files).map(async ([id, file]) => [id, await readFile(file, 'utf8')]) )) const checks = [ { id: 'browser-runtime-defaults-to-one-cdp-setup-attempt', passed: sources.browserRuntime.includes("positiveIntegerEnv('MODERN_UI_BROWSER_SETUP_ATTEMPTS', 1)") }, { id: 'admin-runtime-defaults-to-one-cdp-setup-attempt', passed: sources.adminRuntime.includes("positiveIntegerEnv('MODERN_UI_BROWSER_SETUP_ATTEMPTS', 1)") && !sources.adminRuntime.includes('attempt <= 3') }, { id: 'screenshots-default-to-one-base-url-and-browser-attempt', passed: sources.screenshots.includes("positiveIntegerEnv('MODERN_UI_BASE_URL_ATTEMPTS', 1)") && sources.screenshots.includes("positiveIntegerEnv('MODERN_UI_BROWSER_ATTEMPTS', 1)") }, { id: 'runtime-scripts-route-unavailable-iab-to-chrome-cdp', passed: [sources.browserRuntime, sources.adminRuntime, sources.screenshots].every((source) => source.includes('local Chrome/CDP')) && sources.network.includes('Do not switch to Codex in-app Browser (iab).') && sources.chromeCdp.includes('codexInAppBrowser') && sources.chromeCdp.includes('localChromeCdp') && sources.chromeCdp.includes('boundedAttempts') && sources.chromeCdp.includes('agent.browsers.list()') && [sources.browserRuntime, sources.adminRuntime, sources.screenshots].every((source) => source.includes('summarizeBrowserSetupFailure')) }, { id: 'browser-setup-failures-are-classified-and-bounded', passed: sources.chromeCdp.includes('createBrowserSetupTracker') && sources.chromeCdp.includes('summarizeBrowserSetupFailure') && sources.chromeCdp.includes('classifyBrowserSetupError') && [sources.browserRuntime, sources.adminRuntime, sources.screenshots].every((source) => source.includes('createBrowserSetupTracker')) && [sources.browserRuntime, sources.adminRuntime, sources.screenshots].every((source) => source.includes('summarizeBrowserSetupFailure')) && [sources.browserRuntime, sources.adminRuntime, sources.screenshots].every((source) => source.includes('browserSetup')) }, { id: 'targeted-single-page-selection-remains-supported', passed: sources.adminRuntime.includes('MODERN_UI_ADMIN_RUNTIME_CASES') && sources.adminRuntime.includes('selectedRuntimeCases()') && sources.screenshots.includes('MODERN_UI_SCREENSHOT_IDS') && sources.screenshots.includes('selectedScreenshots()') }, { id: 'screenshots-report-console-errors', passed: sources.screenshots.includes('actionableConsoleErrors') && sources.screenshots.includes('consoleErrors:') && sources.screenshots.includes('ignoredConsoleErrors:') }, { id: 'localhost-blocker-messages-include-rerun-command', passed: [sources.browserRuntime, sources.adminRuntime, sources.screenshots].every((source) => source.includes('npm --prefix plugins/modern-ui/app')) && [sources.browserRuntime, sources.adminRuntime, sources.screenshots].every((source) => source.includes('MODERN_UI_BASE_URL')) && sources.network.includes('EPERM') } ] const failed = checks.filter((check) => !check.passed) console.log(JSON.stringify({ status: failed.length ? 'failed' : 'passed', checkedFiles: files, checks }, null, 2)) if (failed.length) { process.exitCode = 1 }