File: integration.rs

package info (click to toggle)
rustc 1.85.0%2Bdfsg2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 893,176 kB
  • sloc: xml: 158,127; python: 35,830; javascript: 19,497; cpp: 19,002; sh: 17,245; ansic: 13,127; asm: 4,376; makefile: 1,051; lisp: 29; perl: 29; ruby: 19; sql: 11
file content (146 lines) | stat: -rw-r--r-- 5,453 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
use std::path::Path;

use ui_test::{spanned::Spanned, *};

fn main() -> Result<()> {
    let path = Path::new(file!()).parent().unwrap();
    let root_dir = path.join("integrations");
    let mut config = Config {
        bless_command: Some("cargo test -- -- --bless".to_string()),
        ..Config::cargo(root_dir.clone())
    };

    config.comment_defaults.base().require_annotations = Some(Spanned::dummy(false)).into();

    let args = Args::test()?;
    config.with_args(&args);

    config.program.args = vec![
        "test".into(),
        "--color".into(),
        "never".into(),
        "--quiet".into(),
        "--jobs".into(),
        "1".into(),
        "--no-fail-fast".into(),
    ];
    config
        .program
        .envs
        .push(("RUST_TEST_THREADS".into(), Some("1".into())));

    config
        .program
        .envs
        .push(("BLESS".into(), (!args.check).then(|| String::new().into())));

    config
        .program
        .envs
        .push(("RUST_BACKTRACE".into(), Some("0".into())));

    config.stdout_filter("in ([0-9]m )?[0-9\\.]+s", "");
    config.stdout_filter(r#""--out-dir"(,)? "[^"]+""#, r#""--out-dir"$1 "$$TMP"#);
    config.filter("\\.exe", b"");
    config.filter(
        "( *process didn't exit successfully: `.*)-[0-9a-f]+`",
        "$1-HASH`",
    );
    // Windows io::Error uses "exit code".
    config.filter("exit code", "exit status");
    config.filter(
        "The system cannot find the file specified.",
        "No such file or directory",
    );
    config.filter("RUSTC_BOOTSTRAP=\"1\" ", "");
    config.filter("RUSTC_ICE=\"0\" ", "");
    // The order of the `/deps` directory flag is flaky
    config.stdout_filter("/deps", "");
    config.path_filter(std::path::Path::new(path), "$DIR");
    config.stdout_filter("[0-9a-f]+\\.rmeta", "$$HASH.rmeta");
    // Windows backslashes are sometimes escaped.
    // Insert the replacement filter at the start to make sure the filter for single backslashes
    // runs afterwards.
    config
        .comment_defaults
        .base()
        .normalize_stdout
        .insert(0, (Match::Exact(b"\\\\".to_vec()), b"\\".to_vec()));
    config.stdout_filter(r#"(panic.*)\.rs:[0-9]+:[0-9]+"#, "$1.rs");
    // We don't want to normalize lines starting with `+`, those are diffs of the inner ui_test
    // and normalizing these here doesn't make the "actual output differed from expected" go
    // away, it just makes it impossible to diagnose.
    config.filter(" +[0-9]+: .*\n", "");
    config.filter("                +at \\.?/.*\n", "");
    config.filter(" running on .*", "");
    config.stdout_filter("/target/[^/]+/[^/]+/debug", "/target/$$TMP/$$TRIPLE/debug");
    config.stdout_filter("/target/.tmp[^/ \"]+", "/target/$$TMP");
    // Normalize proc macro filenames on windows to their linux repr
    config.stdout_filter("/([^/\\.]+)\\.dll", "/lib$1.so");
    // Normalize proc macro filenames on mac to their linux repr
    config.stdout_filter("/([^/\\.]+)\\.dylib", "/$1.so");
    config.stdout_filter("(command: )\"[^<rp][^\"]+", "$1\"$$CMD");
    config.filter("(src/.*?\\.rs):[0-9]+:[0-9]+", "$1:LL:CC");
    config.filter("program not found", "No such file or directory");
    config.filter(" \\(os error [0-9]+\\)", "");
    config.filter("note: rustc 1\\..*", "");
    // Cross compilation paths contain an additional target directory name
    config.stderr_filter(
        "(/target/ui/tests/integrations/[^/]+).*debug/deps",
        "$1/debug/deps",
    );
    // abort messages are different on macos
    config.stdout_filter(r#" \(core dumped\)"#, "");
    // abort messages are different on windows
    config.stdout_filter(r#"exit status: 0xc0000409"#, "signal: 6 (SIGABRT)");
    config.filter("\"--target=[^\"]+\"", "");

    let text = ui_test::status_emitter::Text::from(args.format);

    let mut pass_config = config.clone();
    pass_config.comment_defaults.base().exit_status = Some(Spanned::dummy(0)).into();
    let mut panic_config = config;
    panic_config.comment_defaults.base().exit_status = Some(Spanned::dummy(101)).into();

    run_tests_generic(
        vec![pass_config, panic_config],
        |path, config| {
            let fail = path
                .parent()
                .unwrap()
                .file_name()
                .unwrap()
                .to_str()
                .unwrap()
                .ends_with("-fail");
            if !path.ends_with("Cargo.toml") {
                return None;
            }
            Some(
                path.parent().unwrap().parent().unwrap() == root_dir
                    && match config
                        .comment_defaults
                        .base_immut()
                        .exit_status
                        .as_deref()
                        .unwrap()
                    {
                        0 => !fail,
                        // This is weird, but `cargo test` returns 101 instead of 1 when
                        // multiple [[test]]s exist. If there's only one test, it returns
                        // 1 on failure.
                        101 => fail,
                        _ => unreachable!(),
                    }
                    && default_any_file_filter(path, config),
            )
        },
        |_, _| {},
        (
            text,
            ui_test::status_emitter::Gha::<true> {
                name: "integration tests".into(),
            },
        ),
    )
}