149 Commits

Author SHA1 Message Date
Thomas Levine
4a65c416b1 GitHub-only note about repository address change 2022-12-25 11:03:28 +00:00
Thomas Levine
1d2231a415 Move repository to SDF server. 2022-12-25 10:57:40 +00:00
Thomas Levine
9721f976e0 organize files 2016-04-11 18:44:58 +00:00
Thomas Levine
65dba9697d update history 2016-04-11 18:44:53 +00:00
Thomas Levine
f57e6cca22 move packages 2016-04-11 18:42:39 +00:00
Thomas Levine
144a76319c remove & 2016-04-11 18:42:33 +00:00
Thomas Levine
cb4e16ddff limits 2016-04-11 17:53:31 +00:00
Thomas Levine
cbad100692 more packages 2016-04-11 17:44:14 +00:00
Thomas Levine
3d5b5ede46 container 2016-04-11 17:40:56 +00:00
Thomas Levine
aedaaa3a05 ssh 2016-04-11 17:28:05 +00:00
Thomas Levine
5045b3546f fix configuration 2016-04-11 17:22:06 +00:00
Thomas Levine
9514948636 nixos-container 2016-04-11 17:14:12 +00:00
Thomas Levine
81a611dd9b require test 2016-04-11 16:27:38 +00:00
Thomas Levine
6fea07d8cf recurse 2016-04-11 16:20:20 +00:00
Thomas Levine
bd4d06bef6 explosions... 2016-04-11 05:44:58 +00:00
Thomas Levine
d92a9bc801 descend directories 2016-04-11 05:05:39 +00:00
Thomas Levine
dc90ed8578 merge small functions 2016-04-11 04:48:26 +00:00
Thomas Levine
d9ffa53e25 debug 2016-04-11 04:31:15 +00:00
Thomas Levine
47860e56ce local variables 2016-04-11 04:13:05 +00:00
Thomas Levine
37e57773a6 NO_MAIN variable 2016-04-11 04:04:30 +00:00
Thomas Levine
c8a0a1b30e meta 2016-04-10 22:48:55 +00:00
Thomas Levine
1bf8b930ec organize metafunctions better 2016-04-10 22:45:39 +00:00
Thomas Levine
a7a5db1cfd more meta 2016-04-10 22:44:22 +00:00
Thomas Levine
85a6c37dfc catch exit codes better 2016-04-10 22:07:15 +00:00
Thomas Levine
ba20619102 names 2016-04-10 21:55:15 +00:00
Thomas Levine
9932d0bf6f read -r and stuff 2016-04-10 21:54:08 +00:00
Thomas Levine
25f74b68cf localpath 2016-04-10 21:45:37 +00:00
Thomas Levine
2bd752012c localpath 2016-04-10 21:27:04 +00:00
Thomas Levine
3761493c7c $ for clarity 2016-04-10 21:18:08 +00:00
Thomas Levine
51fa9dc879 localpath 2016-04-10 21:17:19 +00:00
Thomas Levine
de4a92de7a simpler return codes for recurse 2016-04-10 21:05:34 +00:00
Thomas Levine
9bc3d63ded grr 2016-04-10 20:45:01 +00:00
Thomas Levine
4ca5b98550 comparators 2016-04-10 20:36:05 +00:00
Thomas Levine
fad04e1584 nicer cleanup 2016-04-10 20:34:36 +00:00
Thomas Levine
af0a80d1bd outline main 2016-04-10 20:27:56 +00:00
Thomas Levine
cc2c60cac0 remove another file 2016-04-10 20:11:40 +00:00
Thomas Levine
f3f01bb0dc input parsing 2016-04-10 20:05:34 +00:00
Thomas Levine
8a234e687f remove cycling 2016-04-10 20:03:07 +00:00
Thomas Levine
a6aaa5a130 header 2016-04-10 19:53:57 +00:00
Thomas Levine
3a4a7012a7 refactoring 2016-04-10 19:51:21 +00:00
Thomas Levine
a97bb751bc skip better 2016-04-10 19:44:17 +00:00
Thomas Levine
e217d5a8fb skip encoding 2016-04-10 19:39:11 +00:00
Thomas Levine
2ba4c8b00e exit codes 2016-04-10 19:32:01 +00:00
Thomas Levine
b03640f8aa shell test as variable rather than list 2016-04-10 19:27:15 +00:00
Thomas Levine
7e7b661c68 shorter 2016-04-10 19:20:04 +00:00
Thomas Levine
4e3e29c159 exit codes 2016-04-10 19:17:02 +00:00
Thomas Levine
9caa0d1225 more format 2016-04-10 19:08:19 +00:00
Thomas Levine
f4b66881f6 refactor 2016-04-10 18:56:32 +00:00
Thomas Levine
7dc70982e5 shorter outcome printing 2016-04-10 18:51:52 +00:00
Thomas Levine
34a6276b20 move footer 2016-04-10 18:43:58 +00:00
Thomas Levine
4db468ef2e colors 2016-04-10 18:42:58 +00:00
Thomas Levine
3ceba43410 start rearranging formatting 2016-04-10 18:23:24 +00:00
Thomas Levine
deaf05c062 log format 2016-04-10 17:53:11 +00:00
Thomas Levine
0feeb7233b tabs 2016-04-10 17:42:20 +00:00
Thomas Levine
562489e795 read with -d (not standard) 2016-04-10 17:18:32 +00:00
Thomas Levine
a084577951 play with reading many args 2016-04-10 17:04:12 +00:00
Thomas Levine
22e9f57f0f relative potential test in log file 2016-04-10 16:49:14 +00:00
Thomas Levine
246f29f06c wrappers 2016-04-10 16:40:36 +00:00
Thomas Levine
e230a80be1 move argument validation to the parser 2016-04-10 16:12:40 +00:00
Thomas Levine
b3188d17fc parameter expansions 2016-04-10 16:03:57 +00:00
Thomas Levine
446353a6a7 parameter expansions 2016-04-10 16:02:23 +00:00
Thomas Levine
287fd8a37c use new contains 2016-04-10 15:50:29 +00:00
Thomas Levine
9ce5c45bed "contains" function 2016-04-10 15:48:30 +00:00
Thomas Levine
f01c7f9b53 move dependency checks up to beginning 2016-04-10 15:34:06 +00:00
Thomas Levine
015dd2894f move validation lower 2016-04-10 09:05:08 +00:00
Thomas Levine
4798611d78 ascii delimiters 2016-04-10 08:45:11 +00:00
Thomas Levine
478b0b3c8d ideas 2016-04-10 06:36:34 +00:00
Thomas Levine
fa4708f940 command -v 2016-04-10 06:15:55 +00:00
Thomas Levine
77aff50374 print head 2016-04-10 06:05:28 +00:00
Thomas Levine
0ee97569a6 new format variable 2016-04-10 06:04:12 +00:00
Thomas Levine
f783aa8cbf Automatic commit with j 2016-04-08 22:44:29 +00:00
Thomas Levine
b807f6ad70 version 2016-04-08 22:29:50 +00:00
Thomas Levine
3cfa308953 order matter 2016-04-08 22:25:58 +00:00
Thomas Levine
b46d1a9d6c rearrange contents of the file 2016-04-08 22:24:55 +00:00
Thomas Levine
4608827fed document remote test-running 2016-04-08 21:10:01 +00:00
Thomas Levine
e36333a6c6 document remote test-running 2016-04-08 21:09:59 +00:00
Thomas Levine
c99f6f2919 document remote test-running 2016-04-08 21:09:57 +00:00
Thomas Levine
0227fc73f4 document remote test-running 2016-04-08 21:09:47 +00:00
Thomas Levine
a5e63f5042 execution with remotes 2016-04-08 20:41:53 +00:00
Thomas Levine
fa432b5c09 remote testing proposal 2016-04-07 12:38:23 +00:00
Thomas Levine
236b8f86c2 dep proposal 2016-04-07 12:32:19 +00:00
Thomas Levine
74e9d95f77 fixtures idea 2016-04-07 12:20:31 +00:00
Thomas Levine
0395ebb5b2 comment the line in tap 2016-04-07 05:19:47 +00:00
Thomas Levine
cebf0d3add update format tests 2016-04-07 05:18:56 +00:00
Thomas Levine
123f04270b md5 format 2016-04-07 03:55:43 +00:00
Thomas Levine
82c81822d3 mktemp templates 2016-04-07 03:51:01 +00:00
Thomas Levine
9fe6058fbf Automatic commit with j 2016-04-07 03:46:38 +00:00
Thomas Levine
e58ae17704 supporting no rsync 2016-04-07 03:41:33 +00:00
Thomas Levine
367ae3f2b1 tests to write 2016-04-07 03:25:45 +00:00
Thomas Levine
5ffd065317 solaris 2016-04-07 03:23:19 +00:00
Thomas Levine
c0239915a2 error 2016-04-07 03:20:39 +00:00
Thomas Levine
b339c5f98e wrong flag 2016-04-07 03:17:08 +00:00
Thomas Levine
92d40c9ff1 DISABLE_CYCLING 2016-04-07 03:13:42 +00:00
Thomas Levine
24ecd302cd document environment variables 2016-04-07 03:12:10 +00:00
Thomas Levine
135c24fd72 hpux exit codes 2016-04-07 03:03:07 +00:00
Thomas Levine
c219f0a0e6 shorter output 2016-04-07 02:54:30 +00:00
Thomas Levine
adf8dc3562 epoch 2016-04-07 02:52:40 +00:00
Thomas Levine
969340bfd6 bugs 2016-04-07 02:52:38 +00:00
Thomas Levine
a484300263 oops 2016-04-07 02:48:58 +00:00
Thomas Levine
e8d946cc5c switch debug to set -x 2016-04-07 02:47:55 +00:00
Thomas Levine
81c4cdeac0 oops 2016-04-07 02:44:22 +00:00
Thomas Levine
b79045c6ee refactor mktemp 2016-04-07 02:42:29 +00:00
Thomas Levine
c6061b377b alternative ways of getting a seconds counter 2016-04-07 02:39:28 +00:00
Thomas Levine
539027db59 find the next bug 2016-04-07 01:59:28 +00:00
Thomas Levine
5e2ecab592 mktemp 2016-04-07 01:58:34 +00:00
Thomas Levine
efe3af6f87 new version 2016-04-07 00:25:32 +00:00
Thomas Levine
f244c22055 another bug 2016-04-07 00:24:52 +00:00
Thomas Levine
2cdd3ec049 fix hpux rsync path 2016-04-07 00:24:06 +00:00
Thomas Levine
6744b2cb4a more on bugs 2016-04-07 00:16:09 +00:00
Thomas Levine
6e32dab0b7 bugs 2016-04-07 00:11:41 +00:00
Thomas Levine
bb3876f334 oops 2016-04-07 00:06:44 +00:00
Thomas Levine
0dc6e01fbc that alias approach was invalid 2016-04-07 00:06:02 +00:00
Thomas Levine
ca71678522 md5 2016-04-07 00:02:11 +00:00
Thomas Levine
9b4f14c937 note on MirBSD 2016-04-06 23:58:58 +00:00
Thomas Levine
27592e58ac untested md5 handler 2016-04-06 23:58:26 +00:00
Thomas Levine
42c09b775b openbsd bug 2016-04-06 23:50:46 +00:00
Thomas Levine
2923d3a8b0 more systems 2016-04-06 23:45:44 +00:00
Thomas Levine
12f458a933 wrong port 2016-04-06 23:26:42 +00:00
Thomas Levine
6c217acae8 oops 2016-04-06 23:21:04 +00:00
Thomas Levine
6a7e58c944 all flags as flags 2016-04-06 23:18:38 +00:00
Thomas Levine
32ac65cf3e more data in filename 2016-04-06 23:14:25 +00:00
Thomas Levine
d1c8f78585 todo 2016-04-06 21:43:18 +00:00
Thomas Levine
132e1695db HISTORY 2016-04-04 21:42:02 +00:00
Thomas Levine
d67185ce25 don't use /dev/stderr 2016-04-04 21:37:47 +00:00
Thomas Levine
16988c48a9 simpler check 2016-04-04 21:29:51 +00:00
Thomas Levine
ddb74d43d8 longer shell list 2016-04-04 21:21:24 +00:00
Thomas Levine
04c4f54789 strange name so we don't have conflicts 2016-04-04 21:10:37 +00:00
Thomas Levine
552d7d0dbc record test command in makefile 2016-04-04 21:07:29 +00:00
Thomas Levine
00c99773d0 run cross-os tests in series
because i sometimes run them on weak computers
2016-04-04 21:04:05 +00:00
Thomas Levine
7899657971 simpler cross-os tests 2016-04-04 20:59:21 +00:00
Thomas Levine
2ee965d2ae start on cross-os tests 2016-04-04 20:55:14 +00:00
Thomas Levine
fdb0b1b3ea LC_COLLATE rather than LC_ALL 2016-04-04 19:15:00 +00:00
Thomas Levine
db3dd1c662 typos 2016-04-04 01:22:05 +00:00
Thomas Levine
a9e0f856fb error message text 2016-04-04 01:17:58 +00:00
Thomas Levine
72f0700598 fixing timeout flag 2016-04-04 01:16:51 +00:00
Thomas Levine
a486a6f296 check timeout error message 2016-04-04 01:07:29 +00:00
Thomas Levine
a9ba8e79d3 suppress timeout errors 2016-04-04 01:04:04 +00:00
Thomas Levine
586f46600a assert that there is no timeout output 2016-04-04 01:03:05 +00:00
Thomas Levine
940cd549ab more timeout tests 2016-04-04 00:58:37 +00:00
Thomas Levine
cd7f773d58 fix debug 2016-04-04 00:42:08 +00:00
Thomas Levine
0de2c3264a version in readme 2016-04-04 00:24:54 +00:00
Thomas Levine
fc51c34019 debug messages 2016-04-01 19:52:34 +00:00
Thomas Levine
c61d31fcea docs 2016-04-01 19:43:02 +00:00
Thomas Levine
6275c28ebf update history 2016-04-01 18:25:53 +00:00
Thomas Levine
b0a7a8b07a remove out-of-date windows screenshots 2016-04-01 18:24:59 +00:00
Thomas Levine
f7ffd82893 fix name 2016-04-01 18:21:26 +00:00
Thomas Levine
a5ffad0446 Automatic commit with j 2016-04-01 18:21:01 +00:00
Thomas Levine
b402f466b5 package for nongnu 2016-04-01 18:20:00 +00:00
Thomas Levine
7a34da0906 packaging 2016-04-01 18:19:28 +00:00
48 changed files with 1116 additions and 494 deletions

