#include "socktest.h"
using namespace LCBTest;
using std::string;
using std::vector;
class SockWriteTest : public SockTest {};
TEST_F(SockWriteTest, testMultiWrite)
{
ESocket sock;
loop->connect(&sock);
string expected("Hello World!");
RecvFuture rf(expected.size());
FutureBreakCondition wbc(&rf);
sock.put("Hello "); sock.schedule();
sock.put("World"); sock.schedule();
sock.put("!"); sock.schedule();
sock.schedule();
sock.conn->setRecv(&rf);
loop->setBreakCondition(&wbc);
loop->start();
rf.wait();
ASSERT_TRUE(rf.isOk());
ASSERT_EQ(expected, rf.getString());
}
TEST_F(SockWriteTest, testBigWrite)
{
ESocket sock;
loop->connect(&sock);
string expected(1024*1024*2, '*');
RecvFuture rf(expected.size());
sock.conn->setRecv(&rf);
sock.put(expected);
sock.schedule();
FutureBreakCondition wbc(&rf);
loop->setBreakCondition(&wbc);
loop->start();
rf.wait();
ASSERT_TRUE(rf.isOk());
ASSERT_EQ(expected, rf.getString());
}
TEST_F(SockWriteTest, testBrokenFirstWrite)
{
ESocket sock;
loop->connect(&sock);
while (sock.lasterr == LCB_SUCCESS) {
CloseFuture cf(CloseFuture::BEFORE_IO);
FlushedBreakCondition fbc(&sock);
sock.conn->setClose(&cf);
sock.put("This should fail");
sock.schedule();
loop->setBreakCondition(&fbc);
loop->start();
cf.wait();
}
}
TEST_F(SockWriteTest, testBrokenMultiWrites)
{
ESocket sock;
loop->connect(&sock);
while (sock.lasterr == LCB_SUCCESS) {
CloseFuture cf(CloseFuture::BEFORE_IO);
FlushedBreakCondition fbc(&sock);
sock.conn->setClose(&cf);
for (int ii = 0; ii < 100; ii++) {
sock.put("This message should fail");
sock.schedule();
}
loop->setBreakCondition(&fbc);
loop->start();
cf.wait();
}
}