On Wed, 1 Aug 2018 22:07:33 +0200 Mattias Andrée <maand...@kth.se> wrote:
> On Wed, 1 Aug 2018 21:16:26 +0200 > Silvan Jegen <s.je...@gmail.com> wrote: > > > On Wed, Aug 01, 2018 at 07:53:18PM +0200, Mattias Andrée wrote: > > > Thank you for your time! > > > > Thank you for all your work! :P > > Hi again Silvan, > > > > > > > > The common code is 590 lines of code, including: > > > > > > * 102 lines of code related to identifying the error when the > > > test fails. > > > > > > * 14 lines of code for properly killing processes on failure, > > > abortion, and when a test case hangs. > > > > > > * 32 lines of code, plus 13 of the lines counted above, > > > for supporting concurrent tests. > > > > > > This leaves 442 lines for the fundamental stuff and a few > > > lines to support printing all errors rather than just the > > > first error. > > > > > > Some note on your sh code (since you wrote “crappy and > > > probably non-portable”, you are probably aware of this, > > > but just in case): > > > > > > * `source` is a Bash synonym for the portable `.` command. > > > > Yeah, that sounds familiar. > > > > > > > * `echo` is unportable and `printf` should be used instead. > > > > Didn't know that echo was not portable. Thought it was just a builtin > > that should work the same everywhere. It's probably the flags that are > > the issue... > > It's worse than that, nothing about echo is portable: > > - You don't know how backslashes are interpreted. > > - You don't know whether you get a new line at the end. > > - You don't know if -e is supported. > > - You don't know if -n is supported. > > > > > > > > * I have never seen `&>` before, so I my guess is that it > > > is a Bashism. > > > > Yeah, seems likely. It's supposed to redirect both stderr and stdout. "sh" > > did not complain about it but that doesn't mean much... > > > > > > > * It looks like whichever file descriptor is not being > > > inspected by `check_output` is printed the inherited > > > file descriptor rather than to /dev/null. > > > > Printing behaviour of the tests should looked at and fixed for sure. > > > > > > > * I think it would be better to have something like: > > > > > > set -e > > > > > > run "test name" "./dirname //" > > > check_stderr "" > > > check_stdout / || check_stdout // > > > check_exit 0 > > > > > > Your sh code, with check_exit added, covers most current tests. > > > However, it every time the usage output is modified it has to > > > be change in the test case, which I guess is acceptable but > > > undesirable. The tests that are currently implemented > > > > I think that is working as intended. It's a behaviour change in the code > > and should result in an error (unless we decide that we don't want to > > test the usage output of course). > > > > > > > and which need to be handled specially are: > > > > > > * sleep: > > > This can be done with sh. With some adaption to the sh > > > code, tests can also be done in parallel as it is in > > > the C code. > > > > > > * test: > > > test takes a lot of time to test, which is why multiple > > > tests are run in parallel in the C code. Like tty(1), > > > this test also requires the creation of terminals, but > > > it also requires the creation of sockets. > > > > > > * time: > > > Requires setitimer(3) and pause(3). > > > > > > * tty: > > > This test requires the creation of terminals. > > > > > > * uname: > > > Most of uname can be tested in ed, however, the output > > s/ed/sh/ # I guess you understood that, but I cannot stand not correcting it. > > > > of uname with only one flag applied requires the uname > > > system call. > > > > > > * whoami: > > > The user name can be retrieved via $LOGNAME according > > > to POSIX, however this requires that your login program > > > actually sets it. Additionally (and this should be added > > > to the test) when whoami is called from a program with > > > setuid the owner of the program should be printed (i.e. > > > the effective user), not real user which is stored in > > > $LOGNAME. > > > > > > Additionally env, time, and yes requires identifying which signal > > > the processed was killed by. I have never done this in sh, but I > > > understand that it should be doable. time and env also requires a > > > way to kill the process it runs with a specific signal. Furthermore > > > the test for tty should include a case where stdin does not exist, > > > which for the moment is not done. All tests excepts test and sleep > > > fundamentally requires support for stdout, but they also use stderr > > > for checking error support. > > > > > > These tests require all the features in the C code, except the > > > extra functionally enumerated at the beginning of this mail and > > > the support for binary data. These are tests we should focus on, > > > whichever solution is found for them should be applied to the > > > rest tests since those require almost only subset of the > > > functionality. The only extra functionality other tests require > > > > Thanks for compiling the list of tools to be handled in a special way. > > > > I do feel that it would be better to find the simplest solution that > > works for most of the tests. For the rest we can then decide how to > > handle them in a minimal way (most likely some custom C code for each > > one. Common parts should still be shared of course). > > > > > > > is support for binary data; which I really don't think warrant > > > a separate solution. > > > > > > The following utilities (from both sbase and ubase) still need > > > tests, as well as the utilities listed under ubase's TODO. I > > > have most of the work already done for the utilities marked > > > with an asterisk. > > > > > > at awk bc cal > > > cat chgrp chmod chown > > > chroot chvt cksum* clear > > > cmp cols comm cp > > > cron ctrlaltdel cut date > > > dd df diff dmesg > > > du ed eject env > > > expr fallocate find flock > > > fold free freeramdisk fsfreeze > > > getconf getty grep halt > > > head hostname hwclock id > > > insmod install join kill > > > killall5 last lastlog ln > > > logger login logname ls > > > lsmod lsusb md5sum* mesg > > > mkdir mkfifo mknod mkswap > > > mktemp mount mountpoint mv > > > nice nl nohup nologin* > > > od pagesize passwd paste > > > patch* pathchk pidof pivot_root > > > printf ps pwd pwdx > > > readahead readlink renice respawn > > > rev rm rmdir rmmod > > > sed seq* setsid sha1sum* > > > sha224sum* sha256sum* sha384sum* sha512-224sum* > > > sha512-256sum* sha512sum* sort split > > > sponge stat strings stty > > > su swaplabel swapoff swapon > > > switch_root sync sysctl tail > > > tar tee tftp touch > > > tr truncate tsort umount > > > uniq* unshare uptime uudecode > > > uuencode vtallow watch wc > > > which who xargs > > > > > > I think should look into what their tests will require, maybe > > > even write some tests with optional test framework, especially > > > for the tests that cannot be trivially tested in sh. We should > > > also identify which of them cannot be automatically tested > > > without a virtual machine, and write them down in the README, > > > and possibly list of features to test. Once this is done, we > > > can make a more informed discussion. > > > > > > For the moment I see two options: 1) write the tests mostly > > > in sh and write special utilities in C where required, and > > > 2) use the C code, but look for ways to improve it. > > > > I feel like 1) is the way to go if we want to keep things as simple > > as possible. The rest are special cases which can be handled in a > > special way. > > > > Would you be open for working on some (portable) shell code for the most > > common tools? > > I am open to it, however I fear that it is not the simpler solution > as it may require two implementations of the same functionality. Sorry, I'm mixing things up, the idea is to completely replace the C version of test-common, not just add another implementation. > > > > > > > > As I see it, the most complex parts of the C code are: > > > > > > * start_process: > > > It's probably enough to split out some code to > > > separate functions: the `if (in->flags & DATA)`, > > > the dup2–close loops at the end. > > > > > > * wait_process: > > > Instead of ready all file descriptors as fast as > > > possible, the they could probably be read in order. > > > > > > * check_output_test: > > > It's probably enough to add a few short comments > > > and improve variable names. > > > > > > * print_failure: > > > It's probably enough to add some empty lines add a > > > few short comments. > > > > > > The other parts are pretty straight forward. > > > > If we go with option 1) I would like to wait to see which C functionality > > we would end up needing in the end. Looking at the C code I would postpone > > until after that decision has been made. > > I will make a sh reimplementation, but since I'm back at work > now, it will take some time. In the meanwhile, why not enjoy > my new painting. > > > > > > > Cheers, > > > > Silvan > > Have a nice evening, > Mattias Andrée