-
-
Notifications
You must be signed in to change notification settings - Fork 2
154 lines (151 loc) · 5.15 KB
/
nightly.yml
File metadata and controls
154 lines (151 loc) · 5.15 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
154
name: Nightly
on:
schedule:
- cron: '0 3 * * *' # 3 AM UTC daily
workflow_dispatch: # Allow manual trigger
jobs:
sanitizer:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: mlugg/setup-zig@v2
with:
version: 0.15.2
- name: Tests (Debug — full safety checks)
run: zig build test
- name: Tests (ReleaseSafe — optimized + safety)
run: zig build test -Doptimize=ReleaseSafe
- name: Build ReleaseSafe
run: zig build -Doptimize=ReleaseSafe
- name: E2E under safety checks
run: bash test/e2e/run_e2e.sh
- name: Deps E2E under safety checks
run: bash test/e2e/deps/run_deps_e2e.sh
- name: Stress test — GC pressure
run: |
cat > /tmp/gc_stress.clj << 'EOF'
;; Allocate many objects to stress GC
(dotimes [_ 100]
(doall (map (fn [x] (vec (range x))) (range 100))))
(println "GC stress: OK")
EOF
timeout 60 ./zig-out/bin/cljw /tmp/gc_stress.clj
- name: Stress test — deep recursion
run: |
cat > /tmp/deep_recurse.clj << 'EOF'
(defn deep [n acc]
(if (zero? n) acc (recur (dec n) (inc acc))))
(println "Deep recursion:" (deep 100000 0))
EOF
timeout 30 ./zig-out/bin/cljw /tmp/deep_recurse.clj
- name: Stress test — large collections
run: |
cat > /tmp/large_coll.clj << 'EOF'
(let [v (vec (range 50000))
m (zipmap (range 10000) (range 10000))
s (set (range 10000))]
(println "vec:" (count v) "map:" (count m) "set:" (count s)))
EOF
timeout 30 ./zig-out/bin/cljw /tmp/large_coll.clj
fuzz:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- uses: mlugg/setup-zig@v2
with:
version: 0.15.2
- name: Build ReleaseSafe
run: zig build -Doptimize=ReleaseSafe
- name: Fuzz — random expressions (no crash = pass)
run: |
echo "Fuzzing with random expressions..."
PASS=0
CRASH=0
for i in $(seq 1 200); do
# Generate random expression
case $((RANDOM % 12)) in
0) expr="(+ $((RANDOM % 1000)) $((RANDOM % 1000)))" ;;
1) expr="(* $((RANDOM % 100)) $((RANDOM % 100)))" ;;
2) expr="(- $((RANDOM % 1000)) $((RANDOM % 1000)))" ;;
3) expr="(count (range $((RANDOM % 1000))))" ;;
4) expr="(reduce + (range $((RANDOM % 100 + 1))))" ;;
5) expr="(vec (take $((RANDOM % 50)) (range $((RANDOM % 100)))))" ;;
6) expr="(let [x $((RANDOM % 100))] (* x x))" ;;
7) expr="(apply str (repeat $((RANDOM % 100 + 1)) \"x\"))" ;;
8) expr="(nth (range 100) $((RANDOM % 100)))" ;;
9) expr="(mapv inc (range $((RANDOM % 100))))" ;;
10) expr="(filterv odd? (range $((RANDOM % 100))))" ;;
11) expr="(assoc {} :a $((RANDOM % 1000)) :b $((RANDOM % 1000)))" ;;
esac
# Run with timeout — errors are fine, crashes/hangs are not
if timeout 5 ./zig-out/bin/cljw -e "$expr" >/dev/null 2>&1; then
PASS=$((PASS + 1))
else
rc=$?
if [ "$rc" -eq 124 ]; then
echo "TIMEOUT: $expr"
CRASH=$((CRASH + 1))
elif [ "$rc" -gt 128 ]; then
echo "CRASH (signal $((rc - 128))): $expr"
CRASH=$((CRASH + 1))
else
# Normal error exit (e.g. division by zero) — acceptable
PASS=$((PASS + 1))
fi
fi
done
echo ""
echo "Fuzz results: $PASS ok, $CRASH crashes/timeouts (of 200)"
if [ "$CRASH" -gt 0 ]; then
exit 1
fi
- name: Fuzz — malformed input (no crash = pass)
run: |
echo "Fuzzing with malformed input..."
CRASH=0
EXPRS=(
"("
")"
"(("
"))"
"(+ 1"
"(defn)"
"(let)"
"(let [x])"
"(fn)"
"(if)"
"(try)"
"(catch)"
"[[[[[[[[[["
"(quote quote quote)"
"(def)"
"(do)"
"(loop)"
"(recur)"
"#{"
"#{{"
"@"
"@@@@"
"(deref)"
"(/ 1 0)"
"(nth [] 999)"
"(throw (Exception. \"test\"))"
"(assert false)"
""
)
for expr in "${EXPRS[@]}"; do
if [ -z "$expr" ]; then continue; fi
if timeout 5 ./zig-out/bin/cljw -e "$expr" >/dev/null 2>&1; then
: # ok
else
rc=$?
if [ "$rc" -eq 124 ] || [ "$rc" -gt 128 ]; then
echo "CRASH/TIMEOUT on: $expr (rc=$rc)"
CRASH=$((CRASH + 1))
fi
fi
done
echo "Malformed input: $CRASH crashes"
if [ "$CRASH" -gt 0 ]; then
exit 1
fi