diff --git a/modules/database/src/std/rec/subRecord.c b/modules/database/src/std/rec/subRecord.c index 91f964123..1ef3af3de 100644 --- a/modules/database/src/std/rec/subRecord.c +++ b/modules/database/src/std/rec/subRecord.c @@ -162,7 +162,7 @@ static long process(struct dbCommon *pcommon) recGblFwdLink(prec); prec->pact = FALSE; - return 0; + return status; } static long special(DBADDR *paddr, int after) diff --git a/modules/database/test/std/rec/Makefile b/modules/database/test/std/rec/Makefile index effbbd1cc..816164ebe 100644 --- a/modules/database/test/std/rec/Makefile +++ b/modules/database/test/std/rec/Makefile @@ -167,6 +167,16 @@ asyncproctest_SRCS += asyncproctest_registerRecordDeviceDriver.cpp TESTFILES += $(COMMON_DIR)/asyncproctest.dbd ../asyncproctest.db TESTS += asyncproctest +TARGETS += $(COMMON_DIR)/subproctest.dbd +DBDDEPENDS_FILES += subproctest.dbd$(DEP) +subproctest_DBD += base.dbd +TESTPROD_HOST += subproctest +subproctest_SRCS += subproctest.c +subproctest_SRCS += subproctest_registerRecordDeviceDriver.cpp +TESTFILES += $(COMMON_DIR)/subproctest.dbd ../subproctest.db +TESTS += subproctest + + TESTPROD_HOST += linkFilterTest linkFilterTest_SRCS += linkFilterTest.c linkFilterTest_SRCS += recTestIoc_registerRecordDeviceDriver.cpp diff --git a/modules/database/test/std/rec/subproctest.c b/modules/database/test/std/rec/subproctest.c new file mode 100644 index 000000000..213a6e88d --- /dev/null +++ b/modules/database/test/std/rec/subproctest.c @@ -0,0 +1,55 @@ +/*************************************************************************\ +* Copyright (c) 2022 UChicago Argonne LLC, as Operator of Argonne +* National Laboratory. +* SPDX-License-Identifier: EPICS +* EPICS BASE is distributed subject to a Software License Agreement found +* in file LICENSE that is included with this distribution. +\*************************************************************************/ + +/* This test covers tests related to invoking subrecords + */ + +#include +#include +#include +#include +#include "registryFunction.h" +#include + +static +long subproc(subRecord *prec) +{ + prec->proc = 77; + return 0; +} + +void subproctest_registerRecordDeviceDriver(struct dbBase *); + +MAIN(subproctest) +{ + testPlan(2); + + testdbPrepare(); + + testdbReadDatabase("subproctest.dbd", NULL, NULL); + subproctest_registerRecordDeviceDriver(pdbbase); + registryFunctionAdd("subproc", (REGISTRYFUNCTION) subproc); + testdbReadDatabase("subproctest.db", NULL, "TPRO=0"); + + testIocInitOk(); + testDiag("===== Test that invalid link in INPA field fails a put request ======"); + + testdbPutFieldFail(-1, "InvalidINPARec.PROC", DBF_LONG, 1); + + /* Since the put to PROC above fails, subproc() never runs + * and the value of PROC will not be set by subproc(). However, + * the testdbPutField call above goes through, so we get a partial + * result of the PROC field being left as 1. */ + testdbGetFieldEqual("InvalidINPARec.PROC", DBF_LONG, 1); + + testIocShutdownOk(); + + testdbCleanup(); + + return testDone(); +} diff --git a/modules/database/test/std/rec/subproctest.db b/modules/database/test/std/rec/subproctest.db new file mode 100644 index 000000000..126d3fea5 --- /dev/null +++ b/modules/database/test/std/rec/subproctest.db @@ -0,0 +1,4 @@ +record(sub, "InvalidINPARec") { + field(SNAM, "subproc") + field(INPA, "nonexistent") +}