From 7dd2577abf7420cee54b0281448442d7bcf72165 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 8 Jun 2021 11:28:06 -0700 Subject: [PATCH 1/4] Fix linkchecker redirection tests. These were changed in #84703. --- src/tools/linkchecker/tests/broken_redir/redir-bad.html | 1 + src/tools/linkchecker/tests/redirect_loop/redir-bad.html | 1 + src/tools/linkchecker/tests/valid/inner/redir-bad.html | 1 + src/tools/linkchecker/tests/valid/inner/redir.html | 1 + 4 files changed, 4 insertions(+) diff --git a/src/tools/linkchecker/tests/broken_redir/redir-bad.html b/src/tools/linkchecker/tests/broken_redir/redir-bad.html index 3e376629f74..9c580d8e07e 100644 --- a/src/tools/linkchecker/tests/broken_redir/redir-bad.html +++ b/src/tools/linkchecker/tests/broken_redir/redir-bad.html @@ -2,6 +2,7 @@ + Redirection

Redirecting to sometarget...

diff --git a/src/tools/linkchecker/tests/redirect_loop/redir-bad.html b/src/tools/linkchecker/tests/redirect_loop/redir-bad.html index fe7780e6739..bc567caa78b 100644 --- a/src/tools/linkchecker/tests/redirect_loop/redir-bad.html +++ b/src/tools/linkchecker/tests/redirect_loop/redir-bad.html @@ -2,6 +2,7 @@ + Redirection

Redirecting to redir-bad.html...

diff --git a/src/tools/linkchecker/tests/valid/inner/redir-bad.html b/src/tools/linkchecker/tests/valid/inner/redir-bad.html index d21336e7e73..f32683efe67 100644 --- a/src/tools/linkchecker/tests/valid/inner/redir-bad.html +++ b/src/tools/linkchecker/tests/valid/inner/redir-bad.html @@ -2,6 +2,7 @@ + Redirection

Redirecting to xxx...

diff --git a/src/tools/linkchecker/tests/valid/inner/redir.html b/src/tools/linkchecker/tests/valid/inner/redir.html index 1808b23aed8..3a52a897385 100644 --- a/src/tools/linkchecker/tests/valid/inner/redir.html +++ b/src/tools/linkchecker/tests/valid/inner/redir.html @@ -2,6 +2,7 @@ + Redirection

Redirecting to redir-target.html...

