Repository navigation
Expand file tree
/
Copy pathtester
More file actions
executable file
Β·232 lines (205 loc) Β· 7.2 KB
/
Copy pathtester
File metadata and controls
executable file
Β·232 lines (205 loc) Β· 7.2 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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
#!/bin/bash
MINISHELL_PATH="../minishell"
# Run a specific test if the file name was specified
VALGRIND_FLAG=0
if [[ $1 ]]; then
if [[ $1 == "valgrind" ]]; then
VALGRIND_FLAG=1
test_lists=(
"builtins"
"pipes"
"redirects"
"extras"
)
else
test_lists=(
$1
)
fi
else
test_lists=(
"builtins"
"pipes"
"redirects"
"extras"
)
fi
if [[ $1 == "wildcards" || $1 == "bonus" ]]; then
MINISHELL_PATH="../minishell_bonus"
fi
#Define supressions for readline:wa
cat > readline.supp << EOF
{
name
Memcheck:Leak
fun:*alloc
...
obj:*/libreadline.so.*
...
}
{
leak readline
Memcheck:Leak
...
fun:readline
}
{
leak add_history
Memcheck:Leak
...
fun:add_history
}
EOF
VALGRIND_LOG="./test_files/valgrind_output.text"
touch "$VALGRIND_LOG" && chmod 0644 "$VALGRIND_LOG"
TEMP_OUTPUT="./test_files/temp_output"
VALGRIND_CMD="valgrind -s --suppressions=readline.supp --tool=memcheck -q --leak-check=full --show-leak-kinds=all --track-origins=yes --show-below-main=no"
total_leaks=0
total_fd_leaks=0
BOLD="\e[1m"
YELLOW="\033[0;33m"
GREY="\033[38;5;244m"
PURPLE="\033[0;35m"
BLUE="\033[0;36m"
RED="\e[0;31m"
END="\033[0m"
chmod 000 ./test_files/invalid_permission
mkdir -p ./outfiles
mkdir -p ./mini_outfiles
mkdir -p ./bash_outfiles
printf $RED
echo "π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯";
echo " ";
echo " ββ ββ β ββ β β βββββ β β βββββ β β ββββββ βββββ βββββ ββββββ βββββ βββββ ";
echo " βββ βββ β βββ β β β β β β β β ββ β β ββ β β ββ ";
echo " β ββββ β β β ββ β β βββββ βββββ ββββ β β ββ ββββ βββββ ββ ββββ βββββ ";
echo " β ββ β β β ββ β β β β β β β β ββ β β ββ β β ββ ";
echo " β β β β βββ β βββββ β β βββββ βββββ βββββ ββ βββββ βββββ ββ βββββ β ββ ";
echo " ";
echo "π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯π₯";
echo " ";
check_valgrind_output(){
local has_leaks=0
local has_fd_leaks=0
if grep -q "definitely lost: [^0]" "$VALGRIND_LOG" || \
grep -q "indirecly lost: [^0]" "$VALGRIND_LOG" || \
grep -A 2 -q "Invalid read of size" "$VALGRIND_LOG" || \
grep -A 2 -q "Invalid write" "$VALGRIND_LOG" || \
grep -q "possibly lost: [^0]" "$VALGRIND_LOG"; then
if !grep -q "suppressed: " "$VALGRIND_LOG" || \
!grep -q "readline\|add_history" "$VALGRIND_LOG"; then
has_leaks =1
((total_leaks++))
fi
fi
if grep -q "Open file descriptor" "$VALGRIND_LOG"; then
has_fd_leaks=1
((total_fd_leaks++))
fi
[ $has_leaks -eq 1 ] || [ $has_fd_leaks -eq 1 ]
}
PROMPT=$(echo -e "\nexit\n" | $MINISHELL_PATH | head -n 1 | sed "s/\x1B\[[0-9;]\{1,\}[A-Za-z]//g" )
# Helper commands:
REMOVE_COLORS="sed s/\x1B\[[0-9;]\{1,\}[A-Za-z]//g"
VALGRIND_OUTPUT_ENV="(GLIBC|LD_)"
REMOVE_OUTPUT="grep -v GLIBC | grep -v LD_ | grep -v MAKE"
REMOVE_EXIT="grep -v ^exit$"
for testfile in ${test_lists[*]}; do
printf $RED
echo ββββββββββββ $testfile
printf $END
while read teste; do
((i++))
rm -rf ./outfiles/*
rm -rf ./mini_outfiles/*
if [ $VALGRIND_FLAG -eq 1 ]; then
echo -e "$teste" | $VALGRIND_CMD $MINISHELL_PATH 2>"$VALGRIND_LOG" | $REMOVE_COLORS | grep -v GLIBC | grep -v LD_ | grep -v MAKE | grep -vF "$PROMPT" | $REMOVE_EXIT > $TEMP_OUTPUT
MINI_OUTPUT=$(cat $TEMP_OUTPUT)
else
MINI_OUTPUT=$(echo -e "$teste" | $MINISHELL_PATH 2> /dev/null | $REMOVE_COLORS | grep -vF "$PROMPT" | $REMOVE_EXIT )
fi
MINI_OUTFILES=$(cp ./outfiles/* ./mini_outfiles &>/dev/null)
MINI_EXIT_CODE=$(echo -e "$MINISHELL_PATH\n$teste\necho \$?\nexit\n" | bash 2> /dev/null | $REMOVE_COLORS | grep -vF "$PROMPT" | $REMOVE_EXIT | tail -n 1)
MINI_ERROR_MSG=$(trap "" PIPE && echo "$teste" | $MINISHELL_PATH 2>&1 > /dev/null | grep -o '[^:]*$' )
rm -rf ./outfiles/*
rm -rf ./bash_outfiles/*
BASH_OUTPUT=$(echo -e "$teste" | bash 2> /dev/null)
BASH_EXIT_CODE=$(echo $?)
BASH_OUTFILES=$(cp ./outfiles/* ./bash_outfiles &>/dev/null)
BASH_ERROR_MSG=$(trap "" PIPE && echo "$teste" | bash 2>&1 > /dev/null | grep -o '[^:]*$' | head -n1)
OUTFILES_DIFF=$(diff --brief ./mini_outfiles ./bash_outfiles)
printf $YELLOW
printf "Test %3s: " $i
if [[ "$MINI_OUTPUT" == "$BASH_OUTPUT" && "$MINI_EXIT_CODE" == "$BASH_EXIT_CODE" && -z "$OUTFILES_DIFF" ]]; then
printf β
((ok++))
if [ "$MINI_ERROR_MSG" != "$BASH_ERROR_MSG" ]; then
printf "β οΈ "
fi
else
printf β
fi
if check_valgrind_output; then
printf "π§"
fi
printf "$GREY $teste \n$END"
if [ "$OUTFILES_DIFF" ]; then
echo "$OUTFILES_DIFF"
echo mini outfiles:
cat ./mini_outfiles/*
echo bash outfiles:
cat ./bash_outfiles/*
fi
if [ "$MINI_OUTPUT" != "$BASH_OUTPUT" ]; then
echo mini output = \($MINI_OUTPUT\)
echo bash output = \($BASH_OUTPUT\)
fi
if [ "$MINI_EXIT_CODE" != "$BASH_EXIT_CODE" ]; then
echo mini exit code = $MINI_EXIT_CODE
echo bash exit code = $BASH_EXIT_CODE
fi
if [ "$MINI_ERROR_MSG" != "$BASH_ERROR_MSG" ]; then
echo mini error = \($MINI_ERROR_MSG\)
echo bash error = \($BASH_ERROR_MSG\)
fi
if check_valgrind_output; then
printf $RED
echo "Memory / File Descriptor issues detected:"
grep -v "readline\|add_history" "$VALGRIND_LOG" | grep -A 2 "definitely lost:" 2>/dev/null
grep -v "readline\|add_history" "$VALGRIND_LOG" | grep -A 2 "indirectly lost:" 2>/dev/null
grep -v "readline\|add_history" "$VALGRIND_LOG" | grep -A 2 "possibly lost:" 2>/dev/null
grep "Open file descriptor" "$VALGRIND_LOG" 2>/dev/null
printf $END
fi
done < $testfile
done
chmod 666 ./test_files/invalid_permission
rm -rf ./outfiles
rm -rf ./mini_outfiles
rm -rf ./bash_outfiles
rm -rf ./readline.supp
rm -rf ./valgrind_output.text
rm -rf ./temp_output
printf $PURPLE
printf $BOLD
echo "Test Results: $ok/$i"
if [ $VALGRIND_FLAG -eq 1 ]; then
echo "Memory Leaks: $total_leaks"
echo "File Descriptor Leaks: $total_fd_leaks"
fi
printf $END
if [[ "$ok" == "$i" && "$total_leaks" == "0" && "$total_fd_leaks" == "0" ]]; then
echo "π π π"
echo "π π π"
echo "π π π"
exit 0
else
if [[ "$ok" != "$i" ]]; then
echo "π Test failures detected π"
echo "π π π"
fi
if [[ "$total_leaks" != "0" || "$total_fd_leaks" != "0" ]]; then
echo "π§ Memory or FD leaks detected π§"
fi
exit 1
fi