-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest.sh
More file actions
executable file
·153 lines (139 loc) · 4.9 KB
/
Copy pathtest.sh
File metadata and controls
executable file
·153 lines (139 loc) · 4.9 KB
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/bin/bash
set -x
# Read lean-toolchain file
LEAN_VERSION=$(sed 's/.*lean4:\([^ ]*\).*/\1/' lean-toolchain 2>/dev/null | sed 's/^v//')
# Function to compare Lean versions
version_leq() {
if [[ "$1" == "$2" ]]; then
return 0
fi
local IFS=.
local i ver1=($1) ver2=($2)
# Remove -rc* suffix if present
ver1=${ver1[0]//-rc*}
ver2=${ver2[0]//-rc*}
# Compare major and minor versions
if [[ -z $ver1 || -z $ver2 ]]; then
return 1
fi
for ((i=0; i<2; i++)); do
if [[ -z ${ver1[i]} || -z ${ver2[i]} ]]; then
return 1
fi
if ((10#${ver1[i]} > 10#${ver2[i]})); then
return 1
fi
if ((10#${ver1[i]} < 10#${ver2[i]})); then
return 0
fi
done
return 0
}
# Determine if we need to adjust paths for Lean ≤ 4.17.0
ADJUST_PATHS=false
if [[ -n "$LEAN_VERSION" ]]; then
if version_leq "$LEAN_VERSION" "4.17.0"; then
ADJUST_PATHS=true
fi
fi
# Build the project
lake build SafeVerifyTest || { echo "Build failed"; exit 1; }
# Base directory
BASE_DIR="SafeVerifyTest"
# Iterate over each test directory
for TEST_DIR in "$BASE_DIR"/*/; do
TEST_NAME=$(basename "$TEST_DIR")
# Adjust paths if needed
if [ "$ADJUST_PATHS" = true ]; then
TARGET_OLEAN=".lake/build/lib/$BASE_DIR/$TEST_NAME/Target.olean"
GOOD_OLEAN=".lake/build/lib/$BASE_DIR/$TEST_NAME/Good.olean"
BAD_OLEAN=".lake/build/lib/$BASE_DIR/$TEST_NAME/Bad.olean"
HACK_OLEAN=".lake/build/lib/$BASE_DIR/$TEST_NAME/Hack.olean"
else
TARGET_OLEAN=".lake/build/lib/lean/$BASE_DIR/$TEST_NAME/Target.olean"
GOOD_OLEAN=".lake/build/lib/lean/$BASE_DIR/$TEST_NAME/Good.olean"
BAD_OLEAN=".lake/build/lib/lean/$BASE_DIR/$TEST_NAME/Bad.olean"
HACK_OLEAN=".lake/build/lib/lean/$BASE_DIR/$TEST_NAME/Hack.olean"
fi
STATEMENTS_FILE="$TEST_DIR/statements.txt"
# Check if statements.txt exists
if [ ! -f "$STATEMENTS_FILE" ]; then
statements=""
else
statements=$(cat "$STATEMENTS_FILE")
fi
FLAGS_FILE="$TEST_DIR/flags.txt"
if [ ! -f "$FLAGS_FILE" ]; then
flags=""
else
flags=$(cat "$FLAGS_FILE")
fi
# Skip directories without a Target.lean (e.g. unit test directories)
if [ ! -f "$TEST_DIR/Target.lean" ]; then
echo "Skipping $TEST_NAME (no Target.lean)"
continue
fi
# Check if Target.olean exists
if [ ! -f "$TARGET_OLEAN" ]; then
echo "Error: $TARGET_OLEAN not found"
exit 1
fi
# Test Good.lean
if [ -f "$GOOD_OLEAN" ]; then
echo "Testing $TEST_NAME/Good.lean..."
if OUTPUT=$(lake exe safe_verify $flags "$TARGET_OLEAN" "$GOOD_OLEAN" $statements 2>&1); then
echo "PASS: $TEST_NAME/Good.lean"
else
echo "FAIL: $TEST_NAME/Good.lean (expected to pass)"
echo "Output:"
echo "$OUTPUT"
exit 1
fi
else
echo "Warning: $GOOD_OLEAN not found, skipping..."
fi
# Test Bad.lean
if [ -f "$BAD_OLEAN" ]; then
echo "Testing $TEST_NAME/Bad.lean..."
if ! OUTPUT=$(lake exe safe_verify $flags "$TARGET_OLEAN" "$BAD_OLEAN" 2>&1); then
echo "PASS: $TEST_NAME/Bad.lean (expected to fail)"
else
# If Bad.lean passes, check if Hack.olean exists and fails
if [ -f "$HACK_OLEAN" ]; then
if ! HACK_OUTPUT=$(lake exe safe_verify "$HACK_OLEAN" 2>&1); then
# Test multiple repo imports (BAD_OLEAN) has to import HACK_OLEAN from ../ search path
mkdir -p testtmp
cp -R .lake lakefile.lean lean-toolchain lake-manifest.json Main.lean SafeVerify testtmp/
cd testtmp
LAKE_OUTPUT=$(lake build 2>&1)
rm $HACK_OLEAN
if OUTPUT=$(lake exe safe_verify "$TARGET_OLEAN" "../$BAD_OLEAN" 2>&1); then
cd ..
rm -rf testtmp
echo "PASS: $TEST_NAME/Bad.lean (hack olean failed)"
else
cd ..
rm -rf testtmp
echo "FAIL: $TEST_NAME/Bad.lean (multi-repo test failed)"
echo "Output:"
echo "$OUTPUT"
exit 1
fi
else
echo "FAIL: $TEST_NAME/Bad.lean (expected to fail, hack olean passed)"
echo "Output:"
echo "$OUTPUT"
exit 1
fi
else
echo "FAIL: $TEST_NAME/Bad.lean (expected to fail but passed, no hack olean)"
echo "Output:"
echo "$OUTPUT"
exit 1
fi
fi
else
echo "Warning: $BAD_OLEAN not found, skipping..."
fi
done
echo "All tests completed successfully!"