rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
98.34k stars 12.72k forks source link

Tracking Issue for incr. comp. red/green testing #44716

Closed michaelwoerister closed 6 years ago

michaelwoerister commented 7 years ago

We already have quite a bit of testing in place for incremental compilation but some of it needs to be adapted to the new red/green change tracking system. This issue will track the needed changes and the progress we make on them.

Incremental Compilation Testing Strategy

We use four major kinds of tests in order to keep regressions at bay:

  1. Synthetic end-to-end tests which are small, synthetic test cases that -- given a certain change to the source code -- test that the expected set of object files gets re-compiled. These tests use the #![rustc_partition_reused]/#![rustc_partition_translated] attributes and are located in src/test/incremental.
  2. Synthetic tests of input and intermediate-result fingerprints. The incr. comp. system computes fingerprints (hashes) of various things and then uses these fingerprints to check if something has changed in comparison to the previous compilation session. The test cases in src/test/incremental/hashes test, at a fine-grained level, that various changes in the source code lead to changed fingerprints of various intermediate results. They use the #[rustc_clean]/#[rustc_dirty] attributes to indicate which things are expected to have changed and which are not. https://github.com/rust-lang/rust/issues/36674 is an example issue with a description of how these tests work.
  3. Synthetic dependency graph based tests. These tests check that certain paths exist or do not exist in the dependency graph. The dependency graph records which values had to be accessed (transitively) in order to compute a certain value during the compilation process. By checking for expected and unexpected paths we can make sure that dependency tracking doesn't miss anything (=anything that we actively test for) and that the compiler doesn't unnecessarily access data it doesn't need (which leads to unnecessary cache invalidation). These tests use the #[rustc_if_this_changed]/#[rustc_then_this_would_need] and located in src/test/compile-fail
  4. Real-world test cases that take code bases of existing Rust projects, replay their git history, compile each commit and at every step make sure the compiling with and without incr-comp-cache produces the same binaries. These tests are based on the cargo-incremental tool and can be found at https://github.com/rust-icci and https://travis-ci.org/rust-icci. They have proven to be very useful for finding holes in the tracking system that are not covered by any of the synthetic test cases yet.

Changes Needed for Red/Green

Most of the test cases can stay the same also with the new tracking system:

There are some things, however, that should be extended and improved for the red/green system:

Action Items

Please leave comments below if you think something's missing or if you have any remarks!

cc @nikomatsakis @vitiral

vitiral commented 7 years ago

Thanks for adding this! Let me say how excited I am that all this work from the previous iteration of incr-comp is still usable. These tests are extremely extensive, excellent work!

Some comments (I will edit this post as I review):

vitiral commented 7 years ago

@michaelwoerister I'll take call_expressions.rs to get my feet wet but it looks like we are blocked on a few issues.

Can you have a Status: existing tests [run/don't run] at the top so new contributors can know when they can jump in with a passing suite?

michaelwoerister commented 7 years ago

Can you have a Status: existing tests [run/don't run] at the top so new contributors can know when they can jump in with a passing suite?

Good idea. I'll add this tomorrow (it's already getting late in my time zone). Hopefully these kinds of tests will be updateable by the end of next week.

vitiral commented 7 years ago

It would be good to also provide a checkboxed list of what is blocking us as well :)

michaelwoerister commented 6 years ago

All sub-tasks are done!