errlog std::ostream
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <testMain.h>
|
||||
#include <epicsUnitTest.h>
|
||||
#include <epicsEvent.h>
|
||||
#include <epicsThread.h>
|
||||
|
||||
#include "errlogstream.h"
|
||||
|
||||
namespace {
|
||||
|
||||
struct tester {
|
||||
std::string buf;
|
||||
epicsEvent evnt;
|
||||
bool wait;
|
||||
unsigned called;
|
||||
|
||||
tester() :wait(false), called(0) {
|
||||
errlogAddListener(&handler, (void*)this);
|
||||
}
|
||||
~tester() {
|
||||
errlogRemoveListeners(&handler, (void*)this);
|
||||
}
|
||||
|
||||
static void handler(void *raw, const char *msg)
|
||||
{
|
||||
tester *self = (tester*)raw;
|
||||
if(self->wait)
|
||||
self->evnt.wait();
|
||||
self->called++;
|
||||
self->buf += msg;
|
||||
}
|
||||
};
|
||||
|
||||
void testNoBlock(const char *msg)
|
||||
{
|
||||
testDiag("Test non blocking with message length %u", (unsigned)strlen(msg));
|
||||
tester T;
|
||||
T.wait = true;
|
||||
|
||||
{
|
||||
errlog_ostream strm(false, 16);
|
||||
|
||||
strm<<msg;
|
||||
}
|
||||
testDiag("sleep");
|
||||
epicsThreadSleep(0.1);
|
||||
// see that stream dtor doesn't call errlogFlush()
|
||||
testOk(T.called==0, "called %u times", T.called);
|
||||
T.wait = false;
|
||||
T.evnt.signal();
|
||||
testDiag("flush");
|
||||
errlogFlush();
|
||||
testOk(T.called!=0, "called %u times", T.called);
|
||||
testOk(T.buf==msg, "\"%s\"==\"%s\"", T.buf.c_str(), msg);
|
||||
}
|
||||
|
||||
void testBlock(const char *msg)
|
||||
{
|
||||
testDiag("Test blocking with message length %u", (unsigned)strlen(msg));
|
||||
tester T;
|
||||
|
||||
{
|
||||
errlog_ostream strm(true, 16);
|
||||
|
||||
strm<<msg;
|
||||
}
|
||||
|
||||
testOk(T.called!=0, "called %u times", T.called);
|
||||
testOk(T.buf==msg, "\"%s\"==\"%s\"", T.buf.c_str(), msg);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
static const char longmsg[] = "This message should be longer than the mimimum buffer length"
|
||||
" so that it results in a call to overflow()";
|
||||
|
||||
MAIN(teststream)
|
||||
{
|
||||
testPlan(0);
|
||||
eltc(0);
|
||||
testNoBlock("hello");
|
||||
testNoBlock(longmsg);
|
||||
testBlock("hello");
|
||||
testBlock(longmsg);
|
||||
eltc(1);
|
||||
return testDone();
|
||||
}
|
||||
Reference in New Issue
Block a user