5 Commits

Author SHA1 Message Date
Thomas Levine
a4d09016ab blarg 2016-02-26 18:27:40 +00:00
Thomas Levine
499b6ee131 update history 2016-02-26 18:20:39 +00:00
Thomas Levine
fb2a8e72e6 implement run on a single file 2016-02-26 18:19:26 +00:00
Thomas Levine
e7d5a35409 Automatic commit with j 2016-02-26 18:16:24 +00:00
Thomas Levine
5aba84246f test single file 2016-02-26 17:54:53 +00:00
22 changed files with 76 additions and 175 deletions

15
HISTORY
View File

@@ -4,9 +4,11 @@ HISTORY
Version 0.0.7
---------------------
### Molly-guard
The Molly-guard is now more accepting. For example, you no longer need to
pass -f in this case: https://github.com/creationix/nvm/issues/357
### Skipping tests
Previously, tests were run if they were executable and were otherwise marked
as skipped. Now, an executable script can indicate that it is skipped by
exiting with code 3. For example, if a test requires some dependancy, it
@@ -24,6 +26,19 @@ would the appropriate status code if these tests were Nagios plugins, as the
concept of skipping a test is similar to the Nagios concept of unknown service
status (https://nagios-plugins.org/doc/guidelines.html#AEN78).
### Run on a file
It is now possible to run urchin on a single file.
This occurred to me when I wanted to run
urchin test/fast/Unit\ tests/nvm_ls_current
on the nvm tests. I wound up running this instead.
urchin test/fast/Unit\ tests/ | grep nvm_ls_current
The Molly guard is assessed, and the corresponding setup, setup_dir,
teardown, and teardown_dir files are run in the appropriate order.
Version 0.0.6
---------------------

28
TODO
View File

@@ -19,11 +19,6 @@ 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
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
-------------
I want long options. For example, there's presently -f and -e.
@@ -128,29 +123,6 @@ cleanly create and teardown temporary files.
On the other hand, this could just be sourced explicitly in the test file,
without the special setup and teardown feature.
Run on a file
----------------
Presently you can run urchin only on a directory.
It would be neat if you could run it on a file as well.
This occurred to me when I wanted to run
urchin test/fast/Unit\ tests/nvm_ls_current
on the nvm tests. I wound up running this instead.
urchin test/fast/Unit\ tests/ | grep nvm_ls_current
The Molly guard would be assessed, and the corresponding setup, setup_dir,
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
-------------------------
Urchin might be appropriate for if you have lots of tasks that you want to run

View File

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

0
tests/Single file/.test Executable file
View File

View File

@@ -0,0 +1 @@
echo setup

View File

@@ -0,0 +1 @@
echo setup_dir

View File

@@ -0,0 +1 @@
echo teardown

View File

@@ -0,0 +1 @@
echo teardown_dir

View File

@@ -0,0 +1,2 @@
echo thetest
exit 1

View File

@@ -0,0 +1,3 @@
#!/bin/sh
../../urchin .test
# This will exit 0 if it worked.

View File

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

View File

@@ -0,0 +1,4 @@
tmp=$(mktemp)
echo "Using temp file $tmp"
../../urchin .wrappers > $tmp
diff $tmp .wrapper-expectation

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,2 +0,0 @@
#!/bin/sh
../../urchin --root /bin 2>&1 | grep "'/bin/.urchin'"

View File

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

View File

@@ -1,4 +0,0 @@
#!/bin/sh
I_AM_SOURCING_URCHIN_IN_A_TEST=true . ../../urchin
test $(get_stdout_file t) = aoeu

110
urchin
View File

@@ -7,7 +7,7 @@
# No part of urchin, including this file, may be copied, modified, propagated,
# or distributed except according to the terms contained in the COPYING file.
set +e
# Make sure that CDPATH isn't set, as it causes `cd` to behave unpredictably -
# notably, it can produce output, which breaks fullpath().
@@ -16,44 +16,6 @@ unset CDPATH
# Urchin version number
VERSION=0.0.6
urchin_root() {
# Call recursively but remember the original argument.
current="$(remove_trailing_slash "$1")"
if test -n "$2"; then
orig="$2"
else
orig="$1"
fi
if test "$(readlink -f -- "$1")" = /; then
# Stop traversing upwards at /
if test -d "$orig"; then
origdir="$orig"
else
origdir=$(dirname "$orig")
fi
echo "You need to create the .urchin directory in the root of your tests,
maybe like this:
mkdir '$(readlink -f -- "$(remove_trailing_slash "$origdir")")/.urchin'
" >&2
return 1
elif ! test -e "$current"; then
echo "$current: No such file or directory">&2
return 1
elif test -f "$current"; then
urchin_root "$(dirname "$current")" "$orig"
elif test -d "$current"/.urchin; then
remove_trailing_slash "$current"
elif test "$current" != . && test "$current" != .. &&
echo "$current" | grep '^\.' && > /dev/null; then
# Stop traversing upwards at hidden directories.
urchin_root / "$orig"
else
urchin_root "$current"/.. "$orig"
fi
}
indent() {
level="$1"
if test "$level" -gt 0; then
@@ -61,40 +23,16 @@ indent() {
fi
}
remove_trailing_slash() {
echo "$1" | sed s/\\/$//
}
escape_slashes() {
echo "$1" | sed s+/+\\\\/+g
}
get_stdout_file() {
root="$(readlink -f -- "$(urchin_root "$1")")"
test_file="$(readlink -f -- "$1")"
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() {
potential_test="$1"
indent_level="$2"
shell_for_sh_tests="$3"
[ "$potential_test" = '.urchin' ] && return
[ "$potential_test" = 'setup_dir' ] && return
[ "$potential_test" = 'teardown_dir' ] && return
[ "$potential_test" = 'setup' ] && return
[ "$potential_test" = 'teardown' ] && return
stdout_file="$(get_stdout_file "$potential_test")"
mkdir -p "$(dirname "$stdout_file")"
[ $indent_level -eq 0 ] && : > "$stdout_file"
if [ -d "$potential_test" ]
@@ -122,10 +60,8 @@ recurse() {
[ -f setup ] && [ -x setup ] && ./setup >> "$stdout_file"
# $2 instead of $indent_level so it doesn't clash
set +e
recurse "${test}" "$(( $2 + 1 ))" "$shell_for_sh_tests"
recurse "${test}" $(( $2 + 1 )) "$shell_for_sh_tests"
exit_code=$?
set -e
if $exit_on_fail && test $exit_code -ne 0; then
[ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file"
@@ -218,6 +154,7 @@ recurse() {
return 1
fi
fi
[ $indent_level -eq 0 ] && rm "$stdout_file"
}
has_sh_or_no_shebang_line() {
@@ -247,7 +184,6 @@ $USAGE
contain the word "test".
-t Format output in Test Anything Protocol (TAP)
-h, --help This help.
-r, --root Print the Urchin root for a particular file or directory.
-v Display the version number.
Go to https://github.com/tlevine/urchin for documentation on writing tests.
@@ -268,11 +204,12 @@ plural () {
}
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)"
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.
@@ -287,10 +224,7 @@ urchin_go() {
TEST_SHELL='/bin/sh'
fi
# 1 test folder
# 2 indentation level
# 3 shell to invoke test scripts with
recurse "$1" 0 "$2"
recurse "$1" 0 "$2" # test folder -- indentation level -- [shell to invoke test scripts with]
finish=$(date +%s)
elapsed=$(($finish - $start))
@@ -312,7 +246,7 @@ urchin_go() {
printf '%s\n' "$failed $(plural test "$failed") failed."
printf '\033[m'
fi
# rm -f "$logfile"
rm -f "$logfile"
test -z "$failed" || test "$failed" -eq '0'
}
@@ -328,7 +262,6 @@ urchin_molly_guard() {
exit 1
}
if test -z "$I_AM_SOURCING_URCHIN_IN_A_TEST"; then
shell_for_sh_tests=
force=false
exit_on_fail=false
@@ -338,10 +271,6 @@ if test -z "$I_AM_SOURCING_URCHIN_IN_A_TEST"; then
case "$1" in
-e) exit_on_fail=true;;
-f) force=true;;
-r|--root)
shift
urchin_root "$1"
exit;;
-s)
shift
shell_for_sh_tests=$1
@@ -362,23 +291,18 @@ if test -z "$I_AM_SOURCING_URCHIN_IN_A_TEST"; then
shift
done
# Verify argument for main stuff
if [ "$#" != '1' ] || [ ! -d "$1" ]
then
[ -n "$1" ] && [ ! -d "$1" ] && echo "Not a directory: '$1'" >&2
echo "$USAGE" >&2
exit 11
fi
# Run or present the Molly guard.
if ! urchin_root "$1" > /dev/null; then
exit 1
elif basename "$(readlink -f -- "$(urchin_root "$1")")" |
grep -Fi 'test' > /dev/null || $force; then
logfile="$(readlink -f -- "$(urchin_root "$1")/.urchin/.log")"
printf '' > "$logfile"
thetest=$(readlink -f "$1")
if echo "$thetest" | grep -Fi 'test' > /dev/null || $force; then
if test -d "$1"; then
d="$thetest"
else
d=$(echo "$thetest" | sed 's/\/[^\/]\{1,\}$//')
cd "$d"
fi
logfile="$d/.urchin.log"
stdout_file="$d/.urchin_stdout"
urchin_go "$1" "$shell_for_sh_tests"
else
urchin_molly_guard
fi
fi