void HttpStringStreamTester::testWriteUptoFirstBodyByte(const SampleResponse &resp)
{
    // Response header should be buffered completed, only to be written out on Flush or first byte of body.

    InStringStream iss(sampleGetReq.GetRequest());
    OutStringStream oss;
    HttpStringStream hss(&iss, &oss);

    const std::string &response = resp.GetResponse();
    ssize_t bytes = hss.Write(response.data(), resp.GetAnsHeaderSize());
    assert(bytes == sampleGetResp.GetAnsHeaderSize());
    assert(oss.GetOutput().empty());

    bytes = hss.Write(response.data() + resp.GetAnsHeaderSize(), 1);
    assert(bytes == 1);
    assert(oss.GetOutput().compare(0, std::string::npos, response, 0, resp.GetAnsHeaderSize() + 1) == 0);
}
void HttpStringStreamTester::testWriteOnlyHeader(const SampleResponse &resp)
{
    // Response header should be buffered completed, only to be written out on Flush or first byte of body.
    // Thus, if only the response buffer is written, nothing should be written out to the underlying stream.

    InStringStream iss(sampleGetReq.GetRequest());
    OutStringStream oss;
    HttpStringStream hss(&iss, &oss);

    const std::string &response = resp.GetResponse();
    ssize_t bytes = hss.Write(response.data(), resp.GetAnsHeaderSize());
    assert(bytes == resp.GetAnsHeaderSize());
    assert(oss.GetOutput().empty());

    int err = hss.Flush();
    assert(!err);
    std::string out = oss.GetOutput();
    assert(response.compare(0, out.size(), out) == 0);
}
void HttpStringStreamTester::testWriteAllAtOnce(const SampleResponse &resp)
{
    InStringStream iss(sampleGetReq.GetRequest());
    OutStringStream oss;
    HttpStringStream hss(&iss, &oss);

    const std::string &response = resp.GetResponse();
    ssize_t bytes = hss.Write(response.data(), response.size());
    assert(bytes == response.size());
    assert(oss.GetOutput() == response);
}