Tracking Issue for incr. comp. red/green testing · Issue #44716 · rust-lang/rust (original) (raw)

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. incr.comp.: Create Test Case for Incr. Comp. Hash for enums #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