tests: (col) avoid hardcoding of errno string
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>
This commit is contained in:
parent
6ef9a9e184
commit
eebc9e4dc2
|
@ -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"
|
||||
|
|
|
@ -1 +1 @@
|
|||
col: failed on line 1: Invalid or incomplete multibyte or wide character
|
||||
col: failed on line 1: EILSEQ
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue