|
| 1 | +import * as yargs from "yargs"; |
| 2 | +import { checkElementContainsText, checkElementExists, clickElement, startBrowser } from "./playwrightAccess"; |
| 3 | +import { config, FrameworkData, initializeFrameworks, BenchmarkOptions } from "./common"; |
| 4 | + |
| 5 | +import * as R from "ramda"; |
| 6 | +import { valid } from "semver"; |
| 7 | +import { ElementHandle, Page } from "playwright"; |
| 8 | + |
| 9 | +let args: any = yargs(process.argv) |
| 10 | + .usage("$0 [--framework Framework1 Framework2 ...] [--benchmark Benchmark1 Benchmark2 ...]") |
| 11 | + .help("help") |
| 12 | + .default("port", config.PORT) |
| 13 | + .string("chromeBinary") |
| 14 | + .string("chromeDriver") |
| 15 | + .boolean("headless") |
| 16 | + .array("framework").argv; |
| 17 | + |
| 18 | +let allArgs = args._.length <= 2 ? [] : args._.slice(2, args._.length); |
| 19 | + |
| 20 | +console.log("args.framework", args.framework, !args.framework); |
| 21 | + |
| 22 | + |
| 23 | +async function runBench(frameworkNames: string[]) { |
| 24 | + let runFrameworks; |
| 25 | + let matchesDirectoryArg = (directoryName: string) => allArgs.length == 0 || allArgs.some((arg: string) => arg == directoryName); |
| 26 | + runFrameworks = await initializeFrameworks(matchesDirectoryArg); |
| 27 | + console.log("Frameworks that will be checked", runFrameworks.map((f) => f.fullNameWithKeyedAndVersion).join(" ")); |
| 28 | + |
| 29 | + let frameworkMap = new Map<string, FrameworkData>(); |
| 30 | + |
| 31 | + let allCorrect = true; |
| 32 | + |
| 33 | + let browser = await startBrowser(benchmarkOptions); |
| 34 | + let page = await browser.newPage(); |
| 35 | + try { |
| 36 | + await page.goto(`http://${config.HOST}:${config.PORT}/startCSP`) |
| 37 | + } finally { |
| 38 | + await page.close(); |
| 39 | + await browser.close(); |
| 40 | + } |
| 41 | + |
| 42 | + console.log("*** headless", benchmarkOptions.headless) |
| 43 | + |
| 44 | + for (let i = 0; i < runFrameworks.length; i++) { |
| 45 | + let cspError = false; |
| 46 | + let browser = await startBrowser(benchmarkOptions); |
| 47 | + let page = await browser.newPage(); |
| 48 | + try { |
| 49 | + let framework: FrameworkData = runFrameworks[i]; |
| 50 | + |
| 51 | + await page.goto(`http://${config.HOST}:${config.PORT}/${framework.uri}/index.html`, {waitUntil: "networkidle"}); |
| 52 | + try { |
| 53 | + await checkElementExists(page, "#add"); |
| 54 | + } catch (err) { |
| 55 | + console.log(`CSP test failed for ${runFrameworks[i].fullNameWithKeyedAndVersion} - during load`); |
| 56 | + } |
| 57 | + await clickElement(page, "#add"); |
| 58 | + try { |
| 59 | + await checkElementContainsText(page, "tbody>tr:nth-of-type(1000)>td:nth-of-type(1)", "1000"); |
| 60 | + } catch (err) { |
| 61 | + console.log(`CSP test failed for ${runFrameworks[i].fullNameWithKeyedAndVersion} - when clicking`); |
| 62 | + } |
| 63 | + } catch (e) { |
| 64 | + //console.log("ERROR running " + runFrameworks[i].fullNameWithKeyedAndVersion, e); |
| 65 | + allCorrect = false; |
| 66 | + } finally { |
| 67 | + try { |
| 68 | + await page.close(); |
| 69 | + await browser.close(); |
| 70 | + } catch (e) { |
| 71 | + console.log("error calling driver.quit - ignoring this exception"); |
| 72 | + } |
| 73 | + } |
| 74 | + } |
| 75 | + |
| 76 | + browser = await startBrowser(benchmarkOptions); |
| 77 | + page = await browser.newPage(); |
| 78 | + try { |
| 79 | + await page.goto(`http://${config.HOST}:${config.PORT}/csp`) |
| 80 | + const extractedText = await page.$eval('*', (el:any) => el.innerText); |
| 81 | + console.log(extractedText); |
| 82 | + let failed = JSON.parse(extractedText) |
| 83 | + console.log("CSP check failed for the following frameworks:\n", failed.join("\n")); |
| 84 | + } finally { |
| 85 | + await page.close(); |
| 86 | + await browser.close(); |
| 87 | + } |
| 88 | + |
| 89 | + if (!allCorrect) process.exit(1); |
| 90 | + |
| 91 | +} |
| 92 | + |
| 93 | +config.PORT = Number(args.port); |
| 94 | + |
| 95 | +if (process.env.HOST) { |
| 96 | + config.HOST = process.env.HOST; |
| 97 | + console.log(`INFO: Using host ${config.HOST} instead of localhost`); |
| 98 | +} |
| 99 | + |
| 100 | +let runFrameworks = (args.framework && args.framework.length > 0 ? args.framework : [""]).map((v: string) => v.toString()); |
| 101 | + |
| 102 | +let benchmarkOptions: BenchmarkOptions = { |
| 103 | + HOST: config.HOST, |
| 104 | + port: config.PORT.toFixed(), |
| 105 | + browser: config.BROWSER, |
| 106 | + remoteDebuggingPort: config.REMOTE_DEBUGGING_PORT, |
| 107 | + chromePort: config.CHROME_PORT, |
| 108 | + headless: args.headless, |
| 109 | + chromeBinaryPath: args.chromeBinary, |
| 110 | + numIterationsForCPUBenchmarks: config.NUM_ITERATIONS_FOR_BENCHMARK_CPU, |
| 111 | + numIterationsForMemBenchmarks: config.NUM_ITERATIONS_FOR_BENCHMARK_MEM, |
| 112 | + numIterationsForStartupBenchmark: config.NUM_ITERATIONS_FOR_BENCHMARK_STARTUP, |
| 113 | + batchSize: 1, |
| 114 | +}; |
| 115 | +async function main() { |
| 116 | + if (args.help) { |
| 117 | + yargs.showHelp(); |
| 118 | + } else { |
| 119 | + await runBench(runFrameworks); |
| 120 | + } |
| 121 | +} |
| 122 | + |
| 123 | +main().catch(err => {console.log("Error in isKeyed", err)}); |
0 commit comments