1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2024-12-23 21:34:54 +03:00
libvirt/tests/virerrortest.c
Peter Krempa d9baf0d75b tests: Add test for virErrorMsg message constraints
Make sure that we don't add any broken error message strings any more.

This ensures that both the version with and without additional info is
populated, the version without info does not have any formatting
modifiers and the version with info has exactly one.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Erik Skultety <eskultet@redhat.com>
2018-12-14 13:56:53 +01:00

103 lines
2.6 KiB
C

/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; If not, see
* <http://www.gnu.org/licenses/>.
*/
#include <config.h>
#include "testutils.h"
#define LIBVIRT_VIRERRORPRIV_H_ALLOW
#include "virerrorpriv.h"
#undef LIBVIRT_VIRERRORPRIV_H_ALLOW
static int
virErrorTestMsgFormatInfoOne(const char *msg)
{
bool found = false;
char *next;
int ret = 0;
for (next = (char *)msg; (next = strchr(next, '%')); next++) {
if (next[1] != 's') {
VIR_TEST_VERBOSE("\nerror message '%s' contains disallowed printf modifiers\n", msg);
ret = -1;
} else {
if (found) {
VIR_TEST_VERBOSE("\nerror message '%s' contains multiple %%s modifiers\n", msg);
ret = -1;
} else {
found = true;
}
}
}
if (!found) {
VIR_TEST_VERBOSE("\nerror message '%s' does not contain any %%s modifiers\n", msg);
ret = -1;
}
return ret;
}
static int
virErrorTestMsgs(const void *opaque ATTRIBUTE_UNUSED)
{
const char *err_noinfo;
const char *err_info;
size_t i;
int ret = 0;
for (i = 1; i < VIR_ERR_NUMBER_LAST; i++) {
err_noinfo = virErrorMsg(i, NULL);
err_info = virErrorMsg(i, "");
if (!err_noinfo) {
VIR_TEST_VERBOSE("\nmissing string without info for error id %zu\n", i);
ret = -1;
}
if (!err_info) {
VIR_TEST_VERBOSE("\nmissing string with info for error id %zu\n", i);
ret = -1;
}
if (strchr(err_noinfo, '%')) {
VIR_TEST_VERBOSE("\nerror message id %zu contains formatting characters: '%s'\n",
i, err_noinfo);
ret = -1;
}
if (virErrorTestMsgFormatInfoOne(err_info) < 0)
ret = -1;
}
return ret;
}
static int
mymain(void)
{
int ret = 0;
if (virTestRun("error message strings ", virErrorTestMsgs, NULL) < 0)
ret = -1;
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}
VIR_TEST_MAIN(mymain)