#!/usr/bin/env bash # Usage: # # ./tests/test-one.sh # # Generate bindings for the first match of `./tests/headers/**`, use # `rustc` to compile the bindings with unit tests enabled, and run the generated # layout tests. set -eu if [ $# -ne 1 ]; then echo "Usage: $0 " exit 1 fi cd "$(dirname "$0")" cd .. export RUST_BACKTRACE=1 unique_fuzzy_file() { local pattern="$1" local results="$(find ./tests/headers -type f | egrep -i "$pattern")" local num_results=$(echo "$results" | wc -l) if [[ -z "$results" ]]; then >&2 echo "ERROR: no files found with pattern \"$pattern\"" exit 1 elif [[ "$num_results" -ne 1 ]]; then >&2 echo "ERROR: Expected exactly 1 result, got $num_results:" >&2 echo "$results" exit 1 fi echo "$results" } TEST="$(unique_fuzzy_file "$1")" BINDINGS=$(mktemp -t bindings.rs.XXXXXX) TEST_BINDINGS_BINARY=$(mktemp -t bindings.XXXXXX) FLAGS="$(grep "// bindgen-flags: " "$TEST" || echo)" FLAGS="${FLAGS/\/\/ bindgen\-flags:/}" # Prepend the default flags added in test.rs's `create_bindgen_builder`. FLAGS="--rustfmt-bindings --with-derive-default --raw-line '' --raw-line '#![allow(dead_code, non_snake_case, non_camel_case_types, non_upper_case_globals)]' --raw-line '' $FLAGS" eval ./target/debug/bindgen \ "\"$TEST\"" \ --emit-ir \ --emit-ir-graphviz ir.dot \ --emit-clang-ast \ -o "\"$BINDINGS\"" \ $FLAGS rustup run nightly rustfmt "$BINDINGS" || true dot -Tpng ir.dot -o ir.png echo echo "=== Input header ========================================================" echo cat "$TEST" echo echo "=== Generated bindings ==================================================" echo cat "$BINDINGS" echo echo "=== Diff w/ expected bindings ===========================================" echo EXPECTED=${TEST/headers/expectations\/tests} EXPECTED=${EXPECTED/.hpp/.rs} EXPECTED=${EXPECTED/.h/.rs} rustup run nightly rustfmt "$EXPECTED" || true # Don't exit early if there is a diff. diff -U8 "$EXPECTED" "$BINDINGS" || true echo echo "=== Building bindings ===================================================" echo rustc --test -o "$TEST_BINDINGS_BINARY" "$BINDINGS" --crate-name bindgen_test_one echo echo "=== Testing bindings ====================================================" echo "$TEST_BINDINGS_BINARY"