From bbd053216341cd3843b8f12da791f533e4480b8d Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 8 Jun 2021 16:15:43 -0700 Subject: [PATCH 2/4] Test the linkchecker itself. --- src/bootstrap/builder/tests.rs | 5 +++++ src/bootstrap/test.rs | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/bootstrap/builder/tests.rs b/src/bootstrap/builder/tests.rs index 4d7c207e3ab..e7fb8c0d4d5 100644 --- a/src/bootstrap/builder/tests.rs +++ b/src/bootstrap/builder/tests.rs @@ -613,9 +613,14 @@ mod dist { // Note that the stages here are +1 than what they actually are because // Rustdoc::run swaps out the compiler with stage minus 1 if --stage is // not 0. + // + // The stage 0 copy is the one downloaded for bootstrapping. It is + // (currently) needed to run "cargo test" on the linkchecker, and + // should be relatively "free". assert_eq!( first(builder.cache.all::()), &[ + tool::Rustdoc { compiler: Compiler { host: a, stage: 0 } }, tool::Rustdoc { compiler: Compiler { host: a, stage: 1 } }, tool::Rustdoc { compiler: Compiler { host: a, stage: 2 } }, ] diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs index cc7c143d474..9debfee58e2 100644 --- a/src/bootstrap/test.rs +++ b/src/bootstrap/test.rs @@ -124,8 +124,25 @@ You can skip linkcheck with --exclude src/tools/linkchecker" builder.info(&format!("Linkcheck ({})", host)); + // Test the linkchecker itself. + let bootstrap_host = builder.config.build; + let compiler = builder.compiler(0, bootstrap_host); + let cargo = tool::prepare_tool_cargo( + builder, + compiler, + Mode::ToolBootstrap, + bootstrap_host, + "test", + "src/tools/linkchecker", + SourceType::InTree, + &[], + ); + try_run(builder, &mut cargo.into()); + + // Build all the default documentation. builder.default_doc(&[]); + // Run the linkchecker. let _time = util::timeit(&builder); try_run( builder, From dbc8a1c25a79fa5ce1f1343b0d9c2ede161eb467 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 8 Jun 2021 16:23:19 -0700 Subject: [PATCH 3/4] Change the linkchecker self-tests to validate more output. --- src/tools/linkchecker/tests/checks.rs | 49 +++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src/tools/linkchecker/tests/checks.rs b/src/tools/linkchecker/tests/checks.rs index c6ec999e5cf..531c323a9bc 100644 --- a/src/tools/linkchecker/tests/checks.rs +++ b/src/tools/linkchecker/tests/checks.rs @@ -15,7 +15,7 @@ fn run(dirname: &str) -> (ExitStatus, String, String) { fn broken_test(dirname: &str, expected: &str) { let (status, stdout, stderr) = run(dirname); assert!(!status.success()); - if !stdout.contains(expected) { + if !contains(expected, &stdout) { panic!( "stdout did not contain expected text: {}\n\ --- stdout:\n\ @@ -27,6 +27,25 @@ fn broken_test(dirname: &str, expected: &str) { } } +fn contains(expected: &str, actual: &str) -> bool { + // Normalize for Windows paths. + let actual = actual.replace('\\', "/"); + actual.lines().any(|mut line| { + for (i, part) in expected.split("[..]").enumerate() { + match line.find(part) { + Some(j) => { + if i == 0 && j != 0 { + return false; + } + line = &line[j + part.len()..]; + } + None => return false, + } + } + line.is_empty() || expected.ends_with("[..]") + }) +} + fn valid_test(dirname: &str) { let (status, stdout, stderr) = run(dirname); if !status.success() { @@ -48,30 +67,46 @@ fn valid() { #[test] fn basic_broken() { - broken_test("basic_broken", "bar.html"); + broken_test("basic_broken", "foo.html:3: broken link - `bar.html`"); } #[test] fn broken_fragment_local() { - broken_test("broken_fragment_local", "#somefrag"); + broken_test( + "broken_fragment_local", + "foo.html:3: broken link fragment `#somefrag` pointing to `foo.html`", + ); } #[test] fn broken_fragment_remote() { - broken_test("broken_fragment_remote/inner", "#somefrag"); + broken_test( + "broken_fragment_remote/inner", + "foo.html:3: broken link fragment `#somefrag` pointing to `foo.html`", + ); } #[test] fn broken_redir() { - broken_test("broken_redir", "sometarget"); + broken_test( + "broken_redir", + "foo.html:3: broken redirect from `redir-bad.html` to `sometarget`", + ); } #[test] fn directory_link() { - broken_test("directory_link", "somedir"); + broken_test( + "directory_link", + "foo.html:3: directory link to `somedir` (directory links should use index.html instead)", + ); } #[test] fn redirect_loop() { - broken_test("redirect_loop", "redir-bad.html"); + broken_test( + "redirect_loop", + "foo.html:3: redirect from `redir-bad.html` to `[..]redirect_loop/redir-bad.html` \ + which is also a redirect (not supported)", + ); } From 1e9f0b367e0b7dc9902502cfa09bcc52d2215261 Mon Sep 17 00:00:00 2001 From: Eric Huss Date: Tue, 8 Jun 2021 17:12:48 -0700 Subject: [PATCH 4/4] linkchecker: Fix bug where fragment errors printed the wrong path. --- src/tools/linkchecker/main.rs | 2 +- src/tools/linkchecker/tests/checks.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tools/linkchecker/main.rs b/src/tools/linkchecker/main.rs index 47960c3f6cc..15edd628cdf 100644 --- a/src/tools/linkchecker/main.rs +++ b/src/tools/linkchecker/main.rs @@ -347,7 +347,7 @@ impl Checker { } else { report.errors += 1; print!("{}:{}: broken link fragment ", pretty_path, i + 1); - println!("`#{}` pointing to `{}`", fragment, pretty_path); + println!("`#{}` pointing to `{}`", fragment, target_pretty_path); }; } }); diff --git a/src/tools/linkchecker/tests/checks.rs b/src/tools/linkchecker/tests/checks.rs index 531c323a9bc..1a0b1b00e0d 100644 --- a/src/tools/linkchecker/tests/checks.rs +++ b/src/tools/linkchecker/tests/checks.rs @@ -82,7 +82,8 @@ fn broken_fragment_local() { fn broken_fragment_remote() { broken_test( "broken_fragment_remote/inner", - "foo.html:3: broken link fragment `#somefrag` pointing to `foo.html`", + "foo.html:3: broken link fragment `#somefrag` pointing to \ + `[..]/broken_fragment_remote/bar.html`", ); }