summaryrefslogtreecommitdiff
path: root/ci/run.sh
blob: d1ac5ad90efbbfaba58a154e96ebb8cb49167f57 (plain)
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
#!/bin/bash

# Builds and runs tests for a particular target passed as an argument to this
# script.

set -e

BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
MANIFEST_PATH="${BASE_DIR}/Cargo.toml"
BUILD_DIR="."

VERSION="$1"
TARGET="$2"

export RUST_TEST_THREADS=1

echo "======================================================="
echo "TESTING VERSION: ${VERSION}, TARGET: ${TARGET}"
echo "======================================================="

#
# Tell cargo what linker to use and whatever else is required
#
configure_cargo() {
  rm -rf .cargo
  mkdir .cargo
  cp "${BASE_DIR}/ci/cargo-config" .cargo/config
}

#
# We need to export CC for the tests to build properly (some C code is
# compiled) to work.  We already tell Cargo about the compiler in the
# cargo config, so we just parse that info out of the cargo config
#
cc_for_target() {
  awk "/\[target\.${TARGET}\]/{getline; print}" .cargo/config |
      cut -d '=' -f2 | \
      tr -d '"' | tr -d ' '
}

cross_compile_tests() {
  case "$TARGET" in
    *-apple-ios)
      cargo test --no-run --manifest-path="${MANIFEST_PATH}" --target "$TARGET" -- \
            -C link-args=-mios-simulator-version-min=7.0
      ;;

    *)
      cargo test --no-run --verbose \
            --manifest-path="${MANIFEST_PATH}" \
            --target "$TARGET"
      ;;
  esac
}

# This is a hack as we cannot currently
# ask cargo what test files it generated:
# https://github.com/rust-lang/cargo/issues/1924
find_binaries() {
  target_base_dir="${BUILD_DIR}/${TARGET}/debug"

  # find [[test]] sections and print the first line and
  # hack it to what we want from there.  Also "nix" for
  # tests that are implicitly prsent
  for test_base in $( awk '/\[\[test\]\]/{getline; print}' "${MANIFEST_PATH}" | \
                          cut -d '='  -f2 | \
                          tr -d '"' | \
                          tr '-' '_' | \
                          tr -d ' '; echo "nix" ); do
    for path in ${target_base_dir}/${test_base}-* ; do
      echo "${path} "
    done
  done
}

test_binary() {
  binary=$1

  case "$TARGET" in
    arm-linux-gnueabi-gcc)
      qemu-arm -L /usr/arm-linux-gnueabihf "$binary"
      ;;

    arm-unknown-linux-gnueabihf)
      qemu-arm -L /usr/arm-linux-gnueabihf "$binary"
      ;;

    mips-unknown-linux-gnu)
      qemu-mips -L /usr/mips-linux-gnu "$binary"
      ;;

    aarch64-unknown-linux-gnu)
      qemu-aarch64 -L /usr/aarch64-linux-gnu "$binary"
      ;;

    *-rumprun-netbsd)
      rumprun-bake hw_virtio /tmp/nix-test.img "${binary}"
      qemu-system-x86_64 -nographic -vga none -m 64 \
                         -kernel /tmp/nix-test.img 2>&1 | tee /tmp/out &
      sleep 5
      grep "^PASSED .* tests" /tmp/out
      ;;

    *)
      echo "Running binary: ${binary}"
      ${binary}
      ;;
  esac
}

configure_cargo

export CC="$(cc_for_target)"

# select the proper version
multirust override ${VERSION}

# build the tests
cross_compile_tests

# and run the tests
for bin in $(find_binaries); do
  test_binary "${bin}"
done