1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
#if !defined Expect_hxx
#define Expect_hxx
#include "tfm/Event.hxx"
#include "tfm/TestEndPoint.hxx"
#include <boost/shared_ptr.hpp>
class EventMatcher
{
public:
virtual bool isMatch(boost::shared_ptr<Event> event)
{
assert(0);
return false;
}
virtual resip::Data getMsgTypeString() const
{
assert(0);
return "";
}
virtual const resip::Data& explainMismatch() const = 0;
virtual ~EventMatcher() {}
};
template<class T>
class EventMatcherSpecific : public EventMatcher
{
public:
EventMatcherSpecific(typename T::Type t) :
mEventType(t)
{
}
virtual bool isMatch(boost::shared_ptr<Event> event)
{
T* specificEvent = dynamic_cast<T*>(event.get());
if (specificEvent)
{
if (specificEvent->getType() == mEventType)
{
return true;
}
else
{
{
resip::DataStream ds(mMessage);
ds << "Expected " << T::getTypeName(mEventType) << ", Received " << *event;
}
return false;
}
}
else
{
{
resip::DataStream ds(mMessage);
ds << "Wrong event type";
}
return false;
}
}
virtual resip::Data getMsgTypeString() const
{
resip::Data d;
{
resip::DataStream ds(d);
ds << T::getName() << ": " << T::getTypeName(mEventType);
}
return d;
}
const resip::Data& explainMismatch() const { return mMessage; }
private:
typename T::Type mEventType;
resip::Data mMessage;
};
class ExpectPredicate
{
public:
virtual ~ExpectPredicate()
{
}
virtual bool passes(boost::shared_ptr<Event>) = 0;
virtual const resip::Data& explainMismatch() const = 0;
};
class Expect : public TestEndPoint::ExpectBase
{
public:
Expect(TestEndPoint& endPoint,
EventMatcher* em,
int timeoutMs,
ActionBase* expectAction);
Expect(TestEndPoint& endPoint,
EventMatcher* em,
ExpectPredicate* pred,
int timeoutMs,
ActionBase* expectAction);
~Expect();
virtual TestEndPoint* getEndPoint() const;
virtual unsigned int getTimeout() const;
virtual bool isMatch(boost::shared_ptr<Event> event) const;
virtual resip::Data explainMismatch(boost::shared_ptr<Event> event) const;
virtual void onEvent(TestEndPoint&, boost::shared_ptr<Event> event);
virtual resip::Data getMsgTypeString() const;
virtual std::ostream& output(std::ostream& s) const;
class Exception : public resip::BaseException
{
public:
Exception(const resip::Data& msg,
const resip::Data& file,
const int line);
virtual resip::Data getName() const ;
virtual const char* name() const ;
};
virtual Box layout() const;
virtual void render(AsciiGraphic::CharRaster &out) const;
private:
TestEndPoint& mEndPoint;
EventMatcher* mEventMatcher;
typedef std::vector<ExpectPredicate*> ExpectPredicates;
ExpectPredicates mExpectPredicates;
unsigned int mTimeoutMs;
ActionBase* mExpectAction;
resip::Data mMessage;
};
#endif
|