diff --git a/srcs/shell_loop.c b/srcs/shell_loop.c index fd9d2c9..4c16075 100644 --- a/srcs/shell_loop.c +++ b/srcs/shell_loop.c @@ -6,7 +6,7 @@ /* By: lperrey +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2021/10/04 05:59:26 by lperrey #+# #+# */ -/* Updated: 2021/12/02 17:11:55 by hulamy ### ########.fr */ +/* Updated: 2021/12/03 07:06:35 by hulamy ### ########.fr */ /* */ /* ************************************************************************** */ @@ -23,8 +23,8 @@ void shell_loop(t_all *c) { if (line_input) free(line_input); -// write(2, c->prompt, ft_strlen(c->prompt)); -// rl_already_prompted = 1; + write(2, c->prompt, ft_strlen(c->prompt)); + rl_already_prompted = 1; // line_input = read_input(NULL, c); line_input = read_input(c->prompt, c); if (line_input && *line_input) diff --git a/tests/unit_tests/file.log b/tests/unit_tests/file.log index ca8f9cf..3093fdb 100644 --- a/tests/unit_tests/file.log +++ b/tests/unit_tests/file.log @@ -1,3 +1,3 @@ -hulamy@NoName:/home/simplonco/Nextcloud/informatique/42/minishell/minishell/tests s/unit_tests> echo test -test -hulamy@NoName:/home/simplonco/Nextcloud/informatique/42/minishell/minishell/tests s/unit_tests> exit +mybash a very long prompt to test the output in case of a redirection in a file> echo hello +hello +mybash a very long prompt to test the output in case of a redirection in a file> exit diff --git a/tests/unit_tests/logs/bash_log.txt b/tests/unit_tests/logs/bash_log.txt new file mode 100644 index 0000000..bdc6659 --- /dev/null +++ b/tests/unit_tests/logs/bash_log.txt @@ -0,0 +1,7 @@ + +simplonco@simplonco-Latitude-E6320:~/Nextcloud/informatique/42/minishell/minishell/tests/unit_tests$ echo hello +hello +simplonco@simplonco-Latitude-E6320:~/Nextcloud/informatique/42/minishell/minishell/tests/unit_tests$ exit +simplonco@simplonco-Latitude-E6320:~/Nextcloud/informatique/42/minishell/minishell/tests/unit_tests$ echo you +you +simplonco@simplonco-Latitude-E6320:~/Nextcloud/informatique/42/minishell/minishell/tests/unit_tests$ exit diff --git a/tests/unit_tests/logs/minishell_log.txt b/tests/unit_tests/logs/minishell_log.txt new file mode 100644 index 0000000..b72f15e --- /dev/null +++ b/tests/unit_tests/logs/minishell_log.txt @@ -0,0 +1,7 @@ + +hulamy@NoName:/home/simplonco/Nextcloud/informatique/42/minishell/minishell/tests s/unit_tests> echo hello +hello +hulamy@NoName:/home/simplonco/Nextcloud/informatique/42/minishell/minishell/tests s/unit_tests> exit +hulamy@NoName:/home/simplonco/Nextcloud/informatique/42/minishell/minishell/tests s/unit_tests> echo you +you +hulamy@NoName:/home/simplonco/Nextcloud/informatique/42/minishell/minishell/tests s/unit_tests> exit diff --git a/tests/unit_tests/main.c b/tests/unit_tests/main.c new file mode 100644 index 0000000..f3dfc34 --- /dev/null +++ b/tests/unit_tests/main.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include + +#define WHITE "\001\e[1;37m\002" +#define RESET "\001\e[0m\002" + +int main(void) +{ + char *prompt; + char *line_input; + + //prompt = WHITE"mybash a very long prompt to test the output in case of a redirection in a file> "RESET; + prompt = WHITE"mybash> "RESET; + line_input = NULL; + while (1) + { + if (line_input) + free(line_input); + line_input = readline(prompt); + if (line_input) + { + if (!strncmp(line_input, "echo ", 5)) + { + write(1, line_input + 5, strlen(line_input) - 5); + write(1, "\n", 1); + } + } + if (!line_input) + { + write(2, "exit\n", 5); + exit(0); + } + } +/* + prompt = WHITE"mybash a very long prompt to test the output in case of a redirection in a file, style longer than that even> "RESET; + write(1, prompt, strlen(prompt)); + write(1, "\n", 1); +*/ + return (0); +} diff --git a/tests/unit_tests/t0mm4rx_tests.md b/tests/unit_tests/t0mm4rx_tests.md new file mode 100644 index 0000000..06eb103 --- /dev/null +++ b/tests/unit_tests/t0mm4rx_tests.md @@ -0,0 +1,105 @@ +# Minishell tests + +Here are some tests for the minishell project of school 42 cursus. It's not exaustive, so don't limit yourself with this tests. +These tests are not all mines. Credits to vgoldman, mashar, and jecaudal. + +tmarx +# Tests + +- [ ] echo bonjour ; | +- [ ] echo bonjour | | +- [ ] | +- [ ] echo bonjour |; +- [ ] echo bonjour \; ls +- [ ] echo bonjour > test\ 1 +- [ ] cd $HOME/Documents +- [ ] echo "\s" & echo "\\s" +- [ ] echo \> +- [ ] echo -n -n -nnnn -nnnnm +- [ ] cat /dev/random | head -n 1 | cat -e +- [ ] unset var1 # with undefined var1 +- [ ] export "" et unset "" +- [ ] echo test > file test1 +- [ ] $ +- [ ] not_cmd bonjour > salut +- [ ] env puis export puis env # vars aren't sorted +- [ ] cat Makefile | grep pr | head -n 5 | cd test (mybin) # check status code +- [ ] cat Makefile | grep pr | head -n 5 | cat test (bin) # check status code +- [ ] cat Makefile | grep pr | head -n 5 | hello (NA) # check status code +- [ ] echo bonjour >>> test +- [ ] echo bonjour > > out +- [ ] echo 2 >> out1 > out2 +- [ ] echo 2 > out1 >> out2 +- [ ] cat < test # with non-existent test +- [ ] export var; export var=test +- [ ] echo bonjour > $test # with test not defined +- [ ] file_name_in_current_dir +- [ ] cd ../../../../../.. ; pwd +- [ ] ctrl-C . 130 sur bin(ex : sleep 10)&line vide +- [ ] ctrl-\ .131 sur bin +- [ ] echo "bip | bip ; coyotte > < \" " +- [ ] cat | cat | cat | ls # check outputs order +- [ ] $bla # with bla not defined +- [ ] export var ="cat Makefile | grep >" +- [ ] export "test=ici"=coucou +- [ ] c$var Makefile # with var=at +- [ ] $LESS$VAR +- [ ] /bin/echo bonjour +- [ ] not_cmd +- [ ] sleep 5 | exit +- [ ] echo bonjour > $test w/ t +- [ ] "exit retour a la ligne" +- [ ] minishell # binary not in path without "./" before +- [ ] cat diufosgid # check exit code +- [ ] exit # should return the last exit code value +- [ ] exit -10 +- [ ] exit +10 +- [ ] ; +- [ ] echo coucou | ; +- [ ] echo "$HOME" +- [ ] echo '$HOME' +- [ ] export ; env # display is different for both commands +- [ ] echo \$HOME +- [ ] > log echo coucou +- [ ] echo hudifg d | | hugdfihd +- [ ] echo +- [ ] echo simple +- [ ] echo -n simple +- [ ] echo '\' +- [ ] echo "\" +- [ ] echo "\\" +- [ ] echo "\n \n \n" +- [ ] echo "\n \\n \\\n" +- [ ] echo ;; +- [ ] echo hi";" hihi +- [ ] echo hi " ; " hihi +- [ ] cd +- [ ] cd . +- [ ] cd ~ +- [ ] cd / +- [ ] cd no_file +- [ ] cd a b c d +- [ ] pwd a +- [ ] pwd a b c d +- [ ] export LOL=lala ROR=rara +- [ ] unset LOL ROR +- [ ] export "HI= hi" +- [ ] export "HI =hi" +- [ ] /bin/ls +- [ ] # write something the press ctrl+c +- [ ] # write something then press ctrl+d +- [ ] # write something then press ctrl+\ +- [ ] echo $? +- [ ] l^Ds +- [ ] echo | +- [ ] | echo +- [ ] sort | ls # check output order +- [ ] cat < > +- [ ] cat < < +- [ ] cat > > +- [ ] > a ls > b < Makefile +- [ ] echo > a Hello World! +- [ ] > a echo Hello World! +- [ ] cat < Makefile | grep gcc > output +- [ ] exit 0 | exit 1 +- [ ] exit 1 | exit 0 \ No newline at end of file diff --git a/tests/unit_tests/test1.sh b/tests/unit_tests/test1.sh index c40b5f9..93c7b4c 100644 --- a/tests/unit_tests/test1.sh +++ b/tests/unit_tests/test1.sh @@ -1,6 +1,5 @@ echo hello + +# comment + echo you - -echo "how are" - -echo "you ?" diff --git a/tests/unit_tests/test_unit.sh b/tests/unit_tests/test_unit.sh index acb2f8f..c661e9f 100644 --- a/tests/unit_tests/test_unit.sh +++ b/tests/unit_tests/test_unit.sh @@ -6,6 +6,7 @@ ## if not found, launch test on default file list ## 2. execute the main for-loop ## it will iterate through the commands of each files +## if a line start with a # it's skipped ## if commands are not separated by empty line, it concat them ## then it calls the compare function "test_minishell" with commands ## and it calls the print function with the results @@ -38,42 +39,100 @@ ENDCO="\001\e[0m\002" # copy the executable to current directory + rm -rf ./minishell cp ../../minishell . -# list of tests files, by default ot in parameters - if [ $# == 0 ] - then - list_files=" - vrac.sh - pipes.sh - expensions.sh - redirections.sh - heredocs.sh - exit_status.sh - builtins.sh - " - else - list_files="" - for (( i = 1 ; i <= "$#" ; i++ )) - do - if [ -e "${!i}" ] - then - if [ -n "$list_files" ] - then - list_files+=$'\n' - fi - list_files+="${!i}" - else - echo "${!i} is not a valid file" - fi - done - fi - # globale variables UNIT_TEST=0 SUCCESS_TEST=0 TOTAL_TEST=0 TOTAL_SUCCESS=0 + LOG=0 + mkdir -p ./logs + echo "" > ./logs/bash_log.txt + echo "" > ./logs/minishell_log.txt + BASH_LOG="./logs/bash_log.txt" + MINISHELL_LOG="./logs/minishell_log.txt" + +# default list of files to be use + default_files="\ + vrac.sh + pipes.sh + expensions.sh + redirections.sh + exit_status.sh + builtins.sh" + #heredocs.sh + +# print usage + function print_usage + { + echo -en "$GREEN" + echo " usage :" + echo -en "$ENDCO" + echo -en "$CYAN" + echo " > bash test_unit.sh [options] [list files...]" + echo -en "$ENDCO" + echo "" + echo -en "$GREEN" + echo " if no files are given in parameters, the defaults will be used" + echo " defaults files :" + echo -en "$ENDCO" + echo -en "$CYAN" + echo "$default_files" + echo -en "$ENDCO" + echo "" + echo -en "$GREEN" + echo " options :" + echo -en "$ENDCO" + echo -en "$CYAN" + echo " help - print usage" + echo " log - log output into logs/" + echo -en "$ENDCO" + echo "" + echo -en "$GREEN" + echo " tests files are formated with the following rules :" + echo -en "$ENDCO" + echo -en "$CYAN" + echo " - a line starting with # is skipped" + echo " - an empty line separate two sets of commands" + echo " - other lines are commands" + echo " - multiples lines in a row are executed as following commands" + echo -en "$ENDCO" + echo "" + } + +# list of tests files, by default ot in parameters + if [ $# == 0 ] + then + list_files="$default_files" + else + if [ "$1" == "help" ] + then + print_usage + else + START=1 + if [ "$1" == "log" ] + then + LOG=1 + START=2 + fi + list_files="" + for (( i = $START ; i <= "$#" ; i++ )) + do + if [ -e "${!i}" ] + then + if [ -n "$list_files" ] + then + list_files+=$'\n' + fi + list_files+="${!i}" + else + echo "${!i} is not a valid file" + fi + done + fi + fi # function that will launch the command in bash and minishell and compare them function test_minishell @@ -81,6 +140,12 @@ # execute commands in bash and minishell bash_execution=$( echo "$@" | bash 2>/dev/null ) minishell_execution=$( echo "$@" | ./minishell 2>/dev/null ) + # if log options, log results + if [ "$LOG" == 1 ] + then + echo "$@" | bash -i &>>$BASH_LOG + echo "$@" | ./minishell &>>$MINISHELL_LOG + fi #compare output if [ "$bash_execution" = "$minishell_execution" ] then @@ -117,6 +182,7 @@ # the main loop: go through the files and call the compare func on each commands # parse tests files line by line, grouping lines non-separated by an empty line +# if line start with # it's ignore for i in $list_files do filename=$i @@ -127,22 +193,26 @@ SUCCESS_TEST=0 while read line do - if [ "$line" != "" ] + if [ -n "$line" ] then - if [ "$command_test" == "" ] + # if line start with # skip it + if [ "${line:0:1}" != "#" ] then - command_test="$line" - else - command_test+=$'\n' - command_test+="$line" + if [ "$command_test" == "" ] + then + command_test="$line" + else + command_test+=$'\n' + command_test+="$line" + fi + if [ "$line" == "$last_line" ] + then + (( UNIT_TEST++ )) + (( TOTAL_TEST++ )) + test_minishell "$command_test" + fi fi - if [ "$line" == "$last_line" ] - then - (( UNIT_TEST++ )) - (( TOTAL_TEST++ )) - test_minishell "$command_test" - fi - elif [ "$command_test" != "" ] + elif [ -z "$line" ] && [ -n "$command_test" ] then (( UNIT_TEST++ )) (( TOTAL_TEST++ )) diff --git a/tests/unit_tests/tests_discord.md b/tests/unit_tests/tests_discord.md new file mode 100644 index 0000000..9cae4e3 --- /dev/null +++ b/tests/unit_tests/tests_discord.md @@ -0,0 +1,56 @@ +rotrojan (Romain) — 06/10/2021 +si tu veux on m'a passé quelques listes de tests sympas ... 😈 + +fd leaks: +``` +ulimit -n # nombre de fd dispo max (pour expliquer le principe de fd leaks a l'evalué) +ls /proc/self/fd # affiche le nombre fd utilisés par le process enfant il faut donc repeter cette commande plusieurs fois lors de la correction pour verifier les fd leaks +ls | ls | ls /proc/self/fd # regarder le nombre de fd +ls | ls | ls | ls | ls | ls /proc/self/fd # le nombre de fd doit etre le meme que la ligne d'avant! +# essayer aussi avec des redirections! +``` +trivialités: +``` +#lancer minishell comme ceci puis faire des bails +env -i ./minishell + +# redirections: +>test # doit creer test +>>test # doit creer test +c >d # input b output d +# pipes +ls | cat # affiche ls +cat | ls # doit afficher ls puis doit exit apres un \n +# les redirections doivent etre faites APRES les pipes, (donc sont prioritaires par ecrasement) +cat a | < b cat | cat > c | cat # b doit etre copié dans c, rien ne doit etre ecrit dans stdout +# execution +./non_executable # permission denied exit code 126 +./directory +non_executable # avec non_executable dans un dossier du path, permission denied +cat < directory +``` +parsing : +``` +export A="s -la" #puis faire +l$A #doit executer un ls -la (donc que le split se fait apres le remplacement de var d'env) + +export A=p #puis faire +export B=w #puis faire +$A"$B"d #doit executer un pwd, puis faire +"$A"'$B'd #ne doit pas faire de pwd car les var d'env ne sont pas remplacee dans les simple quote + +echo "ls -la b" #doit afficher "ls -la b" +echo ok "" ok #doit avoir deux espaces car "" est un argument vide mais est un argument +echo ok "" "" "" "" "" "" "" "" "" ok #pour mieux voir ce qui est avant + +export OK="ok ok" #puis faire +echo $OK #doit afficher "ok ok" (un seul espace entre les deux, echo prends deux arguments) + +# si il y a le ; qui est fait +unset A #pour etre sur que la variable d'environnement existe pas puis faire la suite sur une autre ligne de commande +export A=ok; echo $A #doit afficher un ok +``` +https://github.com/t0mm4rx/minishell_tests + +@dkoriaki (Daniel) plusieurs de ces tests ne sont plus pertinents car ils concernaient l'ancien sujet de minishell, mais la plupart restent quand même intéressants diff --git a/tests/unit_tests/vrac.sh b/tests/unit_tests/vrac.sh index 8769af4..a1c9c86 100644 --- a/tests/unit_tests/vrac.sh +++ b/tests/unit_tests/vrac.sh @@ -1 +1,199 @@ -echo "vrac" +echo bonjour ; | + +echo bonjour | | + +| + +echo bonjour |; + +echo bonjour \; ls + +echo bonjour > test\ 1 + +cd $HOME/Documents + +echo "\s" & echo "\\s" + +echo \> + +echo -n -n -nnnn -nnnnm + +cat /dev/random | head -n 1 | cat -e + +unset blablabla + +export "" et unset "" + +echo test > file test1 + +$ + +not_cmd bonjour > salut + +env +export +env + +cat Makefile | grep pr | head -n 5 | cd test (mybin) +$? + +cat Makefile | grep pr | head -n 5 | cat test (bin) +$? + +cat Makefile | grep pr | head -n 5 | hello (NA) +$? + +echo bonjour >>> test + +echo bonjour > > out + +echo 2 >> out1 > out2 + +echo 2 > out1 >> out2 + +cat < blablabla + +export var; export var=test + +echo bonjour > $test + +file_name_in_current_dir + +cd ../../../../../.. ; pwd + +ctrl-C . 130 sur bin(ex : sleep 10)&line vide + +ctrl-\ .131 sur bin + +echo "bip | bip ; coyotte > < \" " + +cat | cat | cat | ls + +$blablabla + +export var ="cat Makefile | grep >" + +export "test=ici"=coucou + +export vat=at +c$var Makefile + +$LESS$VAR + +/bin/echo bonjour + +not_cmd + +sleep 5 | exit + +echo bonjour > $test w/ t + +"exit retour a la ligne" + +minishell +# binary not in path without "./" before + +cat diufosgid +$? + +exit +$? + +exit -10 + +exit +10 + +; + +echo coucou | ; + +echo "$HOME" + +echo '$HOME' + +export ; env # display is different for both commands + +echo \$HOME + +> log echo coucou + +echo hudifg d | | hugdfihd + +echo + +echo simple + +echo -n simple + +echo '\' + +echo "\" + +echo "\\" + +echo "\n \n \n" + +echo "\n \\n \\\n" + +echo ;; + +echo hi";" hihi + +echo hi " ; " hihi + +cd + +cd . + +cd ~ + +cd / + +cd no_file + +cd a b c d + +pwd a + +pwd a b c d + +export LOL=lala ROR=rara + +unset LOL ROR + +export "HI= hi" + +export "HI =hi" + +/bin/ls +write something the press ctrl+c +write something then press ctrl+d +write something then press ctrl+\ + +echo $? + +l^Ds + +echo | + +| echo + +sort | ls + +cat < > + +cat < < + +cat > > + +> a ls > b < Makefile + +echo > a Hello World! + +> a echo Hello World! + +cat < Makefile | grep gcc > output + +exit 0 | exit 1 + +exit 1 | exit 0