mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
README describing the workflow around external tests and their repositories
This commit is contained in:
parent
6ef9ef1e15
commit
14ea1bc145
66
test/externalTests/README.md
Normal file
66
test/externalTests/README.md
Normal file
@ -0,0 +1,66 @@
|
||||
## Solidity external tests
|
||||
This directory contains scripts for compiling some of the popular open-source projects using the
|
||||
current version of the compiler and running their test suites.
|
||||
|
||||
Since projects often don't use the latest compiler, we keep a fork of each of these projects
|
||||
at https://github.com/solidity-external-tests/. If changes are needed to make a project work with the
|
||||
latest version of the compiler, they're maintained as a branch on top if the upstream master branch.
|
||||
This is especially important for testing our `breaking` branch because we can not realistically expect
|
||||
external projects to be instantly compatible with a compiler version that has not been released yet.
|
||||
It also isolates us from upstream changes to some degree - their changes won't affect our test suite
|
||||
until we explicitly pull them.
|
||||
|
||||
### Recommended workflow
|
||||
|
||||
#### Adding a new external project
|
||||
1. Create a fork of the upstream repository in https://github.com/solidity-external-tests/. If the
|
||||
project consists of several repositories, fork them all.
|
||||
2. Remove all the branches except for main one (`master`, `develop`, `main`, etc). This branch is
|
||||
going to be always kept up to date with the upstream repository and should not contain any extra
|
||||
commits.
|
||||
3. Create two new versions of the main branch, representing versions of the compiler currently in
|
||||
`develop` and `breaking`. E.g. if the latest Solidity version is 0.7.5 and the main branch of the
|
||||
external project is called `master`, create `master_070` and `master_080`. This is where we will
|
||||
be adding our own commits. The one corresponding to the newer Solidity version should always be
|
||||
on top on the older one. E.g. if a change is needed to keep the project
|
||||
compilable using Solidity 0.7.x, add it in `master_070` and rebase `master_080` on top of it.
|
||||
If it is only needed for the compiler from its `breaking` branch, add it only in `master_080`.
|
||||
- The fewer commits in these branches, the better. Ideally, any changes needed to make the compiler
|
||||
work should be submitted upstream and the branches should just be tracking the upstream
|
||||
one without any extra commits.
|
||||
4. Create a script for compiling/testing the project and put it in `test/externalTests/` in the
|
||||
Solidity repository.
|
||||
- The script should apply workarounds necessary to make the project actually use the compiler
|
||||
binary it receives as a parameter and possibly apply some generic workarounds that should
|
||||
work across different versions of the upstream project. Very specific workarounds that may
|
||||
easily break with every upstream change are better done as commits in the fork.
|
||||
5. Add the script to `tests/externalTests.sh`.
|
||||
6. Add the test to CircleCI configuration. Make sure to add both a compilation-only run and one that
|
||||
also executes the test suite. If the latter takes a significant amount of time (say, more
|
||||
than 15 minutes) make it run nightly rather than on every PR.
|
||||
|
||||
#### Pulling upstream changes into a fork
|
||||
1. Pull changes directly into the main branch in the fork. This should be straightforward thanks to
|
||||
it not containing any of our customizations.
|
||||
2. If the update is straightforward and looks safe, go straight to point 5. Otherwise you need to
|
||||
test it first.
|
||||
3. Create new branches corresponding to the two versioned ones but suffixed with `_new`. E.g.
|
||||
`master_070_new` and `master_080_new`. Then rebase them so that they are on top of the updated
|
||||
main branch. This may require tweaking some of the commits to apply our fixes in new places.
|
||||
4. Create PRs on `deveop` and `breaking` in Solidity repo which modify the script to use the new
|
||||
branches instead of `master_070`/`master_080`. Tweak the new branches until external tests
|
||||
in CI pass in the PRs.
|
||||
5. Discard the PRs and move the original branches to the place where the `_new` ones are and remove
|
||||
the `_new` branches.
|
||||
|
||||
#### Changes needed after a breaking release of the compiler
|
||||
When a breaking version of the compiler gets released and becomes the most recent release, the scripts
|
||||
and the branches in the forks need to be updated:
|
||||
- In each fork create a branch corresponding to the new brekaing version. E.g. if the current
|
||||
branches are `master_070` and `master_080` the new one should be called `master_090`.
|
||||
- Leave the oldest (i.e. `master_070`) branch as is. We will not be updating it any more but there is no
|
||||
need to remove it.
|
||||
- Update scripts on `develop` to now refer to the branch that used to be breaking (i.e. `master_080`)
|
||||
and on `breaking` to refer to the newly added branch (i.e. `master_090`).
|
||||
- Take care not to overwrite these changes when merging `develop` into breaking. Each branch
|
||||
should always use the branches from the external repos that correspond to it.
|
Loading…
Reference in New Issue
Block a user