@@ -1231,3 +1231,81 @@ fn any_debug() {
12311231 // Downcasting to the underlying type should succeed.
12321232 assert_eq ! ( x. downcast_ref:: <MyStruct >( ) , Some ( & MyStruct { x: 7 } ) ) ;
12331233}
1234+
1235+ /// The staging tests use insta for snapshot testing.
1236+ /// See bootstrap's README on how to bless the snapshots.
1237+ mod staging {
1238+ use crate :: core:: builder:: tests:: {
1239+ TEST_TRIPLE_1 , configure, configure_with_args, render_steps, run_build,
1240+ } ;
1241+
1242+ #[ test]
1243+ fn build_compiler_stage_1 ( ) {
1244+ let mut cache = run_build (
1245+ & [ "compiler" . into ( ) ] ,
1246+ configure_with_args ( & [ "build" , "--stage" , "1" ] , & [ TEST_TRIPLE_1 ] , & [ TEST_TRIPLE_1 ] ) ,
1247+ ) ;
1248+ let steps = cache. into_executed_steps ( ) ;
1249+ insta:: assert_snapshot!( render_steps( & steps) , @r"
1250+ [build] rustc 0 <target1> -> std 0 <target1>
1251+ [build] llvm <target1>
1252+ [build] rustc 0 <target1> -> rustc 1 <target1>
1253+ [build] rustc 0 <target1> -> rustc 1 <target1>
1254+ " ) ;
1255+ }
1256+ }
1257+
1258+ /// Renders the executed bootstrap steps for usage in snapshot tests with insta.
1259+ /// Only renders certain important steps.
1260+ /// Each value in `steps` should be a tuple of (Step, step output).
1261+ fn render_steps ( steps : & [ ( Box < dyn Any > , Box < dyn Any > ) ] ) -> String {
1262+ steps
1263+ . iter ( )
1264+ . filter_map ( |( step, output) | {
1265+ // FIXME: implement an optional method on Step to produce metadata for test, instead
1266+ // of this downcasting
1267+ if let Some ( ( rustc, output) ) = downcast_step :: < compile:: Rustc > ( step, output) {
1268+ Some ( format ! (
1269+ "[build] {} -> {}" ,
1270+ render_compiler( rustc. build_compiler) ,
1271+ // FIXME: return the correct stage from the `Rustc` step, now it behaves weirdly
1272+ render_compiler( Compiler :: new( rustc. build_compiler. stage + 1 , rustc. target) ) ,
1273+ ) )
1274+ } else if let Some ( ( std, output) ) = downcast_step :: < compile:: Std > ( step, output) {
1275+ Some ( format ! (
1276+ "[build] {} -> std {} <{}>" ,
1277+ render_compiler( std. compiler) ,
1278+ std. compiler. stage,
1279+ std. target
1280+ ) )
1281+ } else if let Some ( ( llvm, output) ) = downcast_step :: < llvm:: Llvm > ( step, output) {
1282+ Some ( format ! ( "[build] llvm <{}>" , llvm. target) )
1283+ } else {
1284+ None
1285+ }
1286+ } )
1287+ . map ( |line| {
1288+ line. replace ( TEST_TRIPLE_1 , "target1" )
1289+ . replace ( TEST_TRIPLE_2 , "target2" )
1290+ . replace ( TEST_TRIPLE_3 , "target3" )
1291+ } )
1292+ . collect :: < Vec < _ > > ( )
1293+ . join ( "\n " )
1294+ }
1295+
1296+ fn downcast_step < ' a , S : Step > (
1297+ step : & ' a Box < dyn Any > ,
1298+ output : & ' a Box < dyn Any > ,
1299+ ) -> Option < ( & ' a S , & ' a S :: Output ) > {
1300+ let Some ( step) = step. downcast_ref :: < S > ( ) else {
1301+ return None ;
1302+ } ;
1303+ let Some ( output) = output. downcast_ref :: < S :: Output > ( ) else {
1304+ return None ;
1305+ } ;
1306+ Some ( ( step, output) )
1307+ }
1308+
1309+ fn render_compiler ( compiler : Compiler ) -> String {
1310+ format ! ( "rustc {} <{}>" , compiler. stage, compiler. host)
1311+ }
0 commit comments