From b02944805996fa8dcf7856cae420a334d95b8beb Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sun, 3 Jun 2018 12:35:56 -0500 Subject: [PATCH] Added lnkCalcTest --- src/std/link/test/Makefile | 8 +- src/std/link/test/epicsRunLinkTests.c | 1 + src/std/link/test/lnkCalcTest.c | 164 ++++++++++++++++++++++++++ 3 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 src/std/link/test/lnkCalcTest.c diff --git a/src/std/link/test/Makefile b/src/std/link/test/Makefile index 30aec6038..2a6507e07 100644 --- a/src/std/link/test/Makefile +++ b/src/std/link/test/Makefile @@ -23,6 +23,7 @@ linkTest_DBD += menuScan.dbd linkTest_DBD += links.dbd linkTest_DBD += ioRecord.dbd TESTFILES += $(COMMON_DIR)/linkTest.dbd +TESTFILES += ../ioRecord.db testHarness_SRCS += linkTest_registerRecordDeviceDriver.cpp @@ -30,9 +31,14 @@ TESTPROD_HOST += lnkStateTest lnkStateTest_SRCS += lnkStateTest.c lnkStateTest_SRCS += linkTest_registerRecordDeviceDriver.cpp testHarness_SRCS += lnkStateTest.c -TESTFILES += ../ioRecord.db TESTS += lnkStateTest +TESTPROD_HOST += lnkCalcTest +lnkCalcTest_SRCS += lnkCalcTest.c +lnkCalcTest_SRCS += linkTest_registerRecordDeviceDriver.cpp +testHarness_SRCS += lnkCalcTest.c +TESTS += lnkCalcTest + # epicsRunLinkTests runs all the test programs in a known working order. testHarness_SRCS += epicsRunLinkTests.c diff --git a/src/std/link/test/epicsRunLinkTests.c b/src/std/link/test/epicsRunLinkTests.c index 2cfc7a8a0..a0f3b7c72 100644 --- a/src/std/link/test/epicsRunLinkTests.c +++ b/src/std/link/test/epicsRunLinkTests.c @@ -21,6 +21,7 @@ void epicsRunLinkTests(void) testHarness(); runTest(lnkStateTest); + runTest(lnkCalcTest); dbmfFreeChunks(); diff --git a/src/std/link/test/lnkCalcTest.c b/src/std/link/test/lnkCalcTest.c new file mode 100644 index 000000000..c0d76dda3 --- /dev/null +++ b/src/std/link/test/lnkCalcTest.c @@ -0,0 +1,164 @@ +/*************************************************************************\ +* Copyright (c) 2018 Andrew Johnson +* EPICS BASE is distributed subject to a Software License Agreement found +* in the file LICENSE that is included with this distribution. +\*************************************************************************/ + +#include + +#include "dbAccess.h" +#include "alarm.h" +#include "dbUnitTest.h" +#include "errlog.h" +#include "epicsThread.h" +#include "dbLink.h" +#include "dbState.h" +#include "recGbl.h" +#include "testMain.h" +#include "ioRecord.h" + +#define testPutLongStr(PV, VAL) \ + testdbPutArrFieldOk(PV, DBF_CHAR, sizeof(VAL), VAL); + +void linkTest_registerRecordDeviceDriver(struct dbBase *); + +static void startTestIoc(const char *dbfile) +{ + testdbPrepare(); + testdbReadDatabase("linkTest.dbd", NULL, NULL); + linkTest_registerRecordDeviceDriver(pdbbase); + testdbReadDatabase(dbfile, NULL, NULL); + + eltc(0); + testIocInitOk(); + eltc(1); +} + +static void testCalc() +{ + ioRecord *pio; + DBLINK *pinp, *pout; + long status; + epicsFloat64 f64; + + startTestIoc("ioRecord.db"); + + pio = (ioRecord *) testdbRecordPtr("io"); + pinp = &pio->input; + pout = &pio->output; + + testDiag("testing lnkCalc input"); + + { + dbStateId red; + + testPutLongStr("io.INPUT", "{\"calc\":{" + "\"expr\":\"a\"," + "\"args\":[{\"state\":\"red\"}]" + "}}"); + if (testOk1(pinp->type == JSON_LINK)) + testDiag("Link was set to '%s'", pinp->value.json.string); + red = dbStateFind("red"); + testOk(!!red, "State red was created"); + + dbStateSet(red); + status = dbGetLink(pinp, DBF_DOUBLE, &f64, NULL, NULL); + testOk(!status, "dbGetLink succeeded (status = %ld)", status); + testOk(f64, "Got TRUE (%g)", f64); + + dbStateClear(red); + status = dbGetLink(pinp, DBF_DOUBLE, &f64, NULL, NULL); + testOk(!status, "dbGetLink succeeded (status = %ld)", status); + testOk(!f64, "Got FALSE (%g)", f64); + } + + { + dbStateId major = dbStateCreate("major"); + dbStateId minor = dbStateCreate("minor"); + epicsEnum16 stat, sevr; + + testPutLongStr("io.INPUT", "{\"calc\":{" + "\"expr\":\"0\"," + "\"major\":\"A\"," + "\"minor\":\"B\"," + "\"args\":[{\"state\":\"major\"},{\"state\":\"minor\"}]" + "}}"); + if (testOk1(pinp->type == JSON_LINK)) + testDiag("Link was set to '%s'", pinp->value.json.string); + + dbStateSet(major); + dbStateSet(minor); + status = dbGetLink(pinp, DBF_DOUBLE, &f64, NULL, NULL); + testOk(!status, "dbGetLink succeeded (status = %ld)", status); + testOk(f64 == 0.0, "Got zero (%g)", f64); + testOk(recGblResetAlarms(pio) && DBE_ALARM, "Record alarm was raised"); + status = dbGetAlarm(pinp, &stat, &sevr); + testOk(!status, "dbGetAlarm succeeded (status = %ld)", status); + testOk(stat == LINK_ALARM, "Alarm status = LINK (%d)", stat); + testOk(sevr == MAJOR_ALARM, "Alarm severity = MAJOR (%d)", sevr); + + dbStateClear(major); + status = dbGetLink(pinp, DBF_DOUBLE, &f64, NULL, NULL); + testOk(!status, "dbGetLink succeeded (status = %ld)", status); + testOk(recGblResetAlarms(pio) && DBE_ALARM, "Record alarm was raised"); + status = dbGetAlarm(pinp, &stat, &sevr); + testOk(!status, "dbGetAlarm succeeded (status = %ld)", status); + testOk(stat == LINK_ALARM, "Alarm status = LINK (%d)", stat); + testOk(sevr == MINOR_ALARM, "Alarm severity = MINOR (%d)", sevr); + } + + testDiag("testing lnkCalc output"); + + { + dbStateId red = dbStateFind("red"); + dbStateId out = dbStateCreate("out"); + + testPutLongStr("io.OUTPUT", "{\"calc\":{" + "\"expr\":\"!a\"," + "\"out\":{\"state\":\"out\"}," + "\"args\":[{\"state\":\"red\"}]," + "\"units\":\"things\"," + "\"prec\":3" + "}}"); + if (testOk1(pout->type == JSON_LINK)) + testDiag("Link was set to '%s'", pout->value.json.string); + + dbStateSet(red); + f64 = 1.0; + status = dbPutLink(pout, DBF_DOUBLE, &f64, 1); + testOk(!status, "dbPutLink succeeded (status = %ld)", status); + testOk(!dbStateGet(out), "output was cleared"); + + dbStateClear(red); + status = dbPutLink(pout, DBF_DOUBLE, &f64, 1); + testOk(!status, "dbGetLink succeeded (status = %ld)", status); + testOk(dbStateGet(out), "output was set"); + } + + { + char units[20] = {0}; + short prec = 0; + + status = dbGetUnits(pout, units, sizeof(units)); + testOk(!status, "dbGetUnits succeeded (status = %ld)", status); + testOk(!strcmp(units, "things"), "Units string correct (%s)", units); + + status = dbGetPrecision(pout, &prec); + testOk(!status, "dbGetPrecision succeeded (status = %ld)", status); + testOk(prec == 3, "Precision correct (%d)", prec); + } + + testIocShutdownOk(); + + testdbCleanup(); +} + + +MAIN(lnkCalcTest) +{ + testPlan(0); + + testCalc(); + + return testDone(); +}