From a861760dbb84bcca8c92ced22e5c64dbbaaa8e10 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Tue, 19 Sep 2017 22:24:06 -0500 Subject: [PATCH] Give dbRegisterServer a return value (0/-1) Add tests to check registration failures. --- src/ioc/db/dbServer.c | 11 ++++++----- src/ioc/db/dbServer.h | 5 ++--- src/ioc/db/test/dbServerTest.c | 19 +++++++++++++------ 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/ioc/db/dbServer.c b/src/ioc/db/dbServer.c index 31ba11d80..47ed5d8e8 100644 --- a/src/ioc/db/dbServer.c +++ b/src/ioc/db/dbServer.c @@ -22,17 +22,17 @@ static ELLLIST serverList = ELLLIST_INIT; -void dbRegisterServer(dbServer *psrv) +int dbRegisterServer(dbServer *psrv) { const char * ignore = envGetConfigParamPtr(&EPICS_IOC_IGNORE_SERVERS); if (!psrv || !psrv->name) - return; + return -1; if (strchr(psrv->name, ' ')) { fprintf(stderr, "dbRegisterServer: Bad server name '%s'\n", psrv->name); - return; + return -1; } if (ignore) { @@ -44,7 +44,7 @@ void dbRegisterServer(dbServer *psrv) (found[len] == 0 || found[len] == ' ')) { fprintf(stderr, "dbRegisterServer: Ignoring '%s', per environment\n", psrv->name); - return; + return 0; } /* It was, try again further down */ ignore = found + len; @@ -54,10 +54,11 @@ void dbRegisterServer(dbServer *psrv) if (ellNext(&psrv->node) || ellLast(&serverList) == &psrv->node) { fprintf(stderr, "dbRegisterServer: '%s' registered twice?\n", psrv->name); - return; + return -1; } ellAdd(&serverList, &psrv->node); + return 0; } void dbsr(unsigned level) diff --git a/src/ioc/db/dbServer.h b/src/ioc/db/dbServer.h index c2ebdb467..1d184329c 100644 --- a/src/ioc/db/dbServer.h +++ b/src/ioc/db/dbServer.h @@ -17,8 +17,7 @@ * the servers together, and to provide status and debugging information * to the IOC user/developer through a common set of commands. * - * @todo Should dbRegisterServer() return an error status value? - * No API is provided yet for calling stats() methods. + * @todo No API is provided yet for calling stats() methods. * Nothing in the IOC calls dbStopServers(), not sure where it should go. */ @@ -118,7 +117,7 @@ typedef struct dbServer { * This should only be called once for each server layer. * @param psrv Server information structure for the server */ -epicsShareFunc void dbRegisterServer(dbServer *psrv); +epicsShareFunc int dbRegisterServer(dbServer *psrv); /** @brief Print dbServer Reports. * diff --git a/src/ioc/db/test/dbServerTest.c b/src/ioc/db/test/dbServerTest.c index 31ffbd8b6..e9c6556c5 100644 --- a/src/ioc/db/test/dbServerTest.c +++ b/src/ioc/db/test/dbServerTest.c @@ -104,6 +104,12 @@ dbServer disabled = { disInit, NULL, NULL, NULL }; +dbServer illegal = { + ELLNODE_INIT, "bad name", + NULL, NULL, NULL, + disInit, NULL, NULL, NULL +}; + MAIN(dbServerTest) { @@ -111,24 +117,24 @@ MAIN(dbServerTest) char *theName = "The One"; int status; - testPlan(9); + testPlan(14); /* Prove that we handle substring names properly */ epicsEnvSet("EPICS_IOC_IGNORE_SERVERS", "none ones"); testDiag("Registering dbServer 'one'"); - dbRegisterServer(&one); + testOk(dbRegisterServer(&one) == 0, "Registered 'one'"); testOk1(oneState == NOTHING_CALLED); - testDiag("Expect double-registration warning for 'one':"); - dbRegisterServer(&one); + testOk(dbRegisterServer(&one) != 0, "Duplicate registration rejected"); + testOk(dbRegisterServer(&illegal) != 0, "Illegal registration rejected"); testDiag("Registering dbServer 'no-routines'"); - dbRegisterServer(&no_routines); + testOk(dbRegisterServer(&no_routines) == 0, "Registered 'no-routines'"); epicsEnvSet("EPICS_IOC_IGNORE_SERVERS", "disabled nonexistent"); testDiag("Registering dbServer 'disabled'"); - dbRegisterServer(&disabled); + testOk(dbRegisterServer(&disabled) == 0, "Registration accepted"); dbInitServers(); testOk(oneState == INIT_CALLED, "dbInitServers"); @@ -143,6 +149,7 @@ MAIN(dbServerTest) dbStopServers(); testOk(oneState == STOP_CALLED, "dbStopServers"); + testDiag("Printing server report"); dbsr(0); testOk(oneState == REPORT_CALLED, "dbsr");