From 6d678eca60d2496b40921df83a34c9cf53fa3df8 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Mon, 15 Sep 2014 11:42:38 -0400 Subject: [PATCH] std/rec/test: test dbGet() and dbPut() for array field test with waveform record to check that DBADDR modifications aren't seen by the caller. --- src/std/rec/test/Makefile | 13 ++++ src/std/rec/test/arrayOpTest.c | 105 +++++++++++++++++++++++++++++++ src/std/rec/test/arrayOpTest.db | 4 ++ src/std/rec/test/epicsRunTests.c | 3 + 4 files changed, 125 insertions(+) create mode 100644 src/std/rec/test/arrayOpTest.c create mode 100644 src/std/rec/test/arrayOpTest.db diff --git a/src/std/rec/test/Makefile b/src/std/rec/test/Makefile index b8657ce83..fcdb0ac7f 100644 --- a/src/std/rec/test/Makefile +++ b/src/std/rec/test/Makefile @@ -12,6 +12,19 @@ include $(TOP)/configure/CONFIG PROD_LIBS = dbRecStd dbCore ca Com +TARGETS += $(COMMON_DIR)/recTestIoc.dbd +recTestIoc_DBD = base.dbd +TESTFILES += $(COMMON_DIR)/recTestIoc.dbd + +testHarness_SRCS += recTestIoc_registerRecordDeviceDriver.cpp + +TESTPROD_HOST += arrayOpTest +arrayOpTest_SRCS += arrayOpTest.c +arrayOpTest_SRCS += recTestIoc_registerRecordDeviceDriver.cpp +testHarness_SRCS += arrayOpTest.c +TESTFILES += ../arrayOpTest.db +TESTS += arrayOpTest + TARGETS += $(COMMON_DIR)/analogMonitorTest.dbd analogMonitorTest_DBD += base.dbd TESTPROD_HOST += analogMonitorTest diff --git a/src/std/rec/test/arrayOpTest.c b/src/std/rec/test/arrayOpTest.c new file mode 100644 index 000000000..94fe61591 --- /dev/null +++ b/src/std/rec/test/arrayOpTest.c @@ -0,0 +1,105 @@ +/*************************************************************************\ +* Copyright (c) 2014 Brookhaven Science Assoc. as operator of Brookhaven +* National Laboratory. +* EPICS BASE is distributed subject to a Software License Agreement found +* in file LICENSE that is included with this distribution. + \*************************************************************************/ + +#include + +#include "dbAccess.h" + +#include "dbUnitTest.h" +#include "errlog.h" + +#include "waveformRecord.h" + +#include "testMain.h" + +void recTestIoc_registerRecordDeviceDriver(struct dbBase *); + +static void testGetPutArray(void) +{ + double data[4] = {1, 2, 3, 4}; + DBADDR addr, save; + long nreq; + epicsInt32 *pbtr; + waveformRecord *prec; + + testDiag("Test dbGet() and dbPut() of an array"); + + testdbReadDatabase("recTestIoc.dbd", NULL, NULL); + + recTestIoc_registerRecordDeviceDriver(pdbbase); + + testdbReadDatabase("arrayOpTest.db", NULL, NULL); + + eltc(0); + testIocInitOk(); + eltc(1); + + prec = (waveformRecord*)testdbRecordPtr("wfrec"); + if(!prec || dbNameToAddr("wfrec", &addr)) + testAbort("Failed to find record wfrec"); + memcpy(&save, &addr, sizeof(save)); + + testDiag("Fetch initial value"); + + dbScanLock(addr.precord); + testOk1(prec->nord==0); + + nreq = NELEMENTS(data); + if(dbGet(&addr, DBF_DOUBLE, &data, NULL, &nreq, NULL)) + testFail("dbGet fails"); + else { + testOk1(nreq==0); + } + dbScanUnlock(addr.precord); + + testOk1(memcmp(&addr, &save, sizeof(save))==0); + addr=save; + + testDiag("Write a new value"); + + data[0] = 4.0; + data[1] = 5.0; + data[2] = 6.0; + data[3] = 7.0; + + dbScanLock(addr.precord); + testOk1(dbPut(&addr, DBF_DOUBLE, &data, NELEMENTS(data))==0); + pbtr = prec->bptr; + testOk1(prec->nord==4); + testOk1(pbtr[0]==4 && pbtr[1]==5 && pbtr[2]==6 && pbtr[3]==7); + dbScanUnlock(addr.precord); + + testOk1(memcmp(&addr, &save, sizeof(save))==0); + addr=save; + + memset(&data, 0, sizeof(data)); + + testDiag("reread the value"); + + dbScanLock(addr.precord); + nreq = NELEMENTS(data); + if(dbGet(&addr, DBF_DOUBLE, &data, NULL, &nreq, NULL)) + testFail("dbGet fails"); + else { + testOk1(nreq==NELEMENTS(data)); + testOk1(data[0]==4.0 && data[1]==5.0 && data[2]==6.0 && data[3]==7.0); + } + dbScanUnlock(addr.precord); + + testOk1(memcmp(&addr, &save, sizeof(save))==0); + + testIocShutdownOk(); + + testdbCleanup(); +} + +MAIN(arrayOpTest) +{ + testPlan(10); + testGetPutArray(); + return testDone(); +} diff --git a/src/std/rec/test/arrayOpTest.db b/src/std/rec/test/arrayOpTest.db new file mode 100644 index 000000000..0ee7a9272 --- /dev/null +++ b/src/std/rec/test/arrayOpTest.db @@ -0,0 +1,4 @@ +record(waveform, "wfrec") { + field(NELM, "10") + field(FTVL, "LONG") +} diff --git a/src/std/rec/test/epicsRunTests.c b/src/std/rec/test/epicsRunTests.c index 610ee8364..2c2e9c70a 100644 --- a/src/std/rec/test/epicsRunTests.c +++ b/src/std/rec/test/epicsRunTests.c @@ -13,6 +13,7 @@ #include "epicsExit.h" int analogMonitorTest(void); +int arrayOpTest(void); void epicsRunTests(void) { @@ -20,5 +21,7 @@ void epicsRunTests(void) runTest(analogMonitorTest); + runTest(arrayOpTest); + epicsExit(0); /* Trigger test harness */ }