18
HISTORY
View File

@@ -1,7 +1,17 @@
HISTORY
=======
Version 0.1.0-rc1
Version 0.2.0 (unstable)
---------------------
### Cross-OS testing
I have started testing Urchin across multiple operating systems.
This gives access to more shells, as some shels are easier to install on
certain operating systems.
With this cross-OS test suite, I have extended support to more shells.
A later version of Urchin could include a remote testing feature.
Version 0.1.0 (stable)
---------------------
This release includes breaking changes.
@@ -72,7 +82,7 @@ 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
if ! which inkscape; then
exit 3 # status code 3 for skip
fi
inkscape blah blah ...
@@ -171,10 +181,6 @@ set as an environment variable, and the latter was set with the -s flag..
Urchin now uses the -s flag for both of these settings, and it mostly ignores
the exported TEST_SHELL variable.
Urchin also inspects the shebang line differently. Previously, Urchin would
vary the shells with which a test is run if the shebang line either was absent
or was #!/bin/sh. Now it varies the shell only if the shebang line is absent.
If you pass -n/--disable-cycling, Urchin will invoke tests ordinarily and will
only set the TEST_SHELL variable if it does not exist. If the TEST_SHELL
variable is absent, it will be set to /bin/sh.

8
Makefile Normal file
View File

