blob: 9ca22ebb6ff0cab6ca6ae46549782523051326c7 [file] [view] [edit]
# Web Page Replay
Web Page Replay (WprGo) is a performance testing tool written in Golang for
recording and replaying web pages. WprGo is currently used in Telemetry for
Chrome benchmarking purposes. This requires go 1.8 and above. This has not been
tested with earlier versions of go. It is supported on Windows, MacOS and Linux.
For performance tests, this tool is generally not used directly. Instead, we use [these instructions](https://source.chromium.org/chromium/chromium/src/+/main:tools/perf/recording_benchmarks.md) to record, and [these instructions](https://chromium.googlesource.com/catapult.git/+/HEAD/telemetry/docs/run_benchmarks_locally.md) to replay.
## Set up GOPATH
There are two ways to setup your GOPATH. The first is to use the `go get`
command to fetch this directory. This will use your default GOPATH, which
is typically `$HOME/go`:
```shell
go get github.com/catapult-project/catapult/web_page_replay_go
```
You can then find this directory in:
```shell
$HOME/go/src/github.com/catapult-project/catapult/web_page_replay_go
```
The second approach is to use your current catapult checkout. Assuming your
"catapult" directory is located at `$CATAPULT`, and assuming `$HOME/go` is in
your GOPATH, create the following symbolic link:
```shell
mkdir -p $HOME/go/src/github.com/catapult-project
ln -s $CATAPULT $HOME/go/src/github.com/catapult-project/catapult
```
If you take this second approach, you will also need to set up Go to handle
dependencies for you (if you haven't already):
```shell
go mod init github.com/catapult-project
```
## Sample usage
### Record mode
* Terminal 1:
Start wpr in record mode. By default wpr uses both rsa and ecdsa certificates,
or provide your certificate directly with --https_cert_file and --https_key_file
parameters.
```shell
cd path/to/web_page_replay_go
go run src/wpr.go record --http_port=8080 --https_port=8081 /tmp/archive.wprgo
```
...
Ctrl-C
* Terminal 2:
```shell
google-chrome-beta --user-data-dir=$foo \
--host-resolver-rules="MAP *:80 127.0.0.1:8080,MAP *:443 127.0.0.1:8081,EXCLUDE localhost"
--ignore-certificate-errors-spki-list=PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I=,2HcXCSKKJS0lEXLQEWhpHUfGuojiU0tiT5gOF9LP6IQ=
```
... wait for record servers to start
### Replay mode
* Terminal 1:
Start wpr in replay mode.
```shell
cd path/to/web_page_replay_go
go run src/wpr.go replay --http_port=8080 --https_port=8081 /tmp/archive.wprgo
```
* Terminal 2:
```shell
google-chrome-beta --user-data-dir=$bar \
--host-resolver-rules="MAP *:80 127.0.0.1:8080,MAP *:443 127.0.0.1:8081,EXCLUDE localhost"
--ignore-certificate-errors-spki-list=PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I=,2HcXCSKKJS0lEXLQEWhpHUfGuojiU0tiT5gOF9LP6IQ=
```
... wait for replay servers to start
load the page
## Running on Android
You will need a Linux host machine and an android device.
* Set up reverse port forwarding
```shell
adb reverse tcp:8080 tcp:8080
adb reverse tcp:8081 tcp:8081
```
* Set up command line arguments
```shell
build/android/adb_chrome_public_command_line --host-resolver-rules="MAP *:80 127.0.0.1:8080,MAP *:443 127.0.0.1:8081,EXCLUDE localhost" \
--ignore-certificate-errors-spki-list=PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I=,2HcXCSKKJS0lEXLQEWhpHUfGuojiU0tiT5gOF9LP6IQ=
```
* Run wpr.go as usual on the linux machine
### (Optional) Installing test root CA
WebPageReplay uses self signed certificates for Https requests. To make Chrome
trust these certificates, you can use --ignore-certificate-errors-spki-list
like above. If that doesn't work, you may try installing a test certificate
authority as a local trust anchor. **Note:** Please do this with care because
installing the test root CA compromises your machine. This is currently only
supported on Linux and Android.
Installing the test CA. Specify a `--android_device_id` if you'd like to install
the root CA on an android device.
```shell
cd path/to/web_page_replay_go
go run src/wpr.go installroot
```
Uninstall the test CA. Specify a `--android_device_id` if you'd like to remove
the root CA from an android device.
```shell
cd path/to/web_page_replay_go
go run src/wpr.go removeroot
```
## Other use cases
### Http-to-http2 proxy:
* Terminal 1:
```shell
cd path/to/web_page_replay_go
go run src/wpr.go replay --https_port=8081 --https_to_http_port=8082 \
/tmp/archive.wprgo
```
* Terminal 2:
```shell
google-chrome-beta --user-data-dir=$foo \
--host-resolver-rules="MAP *:443 127.0.0.1:8081,EXCLUDE localhost" \
--ignore-certificate-errors-spki-list=PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I=,2HcXCSKKJS0lEXLQEWhpHUfGuojiU0tiT5gOF9LP6IQ= \
--proxy-server=http=https://127.0.0.1:8082 \
--trusted-spdy-proxy=127.0.0.1:8082
```
## Inspecting an archive
httparchive.go is a convenient script to inspect a wprgo archive. Use `ls`,`cat`
and `edit`. Options are available to specify request url host (`--host`) and
path (`--full-path`).
E.g.
```shell
cd path/to/web_page_replay_go
go run src/httparchive.go ls /tmp/archive.wprgo --host=example.com --full-path=/index.html
```
## Altering an archive
httparchive.go also provides methods to alter a wprgo archive. Use commands such
as `add`, `merge` and `trim`. These will add new traffic, merge two archives to
create a third, or trim request response pairs by host (`--host`) or path
(`--full-path`). See `--help` for more information.
E.g.
```shell
cd path/to/web_page_replay_go
go run src/httparchive.go trim /tmp/archive.wprgo --host=example.com /tmp/trimmed.wprgo
```
## Running unit tests
Run all tests in a specific file. Use '-v' flag to show results.
Note: proxy_test requires more includes than just proxy.go.
```shell
cd path/to/web_page_replay_go/src/webpagereplay
go test archive_test.go archive.go
go test transformers_test.go transformers.go
go test proxy_test.go proxy.go transformers.go archive.go
```
Run all tests in `webpagereplay` module.
```shell
cd path/to/web_page_replay_go/src/webpagereplay
go test -run ''
```
Or
```shell
cd path/to/web_page_replay_go
go test -v github.com/catapult-project/catapult/web_page_replay_go/src/webpagereplay
```
## Generate public key hash for --ignore-certificate-errors-spki-list
wpr_public_hash.txt is generated from wpr_cert.pem using the command below.
```shell
openssl x509 -noout -pubkey -in wpr_cert.pem | \
openssl pkey -pubin -outform der | \
openssl dgst -sha256 -binary | \
base64
```
## Debugging WPR
The run_benchmark and record_wpr tools will build and invoke WPR from this directory if they
are run with the --use-local-wpr flag.
## Contribute
Please read [contributor's guide][contribute]. We use the Catapult
[issue tracker][tracker] for bugs and features. Once your change is reviewed
and ready for landing, please run `telemetry/bin/update_wpr_go_binary` to update
binaries in Google cloud storage.
## Contact
Please email telemetry@chromium.org.
[contribute]: https://github.com/catapult-project/catapult/blob/master/CONTRIBUTING.md
[tracker]: https://github.com/catapult-project/catapult/issues