Files
cdev-1.7.2n/test/caServiceTest.cc
2022-12-13 12:44:04 +01:00

466 lines
16 KiB
C++
Executable File

#include <cdevSystem.h>
#include <cdevDevice.h>
#include <cdevRequestObject.h>
#include <cdevData.h>
#include <cdevCallback.h>
#include <cdevClock.h>
int accumulationValue = 0;
int accumulationCount = 0;
int accumulationSeqCnt = 0;
char tempBuffer[1024] = "\0";
char outputBuffer [65536] = "\0";
void accumulationCallback (int status, void *, cdevRequestObject &, cdevData & data)
{
int newValue;
if(status == CDEV_SUCCESS) accumulationCount++;
data.get("value", &newValue);
if(accumulationValue!=newValue-1)
{
sprintf(tempBuffer, " => ERROR: Missed a callback between value %i and new value %i\n", accumulationValue, newValue);
strcat (outputBuffer, tempBuffer);
accumulationSeqCnt++;
}
accumulationValue=newValue;
}
void countingCallback ( int status, void * arg, cdevRequestObject &, cdevData &)
{
if(status==CDEV_SUCCESS)
{
int * ptr = (int *)arg;
*ptr = (*ptr)+1;
}
}
int accumulationTest ( char * device, char * attrib, int steps )
{
struct timeval first, second, lapsed;
struct timezone tzp;
int resultCode = 0;
int expectedHits = 0;
int callbackHits = 0;
int i;
char monMsg[255];
char mofMsg[255];
char setMsg[255];
cdevCallback cb (accumulationCallback, NULL);
cdevCallback counter (countingCallback, (void *)&callbackHits);
cdevData data;
sprintf(monMsg, "monitorOn %s", attrib);
sprintf(mofMsg, "monitorOff %s", attrib);
sprintf(setMsg, "set %s", attrib);
*outputBuffer = 0;
strcat(outputBuffer, "******************************************************************************\n");
strcat(outputBuffer, " CUMULATIVE MONITORING TESTS \n");
strcat(outputBuffer, "------------------------------------------------------------------------------\n");
gettimeofday(&first, &tzp);
cdevRequestObject & monReq = cdevRequestObject::attachRef(device, monMsg);
cdevRequestObject & mofReq = cdevRequestObject::attachRef(device, mofMsg);
cdevRequestObject & setReq = cdevRequestObject::attachRef(device, setMsg);
gettimeofday(&second, &tzp);
if (first.tv_usec > second.tv_usec)
{
second.tv_usec += 1000000;
second.tv_sec--;
}
lapsed.tv_usec = second.tv_usec - first.tv_usec;
lapsed.tv_sec = second.tv_sec - first.tv_sec;
sprintf(tempBuffer, "=> TIMER: Time necessary to create cdevRequestObjects: %li.%06li seconds\n\n", lapsed.tv_sec, lapsed.tv_usec);
strcat (outputBuffer, tempBuffer);
// ***************************
// * Start with a synchronous
// * send test.
// ***************************
accumulationValue = -1;
data.insert ("value", 0);
setReq.send (data, NULL);
monReq.sendCallback(NULL, cb);
cdevSystem::defaultSystem().poll();
accumulationCount = 0;
accumulationSeqCnt = 0;
sprintf(tempBuffer, "=> Attempting to submit %i changes with send\n", steps);
strcat (outputBuffer, tempBuffer);
gettimeofday(&first, &tzp);
for(i=1; i<=steps; i++)
{
data.insert("value", i);
if(setReq.send(data, NULL)==CDEV_SUCCESS) expectedHits++;
}
gettimeofday(&second, &tzp);
if (first.tv_usec > second.tv_usec)
{
second.tv_usec += 1000000;
second.tv_sec--;
}
lapsed.tv_usec = second.tv_usec - first.tv_usec;
lapsed.tv_sec = second.tv_sec - first.tv_sec;
sprintf(tempBuffer, " => TIMER: Time to submit %i set requests : %li.%06li seconds\n", steps, lapsed.tv_sec, lapsed.tv_usec);
strcat (outputBuffer, tempBuffer);
if(expectedHits < steps)
{
sprintf(tempBuffer, " => ERROR: Could not submit all requests to the device\n => Attempted Sends: %i\n => Actual Sends : %i\n", steps, expectedHits);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(expectedHits > accumulationCount)
{
sprintf(tempBuffer, " => ERROR: Not all changes were delivered to callback\n => Expected Hits: %i\n => Actual Hits : %i\n", expectedHits, accumulationCount);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
else if (expectedHits < accumulationCount)
{
sprintf(tempBuffer, " => WARN: Additional changes were delivered to callback\n => Expected Hits: %i\n => Actual Hits : %i\n", expectedHits, accumulationCount);
strcat (outputBuffer, tempBuffer);
}
if(accumulationSeqCnt > 0)
{
sprintf(tempBuffer, " => ERROR: %i Callbacks were out of sequence\n", accumulationSeqCnt);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(resultCode != -1) strcat(outputBuffer, " => PASSED: Successfully passed the send monitoring test\n\n");
else strcat(outputBuffer, " => FAILED: Failed to correctly execute send monitoring test\n\n");
// ***************************
// * Next with an asynchronous
// * sendCallback test.
// ***************************
resultCode = resultCode?-2:0;
cdevSystem::defaultSystem().poll();
accumulationValue = -1;
data.insert ("value", 0);
setReq.send (data, NULL);
cdevSystem::defaultSystem().poll();
accumulationCount = 0;
accumulationSeqCnt = 0;
sprintf(tempBuffer, "=> Attempting to submit %i changes with sendCallback\n", steps);
strcat (outputBuffer, tempBuffer);
gettimeofday(&first, &tzp);
for(expectedHits=0, i=1; i<=steps; i++)
{
data.insert("value", i);
if(setReq.sendCallback(data, counter)==CDEV_SUCCESS) expectedHits++;
}
cdevTimeValue t(15.0);
cdevClock timer;
timer.schedule(NULL, t);
do {
cdevSystem::defaultSystem().poll();
} while((accumulationCount<expectedHits ||
callbackHits<expectedHits) &&
!timer.expired());
gettimeofday(&second, &tzp);
if (first.tv_usec > second.tv_usec)
{
second.tv_usec += 1000000;
second.tv_sec--;
}
lapsed.tv_usec = second.tv_usec - first.tv_usec;
lapsed.tv_sec = second.tv_sec - first.tv_sec;
sprintf(tempBuffer, " => TIMER: Time to submit %i set requests : %li.%06li seconds\n", steps, lapsed.tv_sec, lapsed.tv_usec);
strcat (outputBuffer, tempBuffer);
if(expectedHits < steps)
{
sprintf(tempBuffer, " => ERROR: Could not submit all requests to the device\n => Attempted Sends: %i\n => Actual Sends : %i\n", steps, expectedHits);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(expectedHits > callbackHits)
{
sprintf(tempBuffer, " => ERROR: Not all set commands were processed\n => Actual Sends: %i\n => Sends Processed : %i\n", expectedHits, callbackHits);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(expectedHits > accumulationCount)
{
sprintf(tempBuffer, " => ERROR: Not all changes were delivered to callback\n => Expected Hits: %i\n => Actual Hits : %i\n", expectedHits, accumulationCount);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
else if (expectedHits < accumulationCount)
{
sprintf(tempBuffer, " => WARN: Additional changes were delivered to callback\n => Expected Hits: %i\n => Actual Hits : %i\n", expectedHits, accumulationCount);
strcat (outputBuffer, tempBuffer);
}
if(accumulationSeqCnt > 0)
{
sprintf(tempBuffer, " => ERROR: %i Callbacks were out of sequence\n", accumulationSeqCnt);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(resultCode != -1) strcat(outputBuffer, " => PASSED: Successfully passed the sendCallback monitoring test\n\n");
else strcat(outputBuffer, " => FAILED: Failed to correctly execute sendCallback monitoring test\n\n");
// ***************************
// * Finally strike with an
// * asynchronous
// * sendNoBlock test.
// ***************************
resultCode = resultCode?-2:0;
cdevSystem::defaultSystem().poll();
accumulationValue = -1;
data.insert ("value", 0);
setReq.send (data, NULL);
cdevSystem::defaultSystem().poll();
accumulationCount = 0;
accumulationSeqCnt = 0;
sprintf(tempBuffer, "=> Attempting to submit %i changes with sendNoBlock\n", steps);
strcat (outputBuffer, tempBuffer);
gettimeofday(&first, &tzp);
cdevGroup group;
group.start();
for(expectedHits=0, i=1; i<=steps; i++)
{
data.insert("value", i);
if(setReq.sendNoBlock(data, NULL)==CDEV_SUCCESS) expectedHits++;
}
group.end();
timer.schedule(NULL, t);
do {
group.poll();
} while(!group.allFinished() && !timer.expired());
while(accumulationCount<expectedHits && !timer.expired())
cdevSystem::defaultSystem().poll();
gettimeofday(&second, &tzp);
if (first.tv_usec > second.tv_usec)
{
second.tv_usec += 1000000;
second.tv_sec--;
}
lapsed.tv_usec = second.tv_usec - first.tv_usec;
lapsed.tv_sec = second.tv_sec - first.tv_sec;
sprintf(tempBuffer, " => TIMER: Time to submit %i set requests : %li.%06li seconds\n", steps, lapsed.tv_sec, lapsed.tv_usec);
strcat (outputBuffer, tempBuffer);
if(expectedHits < steps)
{
sprintf(tempBuffer, " => ERROR: Could not submit all requests to the device\n => Attempted Sends: %i\n => Actual Sends : %i\n", steps, expectedHits);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(expectedHits > callbackHits)
{
sprintf(tempBuffer, " => ERROR: Not all set commands were processed\n => Actual Sends: %i\n => Sends Processed : %i\n", expectedHits, callbackHits);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(expectedHits > accumulationCount)
{
sprintf(tempBuffer, " => ERROR: Not all changes were delivered to callback\n => Expected Hits: %i\n => Actual Hits : %i\n", expectedHits, accumulationCount);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
else if (expectedHits < accumulationCount)
{
sprintf(tempBuffer, " => WARN: Additional changes were delivered to callback\n => Expected Hits: %i\n => Actual Hits : %i\n", expectedHits, accumulationCount);
strcat (outputBuffer, tempBuffer);
}
if(accumulationSeqCnt > 0)
{
sprintf(tempBuffer, " => ERROR: %i Callbacks were out of sequence\n", accumulationSeqCnt);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(resultCode != -1) strcat(outputBuffer, " => PASSED: Successfully passed the sendNoBlock monitoring test\n\n");
else strcat(outputBuffer, " => FAILED: Failed to correctly execute sendNoBlock monitoring test\n\n");
// **************************
// * Detach the monitor using
// * the monitorOff command.
// **************************
mofReq.sendCallback(NULL, cb);
cdevSystem::defaultSystem().poll();
strcat(outputBuffer, "******************************************************************************\n\n");
return resultCode;
}
int getTest ( char * device, char * attrib, int steps)
{
struct timeval first, second, lapsed;
struct timezone tzp;
int i;
int resultCode = 0;
int expectedHits = 0;
int callbackHits = 0;
char getMsg[255];
cdevData data;
cdevCallback counter (countingCallback, (void *)&callbackHits);
sprintf(getMsg, "get %s", attrib);
*outputBuffer = 0;
strcat(outputBuffer, "******************************************************************************\n");
strcat(outputBuffer, " SIMPLE GET TESTS\n");
strcat(outputBuffer, "------------------------------------------------------------------------------\n");
gettimeofday(&first, &tzp);
cdevRequestObject & getReq = cdevRequestObject::attachRef(device, getMsg);
gettimeofday(&second, &tzp);
if (first.tv_usec > second.tv_usec)
{
second.tv_usec += 1000000;
second.tv_sec--;
}
lapsed.tv_usec = second.tv_usec - first.tv_usec;
lapsed.tv_sec = second.tv_sec - first.tv_sec;
sprintf(tempBuffer, "=> TIMER: Time necessary to create cdevRequestObjects: %li.%06li seconds\n\n", lapsed.tv_sec, lapsed.tv_usec);
strcat (outputBuffer, tempBuffer);
// ***************************
// * Start with a synchronous
// * send test.
// ***************************
sprintf(tempBuffer, "=> Attempting to submit %i get requests with send\n", steps);
strcat (outputBuffer, tempBuffer);
gettimeofday(&first, &tzp);
for(i=1; i<=steps; i++) if(getReq.send(NULL, data)==CDEV_SUCCESS) expectedHits++;
gettimeofday(&second, &tzp);
if (first.tv_usec > second.tv_usec)
{
second.tv_usec += 1000000;
second.tv_sec--;
}
lapsed.tv_usec = second.tv_usec - first.tv_usec;
lapsed.tv_sec = second.tv_sec - first.tv_sec;
sprintf(tempBuffer, " => TIMER: Time to submit %i get requests : %li.%06li seconds\n", steps, lapsed.tv_sec, lapsed.tv_usec);
strcat (outputBuffer, tempBuffer);
if(expectedHits < steps)
{
sprintf(tempBuffer, " => ERROR: Could not submit all requests to the device\n => Attempted Sends: %i\n => Actual Sends : %i\n", steps, expectedHits);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(resultCode != -1) strcat(outputBuffer, " => PASSED: Successfully passed the send test\n\n");
else strcat(outputBuffer, " => FAILED: Failed to correctly execute send test\n\n");
// ***************************
// * Next with an asynchronous
// * sendCallback test.
// ***************************
if(resultCode<0) resultCode = -2;
sprintf(tempBuffer, "=> Attempting to submit %i get requests with sendCallback\n", steps);
strcat (outputBuffer, tempBuffer);
gettimeofday(&first, &tzp);
for(expectedHits=0, i=1; i<=steps; i++)
{
if(getReq.sendCallback(data, counter)==CDEV_SUCCESS) expectedHits++;
}
cdevTimeValue t(15.0);
cdevClock timer;
timer.schedule(NULL, t);
do {
cdevSystem::defaultSystem().poll();
} while(callbackHits<expectedHits && !timer.expired());
gettimeofday(&second, &tzp);
if (first.tv_usec > second.tv_usec)
{
second.tv_usec += 1000000;
second.tv_sec--;
}
lapsed.tv_usec = second.tv_usec - first.tv_usec;
lapsed.tv_sec = second.tv_sec - first.tv_sec;
sprintf(tempBuffer, " => TIMER: Time to submit %i get requests : %li.%06li seconds\n", steps, lapsed.tv_sec, lapsed.tv_usec);
strcat (outputBuffer, tempBuffer);
if(expectedHits < steps)
{
sprintf(tempBuffer, " => ERROR: Could not submit all requests to the device\n => Attempted Sends: %i\n => Actual Sends : %i\n", steps, expectedHits);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(expectedHits > callbackHits)
{
sprintf(tempBuffer, " => ERROR: Not all get commands were processed\n => Actual Sends: %i\n => Sends Processed : %i\n", expectedHits, callbackHits);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(resultCode != -1) strcat(outputBuffer, " => PASSED: Successfully passed the sendCallback get test\n\n");
else strcat(outputBuffer, " => FAILED: Failed to correctly execute sendCallback get test\n\n");
// ***************************
// * Next with an asynchronous
// * sendNoBlock test.
// ***************************
if(resultCode<0) resultCode = -2;
sprintf(tempBuffer, "=> Attempting to submit %i get requests with sendNoBlock\n", steps);
strcat (outputBuffer, tempBuffer);
gettimeofday(&first, &tzp);
cdevGroup group;
group.start();
for(expectedHits=0, i=1; i<=steps; i++)
{
if(getReq.sendNoBlock(NULL, data)==CDEV_SUCCESS) expectedHits++;
}
group.end();
while(!group.allFinished()) group.poll();
gettimeofday(&second, &tzp);
if (first.tv_usec > second.tv_usec)
{
second.tv_usec += 1000000;
second.tv_sec--;
}
lapsed.tv_usec = second.tv_usec - first.tv_usec;
lapsed.tv_sec = second.tv_sec - first.tv_sec;
sprintf(tempBuffer, " => TIMER: Time to submit %i get requests : %li.%06li seconds\n", steps, lapsed.tv_sec, lapsed.tv_usec);
strcat (outputBuffer, tempBuffer);
if(expectedHits < steps)
{
sprintf(tempBuffer, " => ERROR: Could not submit all requests to the device\n => Attempted Sends: %i\n => Actual Sends : %i\n", steps, expectedHits);
strcat (outputBuffer, tempBuffer);
resultCode = -1;
}
if(resultCode != -1) strcat(outputBuffer, " => PASSED: Successfully passed the sendNoBlock get test\n\n");
else strcat(outputBuffer, " => FAILED: Failed to correctly execute sendNoBlock get test\n\n");
strcat(outputBuffer, "******************************************************************************\n\n");
return resultCode;
}
int main(int argc, char ** argv)
{
int repetition = argc>1?(atoi(argv[1])):100;
cdevSystem::defaultSystem().setThreshold(CDEV_SEVERITY_ERROR);
accumulationTest("cdev_ai0", "VAL", repetition);
fprintf(stdout, outputBuffer);
getTest("cdev_ai0", "VAL", repetition);
fprintf(stdout, outputBuffer);
}