Add better tests of the ResetHighWaterMark API

This commit is contained in:
Andrew Johnson authored and Dirk Zimoch committed 2026-10-14 11:25:44 +02:00
1 parent a5eddfcd63
commit 4886eaade8
2 files changed
+32 -2

No files matched your search

+17 -1
View File
@@ -60,7 +60,7 @@ MAIN(ringBytesTest)
char get[RINGSIZE+1];
epicsRingBytesId ring;
testPlan(292);
testPlan(314);
pinfo = calloc(1,sizeof(info));
if (!pinfo) {
@@ -99,6 +99,8 @@ MAIN(ringBytesTest)
n = epicsRingBytesPut(ring, put+RINGSIZE, 1);
testOk(n==0, "put to full ring");
check(ring, 0, RINGSIZE);
epicsRingBytesResetHighWaterMark(ring);
check(ring, 0, RINGSIZE);
for(i = 0 ; i < RINGSIZE ; i++) {
n = epicsRingBytesGet(ring, get+i, 1);
testOk(n==1, "ring get 1, %d", i);
@@ -124,6 +126,20 @@ MAIN(ringBytesTest)
testOk(n==1, "ring get %d", 1);
check(ring, RINGSIZE, 1);
/* Reset must lower a grown mark to the current non-zero usage.
* Fill the ring (mark -> RINGSIZE), drain half so usage < mark,
* then reset and confirm the mark drops to the half that remains.
*/
epicsRingBytesResetHighWaterMark(ring);
n = epicsRingBytesPut(ring, put, RINGSIZE);
testOk(n==RINGSIZE, "ring put %d", RINGSIZE);
check(ring, 0, RINGSIZE);
n = epicsRingBytesGet(ring, get, RINGSIZE/2);
testOk(n==RINGSIZE/2, "ring get %d", RINGSIZE/2);
check(ring, RINGSIZE/2, RINGSIZE);
epicsRingBytesResetHighWaterMark(ring);
check(ring, RINGSIZE/2, RINGSIZE/2);
epicsRingBytesDelete(ring);
epicsEventDestroy(consumerEvent);
free(pinfo);
+15 -1
View File
@@ -117,6 +117,20 @@ static void testSingle(void)
testOk1(epicsRingPointerGetUsed(ring)==0);
testOk1(epicsRingPointerGetHighWaterMark(ring)==rsize);
testDiag("Reset lowers a grown mark to the current non-zero usage");
/* Mark is still rsize from the fill above; push half so that
* usage < mark, then reset and confirm the mark drops to usage
* (not to zero, not left unchanged, not the reversed complement).
*/
for(i=0; i<rsize/2; i++)
epicsRingPointerPush(ring, int2ptr(i+1));
testOk1(epicsRingPointerGetUsed(ring)==rsize/2);
testOk1(epicsRingPointerGetHighWaterMark(ring)==rsize);
epicsRingPointerResetHighWaterMark(ring);
testOk1(epicsRingPointerGetHighWaterMark(ring)==rsize/2);
while(epicsRingPointerPop(ring)) {} /* drain for following tests */
testOk1(epicsRingPointerIsEmpty(ring));
testDiag("Fill it up again");
for(i=2; i<2*rsize; i++) {
int ret;
@@ -255,7 +269,7 @@ MAIN(ringPointerTest)
epicsThreadOpts opts = EPICS_THREAD_OPTS_INIT;
epicsEventId stop = epicsEventMustCreate(epicsEventEmpty);
testPlan(42);
testPlan(46);
testSingle();
/* testPair() needs to run with a priority > 0.
* Start a new thread since main() is a "non-epics"