On 9/24/18 4:48 AM, Pádraig Brady wrote:
> I'll push the attached later.
> Interesting there were no echo tests until now.
Nice work, indeed.
Additionally to Eric's comment, I'd suggest to increase the coverage
for 'echo' to about 100% [1] with the attached patch:
* src/echo.c (usage): Assert that STATUS is always EXIT_SUCCESS.
* tests/misc/echo.sh: Add further tests for all hex and escape and
escape characters.
You may simply squash it in.
[1] To get coverage statistic, run:
make coverage -j 4 TESTS=tests/misc/echo.sh SUBDIRS=.
xdg-open file:doc/coverage/src/echo.c.gcov.frameset.html
Have a nice day,
Berny
diff --git a/src/echo.c b/src/echo.c
index 2aee5acfb..062f9038c 100644
--- a/src/echo.c
+++ b/src/echo.c
@@ -16,6 +16,7 @@
#include <config.h>
#include <stdio.h>
+#include <assert.h>
#include <sys/types.h>
#include "system.h"
@@ -34,35 +35,35 @@ enum { DEFAULT_ECHO_TO_XPG = false };
void
usage (int status)
{
- if (status != EXIT_SUCCESS)
- emit_try_help ();
- else
- {
- printf (_("\
+ /* STATUS should always be EXIT_SUCCESS (unlike in most other
+ utilities which would call emit_try_help otherwise). */
+ assert (status == EXIT_SUCCESS);
+
+ printf (_("\
Usage: %s [SHORT-OPTION]... [STRING]...\n\
or: %s LONG-OPTION\n\
"), program_name, program_name);
- fputs (_("\
+ fputs (_("\
Echo the STRING(s) to standard output.\n\
\n\
-n do not output the trailing newline\n\
"), stdout);
- fputs (_(DEFAULT_ECHO_TO_XPG
- ? N_("\
+ fputs (_(DEFAULT_ECHO_TO_XPG
+ ? N_("\
-e enable interpretation of backslash escapes (default)\n\
-E disable interpretation of backslash escapes\n")
- : N_("\
+ : N_("\
-e enable interpretation of backslash escapes\n\
-E disable interpretation of backslash escapes (default)\n")),
- stdout);
- fputs (HELP_OPTION_DESCRIPTION, stdout);
- fputs (VERSION_OPTION_DESCRIPTION, stdout);
- fputs (_("\
+ stdout);
+ fputs (HELP_OPTION_DESCRIPTION, stdout);
+ fputs (VERSION_OPTION_DESCRIPTION, stdout);
+ fputs (_("\
\n\
If -e is in effect, the following sequences are recognized:\n\
\n\
"), stdout);
- fputs (_("\
+ fputs (_("\
\\\\ backslash\n\
\\a alert (BEL)\n\
\\b backspace\n\
@@ -74,13 +75,12 @@ If -e is in effect, the following sequences are recognized:\n\
\\t horizontal tab\n\
\\v vertical tab\n\
"), stdout);
- fputs (_("\
+ fputs (_("\
\\0NNN byte with octal value NNN (1 to 3 digits)\n\
\\xHH byte with hexadecimal value HH (1 to 2 digits)\n\
"), stdout);
- printf (USAGE_BUILTIN_WARNING, PROGRAM_NAME);
- emit_ancillary_info (PROGRAM_NAME);
- }
+ printf (USAGE_BUILTIN_WARNING, PROGRAM_NAME);
+ emit_ancillary_info (PROGRAM_NAME);
exit (status);
}
diff --git a/tests/misc/echo.sh b/tests/misc/echo.sh
index 133b52a35..c3d67cf1b 100755
--- a/tests/misc/echo.sh
+++ b/tests/misc/echo.sh
@@ -63,4 +63,37 @@ foo
EOF
compare exp out || fail=1
+# Further test coverage.
+# Output a literal '-' (on a line itself).
+$prog - > out || fail=1
+# Output a literal backslash '\', no newline.
+$prog -n -e '\\' >> out || fail=1
+# Output an empty line (merely to have a newline after the previous test).
+$prog >> out || fail=1
+# Test other characters escaped by a backslash:
+# \a hex 07 alert, bell
+# \b hex 08 backspace
+# \e hex 1b escape
+# \f hex 0c form feed
+# \n hex 0a new line
+# \r hex 0d carriage return
+# \t hex 09 horizontal tab
+# \v hex 0b vertical tab
+# Convert output, yet checking the exit status of $prog.
+{ $prog -n -e '\a\b\e\f\n\r\t\v' || touch fail; } | od -tx1 >> out || fail=1
+test '!' -f fail || fail=1
+# Output hex values which contain hexadecimal characters to test hextobin().
+# Hex values 4a through 4f are ASCII "JKLMNO".
+$prog -n -e '\x4a\x4b\x4c\x4d\x4e\x4f\x4A\x4B\x4C\x4D\x4E\x4F' >> out || fail=1
+# Output another newline.
+$prog >> out || fail=1
+cat <<\EOF > exp
+-
+\
+0000000 07 08 1b 0c 0a 0d 09 0b
+0000010
+JKLMNOJKLMNO
+EOF
+compare exp out || fail=1
+
Exit $fail