diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a4a876a..f12d583 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -145,8 +145,7 @@ subplot: script: # make sure a virtual card is available, so that the subplot tests are # generated - - touch tools/virtual-card-available - - cargo test + - CARD_BASED_TESTS=true cargo test cache: # inherit all general cache settings <<: *general_cache_config diff --git a/tools/build.rs b/tools/build.rs index 608f687..5185c03 100644 --- a/tools/build.rs +++ b/tools/build.rs @@ -9,19 +9,23 @@ fn main() { // card is available. This is a kludge until Subplot can do // conditional scenarios // (https://gitlab.com/subplot/subplot/-/issues/20). - let flagfile = Path::new("virtual-card-available"); - if flagfile.exists() { - subplot_build::codegen("subplot/opgpcard.subplot") - .expect("failed to generate code with Subplot"); - } else { - // If we're not generating code from the subplot, we should at - // least create an empty file so that the tests/opgpcard.rs - // file can include it. Otherwise the build will fail. - let out_dir = std::env::var("OUT_DIR").unwrap(); - let include = Path::new(&out_dir).join("opgpcard.rs"); - eprintln!("build.rs: include={}", include.display()); - if !include.exists() { - File::create(include).unwrap(); + match option_env!("CARD_BASED_TESTS") { + Some(_) => { + subplot_build::codegen("subplot/opgpcard.subplot") + .expect("failed to generate code with Subplot"); + println!("cargo:warning=generated subplot tests"); + } + None => { + // If we're not generating code from the subplot, we should at + // least create an empty file so that the tests/opgpcard.rs + // file can include it. Otherwise the build will fail. + println!("cargo:warning=did not generate subplot tests"); + let out_dir = std::env::var("OUT_DIR").unwrap(); + let include = Path::new(&out_dir).join("opgpcard.rs"); + eprintln!("build.rs: include={}", include.display()); + if !include.exists() { + File::create(include).unwrap(); + } } } } diff --git a/tools/cargo-test-in-docker b/tools/cargo-test-in-docker index 945294f..9332cd8 100755 --- a/tools/cargo-test-in-docker +++ b/tools/cargo-test-in-docker @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # Run this to run opgpcard (tools directory) test suite inside a # Docker container with a virtual smartcard running. The test suite @@ -14,10 +14,12 @@ docker run --rm -it \ -v root:/root \ -v cargo:/cargo \ -v $(pwd):/src \ + -e CARD_BASED_TESTS=true \ registry.gitlab.com/openpgp-card/virtual-cards/smartpgp-builddeps sh -c ' sed -i "s/timeout=20/timeout=60/" /home/jcardsim/run-card.sh && /etc/init.d/pcscd start && su - -c "sh /home/jcardsim/run-card.sh >/dev/null" jcardsim && cd /src/tools && -if ! [ -e virtual-card-available ]; then rm -f tests/opgpcard.rs; fi && +CARGO_TARGET_DIR=/cargo/ cargo update && +CARGO_TARGET_DIR=/cargo/ cargo build -vv && CARGO_TARGET_DIR=/cargo/ cargo test' diff --git a/tools/subplot/opgpcard.md b/tools/subplot/opgpcard.md index de1693f..d0729d8 100644 --- a/tools/subplot/opgpcard.md +++ b/tools/subplot/opgpcard.md @@ -17,9 +17,9 @@ The verification scenarios in this document assume the availability of a virtual smart card. Specifically one described in . The `openpgp-card/tools` crate is set up to generate tests only if the -file `tools/virtual-card-available` exists, and the `openpgp-card` -repository `.gitlab-ci.yml` file is set up to create that file when -the repository is tested in GitLab CI. +environment variable `CARD_BASED_TESTS` is set (to any value), +and the `openpgp-card` repository `.gitlab-ci.yml` file is set up to +set that environment variable when the repository is tested in GitLab CI. This means that if you run `cargo test`, no test code is normally generated from this document. To run the tests locally, outside of diff --git a/tools/subplot/test-in-docker.sh b/tools/subplot/test-in-docker.sh index 13bf2e1..c24ae9a 100755 --- a/tools/subplot/test-in-docker.sh +++ b/tools/subplot/test-in-docker.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # # Run "cargo test" inside a Docker container with virtual cards # installed and running. This will allow at least rudimentary testing