Compare commits
	
		
			12 Commits
		
	
	
		
			max-forks
			...
			urchin-roo
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 2e278597c9 | ||
|  | f67dedd7ff | ||
|  | e4c880a052 | ||
|  | e5ba45ae96 | ||
|  | 31e0b9fcb7 | ||
|  | 3efcf0aa33 | ||
|  | 97faea610c | ||
|  | f9ddefcf54 | ||
|  | 54b9e5887d | ||
|  | c9af70b947 | ||
|  | 83af249dcd | ||
|  | 160222c0eb | 
							
								
								
									
										2
									
								
								tests/.urchin/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								tests/.urchin/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | * | ||||||
|  | !.gitignore | ||||||
							
								
								
									
										6
									
								
								tests/Test root contains .urchin./.meta-assess
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								tests/Test root contains .urchin./.meta-assess
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | #!/bin/sh | ||||||
|  |  | ||||||
|  | observed=$(../../urchin "$1" .testsuite/a/b) | ||||||
|  | expected=.testsuite/a/b/../.. | ||||||
|  |  | ||||||
|  | test "$observed" = "$expected" | ||||||
							
								
								
									
										2
									
								
								tests/Test root contains .urchin./.testsuite/.urchin/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								tests/Test root contains .urchin./.testsuite/.urchin/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | * | ||||||
|  | !.gitignore | ||||||
							
								
								
									
										1
									
								
								tests/Test root contains .urchin./.testsuite/a/b/c/testcase
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										1
									
								
								tests/Test root contains .urchin./.testsuite/a/b/c/testcase
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | #!/usr/bin/env true | ||||||
							
								
								
									
										3
									
								
								tests/Test root contains .urchin./Assess root on a file.
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								tests/Test root contains .urchin./Assess root on a file.
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,3 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | #!/bin/sh | ||||||
|  | ../../urchin --root .testsuite/a/b/c/testcase | ||||||
							
								
								
									
										2
									
								
								tests/Test root contains .urchin./Assess root with --root.
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								tests/Test root contains .urchin./Assess root with --root.
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | ./.meta-assess --root | ||||||
							
								
								
									
										2
									
								
								tests/Test root contains .urchin./Assess root with -r.
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								tests/Test root contains .urchin./Assess root with -r.
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | ./.meta-assess -r | ||||||
							
								
								
									
										8
									
								
								tests/Test root contains .urchin./No root set
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										8
									
								
								tests/Test root contains .urchin./No root set
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | set -e | ||||||
|  |  | ||||||
|  | tmp=$(mktemp -d) | ||||||
|  | ../../urchin --root $tmp 2>&1 | grep suppress | ||||||
|  | ../../urchin --root $tmp 2>&1 | grep "'$tmp/.urchin'" | ||||||
|  | ../../urchin --root $tmp | ||||||
|  | rm -R "$tmp" | ||||||
							
								
								
									
										2
									
								
								tests/Test root contains .urchin./Wrong filename
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								tests/Test root contains .urchin./Wrong filename
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | #!/bin/sh | ||||||
|  | ! ../../urchin --root .testsuite/a/not-a-file | ||||||
							
								
								
									
										173
									
								
								urchin
									
									
									
									
									
								
							
							
						
						
									
										173
									
								
								urchin
									
									
									
									
									
								
							| @@ -7,7 +7,8 @@ | |||||||
