-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathtest_beleg_lokal.sh
293 lines (239 loc) · 7.07 KB
/
test_beleg_lokal.sh
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
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
#!/bin/bash
#
# @file test_/beleg_lokal.sh
# @brief Verifiziert ein gegebener RN Beleg und fuehrt mit diesem
# diverse Tests durch. Die Tests lehnen sich an dem
# Dokument bzgl. des Abgabeformats an.
# @author Raphael Pour <s74020@informatik.htw-dresden.de>
# @help https://bitbucket.org/evilc00kie/rn_beleg
# @date 08-2017
#
#
# CONFIGURATION
#
# Define mandatory files/directories which existens should be tested
mandatory_files=( "client-udp" "server-udp" "README.md" "make.sh" )
mandatory_directories=( "doc" "bin" "src")
ignored_extensions=( "jpg" "pdf" "png" "gif" "jpeg" "docx" "tex" "tikz" "doc" "class")
# Define scripts where the x right should be set via chmod
# This set should be a subset of the set $mandatory_files
accessable_scripts=( "client-udp" "server-udp" "make.sh" )
# Name of the Module
#modul="Rechnernetze/Kommunikationssysteme"
#module=""
# Banner
hint="Skript um einen Beleg auf häufig auftretende Fehler zu testen.
Inhaltliche Fehler im Java-Quellcode oder in den Shell-Skripten werden
nicht berücksichtigt. D.h. erfolgreiches Compilieren heißt nicht, dass der
Beleg semantisch funktionsfähig ist."
# Short description how to use this script
usage="Syntax: $0 <Archiv>\nArchiv\tDateiname des Belegs welcher als tar oder tar.gz vorliegt."
# Testing the server/client
timeout=600
port=3333
stats=stats.txt
testfile=random.txt
testfilesize=3000 # twice as big as the max. allowed MTU by every ethernet
debug=0
#
# CHECK SCRIPT
#
# == Checklist ==
# Archivename
# Mandatory Files
# Mandatory Directories
# Charset
# Lineending
# Access rights
# Makefile
# Check arguments
if [[ $# -ne 1 ]]
then
echo "Ungueltige Argumentenangabe"
echo -e $usage
exit 1
fi
echo -e "==$modul Beleg Testskript==\n"
echo -e "$hint\n"
archive="$1"
#IF ARCHIVE EXTENSION CAN ALSO BE ONLY TAR
# Check syntax of the archive name
#if [[ $archive =~ s[0-9]{5}\.tar$ ]]
#then
# without_extension=${archive%.*}
#elif [[ $archive =~ s[0-9]{5}\.tar\.gz$ ]]
#IF ARCHIVE EXTENSION CAN ALSO BE ONLY TAR
if [[ $archive =~ s[0-9]{5}\.tar\.gz$ ]]
then
without_extension=${archive%.*.*}
else
echo -e "Ungueltiger Archivname!\nArchivname: <s-nummer>.tar.gz"
exit 1
fi
beleg_directory=$(basename $without_extension)
# Check if archive exists
if [[ ! -f $archive ]]
then
echo "Archiv '$archive' konnte nicht gefunden werden"
exit 1
fi
# Create new directory where the archive should be extracted to
# Check if the directory is already existing and delete it
if [[ -d "$beleg_directory" ]]
then
$(rm -rf $beleg_directory)
fi
# Extract archive
tar -xf $archive
if [[ $? -ne 0 ]]
then
echo "Fehler beim Entpacken des Archivs."
exit 1
fi
# Check if mandatory files are existing
for file in ${mandatory_files[@]}
do
if [[ $debug -ne 0 ]]
then
echo $beleg_directory/$file
fi
if [[ ! -f "$beleg_directory/$file" ]]
then
echo "Datei $file fehlt"
exit 1
fi
done
# Check if mandatory directories are existing
for directory in ${mandatory_directories[@]}
do
if [[ ! -d "$beleg_directory/$directory" ]]
then
echo "Verzeichnis $directory fehlt"
exit 1
fi
done
# Check Charset is set to utf8 and lineending to LF Linux (LF) in each file
for file in $(find "$beleg_directory" ! -path . -type f)
do
fileLower=$(echo "$file"| tr '[:upper:]' '[:lower:]')
# Overstep all files having extensions from the
# ignored_extensions list
# This ensures that we don't check the charset of
# those files being for example in binary format
for extension in ${ignored_extensions[@]}
do
if [[ $fileLower == *"$extension"* ]]
then
continue 2
fi
done
# Overstep the archive itself
if [[ $fileLower == *"$archive"* ]]
then
continue
fi
# Check if file is empty
if [[ ! -s $file ]]
then
echo "$file ist leer oder existiert nicht."
exit 1
fi
# Get charset of the current file
charset=$(file -i "$file")
if [[ $debug -ne 0 ]]
then
echo "file -i $file: $charset"
fi
# Since us-ascii is 7-bit ASCII which is identical to utf-8
# on the first 128 chars (and us-ascii hasn't more)
# we also have to check for us-ascii.
# file -I returns us-ascii if a utf-8 file only contains
# chars from the first 128 chars of the charset
if [[ $charset == *"binary"* ]]
then
echo "Die Datei $file scheint eine Testdatei zu sein (da Binärformat vorliegt). Bitte diese Datei entfernen. Testdateien machen den Beleg nur unnötig groß."
exit 1
elif [[ ! $charset == *"utf-8"* && ! $charset == *"us-ascii" ]]
then
echo "$file ist nicht UTF-8 kodiert."
exit 1
fi
# Check line ending
lineending_result=$(file "$file")
if [[ $lineending_result == *"with CRLF"* ]]
then
echo "Datei $file hat keine Unix-Zeilenenden. Es wurden Windows-Zeilenenden erkannt. Bitte manuell oder mit dos2unix ändern"
exit 1
fi
done
# Check access rights of all scripts
for file in ${accessable_scripts[@]}
do
full_file_path="$beleg_directory/$file"
if [[ ! -x $full_file_path ]]
then
echo "$file ist nicht ausführbar. Bitte mit 'chmod +x <file>' die Skripte ausfuehrbar machen"
exit 1
fi
done
# Check if files can be compiled
cd $beleg_directory
# Remove all precompiled files in order to test if the
# make file generates something
rm -rf ./bin/* 2> /dev/null
echo "Ausgabe Makefile ==========="
./make.sh
make_error_code=$?
echo "Ende Ausgabe Makefile ======"
if [[ $make_error_code -ne 0 ]]
then
echo "Beleg konnte nicht kompiliert werden. Siehe Fehlerausgabe des Makefiles"
exit 1
fi
# Check if make file adds files to the bin directory.
# Javac should move the compiled class files into
# this directory
if [[ ! "$(ls -A ./bin/)" ]]
then
echo "Compilierte Dateien fehlen oder sind im falschen Verzeichnis"
exit 1
fi
cd ..
#
# Execute Client and Server and check if a transmission is successful
#
# Create random file
cat /dev/urandom | tr -cd 'a-f0-9' | head -c $testfilesize >> $testfile
crc_a=$(crc32 $testfile)
# Execute server and return
cd $beleg_directory
./server-udp $port 0.1 150&
cd ..
# Save PID in order to kill it later
server_pid=$!
# Execute client and trigger upload to server. This returns after the client finishes
#./$beleg_directory/client-udp localhost 3333 random.txt
echo "Ausgabe Client ==========="
command time -f "%e" -a -o $stats timeout $timeout ./$beleg_directory/client-udp localhost $port $testfile
echo "Ende Ausgabe Makefile ==========="
echo -n "Time needed:"
cat $stats
if [[ ! -f ./$beleg_directory/$testfile ]]
then
echo "Fehler bei Testübertragung: Datei wurde nicht übertragen."
rm $testfile
pkill -P $server_pid
exit -1
fi
crc_b=$(crc32 ./$beleg_directory/$testfile)
if [[ "$crc_a" -ne "$crc_b" ]]
then
echo "Fehler bei Testübertragung: CRC der Zieldatei stimmt nicht mit der Quelldatei überein"
rm $tesfile
pkill -P $server_pid
exit 1
fi
rm $testfile
pkill -P $server_pid
echo "$archive OK"
exit 1