pipex/test.sh
2023-03-01 04:36:24 +01:00

1001 lines
38 KiB
Bash
Executable File

# **************************************************************************** #
# #
# .--. _ #
# test.sh |o_o || | #
# |:_/ || |_ _ ___ __ #
# By: houtworm <codam@houtworm.net> // \ \ __| | | \ \/ / #
# (| | )|_| |_| |> < #
# Created: 2023/02/20 12:46:49 by houtworm /'\_ _/`\__|\__,_/_/\_\ #
# Updated: 2023/02/25 02:41:01 by houtworm \___)=(___/ #
# #
# **************************************************************************** #
#!/bin/bash
OS=$(uname -s)
SLEEP=1
FAULTS=0
CATLOC=$(which cat)
mkdir -p tests
echo "Hallo\nHallo\nHallo" > tests/input
touch tests/perm tests/cmd
chmod 000 tests/perm
echo cat > tests/cmd
if [ $1 ]
then
SLEEP=$1
fi
checkfile()
{
ls $1 2> /dev/null | grep $1 > /dev/null
if [ $? -ne $2 ]
then
printf "\e[1;31mMakefile does not create $1\e[0;00m\n"
rm -rf tests/files
exit 1
fi
}
searchobj()
{
FILES=$(find ./ -name '*.o' | wc -l)
if [ $1 -eq 0 ]
then
if [ $FILES -ne 0 ]
then
printf "\e[1;31mObject files found after clean\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
fi
if [ $1 -eq 1 ]
then
if [ $FILES -eq 0 ]
then
printf "\e[1;31mObject files not found after make\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
fi
}
checkrule()
{
make $1 > /dev/null 2>&1
if [ $? -eq 2 ]
then
printf "\e[1;31mMissing rule $1\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
}
errorpermdenied()
{
ERRMSG=$(cat tests/error | grep "mission denied" | wc -l)
if [ $ERRMSG -eq $1 ]
then
printf "\e[1;32mError Message OK\e[0;00m\n"
else
printf "\e[1;31mWrong Error Message \e[0;00m\n"
cat tests/error
FAULTS=$(($FAULTS+1))
fi
}
errorfiledescri()
{
ERRMSG=$(cat tests/error | grep "file descri" | wc -l)
if [ $ERRMSG -eq $1 ]
then
printf "\e[1;32mError Message OK\e[0;00m\n"
else
printf "\e[1;31mWrong Error Message\e[0;00m\n"
cat tests/error
FAULTS=$(($FAULTS+1))
fi
}
errornotfound()
{
ERRMSG=$(cat tests/error | grep "not found" | wc -l)
if [ $ERRMSG -eq $1 ]
then
printf "\e[1;32mError Message OK\e[0;00m\n"
else
printf "\e[1;31mWrong Error Message\e[0;00m\n"
cat tests/error
FAULTS=$(($FAULTS+1))
fi
}
errorinvalid()
{
ERRMSG=$(cat tests/error | grep "option --" | wc -l)
if [ $ERRMSG -eq $1 ]
then
printf "\e[1;32mError Message OK\e[0;00m\n"
else
printf "\e[1;31mWrong Error Message\e[0;00m\n"
cat tests/error
FAULTS=$(($FAULTS+1))
fi
}
errorsuchfile()
{
ERRMSG=$(cat tests/error | grep "such file" | wc -l)
if [ $ERRMSG -eq $1 ]
then
printf "\e[1;32mError Message OK\e[0;00m\n"
else
printf "\e[1;31mWrong Error Message\e[0;00m\n"
cat tests/error
FAULTS=$(($FAULTS+1))
fi
}
errorclean()
{
ERRMSG=$(cat tests/error | grep " " | wc -l)
if [ $ERRMSG -eq 0 ]
then
printf "\e[1;32mError Message OK\e[0;00m\n"
else
printf "\e[1;31mPrinted Error Message\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
}
fourargs()
{
./pipex $1 "$2" "$3" $4 2> tests/error
RTRN=$?
< $1 $2 2> /dev/null | $3 > tests/expected 2> /dev/null
if [ $? -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be $? is $RTRN\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
diff $4 tests/expected
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
}
fournodiff()
{
timeout 2 ./pipex $1 "$2" "$3" $4 2> tests/error
RTRN=$?
< $1 $2 2> /dev/null | $3 > tests/expected 2> /dev/null
if [ $? -eq $RTRN ]
then
printf "\e[1;32mEndless command OK\e[0;00m\n"
else
printf "\e[1;31mYour pipex hangs forever\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
}
fiveargs()
{
./pipex $1 "$2" "$3" "$4" $5 2> tests/error
RTRN=$?
< $1 $2 2> /dev/null | $3 2> /dev/null | $4 > tests/expected 2> /dev/null
if [ $? -eq $RTRN ]
then
printf "\e[1;32mEndless command OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
diff $5 tests/expected
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
}
fivenodiff()
{
timeout 2 ./pipex $1 "$2" "$3" "$4" $5 2> tests/error
RTRN=$?
< $1 $2 2> /dev/null | $3 2> /dev/null | $4 > tests/expected 2> /dev/null
if [ $? -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mYour pipex hangs forever\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
}
wrongarg()
{
./pipex $2 $3 $4 $5 $6 $7
RTRN=$?
if [ $1 -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be $? is $RTRN\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
}
# Test 1
printf "\e[1;36mTest 1: Checking all source with Norminette\e[0;00m\n"
norminette > /dev/null 2>&1
if [ $? -eq 1 ]
then
printf "\e[1;31mYour shit is not norm!\e[0;00m\n"
FAULTS=$(($FAULTS+1))
else
printf "\e[1;32mNorminette OK\e[0;00m\n"
fi
sleep $SLEEP
# Test 2
printf "\e[1;36mTest 2: Checking all mandatory rules Makefile\e[0;00m\n"
checkrule all
checkfile pipex 0
searchobj 1
checkrule clean
searchobj 0
checkfile pipex 0
checkrule pipex
checkfile pipex 0
searchobj 1
checkrule fclean
searchobj 0
checkfile pipex 1
checkrule re
searchobj 1
checkfile pipex 0
if [ $FAULTS -eq 0 ]
then
printf "\e[1;32mMakefile rules OK\e[0;00m\n"
fi
sleep $SLEEP
# Test 3
printf "\e[1;36mTest 3: Checking if Makefile relinks\e[0;00m\n"
make 2>&1 | grep Nothing
if [ $? -eq 1 ]
then
printf "\e[1;31mMakefile relinks\e[0;00m\n"
FAULTS=$(($FAULTS+1))
else
printf "\e[1;32mMakefile OK\e[0;00m\n"
fi
sleep $SLEEP
# Test 4
printf "\e[1;36mTest 4: Running pipex with no arguments\e[0;00m\n"
wrongarg 1
sleep $SLEEP
# Test 5
printf "\e[1;36mTest 5: Running pipex with 1 argument\e[0;00m\n"
wrongarg 1 1
sleep $SLEEP
# Test 6
printf "\e[1;36mTest 6: Running pipex with 2 arguments\e[0;00m\n"
wrongarg 1 1 2
sleep $SLEEP
# Test 7
printf "\e[1;36mTest 7: Running pipex with 3 arguments\e[0;00m\n"
wrongarg 1 1 2 3
sleep $SLEEP
# Test 8
printf "\e[1;36mTest 8: Running pipex with 5 arguments\e[0;00m\n"
wrongarg 1 1 2 3 4 5
sleep $SLEEP
# Test 9
printf "\e[1;36mTest 9: Running pipex with 6 arguments\e[0;00m\n"
wrongarg 1 1 2 3 4 5 6
sleep $SLEEP
# Test 10
printf "\e[1;36mTest 10: Running pipex properly with basic commands\e[0;00m\n"
fourargs tests/input "cat" "cat" tests/output
errorclean
sleep $SLEEP
# Test 11
printf "\e[1;36mTest 11: Running pipex with commands with options\e[0;00m\n"
fourargs tests/input "cat -e" "cat -v" tests/output
errorclean
sleep $SLEEP
# Test 12
printf "\e[1;36mTest 12: Running pipex with commands with multiple options\e[0;00m\n"
fourargs tests/input "cat -u -v -e" "cat -v -b -e" tests/output
errorclean
sleep $SLEEP
# Test 13
printf "\e[1;36mTest 13: Running pipex with empty commands\e[0;00m\n"
./pipex tests/input "" "" tests/output 2> tests/error
< tests/input "" 2> /dev/null | "" > tests/expected 2> /dev/null
if [ $? -eq 127 ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be 127 is $?\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
diff tests/output tests/expected
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errornotfound 2
sleep $SLEEP
# Test 14
printf "\e[1;36mTest 14: Running pipex with space commands\e[0;00m\n"
./pipex tests/input " " " " tests/output 2> tests/error
RTRN=$?
< tests/input " " 2> /dev/null | " " > tests/expected 2> /dev/null
if [ 127 -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be 127 is $?\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
diff tests/output tests/expected
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errornotfound 2
sleep $SLEEP
# Test 15
printf "\e[1;36mTest 15: Running pipex with backticks\e[0;00m\n"
./pipex tests/input "`cat tests/cmd`" "`echo cat`" tests/output 2> tests/error
if [ $? -eq 0 ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be 0 is $?\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
< tests/input `cat tests/cmd` 2> /dev/null | `echo cat` > tests/expected 2> /dev/null
diff tests/output tests/expected
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errorclean
sleep $SLEEP
# Test 16
printf "\e[1;36mTest 16: Running pipex with \$()\e[0;00m\n"
fourargs tests/input "$(cat tests/cmd)" "$(echo cat)" tests/output
errorclean
sleep $SLEEP
# Test 17
printf "\e[1;36mTest 17: Running pipex with non existing input\e[0;00m\n"
fourargs doesnotexist "cat" "cat" tests/output
errorsuchfile 1
sleep $SLEEP
# Test 18
printf "\e[1;36mTest 18: Running pipex with nonexisting command 1\e[0;00m\n"
fourargs tests/input "doesnotexist" "cat" tests/output
errornotfound 1
sleep $SLEEP
# Test 19
printf "\e[1;36mTest 19: Running pipex with nonexisting command 2\e[0;00m\n"
fourargs tests/input "cat" "doesnotexist" tests/output
errornotfound 1
sleep $SLEEP
# Test 20
printf "\e[1;36mTest 20: Running pipex with nonexisting command 1 & 2\e[0;00m\n"
fourargs tests/input "doesnotexist" "doesnotexist" tests/output
errornotfound 2
sleep $SLEEP
# Test 21
printf "\e[1;36mTest 21: Running pipex with nonexisting input and command 1 \e[0;00m\n"
fourargs doesnotexist "doesnotexist" "cat" tests/output
errorsuchfile 1
sleep $SLEEP
# Test 22
printf "\e[1;36mTest 22: Running pipex with nonexisting option 1\e[0;00m\n"
fourargs tests/input "cat -r" "cat" tests/output
errorinvalid 1
sleep $SLEEP
# Test 23
printf "\e[1;36mTest 23: Running pipex with nonexisting option command 2\e[0;00m\n"
fourargs tests/input "cat" "cat -r" tests/output
errorinvalid 1
sleep $SLEEP
# Test 24
printf "\e[1;36mTest 24: Running pipex with nonexisting option command 1 & 2\e[0;00m\n"
fourargs tests/input "cat -r" "cat -r" tests/output
errorinvalid 2
sleep $SLEEP
# Test 25
printf "\e[1;36mTest 25: Running pipex with no read permissions on input\e[0;00m\n"
fourargs tests/perm "cat" "cat" tests/output
errorpermdenied 1
sleep $SLEEP
# Test 26
printf "\e[1;36mTest 26: Running pipex with no write permissions on existing output\e[0;00m\n"
./pipex tests/input "cat" "cat" tests/perm 2> tests/error
RTRN=$?
< tests/input "cat" 2> /dev/null | "cat" > tests/perm 2> /dev/null
if [ $? -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be $? is $RTRN\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errorpermdenied 1
sleep $SLEEP
# Test 27
printf "\e[1;36mTest 27: Running pipex with no execute permissions on command 1\e[0;00m\n"
fourargs tests/input tests/perm cat tests/output
errorpermdenied 1
sleep $SLEEP
# Test 28
printf "\e[1;36mTest 28: Running pipex with no execute permissions on command 2\e[0;00m\n"
fourargs tests/input cat tests/perm tests/output
errorpermdenied 1
sleep $SLEEP
# Test 29
printf "\e[1;36mTest 29: Running pipex with no execute permissions on command 1 & 2\e[0;00m\n"
fourargs tests/input tests/perm tests/perm tests/output
errorpermdenied 2
sleep $SLEEP
# Test 30
printf "\e[1;36mTest 30: Running pipex with no execute permissions on command 1 and input\e[0;00m\n"
fourargs tests/perm tests/perm cat tests/output
errorpermdenied 1
sleep $SLEEP
# Test 31
printf "\e[1;36mTest 31: Running pipex with no execute permissions on command 2 and input\e[0;00m\n"
fourargs tests/perm cat tests/perm tests/output
errorpermdenied 2
sleep $SLEEP
# Test 32
printf "\e[1;36mTest 32: Running pipex without the PATH env variable\e[0;00m\n"
export ATH=$PATH
unset PATH
./pipex tests/input "cat" "cat" tests/output 2> tests/error
< tests/input cat 2> /dev/null | cat > tests/expected 2> /dev/null
if [ $? -eq 127 ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be 127 is $?\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
export PATH=$ATH
diff tests/output tests/expected
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errorsuchfile 2
sleep $SLEEP
# Test 33
printf "\e[1;36mTest 33: Running pipex with double quotes\e[0;00m\n"
fourargs tests/input "echo ""hallo hallo""" "echo ""hallo hallo""" tests/output
errorclean
sleep $SLEEP
# Test 34
printf "\e[1;36mTest 34: Running pipex with single quotes\e[0;00m\n"
fourargs tests/input 'echo ''hallo hallo''' 'echo ''hallo hallo''' tests/output
errorclean
sleep $SLEEP
# Test 35
printf "\e[1;36mTest 35: Running pipex with double quotes in single quotes\e[0;00m\n"
fourargs tests/input 'echo "hallo hallo"' 'echo "hallo hallo"' tests/output
errorclean
sleep $SLEEP
# Test 36
printf "\e[1;36mTest 36: Running pipex with single quotes in double quotes\e[0;00m\n"
fourargs tests/input "echo 'hallo hallo'" "echo 'hallo hallo'" tests/output
errorclean
sleep $SLEEP
# Test 37
printf "\e[1;36mTest 37: Running pipex with Absolute paths\e[0;00m\n"
fourargs tests/input "$CATLOC" "$CATLOC" tests/output
errorclean
sleep $SLEEP
# Test 38
cp $CATLOC tests/cat
printf "\e[1;36mTest 38: Running pipex with Relative paths\e[0;00m\n"
fourargs tests/input "tests/cat" "tests/cat" tests/output
errorclean
sleep $SLEEP
# Test 39
printf "\e[1;36mTest 39: Running pipex here_doc as inputfile\e[0;00m\n"
fourargs here_doc "cat" "cat" tests/output
errorsuchfile 1
sleep $SLEEP
# Test 40
printf "\e[1;36mTest 40: Running pipex with 2 sleep commands\e[0;00m\n"
(time < tests/input sleep 1 | sleep 1 > tests/expected) 2>&1 > /dev/null | grep real | awk '{print substr($0,6,4);}' > tests/timereal
(time ./pipex tests/input "sleep 1" "sleep 1" tests/output) 2>&1 > /dev/null | grep real | awk '{print substr($0,6,4);}' > tests/timepipe
diff tests/timereal tests/timepipe
if [ $? -eq 0 ]
then
printf "\e[1;32mTime is OK\e[0;00m\n"
else
printf "\e[1;31mPipes should all be executed at once\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
sleep $SLEEP
# Test 41
printf "\e[1;36mTest 41: Running pipex with an endless command\e[0;00m\n"
fournodiff tests/input "cat /dev/random" "head -c 100" tests/expected
errorclean
sleep $SLEEP
# Test 42
printf "\e[1;36mTest 42: Checking if Makefile bonus rule exists\e[0;00m\n"
make fclean > /dev/null
make bonus >/dev/null 2>&1
if [ $? -eq 2 ]
then
printf "\e[1;31mNo bonus? I am a little dissapointed...\e[0;00m\n"
if [ $FAULTS -eq 0 ]
then
printf "\e[1;35mBut we got no errors, Congratulations\e[0;00m\n"
rm -rf tests
make fclean > /dev/null
exit 0
else
printf "\e[1;31mAnd we got $FAULTS errors\nSo that's a bummer\e[0;00m\n"
make fclean > /dev/null
rm -rf tests
exit 1
fi
fi
printf "\e[1;32mbonus rule OK\e[0;00m\n"
sleep $SLEEP
# Test 43
printf "\e[1;36mTest 43: Checking if Makefile relinks for bonus\e[0;00m\n"
make bonus 2>&1 | grep Nothing
if [ $? -eq 1 ]
then
printf "\e[1;31mMakefile relinks on bonus\e[0;00m\n"
FAULTS=$(($FAULTS+1))
else
printf "\e[1;32mMakefile bonus OK\e[0;00m\n"
fi
sleep $SLEEP
# Test 44
printf "\e[1;36mTest 44: Running pipex properly with basic commands\e[0;00m\n"
fiveargs tests/input "cat" "cat" "cat" tests/output
errorclean
sleep $SLEEP
# Test 45
printf "\e[1;36mTest 45: Running pipex with commands with options\e[0;00m\n"
fiveargs tests/input "cat -e" "cat -b" "cat -v" tests/output
errorclean
sleep $SLEEP
# Test 46
printf "\e[1;36mTest 46: Running pipex with commands with multiple options\e[0;00m\n"
fiveargs tests/input "cat -u -b -e" "cat -v -b -e" "cat -v -b -e" tests/output
errorclean
sleep $SLEEP
# Test 47
printf "\e[1;36mTest 47: Running pipex with empty commands\e[0;00m\n"
./pipex tests/input "" "" "" tests/output 2> tests/error
if [ $? -eq 127 ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be 127 is $?\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
< tests/input "" 2> /dev/null | "" 2> /dev/null | "" > tests/expected 2> /dev/null
diff tests/output tests/expected
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errornotfound 3
sleep $SLEEP
# Test 48
printf "\e[1;36mTest 48: Running pipex with space commands\e[0;00m\n"
./pipex tests/input " " " " " " tests/output 2> tests/error
RTRN=$?
< tests/input " " 2> /dev/null | " " 2> /dev/null | " " > tests/expected 2> /dev/null
if [ 127 -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be 127 is $?\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
diff tests/output tests/expected
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errornotfound 3
sleep $SLEEP
# Test 49
printf "\e[1;36mTest 49: Running pipex with double quotes\e[0;00m\n"
fiveargs tests/input "echo ""hallo hallo""" "echo ""hallo hallo""" "echo ""hallo hallo""" tests/output
errorclean
sleep $SLEEP
# Test 50
printf "\e[1;36mTest 50: Running pipex with single quotes\e[0;00m\n"
fiveargs tests/input 'echo ''hallo hallo''' 'echo ''hallo hallo''' 'echo ''hallo hallo''' tests/output
errorclean
sleep $SLEEP
# Test 51
printf "\e[1;36mTest 51: Running pipex with double quotes in single quotes\e[0;00m\n"
fiveargs tests/input 'echo "hallo hallo"' 'echo "hallo hallo"' 'echo "hallo hallo"' tests/output
errorclean
sleep $SLEEP
# Test 52
printf "\e[1;36mTest 52: Running pipex with single quotes in double quotes\e[0;00m\n"
fiveargs tests/input "echo 'hallo hallo'" "echo 'hallo hallo'" "echo 'hallo hallo'" tests/output
errorclean
sleep $SLEEP
# Test 53
printf "\e[1;36mTest 53: Running pipex with Absolute paths\e[0;00m\n"
fiveargs tests/input "$CATLOC" "$CATLOC" "$CATLOC" tests/output
errorclean
sleep $SLEEP
# Test 54
cp $CATLOC tests/cat
printf "\e[1;36mTest 54: Running pipex with Relative paths\e[0;00m\n"
fiveargs tests/input "tests/cat" "tests/cat" "tests/cat" tests/output
errorclean
sleep $SLEEP
# Test 55
printf "\e[1;36mTest 55: Running pipex with backticks\e[0;00m\n"
./pipex tests/input "`cat tests/cmd`" "`echo cat`" "`cat tests/cmd`" tests/output 2> tests/error
if [ $? -eq 0 ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be 0 is $?\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
< tests/input `cat tests/cmd` 2> /dev/null | `echo cat` > tests/expected 2> /dev/null
diff tests/output tests/expected
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errorclean
sleep $SLEEP
# Test 56
printf "\e[1;36mTest 56: Running pipex with \$()\e[0;00m\n"
fiveargs tests/input "$(cat tests/cmd)" "$(echo cat)" "$(cat tests/cmd)" tests/output
errorclean
sleep $SLEEP
# Test 57
printf "\e[1;36mTest 57: Running pipex with non existing input\e[0;00m\n"
fiveargs doesnotexist "cat" "cat" "cat" tests/output
errorsuchfile 1
sleep $SLEEP
# Test 58
printf "\e[1;36mTest 58: Running pipex with nonexisting command 1\e[0;00m\n"
fiveargs tests/input "doesnotexist" "cat" "cat" tests/output
errornotfound 1
sleep $SLEEP
# Test 59
printf "\e[1;36mTest 59: Running pipex with nonexisting command 2\e[0;00m\n"
fiveargs tests/input "cat" "doesnotexist" "cat" tests/output
errornotfound 1
sleep $SLEEP
# Test 60
printf "\e[1;36mTest 60: Running pipex with nonexisting command 3\e[0;00m\n"
fiveargs tests/input "cat" "cat" "doesnotexist" tests/output
errornotfound 1
sleep $SLEEP
# Test 61
printf "\e[1;36mTest 61: Running pipex with nonexisting command 1, 2 & 3\e[0;00m\n"
fiveargs tests/input "doesnotexist" "doesnotexist" "doesnotexist" tests/output
errornotfound 3
sleep $SLEEP
# Test 62
printf "\e[1;36mTest 62: Running pipex with nonexisting input and command 1 \e[0;00m\n"
fiveargs doesnotexist "doesnotexist" "cat" "cat" tests/output
errorsuchfile 1
sleep $SLEEP
# Test 63
printf "\e[1;36mTest 63: Running pipex with nonexisting option 1\e[0;00m\n"
fiveargs tests/input "cat -r" "cat" "cat" tests/output
errorinvalid 1
sleep $SLEEP
# Test 64
printf "\e[1;36mTest 64: Running pipex with nonexisting option command 3\e[0;00m\n"
fiveargs tests/input "cat" "cat" "cat -r" tests/output
errorinvalid 1
sleep $SLEEP
# Test 65
printf "\e[1;36mTest 65: Running pipex with nonexisting option command 1, 2 & 3\e[0;00m\n"
fiveargs tests/input "cat -r" "cat -r" "cat -r" tests/output
errorinvalid 3
sleep $SLEEP
# Test 66
printf "\e[1;36mTest 66: Running pipex with no read permissions on input\e[0;00m\n"
fiveargs tests/perm "cat" "cat" "cat" tests/output
errorpermdenied 1
sleep $SLEEP
# Test 67
printf "\e[1;36mTest 67: Running pipex with no write permissions on existing output\e[0;00m\n"
./pipex tests/input "cat" "cat" "cat" tests/perm 2> tests/error
RTRN=$?
< tests/input "cat" 2> /dev/null | "cat" 2> /dev/null | "cat" > tests/perm 2> /dev/null
if [ $? -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be $? is $RTRN\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errorpermdenied 1
sleep $SLEEP
# Test 68
printf "\e[1;36mTest 68: Running pipex with no execute permissions on command 1\e[0;00m\n"
fiveargs tests/input tests/perm cat cat tests/output
errorpermdenied 1
sleep $SLEEP
# Test 69
printf "\e[1;36mTest 69: Running pipex with no execute permissions on command 2\e[0;00m\n"
fiveargs tests/input cat tests/perm cat tests/output
errorpermdenied 1
sleep $SLEEP
# Test 70
printf "\e[1;36mTest 70: Running pipex with no execute permissions on command 3\e[0;00m\n"
fiveargs tests/input cat cat tests/perm tests/output
errorpermdenied 1
sleep $SLEEP
# Test 71
printf "\e[1;36mTest 71: Running pipex with no execute permissions on command 1, 2 & 3\e[0;00m\n"
fiveargs tests/input tests/perm tests/perm tests/perm tests/output
errorpermdenied 3
sleep $SLEEP
# Test 72
printf "\e[1;36mTest 72: Running pipex with no execute permissions on command 1 and input\e[0;00m\n"
fiveargs tests/perm tests/perm cat cat tests/output
errorpermdenied 1
sleep $SLEEP
# Test 73
printf "\e[1;36mTest 73: Running pipex with no execute permissions on command 3 and input\e[0;00m\n"
fiveargs tests/perm cat cat tests/perm tests/output
errorpermdenied 2
sleep $SLEEP
# Test 74
printf "\e[1;36mTest 74: Running pipex with heredoc empty lines\e[0;00m\n"
printf "press enter twice, type EOF and press enter again\n"
./pipex here_doc EOF "cat" "cat" tests/output 2> tests/error
RTRN=$?
<< EOF cat 2> /dev/null | cat >> tests/expected 2> /dev/null
EOF
if [ $? -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be $? is $RTRN\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
diff tests/output tests/expected > /dev/null 2>&1
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errorclean
sleep $SLEEP
# Test 75
printf "\e[1;36mTest 75: Running pipex with heredoc space before and after delimiter\e[0;00m\n"
printf "type ' EOF', press enter, type 'EOF', press enter again. without quotes, and notice the spaces\n"
./pipex here_doc EOF "cat" "cat" tests/output 2> tests/error
RTRN=$?
<< EOF cat 2> /dev/null | cat >> tests/expected 2> /dev/null
EOF
EOF
if [ $? -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be $? is $RTRN\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
diff tests/output tests/expected > /dev/null 2>&1
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errorclean
printf "\e[1;35mNote that we can't test 'EOF ' from this script, test it and huge lines to be sure\e[0;00m\n"
sleep $SLEEP
# Test 76
printf "\e[1;36mTest 76: Running pipex with well over a thousand pipes\e[0;00m\n"
if [ $OS == "Linux" ]
then
printf "\e[1;35mNote that this can have unpredictable behavior\e[0;00m\n"
./pipex tests/input cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat cat tests/output 2> /dev/null
RTRN=$?
< tests/input cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat | cat > tests/expected 2> /dev/null
if [ $? -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf ""
printf "\e[1;31mWrong return value should be $? is $RTRN\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
diff tests/output tests/expected > /dev/null 2>&1
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errorfiledescri 1
else
printf "\e[1;35mSkipping.... Test crashes the tester on $OS\e[0;00m\n"
fi
sleep $SLEEP
# Test 77
printf "\e[1;36mTest 77: Running pipex with all wrong options except the last\e[0;00m\n"
./pipex tests/input "cat -r" "cat -r" "cat -r" "cat -r" "cat -r" "cat -r" "cat -r" "cat -r" "cat -r" cat tests/output 2> tests/error
RTRN=$?
< tests/input cat -r 2> /dev/null | cat -r 2> /dev/null | cat -r 2> /dev/null | cat -r 2> /dev/null | cat -r 2> /dev/null | cat -r 2> /dev/null | cat -r 2> /dev/null | cat -r 2> /dev/null | cat -r 2> /dev/null | cat > tests/expected 2> /dev/null
if [ $? -eq $RTRN ]
then
printf "\e[1;32mReturn value OK\e[0;00m\n"
else
printf "\e[1;31mWrong return value should be $? is $RTRN\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
diff tests/output tests/expected > /dev/null 2>&1
if [ $? -eq 0 ]
then
printf "\e[1;32mOutput file OK\e[0;00m\n"
else
printf "\e[1;31mOutput files don't match\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
errorinvalid 9
sleep $SLEEP
# Test 78
printf "\e[1;36mTest 78: Running pipex with 3 sleep commands\e[0;00m\n"
(time < tests/input sleep 1 | sleep 1 > tests/expected) 2>&1 > /dev/null | grep real | awk '{print substr($0,6,4);}' > tests/timereal
(time ./pipex tests/input "sleep 1" "sleep 1" tests/output) 2>&1 > /dev/null | grep real | awk '{print substr($0,6,4);}' > tests/timepipe
diff tests/timereal tests/timepipe
if [ $? -eq 0 ]
then
printf "\e[1;32mTime is OK\e[0;00m\n"
else
printf "\e[1;31mPipes should all be executed at once\e[0;00m\n"
FAULTS=$(($FAULTS+1))
fi
sleep $SLEEP
# Test 79
printf "\e[1;36mTest 79: Running pipex with an endless command\e[0;00m\n"
fivenodiff tests/input "cat /dev/random" "base64" "head -c 100" tests/expected
errorclean
sleep $SLEEP
if [ $FAULTS -eq 0 ]
then
printf "\e[1;35mwe got no errors, Congratulations\e[0;00m\n"
else
printf "\e[1;31mwe got $FAULTS errors\nSo that's a bummer\e[0;00m\n"
rm -rf tests
make fclean > /dev/null
exit 1
fi
rm -rf tests
make fclean > /dev/null
exit 0