diff --git a/src/ioc/db/test/Makefile b/src/ioc/db/test/Makefile index 86f4853a1..c44226b04 100644 --- a/src/ioc/db/test/Makefile +++ b/src/ioc/db/test/Makefile @@ -28,30 +28,31 @@ TESTSPEC_vxWorks = dbTestHarness.munch; epicsRunDbTests TESTSPEC_RTEMS = dbTestHarness.boot; epicsRunDbTests TESTPROD_HOST += dbChannelTest -dbChannelTest_SRCS += dbChannelTest.c xRecord_registerRecordDeviceDriver.cpp +dbChannelTest_SRCS += dbChannelTest.c xRecord.c +dbTestHarness_SRCS += dbChannelTest.c OBJS_IOC_vxWorks += dbChannelTest TESTS += dbChannelTest TESTPROD_HOST += chfPluginTest -chfPluginTest_SRCS += chfPluginTest.c xRecord_registerRecordDeviceDriver.cpp +chfPluginTest_SRCS += chfPluginTest.c xRecord.c +dbTestHarness_SRCS += chfPluginTest.c OBJS_IOC_vxWorks += chfPluginTest TESTS += chfPluginTest TESTPROD_HOST += arrShorthandTest -arrShorthandTest_SRCS += arrShorthandTest.c xRecord_registerRecordDeviceDriver.cpp +arrShorthandTest_SRCS += arrShorthandTest.c xRecord.c +dbTestHarness_SRCS += arrShorthandTest.c OBJS_IOC_vxWorks += arrShorthandTest TESTS += arrShorthandTest TESTPROD_HOST += dbStateTest dbStateTest_SRCS += dbStateTest.c +dbTestHarness_SRCS += dbStateTest.c OBJS_IOC_vxWorks += dbStateTest TESTS += dbStateTest +dbTestHarness_SRCS += xRecord.c + TESTSCRIPTS_HOST += $(TESTS:%=%.t) include $(TOP)/configure/RULES - -dbChannelTest$(DEP): $(COMMON_DIR)/xRecord.h -chfPluginTest$(DEP): $(COMMON_DIR)/xRecord.h -arrShorthandTest$(DEP): $(COMMON_DIR)/xRecord.h -dbStateTest$(DEP): $(COMMON_DIR)/xRecord.h diff --git a/src/ioc/db/test/arrShorthandTest.c b/src/ioc/db/test/arrShorthandTest.c index 669eab9ca..9957ff897 100644 --- a/src/ioc/db/test/arrShorthandTest.c +++ b/src/ioc/db/test/arrShorthandTest.c @@ -21,6 +21,7 @@ #include "chfPlugin.h" #include "dbStaticLib.h" #include "dbAccessDefs.h" +#include "registry.h" #include "epicsUnitTest.h" #include "testMain.h" @@ -75,22 +76,21 @@ static void testHead (char* title) { testDiag("--------------------------------------------------------"); } -void xRecord_registerRecordDeviceDriver(struct dbBase *); +int loadTestDB(DBBASE **ppbase); -MAIN(chfPluginTest) +MAIN(arrShorthandTest) { dbChannel *pch; - testPlan(26); + testPlan(28); db_init_events(); - if (dbReadDatabase(&pdbbase, "xRecord.dbd", "..", NULL)) - testAbort("Database description not loaded"); + testHead("Set up database"); + if(loadTestDB(&pdbbase)) + return testDone(); - xRecord_registerRecordDeviceDriver(pdbbase); - if (dbReadDatabase(&pdbbase, "dbChannelTest.db", "..", NULL)) - testAbort("Test database not loaded"); + testOk(!!pdbbase, "pdbbase was set"); testHead("Register plugin"); testOk(!chfPluginRegister("arr", &myPif, opts), "register fake arr plugin"); @@ -124,16 +124,8 @@ MAIN(chfPluginTest) TESTGOOD("range with incr [s:i:e]", "[2:3:4]", 2, 3, 4); dbFreeBase(pdbbase); + registryFree(); + pdbbase=0; return testDone(); } - - -#define GEN_SIZE_OFFSET -#include "xRecord.h" - -#include -#include - -static rset xRSET; -epicsExportAddress(rset,xRSET); diff --git a/src/ioc/db/test/chfPluginTest.c b/src/ioc/db/test/chfPluginTest.c index 20db71830..89d39f8c9 100644 --- a/src/ioc/db/test/chfPluginTest.c +++ b/src/ioc/db/test/chfPluginTest.c @@ -15,6 +15,7 @@ #include "chfPlugin.h" #include "dbStaticLib.h" #include "dbAccessDefs.h" +#include "registry.h" #include "epicsUnitTest.h" #include "testMain.h" @@ -462,14 +463,14 @@ static void testHead (char* title) { testDiag("--------------------------------------------------------"); } -void xRecord_registerRecordDeviceDriver(struct dbBase *); +int loadTestDB(DBBASE **ppbase); MAIN(chfPluginTest) { dbChannel *pch; db_field_log *pfl; - testPlan(1351); + testPlan(1353); db_init_events(); @@ -484,12 +485,10 @@ MAIN(chfPluginTest) testOk(strcmp(chfPluginEnumString(colorEnum, 3, "-"), "-") == 0, "Enum to string: invalid index"); - if (dbReadDatabase(&pdbbase, "xRecord.dbd", "..", NULL)) - testAbort("Database description not loaded"); - - xRecord_registerRecordDeviceDriver(pdbbase); - if (dbReadDatabase(&pdbbase, "dbChannelTest.db", "..", NULL)) - testAbort("Test database not loaded"); + testHead("Set up database"); + if(loadTestDB(&pdbbase)) + return testDone(); + testOk(!!pdbbase, "pdbbase was set"); testHead("Try to register buggy plugins"); testOk(!!chfPluginRegister("buggy", &myPif, brokenOpts1), @@ -818,15 +817,8 @@ MAIN(chfPluginTest) drop = -1; dbFreeBase(pdbbase); + registryFree(); + pdbbase=0; return testDone(); } - -#define GEN_SIZE_OFFSET -#include "xRecord.h" - -#include -#include - -static rset xRSET; -epicsExportAddress(rset,xRSET); diff --git a/src/ioc/db/test/dbChannelTest.c b/src/ioc/db/test/dbChannelTest.c index 94de616f7..dab486b9d 100644 --- a/src/ioc/db/test/dbChannelTest.c +++ b/src/ioc/db/test/dbChannelTest.c @@ -16,6 +16,7 @@ #include "dbChannel.h" #include "dbStaticLib.h" #include "dbAccessDefs.h" +#include "registry.h" #include "recSup.h" #include "epicsUnitTest.h" #include "testMain.h" @@ -147,20 +148,18 @@ chFilterIf testIf = p_string, p_start_map, p_map_key, p_end_map, p_start_array, p_end_array, c_open, c_reg_pre, c_reg_post, c_report, c_close }; -void xRecord_registerRecordDeviceDriver(struct dbBase *); +int loadTestDB(DBBASE **ppbase); MAIN(testDbChannel) /* dbChannelTest is an API routine... */ { dbChannel *pch; - testPlan(66); + testPlan(68); - if (dbReadDatabase(&pdbbase, "xRecord.dbd", "..", NULL)) - testAbort("Database description not loaded"); + if(loadTestDB(&pdbbase)) + return testDone(); - xRecord_registerRecordDeviceDriver(pdbbase); - if (dbReadDatabase(&pdbbase, "dbChannelTest.db", "..", NULL)) - testAbort("Test database not loaded"); + testOk(!!pdbbase, "pdbbase was set"); r = e = 0; /* dbChannelTest() checks record and field names */ @@ -247,15 +246,8 @@ MAIN(testDbChannel) /* dbChannelTest is an API routine... */ testOk1(!dbChannelCreate("x.{\"scalar\":{}}")); dbFreeBase(pdbbase); + registryFree(); + pdbbase=0; return testDone(); } - -#define GEN_SIZE_OFFSET -#include "xRecord.h" - -#include -#include - -static rset xRSET; -epicsExportAddress(rset,xRSET); diff --git a/src/ioc/db/test/dbChannelTest.db b/src/ioc/db/test/dbChannelTest.db deleted file mode 100644 index a6fa08e40..000000000 --- a/src/ioc/db/test/dbChannelTest.db +++ /dev/null @@ -1,2 +0,0 @@ -record(x, x) {} - diff --git a/src/ioc/db/test/epicsRunDbTests.c b/src/ioc/db/test/epicsRunDbTests.c index 0b747abc2..d8633702e 100644 --- a/src/ioc/db/test/epicsRunDbTests.c +++ b/src/ioc/db/test/epicsRunDbTests.c @@ -17,12 +17,20 @@ #include "dbmf.h" int callbackTest(void); +int dbStateTest(void); +int testDbChannel(void); +int chfPluginTest(void); +int arrShorthandTest(void); void epicsRunDbTests(void) { testHarness(); runTest(callbackTest); + runTest(dbStateTest); + runTest(testDbChannel); + runTest(chfPluginTest); + runTest(arrShorthandTest); dbmfFreeChunks(); diff --git a/src/ioc/db/test/xRecord.c b/src/ioc/db/test/xRecord.c new file mode 100644 index 000000000..a8dc1ef0d --- /dev/null +++ b/src/ioc/db/test/xRecord.c @@ -0,0 +1,132 @@ + +#include +#include + +#include "epicsTypes.h" +#include "dbBase.h" +#include "devSup.h" +#include "registryCommon.h" +#include "registryRecordType.h" +#include "dbStaticLib.h" + +#include "epicsUnitTest.h" + +/* + * Test database initialization + */ + +/* No actual record support code is provided */ +static rset xRSET; + +/* the following would normally be found in xRecord.h */ + +typedef struct xRecord { + char name[61]; /* Record Name */ + epicsInt32 val; /* Value */ +} xRecord; + +typedef enum { + xRecordNAME = 0, + xRecordVAL = 1 +} xFieldIndex; + +static int xRecordSizeOffset(dbRecordType *prt) +{ + xRecord *prec = 0; + prt->papFldDes[xRecordNAME]->size = sizeof(prec->name); + prt->papFldDes[xRecordVAL]->size = sizeof(prec->val); + prt->papFldDes[xRecordNAME]->offset = (char *)&prec->name - (char *)prec; + prt->papFldDes[xRecordVAL]->offset = (char *)&prec->val - (char *)prec; + prt->rec_size = sizeof(*prec); + return 0; +} + +/* the following would normally be found in xRecord_registerRecordDeviceDriver.cpp */ + +static const char * const recordTypeNames[] = { + "x" +}; + +static const recordTypeLocation rtl[] = { + {&xRSET, &xRecordSizeOffset} +}; + +/* the following wpuld normally be the contents of xRecord.dbd */ + +static const char xRecord_dbd[] = +"# This is a combined minimal DBD and DB file\n" +"\n" +"recordtype(x) {\n" +" field(NAME, DBF_STRING) {\n" +" prompt(\"Record Name\")\n" +" special(SPC_NOMOD)\n" +" size(61)\n" +" }\n" +" field(VAL, DBF_LONG) {\n" +" prompt(\"Value\")\n" +" }\n" +"}\n"; + +/* the following is a db file which loads a single record instance */ + +static const char recinst_db[] = "record(x, x) {}\n"; + +/* The remainder of this file is specific to the test database initialization */ + +static FILE* makefile(const char* contents) +{ + size_t len=strlen(contents); + FILE *fp=epicsTempFile(); + if(!fp) { + perror("epicsTempFile fails"); + return NULL; + } + + if(fwrite(contents, 1, len, fp)!=len){ + perror("makefile fwrite failed"); + goto fail; + } + + if(fseek(fp, 0, SEEK_SET)!=0) + goto fail; + + return fp; +fail: + fclose(fp); + return NULL; +} + +int loadTestDB(DBBASE **ppbase) +{ + FILE *fp=makefile(xRecord_dbd); + if(!fp) { + testFail("Failed to create temp xRecord.dbd"); + return -1; + } + + if(dbReadDatabaseFP(ppbase, fp, 0, 0)) { + testFail("Failed to load temp xRecord.dbd"); + goto fail; + } + /* fp closed by dbReadDatabaseFP */ + + registerRecordTypes(*ppbase, NELEMENTS(rtl), recordTypeNames, rtl); + + fp=makefile(recinst_db); + if(!fp) { + testFail("Failed to create temp xinst.db"); + return -1; + } + + if(dbReadDatabaseFP(ppbase, fp, 0, 0)) { + testFail("Failed to load temp xinst.db"); + goto fail; + } + /* fp closed by dbReadDatabaseFP */ + + testPass("Loaded test database"); + return 0; +fail: + fclose(fp); + return -1; +} diff --git a/src/ioc/db/test/xRecord.dbd b/src/ioc/db/test/xRecord.dbd deleted file mode 100644 index 4837871a4..000000000 --- a/src/ioc/db/test/xRecord.dbd +++ /dev/null @@ -1,12 +0,0 @@ -# This is a combined minimal DBD and DB file - -recordtype(x) { - field(NAME, DBF_STRING) { - prompt("Record Name") - special(SPC_NOMOD) - size(61) - } - field(VAL, DBF_LONG) { - prompt("Value") - } -}