summaryrefslogtreecommitdiff
path: root/tests/tst-tool-config-runner.sh
blob: 790da5878e634b500c5abeaecca9243b5c57daa4 (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
#!/bin/sh
set -eu

: "${TOOL_CONFIG_TEST:?}" "${CPU_AS:?}" "${CPU_LD:?}" "${CPU_RUN:?}" "${TEST_SRCDIR:?}"

TMP=${TMPDIR:-/tmp}/libmcpu-tool-config-$$
mkdir -p "$TMP/home/.mcpu/etc" "$TMP/relative-root/lib"
trap 'rm -rf "$TMP"' EXIT HUP INT TERM

HOME="$TMP/home"
export HOME

# Baseline: no config files, executable-derived root remains active.
"$TOOL_CONFIG_TEST" --no-config > "$TMP/default.txt"
DEFAULT_LIB=$(sed -n 's/^lib=//p' "$TMP/default.txt")
test -n "$DEFAULT_LIB"

# The obsolete per-user path must be ignored.
printf '%s\n' 'MCPU_LD_SYSTEM_LIBRARY_PATH = /obsolete/path;' \
  > "$HOME/.mcpu/mcpu-ld.conf"
"$TOOL_CONFIG_TEST" > "$TMP/old-user.txt"
test "$(sed -n 's/^lib=//p' "$TMP/old-user.txt")" = "$DEFAULT_LIB"

# The new per-user path has highest user-level priority and expands $HOME.
cat > "$HOME/.mcpu/etc/mcpu-ld.conf" <<'EOC'
MCPU_LD_SYSTEM_LIBRARY_PATH = $HOME/mcpu-next/lib;
EOC
"$TOOL_CONFIG_TEST" > "$TMP/user.txt"
test "$(sed -n 's/^lib=//p' "$TMP/user.txt")" = "$HOME/mcpu-next/lib"

# An explicit empty value disables the configured system library tree.
printf '%s\n' 'MCPU_LD_SYSTEM_LIBRARY_PATH = ;' \
  > "$HOME/.mcpu/etc/mcpu-ld.conf"
"$TOOL_CONFIG_TEST" > "$TMP/empty.txt"
test -z "$(sed -n 's/^lib=//p' "$TMP/empty.txt")"

# --no-config ignores even a malformed user configuration and keeps default.
printf '%s\n' 'MCPU_LD_SYSTEM_LIBRARY_PATH = broken' \
  > "$HOME/.mcpu/etc/mcpu-ld.conf"
"$TOOL_CONFIG_TEST" --no-config > "$TMP/no-config.txt"
test "$(sed -n 's/^lib=//p' "$TMP/no-config.txt")" = "$DEFAULT_LIB"
if "$TOOL_CONFIG_TEST" > /dev/null 2>&1; then
  echo "malformed user configuration was unexpectedly accepted" >&2
  exit 1
fi

# Absolute --sys-root implies --no-config and uses PATH/lib.
"$TOOL_CONFIG_TEST" --sys-root="$TMP/absolute-root" > "$TMP/absolute.txt"
test "$(sed -n 's/^root=//p' "$TMP/absolute.txt")" = "$TMP/absolute-root"
test "$(sed -n 's/^lib=//p' "$TMP/absolute.txt")" = "$TMP/absolute-root/lib"

# Relative --sys-root is resolved from the invocation working directory.
(
  cd "$TMP"
  "$TOOL_CONFIG_TEST" --sys-root=relative-root > "$TMP/relative.txt"
)
test "$(sed -n 's/^root=//p' "$TMP/relative.txt")" = "$TMP/relative-root"
test "$(sed -n 's/^lib=//p' "$TMP/relative.txt")" = "$TMP/relative-root/lib"


# The production linker and runner use the same policy state.
"$CPU_AS" -o "$TMP/radd.o" "$TEST_SRCDIR/fixtures/radd-pi.s" >/dev/null
if "$CPU_LD" --stack-size=512 -o "$TMP/radd.melf" "$TMP/radd.o" >/dev/null 2>&1; then
  echo "mcpu-ld unexpectedly accepted malformed user configuration" >&2
  exit 1
fi
"$CPU_LD" --no-config --stack-size=512 \
  -o "$TMP/radd.melf" "$TMP/radd.o" >/dev/null
"$CPU_RUN" --no-config --digits=60 --real-data=4096@16 \
  "$TMP/radd.melf" > "$TMP/run-no-config.txt"
case "$(cat "$TMP/run-no-config.txt")" in
  5.14159265358979323846264338327950288419716939937510582097*) ;;
  *) echo "unexpected --no-config execution result" >&2; exit 1 ;;
esac

if "$CPU_RUN" --digits=60 --real-data=4096@16 \
     "$TMP/radd.melf" >/dev/null 2>&1; then
  echo "mcpu-run unexpectedly accepted malformed user configuration" >&2
  exit 1
fi

"$CPU_LD" --sys-root "$TMP/absolute-root" --stack-size=512 \
  -o "$TMP/radd-sysroot.melf" "$TMP/radd.o" >/dev/null
"$CPU_RUN" --sys-root="$TMP/absolute-root" --digits=60 \
  --real-data=4096@16 "$TMP/radd-sysroot.melf" > "$TMP/run-sysroot.txt"
case "$(cat "$TMP/run-sysroot.txt")" in
  5.14159265358979323846264338327950288419716939937510582097*) ;;
  *) echo "unexpected --sys-root execution result" >&2; exit 1 ;;
esac

# Both production tools expose the common policy options.
"$CPU_LD" --help 2>&1 | grep -q -- '--no-config'
"$CPU_LD" --help 2>&1 | grep -q -- '--sys-root=PATH'
"$CPU_RUN" --help 2>&1 | grep -q -- '--no-config'
"$CPU_RUN" --help 2>&1 | grep -q -- '--sys-root=PATH'

exit 0