]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
tests: (col) avoid hardcoding of errno string
authorPatrick Steinhardt <ps@pks.im>
Fri, 23 Aug 2019 13:32:57 +0000 (15:32 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 27 Aug 2019 07:37:01 +0000 (09:37 +0200)
The col/multibyte test has a hardcoded error string as part of its
expected output that is returned by glibc's strerror(3P) function. Even
though many of these strings are the same across libc implementations,
they are not standardiced and some are certainly different. One example
is the string for EILSEQ on musl libc.

To fix this, we introduce a new test helper "test_strerror". The helper
can be invoked with an error code like "EILSEQ", which will cause it to
print out the the respective error message for that code. Note that
"test_strerror" cannot act on the error's value (e.g. 84 for EILSEQ), as
these aren't standardized either. Instead, we thus need to have an array
of the error's string representation ("EILSEQ") to its respective error
code (the define EILSEQ). The array can trivially be extended as
required, thus it is only sparsely populated with EILSEQ right now.

To fix the col/multibyte test, we introduce a call to sed(1) to replace
the strerror(3P) message from EILSEQ with "EILSEQ". Furthermore, as
we're running tests with the POSIX locale by default which treats all
bytes as valid multibyte sequences, we have to change to the C.UTF-8
locale instead to actually get an error.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
tests/commands.sh
tests/expected/col/multibyte
tests/helpers/Makemodule.am
tests/helpers/test_strerror.c [new file with mode: 0644]
tests/ts/col/multibyte

index 5cc34f6b3821d6277d1f42249a9673b2f48b9f57..9fcd488ce22305690908f41e87c05254af5f62ec 100644 (file)
@@ -33,6 +33,7 @@ TS_HELPER_PARTITIONS="${ts_helpersdir}sample-partitions"
 TS_HELPER_PATHS="${ts_helpersdir}test_pathnames"
 TS_HELPER_SCRIPT="${ts_helpersdir}test_script"
 TS_HELPER_SIGRECEIVE="${ts_helpersdir}test_sigreceive"
+TS_HELPER_STRERROR="${ts_helpersdir}test_strerror"
 TS_HELPER_STRUTILS="${ts_helpersdir}test_strutils"
 TS_HELPER_SYSINFO="${ts_helpersdir}test_sysinfo"
 TS_HELPER_TIOCSTI="${ts_helpersdir}test_tiocsti"
index 4e299adc1bfb0b5676a966584e78bc76b581732c..abf607249a9c4a07921e426f13a6a8af287d5625 100644 (file)
@@ -1 +1 @@
-col: failed on line 1: Invalid or incomplete multibyte or wide character
+col: failed on line 1: EILSEQ
index ab0b3cea97692842b723a8f8df02babcf6b3130c..a34cd8d2ad998f10e073e88b212d88760303f419 100644 (file)
@@ -14,6 +14,9 @@ test_sha1_SOURCES = tests/helpers/test_sha1.c lib/sha1.c
 check_PROGRAMS += test_pathnames
 test_pathnames_SOURCES = tests/helpers/test_pathnames.c
 
+check_PROGRAMS += test_strerror
+test_strerror_SOURCES = tests/helpers/test_strerror.c
+
 check_PROGRAMS += test_sysinfo
 test_sysinfo_SOURCES = tests/helpers/test_sysinfo.c
 
diff --git a/tests/helpers/test_strerror.c b/tests/helpers/test_strerror.c
new file mode 100644 (file)
index 0000000..1919698
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * This test program prints errno messages to allow for portable
+ * verification of error messages.
+ *
+ * Copyright (C) 2019 Patrick Steinhardt <ps@pks.im
+ *
+ * This file may be redistributed under the terms of the GNU Public
+ * License.
+ */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define E(x) { #x, x }
+static struct {
+       const char *str;
+       int error;
+} errors[] = {
+       E(EILSEQ)
+};
+
+int main(int argc, const char *argv[])
+{
+       size_t i;
+
+       if (argc != 2) {
+               fprintf(stderr, "USAGE: %s <errno>\n", argv[0]);
+               return -1;
+       }
+
+       for (i = 0; i < sizeof(errors)/sizeof(*errors); i++) {
+               if (strcmp(errors[i].str, argv[1]))
+                       continue;
+               puts(strerror(errors[i].error));
+               return 0;
+       }
+
+       fprintf(stderr, "Invalid errno: %s\n", argv[1]);
+       return -1;
+}
index e9c02922e7c41272dc519c0fd2e585b40c9c5dd3..1ed4b5ff8ccf1016b877c158326ab7a0de76fa2c 100755 (executable)
@@ -22,8 +22,9 @@ TS_DESC="multibyte input"
 ts_init "$*"
 
 ts_check_test_command "$TS_CMD_COL"
+ts_check_test_command "$TS_HELPER_STRERROR"
 
-cat $TS_SELF/multibyte.data | $TS_CMD_COL > /dev/null  2> $TS_OUTPUT
+cat $TS_SELF/multibyte.data | LC_ALL=C.UTF-8 $TS_CMD_COL 2>&1 > /dev/null |
+    sed -e "s@$($TS_HELPER_STRERROR EILSEQ)@EILSEQ@" > $TS_OUTPUT
 
 ts_finalize
-