14 Commits

Author SHA1 Message Date
Thomas Levine
2e278597c9 Automatic commit with j 2016-02-27 16:40:55 +00:00
Thomas Levine
f67dedd7ff .urchin directories 2016-02-27 16:38:36 +00:00
Thomas Levine
e4c880a052 revert to a default root like before 2016-02-27 16:33:05 +00:00
Thomas Levine
e5ba45ae96 nicer log file location 2016-02-27 16:05:48 +00:00
Thomas Levine
31e0b9fcb7 quote 2016-02-27 16:01:18 +00:00
Thomas Levine
3efcf0aa33 blah 2016-02-27 15:59:17 +00:00
Thomas Levine
97faea610c error message when no root is set 2016-02-27 14:50:04 +00:00
Thomas Levine
f9ddefcf54 fix test 2016-02-27 14:45:57 +00:00
Thomas Levine
54b9e5887d more urchin_root 2016-02-27 14:45:37 +00:00
Thomas Levine
c9af70b947 simpler urchin root 2016-02-27 14:41:37 +00:00
Thomas Levine
83af249dcd test urchin_root 2016-02-27 14:39:32 +00:00
Thomas Levine
160222c0eb test suite to test .urchin 2016-02-27 14:14:15 +00:00
Thomas Levine
4cd9d41a1e Automatic commit with j 2016-02-26 20:38:31 +00:00
Thomas Levine
e14d8edc05 .urchin in root idea 2016-02-26 18:30:33 +00:00
11 changed files with 151 additions and 62 deletions

12
TODO
View File

@@ -19,6 +19,11 @@ Hmm or maybe there's a compromise: Tell people to mount /tmp as a tmpfs so
that temp files are fast. Maybe allow people to set some other directory as that temp files are fast. Maybe allow people to set some other directory as
the temporary file place, in case they want a different tmpfs location. the temporary file place, in case they want a different tmpfs location.
In order to run things in parallel, we have to change how we do the
stdout_file. I think it's easiest to create separate files for each test and
to save them in testroot/.urchin/stdout/$filename. The test root would be
defined as the closest ancestor containing a .urchin directory.
Options Options
------------- -------------
I want long options. For example, there's presently -f and -e. I want long options. For example, there's presently -f and -e.
@@ -139,6 +144,13 @@ on the nvm tests. I wound up running this instead.
The Molly guard would be assessed, and the corresponding setup, setup_dir, The Molly guard would be assessed, and the corresponding setup, setup_dir,
teardown, and teardown_dir files would be run in the appropriate order. teardown, and teardown_dir files would be run in the appropriate order.
In order to know how far up the tree to evaluate the setup, &c. files,
I think it would make sense to require that a ".urchin" file be placed in the
root of the tests. Urchin would keep going up until it sees this file, and it
would evaluate the appropriate setup, &c. files from there down to the
particular test file of interest. We would also use this for testing
directtories more correctly.
Running automated tasks Running automated tasks
------------------------- -------------------------
Urchin might be appropriate for if you have lots of tasks that you want to run Urchin might be appropriate for if you have lots of tasks that you want to run

2
tests/.urchin/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -0,0 +1,6 @@
#!/bin/sh
observed=$(../../urchin "$1" .testsuite/a/b)
expected=.testsuite/a/b/../..
test "$observed" = "$expected"

View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -0,0 +1 @@
#!/usr/bin/env true

View File

@@ -0,0 +1,3 @@
#!/bin/sh
#!/bin/sh
../../urchin --root .testsuite/a/b/c/testcase

View File

@@ -0,0 +1,2 @@
#!/bin/sh
./.meta-assess --root

View File

@@ -0,0 +1,2 @@
#!/bin/sh
./.meta-assess -r

View 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"

View File

@@ -0,0 +1,2 @@
#!/bin/sh
! ../../urchin --root .testsuite/a/not-a-file

173
urchin
View File

@@ -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