| # No part of urchin, including this file, may be copied, modified, propagated, | # No part of urchin, including this file, may be copied, modified, propagated, | ||||||
| # or distributed except according to the terms contained in the COPYING file. | # or distributed except according to the terms contained in the COPYING file. | ||||||
|  |  | ||||||
|  | # Stop on error. | ||||||
|  | set -e | ||||||
|  |  | ||||||
| # Make sure that CDPATH isn't set, as it causes `cd` to behave unpredictably - | # Make sure that CDPATH isn't set, as it causes `cd` to behave unpredictably - | ||||||
| # notably, it can produce output, which breaks fullpath(). | # notably, it can produce output, which breaks fullpath(). | ||||||
| @@ -16,11 +17,37 @@ unset CDPATH | |||||||
| # Urchin version number | # Urchin version number | ||||||
| VERSION=0.0.6 | VERSION=0.0.6 | ||||||
|  |  | ||||||
| fullpath() { | urchin_root() { | ||||||
|   ( |   # Call recursively but remember the original argument. | ||||||
|     cd -- "$1" |   current="$1" | ||||||
|     pwd |   if test -n "$2"; then | ||||||
|   ) |     orig="$2" | ||||||
|  |   else | ||||||
|  |     orig="$1" | ||||||
|  |   fi | ||||||
|  |  | ||||||
|  |   if ! test -e "$current"; then | ||||||
|  |     echo "$current: No such file or directory">&2 | ||||||
|  |     exit 1 | ||||||
|  |   elif test -f "$current"; then | ||||||
|  |     urchin_root "$(dirname "$current")" "$orig" | ||||||
|  |   elif test -d "$current"/.urchin; then | ||||||
|  |     echo "$current" | ||||||
|  |   elif test "$(readlink -f "$current")" = /; then | ||||||
|  |     if test -d "$orig"; then | ||||||
|  |       origdir="$orig" | ||||||
|  |     else | ||||||
|  |       origdir=$(dirname "$orig") | ||||||
|  |     fi | ||||||
|  |     echo "You must create a .urchin directory to specify the urchin root. | ||||||
|  | Run something like this, and then run urchin again. | ||||||
|  |  | ||||||
|  |   mkdir '$origdir/.urchin' | ||||||
|  | " >&2 | ||||||
|  |     exit 1 | ||||||
|  |   else | ||||||
|  |     urchin_root "$current"/.. "$orig" | ||||||
|  |   fi | ||||||
| } | } | ||||||
|  |  | ||||||
| indent() { | indent() { | ||||||
| @@ -30,16 +57,36 @@ indent() { | |||||||
|   fi |   fi | ||||||
| } | } | ||||||
|  |  | ||||||
|  | escape_slashes() { | ||||||
|  |   echo "$1" | sed s+/+\\\\/+g | ||||||
|  | } | ||||||
|  |  | ||||||
|  | get_stdout_file() { | ||||||
|  |   root="$(readlink -f "$1")" | ||||||
|  |   test_file="$(readlink -f "$2")" | ||||||
|  |   eroot="$(escape_slashes "$root")" | ||||||
|  |   base="$(echo "$test_file" | sed "s/^$eroot/$eroot\/.urchin/")" | ||||||
|  |   if test -d "$1"; then | ||||||
|  |     echo "$base"/.index | ||||||
|  |   else | ||||||
|  |     echo "$base" | ||||||
|  |   fi | ||||||
|  | } | ||||||
|  |  | ||||||
| recurse() { | recurse() { | ||||||
|   potential_test="$1" |   potential_test="$1" | ||||||
|   indent_level="$2" |   indent_level="$2" | ||||||
|   shell_for_sh_tests="$3" |   shell_for_sh_tests="$3" | ||||||
|  |   root="$4" | ||||||
|  |  | ||||||
|   [ "$potential_test" = 'setup_dir' ] && return |   [ "$potential_test" = 'setup_dir' ] && return | ||||||
|   [ "$potential_test" = 'teardown_dir' ] && return |   [ "$potential_test" = 'teardown_dir' ] && return | ||||||
|   [ "$potential_test" = 'setup' ] && return |   [ "$potential_test" = 'setup' ] && return | ||||||
|   [ "$potential_test" = 'teardown' ] && return |   [ "$potential_test" = 'teardown' ] && return | ||||||
|  |  | ||||||
|  |   stdout_file="$(get_stdout_file "$root" "$potential_test")" | ||||||
|  |   mkdir -p "$(dirname "$stdout_file")" | ||||||
|  |  | ||||||
|   [ $indent_level -eq 0 ] && : > "$stdout_file" |   [ $indent_level -eq 0 ] && : > "$stdout_file" | ||||||
|  |  | ||||||
|   if [ -d "$potential_test" ] |   if [ -d "$potential_test" ] | ||||||
| @@ -67,7 +114,7 @@ recurse() { | |||||||
|         [ -f setup ] && [ -x setup ] && ./setup >> "$stdout_file" |         [ -f setup ] && [ -x setup ] && ./setup >> "$stdout_file" | ||||||
|  |  | ||||||
|         # $2 instead of $indent_level so it doesn't clash |         # $2 instead of $indent_level so it doesn't clash | ||||||
|         recurse "${test}" $(( $2 + 1 )) "$shell_for_sh_tests" |         recurse "${test}" "$(( $2 + 1 ))" "$shell_for_sh_tests" "$root" | ||||||
|         exit_code=$? |         exit_code=$? | ||||||
|  |  | ||||||
|         if $exit_on_fail && test $exit_code -ne 0; then |         if $exit_on_fail && test $exit_code -ne 0; then | ||||||
| @@ -161,7 +208,6 @@ recurse() { | |||||||
|       return 1 |       return 1 | ||||||
|     fi |     fi | ||||||
|   fi |   fi | ||||||
|   [ $indent_level -eq 0 ] && rm "$stdout_file" |  | ||||||
| } | } | ||||||
|  |  | ||||||
| has_sh_or_no_shebang_line() { | has_sh_or_no_shebang_line() { | ||||||
| @@ -191,6 +237,7 @@ $USAGE | |||||||
|             contain the word "test". |             contain the word "test". | ||||||
| -t          Format output in Test Anything Protocol (TAP) | -t          Format output in Test Anything Protocol (TAP) | ||||||
| -h, --help  This help. | -h, --help  This help. | ||||||
|  | -r, --root  Print the Urchin root for a particular file or directory. | ||||||
| -v          Display the version number. | -v          Display the version number. | ||||||
|  |  | ||||||
| Go to https://github.com/tlevine/urchin for documentation on writing tests. | Go to https://github.com/tlevine/urchin for documentation on writing tests. | ||||||
| @@ -210,53 +257,6 @@ plural () { | |||||||
|   fi |   fi | ||||||
| } | } | ||||||
|  |  | ||||||
| urchin_go() { |  | ||||||
|   rm -f "$logfile" |  | ||||||
|   if "$tap_format"; then |  | ||||||
|     printf \#\  |  | ||||||
|   fi |  | ||||||
|   echo Running tests at $(date +%Y-%m-%dT%H:%M:%S) |  | ||||||
|   start=$(date +%s) |  | ||||||
|  |  | ||||||
|   # Determine the environment variable to define for test scripts |  | ||||||
|   # that reflects the specified or implied shell to use for shell-code tests. |  | ||||||
|   #  - Set it to the shell specified via -s, if any. |  | ||||||
|   #  - Otherwise, use its present value, if non-empty. |  | ||||||
|   #  - Otherwise, default to '/bin/sh'. |  | ||||||
|   if [ -n "$2" ] |  | ||||||
|     then |  | ||||||
|     TEST_SHELL="$2" |  | ||||||
|   elif [ -z "$TEST_SHELL" ] |  | ||||||
|     then |  | ||||||
|     TEST_SHELL='/bin/sh' |  | ||||||
|   fi |  | ||||||
|  |  | ||||||
|   recurse "$1" 0 "$2"  # test folder -- indentation level -- [shell to invoke test scripts with] |  | ||||||
|  |  | ||||||
|   finish=$(date +%s) |  | ||||||
|   elapsed=$(($finish - $start)) |  | ||||||
|  |  | ||||||
|   passed=$(grep -c '^success' "$logfile") |  | ||||||
|   failed=$(grep -c '^fail' "$logfile") |  | ||||||
|   skipped=$(grep -c '^skip' "$logfile") |  | ||||||
|   if $tap_format; then |  | ||||||
|     echo "# Took $elapsed $(plural second $elapsed)." |  | ||||||
|     echo 1..$(($passed + $failed + $skipped)) |  | ||||||
|   else |  | ||||||
|     echo "Done, took $elapsed $(plural second $elapsed)." |  | ||||||
|     printf '%s\n' "$passed $(plural test "$passed") passed." |  | ||||||
|     printf '%s\n' "$skipped $(plural test "$skipped") skipped." |  | ||||||
|  |  | ||||||
|     # If tests failed, print the message in red, otherwise in green. |  | ||||||
|     [ $failed -gt 0 ] && printf '\033[31m' || printf '\033[32m' |  | ||||||
|  |  | ||||||
|     printf '%s\n' "$failed $(plural test "$failed") failed." |  | ||||||
|     printf '\033[m' |  | ||||||
|   fi |  | ||||||
|   rm -f "$logfile" |  | ||||||
|   test -z "$failed" || test "$failed" -eq '0' |  | ||||||
| } |  | ||||||
|  |  | ||||||
| urchin_molly_guard() { | urchin_molly_guard() { | ||||||
|   { |   { | ||||||
|     echo |     echo | ||||||
| @@ -278,6 +278,10 @@ do | |||||||
|     case "$1" in |     case "$1" in | ||||||
|         -e) exit_on_fail=true;; |         -e) exit_on_fail=true;; | ||||||
|         -f) force=true;; |         -f) force=true;; | ||||||
|  |         -r|--root) | ||||||
|  |           shift | ||||||
|  |           urchin_root "$1" | ||||||
|  |           exit;; | ||||||
|         -s) |         -s) | ||||||
|           shift |           shift | ||||||
|           shell_for_sh_tests=$1 |           shell_for_sh_tests=$1 | ||||||
| @@ -306,14 +310,59 @@ if [ "$#" != '1' ] || [ ! -d "$1" ] | |||||||
|   exit 11 |   exit 11 | ||||||
| fi | fi | ||||||
|  |  | ||||||
| # Constants |  | ||||||
| logfile=$(fullpath "$1")/.urchin.log |  | ||||||
| stdout_file=$(fullpath "$1")/.urchin_stdout |  | ||||||
|  |  | ||||||
| # Run or present the Molly guard. | # Run or present the Molly guard. | ||||||
| if fullpath "$1" | grep -Fi 'test' > /dev/null || $force | root="$(urchin_root "$1")" | ||||||
|   then | if basename "$(readlink -f "$root")" | | ||||||
|   urchin_go "$1" "$shell_for_sh_tests" |   grep -Fi 'test' > /dev/null || $force; then | ||||||
|  |   logfile="$(readlink -f "$root")/.urchin/.log" | ||||||
|  |   echo > "$logfile" | ||||||
|  |  | ||||||
|  |   if "$tap_format"; then | ||||||
|  |     printf \#\  | ||||||
|  |   fi | ||||||
|  |   echo Running tests at $(date +%Y-%m-%dT%H:%M:%S) | ||||||
|  |   start="$(date +%s)" | ||||||
|  |  | ||||||
|  |   # Determine the environment variable to define for test scripts | ||||||
|  |   # that reflects the specified or implied shell to use for shell-code tests. | ||||||
|  |   #  - Set it to the shell specified via -s, if any. | ||||||
|  |   #  - Otherwise, use its present value, if non-empty. | ||||||
|  |   #  - Otherwise, default to '/bin/sh'. | ||||||
|  |   if [ -n "$shell_for_sh_tests" ]; then | ||||||
|  |     TEST_SHELL="$shell_for_sh_tests" | ||||||
|  |   elif [ -z "$TEST_SHELL" ]; then | ||||||
|  |     TEST_SHELL='/bin/sh' | ||||||
|  |   fi | ||||||
|  |  | ||||||
|  |   # 1 test folder | ||||||
|  |   # 2 indentation level | ||||||
|  |   # 3 shell to invoke test scripts with | ||||||
|  |   # 4 urchin root | ||||||
|  |   recurse "$1" 0 "$shell_for_sh_tests" "$root" | ||||||
|  |  | ||||||
|  |   finish=$(date +%s) | ||||||
|  |   elapsed=$(($finish - $start)) | ||||||
|  |  | ||||||
|  |   passed=$(grep -c '^success' "$logfile") | ||||||
|  |   failed=$(grep -c '^fail' "$logfile") | ||||||
|  |   skipped=$(grep -c '^skip' "$logfile") | ||||||
|  |   if $tap_format; then | ||||||
|  |     echo "# Took $elapsed $(plural second $elapsed)." | ||||||
|  |     echo 1..$(($passed + $failed + $skipped)) | ||||||
|  |   else | ||||||
|  |     echo "Done, took $elapsed $(plural second $elapsed)." | ||||||
|  |     printf '%s\n' "$passed $(plural test "$passed") passed." | ||||||
|  |     printf '%s\n' "$skipped $(plural test "$skipped") skipped." | ||||||
|  |  | ||||||
|  |     # If tests failed, print the message in red, otherwise in green. | ||||||
|  |     [ $failed -gt 0 ] && printf '\033[31m' || printf '\033[32m' | ||||||
|  |  | ||||||
|  |     printf '%s\n' "$failed $(plural test "$failed") failed." | ||||||
|  |     printf '\033[m' | ||||||
|  |   fi | ||||||
|  |   rm -f "$logfile" | ||||||
|  |   test -z "$failed" || test "$failed" -eq '0' | ||||||
|  |  | ||||||
| else | else | ||||||
|   urchin_molly_guard |   urchin_molly_guard | ||||||
| fi | fi | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user