2020-06-03 18:43:32 -04:00
# Browser configuration and versioning for testing of Angular
2020-12-16 10:11:45 -05:00
Within the Angular organization, we use Chrome and Firefox to perform most of the local testing, and rely on Sauce Labs and BrowserStack to do cross-browser testing on our CI.
2020-06-03 18:43:32 -04:00
2020-12-16 10:11:45 -05:00
The version of Chrome used in tests within this monorepo is configured and controlled via Bazel and `puppeteer` .
We manually keep the configuration of these two tools in sync to create a consistent testing environment across unit, e2e, and integration tests.
2020-06-03 18:43:32 -04:00
2020-07-13 16:25:46 -04:00
## Bazel
2020-06-03 18:43:32 -04:00
2021-05-24 10:17:27 -04:00
Bazel `karma_web_test_suite` and `protractor_web_test_suite` targets will use Chromium or Firefox provisioned by `//dev-infra/bazel/browsers` .
The version of Chrome and Firefox are specified in the `chromium.bzl` and `firefox.bzl` files in `/dev-infra/bazel/browsers` .
2020-06-03 18:43:32 -04:00
2020-12-16 10:11:45 -05:00
The process of updating the Chrome or Firefox version is not straightforward, but below are dedicated sections for each browser.
2020-06-03 18:43:32 -04:00
2020-07-13 16:25:46 -04:00
## Updating Chromium
2020-06-03 18:43:32 -04:00
2020-12-16 10:11:45 -05:00
1. Visit https://chromium.woolyss.com/ and note the version (commit position) of the latest stable version.
2020-07-13 16:25:46 -04:00
2020-12-16 10:11:45 -05:00
For example, "Google Chrome 83.0.4103.97 (756066) • Wednesday, 3 Jun 2020".
Alternatively, you can look in https://omahaproxy.appspot.com/.
2020-06-03 18:43:32 -04:00
2020-12-16 10:11:45 -05:00
2. Find the closest commit position number available for each platform in chromium-browser-snapshots: https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html
2020-06-03 18:43:32 -04:00
2020-12-16 10:11:45 -05:00
For example:
* https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/756066/
* https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Mac/756053/
* https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win/756065/
2020-06-03 18:43:32 -04:00
2020-12-16 10:11:45 -05:00
You can download Chromium for your local platform and double check that the `--version` matches up with what you expect.
2020-06-03 18:43:32 -04:00
2020-12-16 10:11:45 -05:00
For example:
2020-07-13 16:25:46 -04:00
``` bash
$ ~/Downloads/chrome-mac/Chromium.app/Contents/MacOS/Chromium --version
Chromium 83.0.4103.0
```
2020-06-03 18:43:32 -04:00
2021-05-24 10:17:27 -04:00
3. Update the chrome & chrome driver build numbers in `dev-infra/bazel/browsers/chromium/chromium.bzl` and either run `bazel query @org_chromium_chromium_amd64//...` to prompt Bazel to calculate the new `sha256` for each platform binary or determine the new `sha256` values manually.
2020-06-03 18:43:32 -04:00
2020-07-13 16:25:46 -04:00
Here is an example with `curl` & `shasum` :
``` bash
2020-12-16 10:25:38 -05:00
curl -L https://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/756066/chrome-linux.zip | shasum -a 256
2020-07-13 16:25:46 -04:00
```
2020-06-03 18:43:32 -04:00
2020-07-13 16:25:46 -04:00
## Puppeteer
2020-06-03 18:43:32 -04:00
2020-12-16 11:28:33 -05:00
1. Visit https://github.com/puppeteer/puppeteer/blob/master/docs/api.md to determine which version of puppeteer corresponds to the version of Chrome desired.
2020-06-03 18:43:32 -04:00
2020-12-16 11:28:33 -05:00
2. Visit https://chromedriver.chromium.org/downloads to determine which version of ChromeDriver should be used for the version of Chrome desired.
2020-06-03 18:43:32 -04:00
2020-12-16 11:28:33 -05:00
> NOTE:
> The version of Chrome does not necessarily correspond exactly with the version of ChromeDriver.
> For example, you might have to use ChromeDriver v87.0.4280.x to drive Chrome v87.0.4272.x.
2021-04-18 05:43:49 -04:00
3. Update `scripts/puppeteer-chromedriver-versions.js` to include an entry with the new version of puppeteer as key and the new version of ChromeDriver as value (as determined in the two previous steps).
2020-12-16 11:28:33 -05:00
4. Update all of the puppeteer versions throughout the repo:
* `package.json`
* `aio/package.json`
* `aio/tools/examples/shared/package.json`
...and their corresponding `yarn.lock` files.
2020-07-13 16:25:46 -04:00
## Firefox
2021-05-24 10:17:27 -04:00
In order to update Firefox, open the `dev-infra/bazel/browsers/firefox/firefox.bzl` file and update the repository URLs to the desired version.
2020-12-16 10:21:38 -05:00
For example:
2020-07-13 16:25:46 -04:00
```bzl
platform_http_file(
name = "org_mozilla_firefox_amd64",
licenses = ["reciprocal"], # MPL 2.0
sha256 = "bde6e020556a21561e4b8d7aaecf8db7077951f179b98ca5d0305435bc6802c9",
# Firefox v78.0
urls = ["https://ftp.mozilla.org/pub/firefox/releases/78.0/linux-x86_64/en-US/firefox-78.0.tar.bz2"],
)
```
2020-12-16 10:21:38 -05:00
1. Go to the `urls` property and update the URL by replacing all `78.0` occurrences with the version you intend to use.
Once done, do the same change for other platforms (such as `macos` ).
2020-07-13 16:25:46 -04:00
2020-12-16 10:21:38 -05:00
2. Update the `sha256` checksum of the browser archives.
You can do this by downloading the artifacts from the URLs you just updated, and then running `shasum` on those files:
```sh
2020-12-16 10:25:38 -05:00
curl -L < BROWSER_URL > | shasum -a 256
```
In the same file, you can also update the version of gecko driver (the WebDriver implementation for Firefox browsers).
1. Go to https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html and find a version that is compatible with the used version of Firefox.
2. Update the `geckodriver` repository URLs to the desired version:
```bzl
platform_http_file(
name = "org_mozilla_geckodriver_amd64",
licenses = ["reciprocal"], # MPL 2.0
sha256 = "d59ca434d8e41ec1e30dd7707b0c95171dd6d16056fb6db9c978449ad8b93cc0",
# Geckodriver v0.26.0
urls = ["https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz"],
)
```
For example, replace all occurrences of `0.26.0` with the newer version.
3. Update the `sha256` checksum of the driver archives.
You can do this by downloading the artifacts from the URLs you just updated, and then running `shasum` on those files:
```sh
curl -L < DRIVER_URL > | shasum -a 256
2020-12-16 10:21:38 -05:00
```