@@ -0,0 +1,8 @@
.PHONY: test install
test:
./urchin tests
./urchin -s sh -v ./cross-os-tests
install:
cp ./urchin /usr/bin

229
TODO
View File

@@ -63,3 +63,232 @@ bash
Alternatives
--------------
JSON.sh test suite
Running in multiple environments
-----------------------------------
Setup for other environments includes the following.
* Installing packages
* `touch .zshrc`
* Copy urchin and tests
Fixtures
------------
I want to change the way that fixtures are done.
Instead of using setup, teardown, &c., use ordinary programs from within
your tests. For example.
# tests/.fixtures/tmp-dir
tmp=$(mktemp -d)
cd $tmp
@$
code=$?
cd /
rm -Rf $tmp
exit $code
# tests/blah
../.fixtures/tmp-dir 'blah blah blah'
It's best if I can wrap a bunch of commands in braces or paratheses
rather than just one command. Is there a nice way to do that?
Once I have this new way, I guess I might as well keep the old way.
I think the setup, teardown thing can be easier if you only have simple
fixtures. And since I'm going to keep it, I'm going to add another one.
* setup_dir runs once for the present directory.
* setup_children runs once for each child.
* setup_file runs once for each file descendent.
The present `setup` is renamed to `setup_children`, and the new
`setup_file` runs on each file (not directory) that is a child,
grandchild, great-grandchild, and so on.
Dependency checking
----------------------
You might want to skip tests based on dependencies. Currently you can
conditionally skip tests one at a time by exiting with code 3. I want to
be able to skip an entire directory.
So we add a new magic file called `dep`. If it exists, it is run before
everything else in the directory.
* If it exits with code 0, tests continue as if dep did not exist.
* If it exits with code 3, all tests in the directory are marked as
skipped.
* If it exits with code 1, all tests in the directory are marked as
failed. To make the implementation easier, I'll probably treat the
directory as a single test in this case.
A note on magic files
-------------------------
It is nice to have access to things like setup and dep (magic files)
once in a while, but you need to be doing rather substantial testing
before they make your test suite simpler; the documentation should
strongly recommend writing your tests without magic files and then
refactoring and only then considering moving things to magic files.
Remote testing
----------------
In order to test Urchin across multiple operating systems, I have
already added tests in Urchin's test suite that run Urchin tests in
remote servers. I would like to move this to Urchin itself so that
Urchin can test other things on remote servers.
Urchin's output presently looks like this.
Cycling with the following shells: sh bash dash mksh zsh
Running tests at 2016-04-07T12:33:49
Flags/
> --timeout output
. bash (0 seconds)
. dash (0 seconds)
. mksh (0 seconds)
. sh (0 seconds)
. zsh (0 seconds)
Done, took 1 second.
5 tests passed.
0 tests skipped.
0 tests failed.
After the change, the output should look like this.
Cycling with the following shells: sh dash mksh
Running tests at 2016-04-07T12:33:49
Flags/
> --timeout output
. dash on localhost (0 seconds)
. dash on localhost:8080 (0 seconds)
. dash on tlevine@hpux.polarhome.com (0 seconds)
. mksh on localhost (0 seconds)
. mksh on tlevine@hpux.polarhome.com (0 seconds)
. sh on localhost (0 seconds)
. sh on localhost:8080 (0 seconds)
. sh on tlevine@hpux.polarhome.com (0 seconds)
Done, took 1 second.
8 tests passed.
0 tests skipped.
0 tests failed.
This is just how the output should look; the tests run in whatever order
makes sense.
Bugs
-------
Both md5sum and md5 should be supported.
Trouble logging in to hpux, irix, miros, netbsd, tru64, qnx, ....
$ rsync -e 'ssh -p 785' urchin tlevine@hpux.polarhome.com:.blah
HP-UX hpux.polarhome.com B.11.11 U 9000/785 (ta)
Welcome to HPUX/PA... member of polarhome.com realm
bash: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127) at io.c(226)
[sender=3.1.1]
OpenIndiana grep does not support -q
I get `/urchin: syntax error at line 84: \`}' unexpected` on
unixware and solaris.
mktemp
> tlevine@hpux.polarhome.com -p 785
F sh (8 seconds)
|
| HP-UX hpux.polarhome.com B.11.11 U 9000/785 (ta)
| Welcome to HPUX/PA... member of polarhome.com realm
|
|
| HP-UX hpux.polarhome.com B.11.11 U 9000/785 (ta)
| Welcome to HPUX/PA... member of polarhome.com realm
|
| mktemp: option requires an argument -- d
| ./urchin[96]: /tmp/tlevinea21441/log: Cannot create the specified file.
date
tlevine@hpux64$ ./urchin tests/ -n -vv
date: bad format character - s
So I need a portable seconds-from epoch
I also need to handle when no arguments are passed to urchin.
Exit code is wrong for which on HP-UX
## `$(...)`
Solaris doesn't support `$(...)`; you need `\`...\`` instead.
tlevine@solaris$ ./urchin --run-in-series tests/Errors/
./urchin: syntax error at line 84: `tmp=$' unexpected
I use this a lot.
$ grep -c '\$(' urchin
52
Darn
Update tests to support
* md5
* rsync
* mktemp
* epoch
* Report cycling by default
* New format for reporting cycling
Support systems without rsync
BSD mktemp
| NetBSD 6.1.3
| Welcome to NetBSD ...member of polarhome.com realm
|
| Usage: mktemp [-dqu] [-p <tmpdir>] {-t prefix | template ...}
| mkdir: : No such file or directory
| ./urchin: cannot create /log: permission denied
NetBSD
md5: unknown option -- q
usage: cksum [-n] [-a algorithm [-ptx] [-s string]] [-o 1|2]
[file ... | -c [-w] [sumfile]]
Things I can use to make things better
------------------------
${x##*blah}
$IFS and set --
Redirection, especiall <<-
Maybe fifo
for x in "$@"
until
readonly
getopts
Variable assignments specified with special built-in utilities remain in
effect after the built-in completes; this shall not be the case with a
regular built-in or other utility.

14
cross-os-tests/.run Executable file
View File

@@ -0,0 +1,14 @@
params="$(basename "${0}")"
hostname="$(echo "${params}" | cut -d\ -f1)"
if echo "${params}" | grep -q \ ; then
flags="$(echo "${params}" | cut -d\ -f2-)"
fi
urchin_dir=.urchin-cross-shell-test
rsync --archive -e "ssh ${flags}" $RSYNC_FLAGS \
../urchin ../tests "${hostname}":"${urchin_dir}" ||
scp -r ${flags} ../urchin ../tests "${hostname}":"${urchin_dir}"
ssh "${hostname}" ${flags} \
"cd ${urchin_dir} && ./urchin --run-in-series tests"

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,3 @@
#!/bin/sh
# apt-get install bash dash ksh posh pdksh mksh yash zsh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,3 @@
#!/bin/sh
RSYNC_FLAGS='--rsync-path=/usr/local/bin/rsync'
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,3 @@
#!/bin/sh
# SSH public key needs to be in ~/.etc/ssh/authorized_keys
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

View File

@@ -0,0 +1,2 @@
#!/bin/sh
. ./.run

109
docs/execution-flow Normal file
View File

@@ -0,0 +1,109 @@
Here I discuss Urchin's general execution flow and how it is handled
specifically when tests are run on remote environments.
Steps of an Urchin run
----------------------
When Urchin runs a directory of files, it goes through the following
steps.
1. Head
2. Test
3. Foot
4. Reporting
Urchin stores files in a temporary directory, creating a new directory
on each invocation. The directory contains these things.
* head (file)
* test (file)
* foot (file)
* stdout (directory)
When run on remotes, the temporary directory corresponding to the local
master process additionally has these files.
* remote-test
Messages from the head, test, and foot steps go in the corresponding
files. In the head and foot phases, messages are just simple prints.
Messages from the test phase always correspond to a particular test
file, and they are written to the test file in a delimiter-separated
format.
Stdout and stderr from test runs are written to files in the stdout
directory, one file per test file per shell that the file is run in.
The reporting phase
----------------------
In most cases Urchin begins printing to the screen only during the
reporting phase. The only case where anything is printed beforehand is
when Urchin is run with -vvvv; that sets "+x", so the commands are
printed as they run, though all other output is still suppressed.
Test results are reported in the reporting phase. Four output formats
are available.
1. Urchin's human-readable format (default)
2. Test Anything Protocol
3. Delimiter-separated values (used internally)
4. Remote Urchin worker output
Most of the output is generated based on the delimiter-separated values
in the test log file. The first two formats also include stdout and
stderr from the tests, depending on verbosity level flags; when it needs
these, Urchin reads them from appropriate files in the temporary
directory.
I could discuss the further details of each format elsewhere.
Remotes
----------------------
When Urchin runs tests on a remote, it copies tests to the remote and
then calls Urchin on the remote with "--format=remote". This specifies
the following.
* The temporary directory should be kept, rather than deleted, after
Urchin runs.
* The path of the temporary directory should be printed as output.
* No other output should be printed to stdout.
After the remote Urchin finishes running, the local urchin downloads
the remote Urchin's test log file from the temporary directory.
It modifies the file to include the remote's name and then concatenates
the result to the "remote-test" file in the local temporary directory.
For example, the file from the remote might look like this,
:sh:Counting tests/.test/faila:0:not_ok
and the result might look like this.
nsa:sh:Counting tests/.test/faila:0:not_ok
This gets processed in the reporting step like usual, according to
whatever format is specified. Instead of printing just "sh" as the
environment in which the particular test was run, the report will print
"sh on nsa".
When it needs the stdout files, it prints them over ssh.
New flags
----------
In making this remotes feature, I wound up adding some others.
-r, --remote SSH host to use as a remote
-F, --format Output format, one of "urchin", "tap", "dsv", "remote"
Urchin runs only locally by default. If you pass at least one --remote
flag, Urchin runs tests only on the specified remotes; it can't run both
locally and remotely in the same run. If you want to do that, you could
wait until I add that feature, or you can add "localhost" as a remote.
Settings that I'm thinking about
* Port for rsync/ssh
* SSH protocol version
* --rsync-path
Can those all be set in ssh_config? Probably not --rsync-path, but
I guess I could just fix it on the remote.

View File

@@ -0,0 +1,39 @@
# A NixOS container to protect against accidental fork bombs
#
# Put this in /var/lib/containers/test/etc/nixos/configuration.nix
# See https://nixos.org/wiki/NixOS:Containers
{ config, lib, pkgs, ... }:
with lib;
{ boot.isContainer = true;
networking.hostName = mkDefault "urchin";
networking.useDHCP = false;
environment.systemPackages = with pkgs; [
# Urchin
bash dash mksh zsh
busybox
# Other
vim git rsync tmux
];
security.pam.loginLimits = [
# Prevent accidental fork bombs.
{ domain = "*"; item = "nproc"; type = "hard"; value = "200"; }
];
services.openssh = {
enable = true;
passwordAuthentication = false;
};
users.extraUsers.user = {
name = "tlevine";
uid = 1000;
isNormalUser = true;
home = "/home/tlevine";
extraGroups = [ "users" "wheel" ];
openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGvQyzr42/96acUTUedaeM2ee+DMt9bkxeurdeXji9sNE10MjjAUFtxPmSI8/BUZW2/a9ByblfaJEI+H+kFVPjVr+QGKXZluxcFMj2BLbH53fi9xLgoQRjb2aAXutb2Bp74/E8R1K+CuFfRRGQ5Spdnv44SLt04D6JbBLcLIcWTpQ4v5RaYr2U27jfiF9z0m+/opxvowEy2gnqlEXFxFk8jZHT4K0uLWm2ENjT6OpyOx8hWcKeAN2vRVRex3pJfSzswn0LpuCrM1rUZ4DRE+FABi8N21Q3MBaMRkwnZPwaZwKzv06q8bu23jYTqK5BrUPtOXeeVuroQXMc12H/6/Nh laptop"
];
};
}

View File

@@ -0,0 +1,36 @@
#!/bin/sh
set -e
# Create the container.
if ! nixos-container list | grep ^urchin$ > /dev/null; then
sudo nixos-container create urchin
fi
# Configure the container.
sudo cp configuration.nix \
/var/lib/containers/urchin/etc/nixos/configuration.nix
sudo nixos-container update urchin
sudo nixos-container start urchin
# Create the git repository.
host="tlevine@$(nixos-container show-ip urchin)"
ssh "${host}" 'if mkdir urchin 2> /dev/null; then
cd urchin
git init
git config --add receive.denyCurrentBranch ignore
fi
'
# Push to the git repository
git push "${host}":urchin
# Print information
echo "Log in:
ssh ${host}
Add git remote
git remote add ${host} container
"

1
packages/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
*.tar.gz

11
packages/nongnu.sh Executable file
View File

@@ -0,0 +1,11 @@
#!/bin/sh
name=urchin-$(../urchin --version)
tmp=$(mktemp -d)
mkdir $tmp/$name
cp ../urchin ../readme.md ../AUTHORS ../COPYING $tmp/$name
cd $tmp
tar czf $name.tar.gz $name
cd - > /dev/null
mv $tmp/$name.tar.gz .
rm -R $tmp

View File

@@ -12,7 +12,7 @@
"bin": "./urchin",
"repository": {
"type": "git",
"url": "git://github.com/tlevine/urchin.git"
"url": "https://git.sdf.org/tlevine/urchin"
},
"keywords": [
"shell",

View File

@@ -1,3 +1,5 @@
**The repository at https://github.com/tlevine/urchin will go away. New location is https://git.sdf.org/tlevine/urchin.**
__ _
__ ____________/ /_ (_)___
/ / / / ___/ ___/ __ \/ / __ \
@@ -17,7 +19,7 @@ have shells called "tests".
Urchin's tests are written in Urchin, so you can run them to see what Urchin
is like. Clone the repository
git clone git://github.com/tlevine/urchin.git
git clone https://git.sdf.org/tlevine/urchin
Run the tests
@@ -51,7 +53,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.githubusercontent.com/tlevine/urchin/v0.0.6/urchin
wget https://git.sdf.org/tlevine/urchin/raw/branch/master/urchin
chmod +x urchin
Urchin can be installed with npm too.

View File

@@ -0,0 +1,2 @@
../../urchin -T aoeu .testsuite 2>&1 | grep Bad
../../urchin -T .testsuite 2>&1 | grep Bad

View File

@@ -1,3 +1 @@
set -e
$TEST_SHELL ../../urchin --shell sh .slow-tests
! $TEST_SHELL ../../urchin --shell sh --timeout 0.3 .slow-tests

4
tests/Flags/--timeout output Executable file
View File

@@ -0,0 +1,4 @@
$TEST_SHELL ../../urchin --shell sh --timeout 0.3 .slow-tests 2>&1 |
grep -v -- --timeout |
grep timeout
test $? = 1

1
tests/Flags/--timeout success Executable file
View File

@@ -0,0 +1 @@
$TEST_SHELL ../../urchin --shell sh .slow-tests --timeout 1000

View File

@@ -1,3 +1,3 @@
$TEST_SHELL ../../urchin -v -s sh -t .testsuite/ |
sed -e 1d -e /second/d > $tmp
sed -e 1,2\ d -e /second/d > $tmp
diff $tmp .tap-output-expectation

View File

@@ -0,0 +1,5 @@
lines=$(
$TEST_SHELL ../../urchin -v -s sh -t .testsuite/ |
tee $tmp | grep -v '^#' | wc -l)
cat $tmp
test $lines -eq 4

View File

@@ -1,3 +1,3 @@
$TEST_SHELL ../../urchin -vv -s sh .testsuite/ |
sed -e 1d -e 's/. seconds\?/1 second/' > $tmp
sed -e 1,2\ d -e 's/. seconds\?/1 second/' > $tmp
diff $tmp .urchin-output-expectation

View File

@@ -1,3 +1,3 @@
$TEST_SHELL ../../urchin --pretty -vv --shell sh .testsuite/ |
sed -e 1d -e 's/. seconds\?/1 second/' > $tmp
sed -e 1,2\ d -e 's/. seconds\?/1 second/' > $tmp
diff $tmp .urchin-output-expectation-color

View File

@@ -1,3 +1,3 @@
echo "$1" > $tmp
TESTING_URCHIN_INTERNALS=true . ../../../urchin
NO_MAIN= . ../../../urchin
has_shebang_line $tmp

1066
urchin

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB