db link filter tests added

This commit is contained in:
2020-10-30 17:07:09 -05:00
committed by Andrew Johnson
parent 39c8d5619a
commit 7ab56a68d1
3 changed files with 180 additions and 0 deletions
+7
View File
@@ -159,6 +159,13 @@ asyncproctest_SRCS += asyncproctest_registerRecordDeviceDriver.cpp
TESTFILES += $(COMMON_DIR)/asyncproctest.dbd ../asyncproctest.db
TESTS += asyncproctest
TESTPROD_HOST += linkFilterTest
linkFilterTest_SRCS += linkFilterTest.c
linkFilterTest_SRCS += recTestIoc_registerRecordDeviceDriver.cpp
testHarness_SRCS += linkFilterTest.c
TESTFILES += ../linkFilterTest.db
TESTS += linkFilterTest
# dbHeader* is only a compile test
# no need to actually run
TESTPROD += dbHeaderTest
@@ -0,0 +1,157 @@
/*************************************************************************\
* Copyright (c) 2020 Dirk Zimoch
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
#include <string.h>
#include "dbAccess.h"
#include "devSup.h"
#include "alarm.h"
#include "dbUnitTest.h"
#include "errlog.h"
#include "epicsThread.h"
#include "longinRecord.h"
#include "testMain.h"
void recTestIoc_registerRecordDeviceDriver(struct dbBase *);
static void startTestIoc(const char *dbfile)
{
testdbPrepare();
testdbReadDatabase("recTestIoc.dbd", NULL, NULL);
recTestIoc_registerRecordDeviceDriver(pdbbase);
testdbReadDatabase(dbfile, NULL, NULL);
eltc(0);
testIocInitOk();
eltc(1);
}
static void expectProcSuccess(const char *rec)
{
char fieldname[20];
testDiag("expecting success from %s", rec);
sprintf(fieldname, "%s.PROC", rec);
testdbPutFieldOk(fieldname, DBF_LONG, 1);
sprintf(fieldname, "%s.SEVR", rec);
testdbGetFieldEqual(fieldname, DBF_LONG, NO_ALARM);
sprintf(fieldname, "%s.STAT", rec);
testdbGetFieldEqual(fieldname, DBF_LONG, NO_ALARM);
}
static void expectProcFailure(const char *rec)
{
char fieldname[20];
testDiag("expecting failure S_db_badField %#x from %s", S_db_badField, rec);
sprintf(fieldname, "%s.PROC", rec);
testdbPutFieldFail(S_db_badField, fieldname, DBF_LONG, 1);
sprintf(fieldname, "%s.SEVR", rec);
testdbGetFieldEqual(fieldname, DBF_LONG, INVALID_ALARM);
sprintf(fieldname, "%s.STAT", rec);
testdbGetFieldEqual(fieldname, DBF_LONG, LINK_ALARM);
}
static void changeRange(long start, long stop, long step)
{
char linkstring[60];
if (step)
sprintf(linkstring, "src.[%ld:%ld:%ld]", start, step, stop);
else if (stop)
sprintf(linkstring, "src.[%ld:%ld]", start, stop);
else
sprintf(linkstring, "src.[%ld]", start);
testDiag("modifying link: %s", linkstring);
testdbPutFieldOk("ai.INP", DBF_STRING, linkstring);
testdbPutFieldOk("wf.INP", DBF_STRING, linkstring);
}
static double buf[] = {1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 2, 4, 6};
static void expectRange(long start, long end)
{
long n = end-start+1;
testdbGetFieldEqual("ai.VAL", DBF_DOUBLE, buf[start]);
testdbGetFieldEqual("wf.NORD", DBF_LONG, n);
testdbGetArrFieldEqual("wf.VAL", DBF_DOUBLE, n+2, n, buf+start);
}
#if 0
static void expectEmptyArray(void)
{
/* empty arrays are now allowed at the moment */
testDiag("expecting empty array");
testdbGetFieldEqual("wf.NORD", DBF_LONG, 0);
}
#endif
MAIN(linkFilterTest)
{
testPlan(0);
startTestIoc("linkFilterTest.db");
testDiag("PINI");
expectRange(2,4);
testDiag("modify range");
changeRange(3,6,0);
expectProcSuccess("ai");
expectProcSuccess("wf");
expectRange(3,6);
testDiag("step 2");
changeRange(1,6,2);
expectProcSuccess("ai");
expectProcSuccess("wf");
expectRange(10,12);
testDiag("single value");
changeRange(5,0,0);
expectProcSuccess("ai");
expectProcSuccess("wf");
expectRange(5,5);
testDiag("backward range");
changeRange(5,3,0);
expectProcFailure("ai");
expectProcFailure("wf");
testDiag("range end beyond src.NORD");
changeRange(3,9,0);
expectProcSuccess("ai");
expectProcSuccess("wf");
expectRange(3,7); /* clipped range */
testDiag("range end beyond src.NELM");
changeRange(4,12,0);
expectProcSuccess("ai");
expectProcSuccess("wf");
expectRange(4,7); /* clipped range */
testDiag("range start beyond src.NORD");
changeRange(8,9,0);
expectProcFailure("ai");
expectProcFailure("wf");
testDiag("range start beyond src.NELM");
changeRange(11,12,0);
expectProcFailure("ai");
expectProcFailure("wf");
testDiag("single value beyond src.NORD");
changeRange(8,0,0);
expectProcFailure("ai");
expectProcFailure("wf");
testDiag("single beyond rec.NELM");
changeRange(12,0,0);
expectProcFailure("ai");
expectProcFailure("wf");
testIocShutdownOk();
testdbCleanup();
return testDone();
}
@@ -0,0 +1,16 @@
record(waveform, "src") {
field(NELM, "10")
field(FTVL, "SHORT")
field(INP, [1, 2, 3, 4, 5, 6, 7, 8])
}
record(ai, "ai") {
field(INP, "src.[2]") # expect 3
field(PINI, "YES")
}
record(waveform, "wf") {
field(NELM, "5")
field(FTVL, "DOUBLE")
field(INP, "src.[2:4]") # expect 3,4,5
field(PINI, "YES")
}