testpvalink avoid false positive races

This commit is contained in:
Michael Davidsaver
2018-04-19 14:13:07 -07:00
parent c86472666a
commit ff197f89cb
7 changed files with 63 additions and 20 deletions
+27 -14
View File
@@ -1,10 +1,13 @@
#include <dbUnitTest.h>
#include <testMain.h>
#include <longinRecord.h>
#include <longoutRecord.h>
#include <pv/qsrv.h>
#include "utilities.h"
#include "pvalink.h"
#include "pv/qsrv.h"
namespace {
@@ -12,40 +15,50 @@ void testGet()
{
testDiag("==== testGet ====");
longinRecord *li1 = (longinRecord*)testdbRecordPtr("src:li1");
while(!dbIsLinkConnected(&li1->inp))
testqsrvWaitForLinkEvent(&li1->inp);
testdbGetFieldEqual("target:li.VAL", DBF_LONG, 42);
testdbGetFieldEqual("src:li1.VAL", DBF_LONG, 0);
testdbGetFieldEqual("src:li1.VAL", DBF_LONG, 0); // value before first process
testdbGetFieldEqual("src:li1.INP", DBF_STRING, "{\"pva\":\"target:li\"}");
testdbPutFieldOk("src:li1.PROC", DBF_LONG, 1);
//TODO: wait for dbEvent queue update
epicsThreadSleep(0.1);
testdbGetFieldEqual("src:li1.VAL", DBF_LONG, 42);
testdbPutFieldOk("src:li1.INP", DBF_STRING, "{\"pva\":\"target:ai\"}");
testdbGetFieldEqual("src:li1.VAL", DBF_LONG, 42);
while(!dbIsLinkConnected(&li1->inp))
testqsrvWaitForLinkEvent(&li1->inp);
testdbGetFieldEqual("src:li1.VAL", DBF_LONG, 42); // changing link doesn't automatically process
//TODO: wait for pvalink worker update
epicsThreadSleep(0.1);
testdbPutFieldOk("src:li1.PROC", DBF_LONG, 1);
//TODO: wait for dbEvent queue update
epicsThreadSleep(0.1);
testdbGetFieldEqual("src:li1.VAL", DBF_LONG, 4);
testdbGetFieldEqual("src:li1.VAL", DBF_LONG, 4); // now it's changed
}
void testPut()
{
testDiag("==== testPut ====");
testdbGetFieldEqual("target:li2.VAL", DBF_LONG, 43);
testdbGetFieldEqual("src:li2.VAL", DBF_LONG, 0);
testdbGetFieldEqual("src:li2.OUT", DBF_STRING, "{\"pva\":\"target:li2\"}");
testdbPutFieldOk("src:li2.VAL", DBF_LONG, 14);
longoutRecord *lo2 = (longoutRecord*)testdbRecordPtr("src:lo2");
while(!dbIsLinkConnected(&lo2->out))
testqsrvWaitForLinkEvent(&lo2->out);
testdbGetFieldEqual("target:li2.VAL", DBF_LONG, 43);
testdbGetFieldEqual("src:lo2.VAL", DBF_LONG, 0);
testdbGetFieldEqual("src:lo2.OUT", DBF_STRING, "{\"pva\":\"target:li2\"}");
testdbPutFieldOk("src:lo2.VAL", DBF_LONG, 14);
testdbGetFieldEqual("target:li2.VAL", DBF_LONG, 14);
testdbGetFieldEqual("src:li2.VAL", DBF_LONG, 14);
testdbGetFieldEqual("src:lo2.VAL", DBF_LONG, 14);
}
} // namespace