mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-02 06:07:06 +01:00
8ffebb294b
There are a few issues encountered when running `yarn setup` on new
Apple Silicon (aka M1, aka arm64) Macs:
* The script halts when attempting to run the install step for
the `chromedriver` package with the message "Only Mac 64 bits
supported". This is somewhat misleading as it seems to indicate that
chromedriver can only be installed on a 64-bit Mac. However, what I
think is happening is that the installation script for `chromedriver`
is not able to detect that an arm64 CPU *is* a 64-bit CPU. After
looking through the `chromedriver` repo, it appears that 87.0.1 is the
first version that adds a proper check ([1]).
Note that upgrading chromedriver caused the Chrome-specific tests to
fail intermittently on CI. I was not able to 100% work out the reason
for this, but ensuring that X (which provides a way for Chrome to run
in a GUI setting from the command line) is available seems to fix
these issues.
* The script also halts when attempting to run the install step for
the `electron` package. This happens because for the version of
`electron` we are using (9.4.2), there is no available binary for
arm64. It appears that Electron 11.x was the first version to support
arm64 Macs ([2]). This is a bit trickier to resolve because we don't
explicitly rely on `electron` — that's brought in by `react-devtools`.
The first version of `react-devtools` that relies on `electron` 11.x
is 4.11.0 ([3]).
[1]: 469dd0a6ee
[2]: https://www.electronjs.org/blog/apple-silicon
[3]: https://github.com/facebook/react/blob/main/packages/react-devtools/CHANGELOG.md#4110-april-9-2021
84 lines
2.5 KiB
JavaScript
84 lines
2.5 KiB
JavaScript
const { promises: fs } = require('fs');
|
|
const yargs = require('yargs/yargs');
|
|
const { hideBin } = require('yargs/helpers');
|
|
const { runInShell } = require('../../development/lib/run-command');
|
|
const { exitWithError } = require('../../development/lib/exit-with-error');
|
|
const { retry } = require('../../development/lib/retry');
|
|
|
|
async function main() {
|
|
const { argv } = yargs(hideBin(process.argv))
|
|
.usage(
|
|
'$0 [options] <e2e-test-path>',
|
|
'Run a single E2E test, with a variable number of retries.',
|
|
(_yargs) =>
|
|
_yargs
|
|
.option('browser', {
|
|
default: process.env.SELENIUM_BROWSER,
|
|
description: `Set the browser used; either 'chrome' or 'firefox'.`,
|
|
type: 'string',
|
|
choices: ['chrome', 'firefox'],
|
|
})
|
|
.option('retries', {
|
|
default: 0,
|
|
description:
|
|
'Set how many times the test should be retried upon failure.',
|
|
type: 'number',
|
|
})
|
|
.option('leave-running', {
|
|
default: false,
|
|
description:
|
|
'Leaves the browser running after a test fails, along with anything else that the test used (ganache, the test dapp, etc.)',
|
|
type: 'boolean',
|
|
})
|
|
.positional('e2e-test-path', {
|
|
describe: 'The path for the E2E test to run.',
|
|
type: 'string',
|
|
normalize: true,
|
|
}),
|
|
)
|
|
.strict()
|
|
.help('help');
|
|
|
|
const { browser, e2eTestPath, retries, leaveRunning } = argv;
|
|
|
|
if (!browser) {
|
|
exitWithError(
|
|
`"The browser must be set, via the '--browser' flag or the SELENIUM_BROWSER environment variable`,
|
|
);
|
|
return;
|
|
} else if (browser !== process.env.SELENIUM_BROWSER) {
|
|
process.env.SELENIUM_BROWSER = browser;
|
|
}
|
|
|
|
try {
|
|
const stat = await fs.stat(e2eTestPath);
|
|
if (!stat.isFile()) {
|
|
exitWithError('Test path must be a file');
|
|
return;
|
|
}
|
|
} catch (error) {
|
|
if (error.code === 'ENOENT') {
|
|
exitWithError('Test path specified does not exist');
|
|
return;
|
|
} else if (error.code === 'EACCES') {
|
|
exitWithError(
|
|
'Access to test path is forbidden by file access permissions',
|
|
);
|
|
return;
|
|
}
|
|
throw error;
|
|
}
|
|
|
|
if (leaveRunning) {
|
|
process.env.E2E_LEAVE_RUNNING = 'true';
|
|
}
|
|
|
|
await retry({ retries }, async () => {
|
|
await runInShell('yarn', ['mocha', '--no-timeouts', e2eTestPath]);
|
|
});
|
|
}
|
|
|
|
main().catch((error) => {
|
|
exitWithError(error);
|
|
});
|