Compare commits

..
26 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
Thomas Levine 15acd676f9 nagios explanation 2016-02-26 17:43:05 +00:00
Thomas Levine 0c73e5eb44 move skip tests to history 2016-02-26 17:39:18 +00:00
Thomas Levine bb103757e4 implement exit code 3 thing 2016-02-26 17:37:39 +00:00
Thomas Levine dce0adc768 test skip on exit code 3 2016-02-26 17:37:12 +00:00
Thomas Levine 80ebf28da9 test skipping idea 2016-02-26 16:39:53 +00:00
Thomas Levine 3f0e925975 move molly-guard change from todo to history 2016-02-26 16:26:22 +00:00
Thomas Levine 43674f12e2 more accepting molly-guard 2016-02-26 16:23:41 +00:00
Thomas Levine 9bb1366549 simpler truth test 2016-02-26 16:19:32 +00:00
Thomas Levine 643a1bf576 test a more accepting molly-guard 2016-02-26 16:18:49 +00:00
Thomas Levine 08ea7bb88f specify version in readme 2016-02-26 16:14:54 +00:00
Thomas Levine e5ada4899a task runner ideas 2016-02-26 15:57:21 +00:00
Thomas Levine c818033faa list alternatives 2016-02-14 16:38:02 +00:00
Thomas Levine 88572b6c90 to support single file runs 2016-02-14 07:44:07 +00:00
Thomas Levine 3e5e7334e8 sourcing idea 2016-02-11 20:18:35 +00:00
Thomas Levine 87bb9f4660 link to COPYING file on web 2016-02-08 16:09:00 +00:00
Thomas Levine caabcd25ff update HISTORY 2016-02-08 16:06:22 +00:00
Thomas Levine 8f82cf5aeb make long lines shorter 2016-02-08 16:05:56 +00:00
Thomas Levine 385ec3fe81 add a copying notice to the urchin excutable 2016-02-08 16:02:03 +00:00
Thomas Levine d4eb99ffb0 rename LICENSE -> COPYING 2016-02-08 15:59:56 +00:00
Thomas Levine ed939ff39a update history 2016-02-08 15:59:47 +00:00
Thomas Levine d24a71d0d7 copyright notice
add Thomas Levine and Michael Klement
2016-02-08 15:59:16 +00:00
24 changed files with 147 additions and 44 deletions
+2
View File
@@ -1,3 +1,5 @@
Copyright (c) 2013, 2014, 2015, 2016 Thomas Levine
Copyright (c) 2014, Michael Klement
Copyright (c) 2012, ScraperWiki Limited
All rights reserved.
+41
View File
@@ -1,6 +1,44 @@
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
might look for the dependency and then skip if it does not see the dependency.
It might look like this.
#!/bin/sh
if which inkscape; then
exit 3 # status code 3 for skip
fi
inkscape blah blah ...
I chose status code 3 sort of arbitrarily at first, but it turns out that it
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
---------------------
@@ -14,6 +52,9 @@ Version 0.0.6
* Remove the undocumented, experimental -x flag now that shall exists.
* Display version number with the -v flag.
* Document why Urchin is called "Urchin"
* Update TODO
* Support mksh (Change a printf command.)
* Make long lines shorter.
These changes are made somewhat separately in the branches "exit-on-fail",
"remove-urchin-x", "tap", and "update-readme". They are rebased into one
+26 -7
View File
@@ -1,13 +1,6 @@
Things I want
=============
Molly guard
-------------
The Molly-guard should be more accepting so that people don't have to use it
all the time and thus get used to using it. For example, you shouldn't need to
pass -f in this case.
https://github.com/creationix/nvm/issues/357
Test speed
-------------
Make tests run faster.
@@ -115,3 +108,29 @@ Nagios plugins
It would be cool to run Nagios plugins with Urchin. This is already possible,
actually, but it might be worth giving some special thought to it.
https://nagios-plugins.org/doc/guidelines.html
Source setup and teardown
--------------------
If setup and teardown are sourced instead of executed, maybe we can more
cleanly create and teardown temporary files.
(
. ./setup
./$thetestfile
. ./teardown
)
On the other hand, this could just be sourced explicitly in the test file,
without the special setup and teardown feature.
Running automated tasks
-------------------------
Urchin might be appropriate for if you have lots of tasks that you want to run
periodically; add an urchin call to your crontab, and call all of your other
tasks with urchin. Here are some features that might make urchin better for
this sort of thing.
* Time how long each test/job takes
* Optionally kill tests/jobs after a specific timeout threshold
* Send output of different tests/jobs to different files for each file
descriptor (STDOUT, STDERR)
+7
View File
@@ -1,2 +1,9 @@
Totally different syntax and similar features, plus TAP output
https://github.com/sstephenson/bats
Relatively similar interface
https://github.com/mlafeldt/sharness
Lists of alternatives
https://thomaslevine.com/!/shell-testing/
https://github.com/mlafeldt/sharness#alternatives
+1 -1
View File
@@ -36,7 +36,7 @@ Urchin is contained in a single file, so you can install it by copying it to a
directory in your `PATH`. For example, you can run the following as root.
cd /usr/local/bin
wget https://raw.github.com/tlevine/urchin/master/urchin
wget https://raw.githubusercontent.com/tlevine/urchin/v0.0.6/urchin
chmod +x urchin
Urchin can be installed with npm too.
View File
+1
View File
@@ -0,0 +1 @@
echo setup
+1
View File
@@ -0,0 +1 @@
echo setup_dir
+1
View File
@@ -0,0 +1 @@
echo teardown
+1
View File
@@ -0,0 +1 @@
echo teardown_dir
+2
View File
@@ -0,0 +1,2 @@
echo thetest
exit 1
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
../../urchin .test
# This will exit 0 if it worked.
+2
View File
@@ -0,0 +1,2 @@
#!/bin/sh
! ../../urchin not-a-file
@@ -0,0 +1,4 @@
tmp=$(mktemp)
echo "Using temp file $tmp"
../../urchin .wrappers > $tmp
diff $tmp .wrapper-expectation
@@ -1,3 +1,5 @@
#!/bin/sh
! ../../urchin ./.chainsaw
tmp=$(mktemp -d)/blah
echo '#!/usr/bin/env true' > $tmp
! ../../urchin $tmp
+1
View File
@@ -0,0 +1 @@
exit 1
+1
View File
@@ -0,0 +1 @@
exit 3
+1
View File
@@ -0,0 +1 @@
exit 0
+1
View File
@@ -0,0 +1 @@
test $(../../urchin -t .test/ | grep -c SKIP) -eq 1
+43 -29
View File
@@ -1,19 +1,21 @@
#!/bin/sh
# Make sure that CDPATH isn't set, as it causes `cd` to behave unpredictably - notably, it can produce output,
# which breaks fullpath().
# This file is part of urchin. It is subject to the license terms in the
# COPYING file found in the top-level directory of this distribution or at
# https://raw.githubusercontent.com/tlevine/urchin/master/COPYING
# No part of urchin, including this file, may be copied, modified, propagated,
# or distributed except according to the terms contained in the COPYING file.
# Make sure that CDPATH isn't set, as it causes `cd` to behave unpredictably -
# notably, it can produce output, which breaks fullpath().
unset CDPATH
# Urchin version number
VERSION=0.0.6
fullpath() {
(
cd -- "$1"
pwd
)
}
indent() {
level="$1"
if test "$level" -gt 0; then
@@ -94,6 +96,8 @@ recurse() {
[ -f teardown ] && [ -x teardown ] && ./teardown >> "$stdout_file"
if [ $exit_code -eq 0 ]; then
result=success
elif [ $exit_code -eq 3 ]; then
result=skip
else
result=fail
fi
@@ -133,7 +137,10 @@ recurse() {
# On fail, print a red '✗'
printf '\033[31m✗ \033[0m'
printf '%s\n' "${potential_test}"
printf '\033[31m' # Print output captured from failed test in red.
# Print output captured from failed test in red.
printf '\033[31m'
cat "$stdout_file"
printf '\033[0m'
;;
@@ -151,8 +158,13 @@ recurse() {
}
has_sh_or_no_shebang_line() {
head -n 1 "$1" | grep -vqE '^#!' && return 0 # no shebang line at all
head -n 1 "$1" | grep -qE '^#![[:blank:]]*/bin/sh($|[[:blank:]])' && return 0 # shebang line is '#!/bin/sh' or legal variations thereof
# no shebang line at all
head -n 1 "$1" | grep -vqE '^#!' && return 0
# shebang line is '#!/bin/sh' or legal variations thereof
head -n 1 "$1" | grep -qE '^#![[:blank:]]*/bin/sh($|[[:blank:]])' &&
return 0
return 1
}
@@ -227,7 +239,10 @@ urchin_go() {
echo "Done, took $elapsed $(plural second $elapsed)."
printf '%s\n' "$passed $(plural test "$passed") passed."
printf '%s\n' "$skipped $(plural test "$skipped") skipped."
[ $failed -gt 0 ] && printf '\033[31m' || printf '\033[32m' # If tests failed, print the message in red, otherwise in green.
# 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
@@ -259,8 +274,11 @@ do
-s)
shift
shell_for_sh_tests=$1
which "$shell_for_sh_tests" >/dev/null || { echo "Cannot find specified shell: '$shell_for_sh_tests'" >&2; urchin_help >&2; exit 2; }
;;
which "$shell_for_sh_tests" > /dev/null || {
echo "Cannot find specified shell: '$shell_for_sh_tests'" >&2
urchin_help >&2
exit 11
} ;;
-t) tap_format=true;;
-h|--help) urchin_help
exit 0;;
@@ -273,21 +291,17 @@ do
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 2
fi
# Constants
logfile=$(fullpath "$1")/.urchin.log
stdout_file=$(fullpath "$1")/.urchin_stdout
# Run or present the Molly guard.
if basename "$(fullpath "$1")" | grep -Fi 'test' > /dev/null || $force
then
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