skip to Main Content

My documentation tests are silently not executed in my Docker environment while everything works on both Windows and Ubuntu/Debian hosts.

I created a minimal Github Repository to demonstrate the issue. I tried two different versions of Rust nightly and Rust stable, debug/release, all without success. See my Dockerfile and complete build output.

Example code:

/// Fixes string arrays which can also be objects into string arrays
/// # Examples
///
/// ```
/// assert_eq!(cargo_test_doc_docker::add(1, 2), 3);
/// ```
pub fn add(a: i32, b: i32) -> i32 {
    a + b
}

Result when executing on Debian:

arturh@host:~/projects/cargo-test-doc-docker$ cargo test
   Compiling cargo-test-doc-docker v0.1.0 (/home/arturh/projects/cargo-test-doc-docker)
    Finished test [unoptimized + debuginfo] target(s) in 2.39s
     Running target/debug/deps/cargo_test_doc_docker-9d5ae146cd4c3628

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/cargo_test_doc_docker-2a696d2579128ce1

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests cargo-test-doc-docker

running 1 test
test src/lib.rs - add (line 4) ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

The problem occurs when executing the build on Docker. This is a minimal Dockerfile that reproduces the problem:

FROM ekidd/rust-musl-builder:nightly-2020-01-26-openssl11 as build
COPY --chown=rust:rust . .
RUN cargo test; echo $?

Result for every Rust toolchain I tried:

Step 6/17 : RUN cargo test; echo $?
 ---> Running in b266fc72f3c1
   Compiling cargo-test-doc-docker v0.1.0 (/home/rust/src)
    Finished test [unoptimized + debuginfo] target(s) in 0.32s
     Running target/x86_64-unknown-linux-musl/debug/deps/cargo_test_doc_docker-7b40e7e5b47f49eb

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/x86_64-unknown-linux-musl/debug/deps/cargo_test_doc_docker-0bfec9752a7bec14

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

0

It does not even try to execute any doc tests and exits with zero so it’s not easily noticed. I guess it must be something the Docker base image does, but what could that be?

2

Answers


  1. Chosen as BEST ANSWER

    Shepmaster was right, when I target the x86_64-unknown-linux-musl it also does not work locally on Debian:

    arturh@host:~/projects/cargo-test-doc-docker$ cargo test --target=x86_64-unknown-linux-musl; echo $?
       Compiling cargo-test-doc-docker v0.1.0 (/home/arturh/projects/cargo-test-doc-docker)
        Finished test [unoptimized + debuginfo] target(s) in 0.28s
         Running target/x86_64-unknown-linux-musl/debug/deps/cargo_test_doc_docker-8dfff5631875d404
    
    running 0 tests
    
    test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
    
         Running target/x86_64-unknown-linux-musl/debug/deps/cargo_test_doc_docker-eb877250b708174b
    
    running 0 tests
    
    test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
    
    0
    

    I guess I must have a separate build step for testing the doc tests with the target x86_64-unknown-linux-gnu.


  2. Cross Compilation

    This is a logical, if surprising, outcome of cross-compilation.

    To understand why, imagine that you:

    • Compile on a Linux x64 machine (Host).
    • Target a Windows ARM machine.

    The generated code cannot be executed on the current host (Linux x64): it is prepared for a different CPU (instruction set) and OS (system calls).

    Since the tests — unit tests, integration tests, and documentation tests — are also generated for the target architecture, they cannot be executed on the host either.


    What to do with the tests?

    If your code has no specific dependency on a specific platform, then you can content yourself with compiling for the host and running those.

    Otherwise, you will need access to a machine that can actually run the cross-compiled binaries. You can still use cross-compilation to speed up building those binaries, and then upload them to either a physical or virtual machine to run them.

    AFAIK Cargo does not help with the latter, so you’ll need your own scripts.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search