interprocess/test/bufferstream_test.cpp

145 lines
3.9 KiB
C++

//////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2006-2012. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/interprocess for documentation.
//
//////////////////////////////////////////////////////////////////////////////
#include <boost/interprocess/detail/config_begin.hpp>
#include <boost/interprocess/streams/bufferstream.hpp>
#include <sstream>
#include <cstring>
namespace boost{
namespace interprocess{
//Force instantiations to catch compile-time errors
template class basic_bufferbuf<char>;
template class basic_bufferstream<char>;
template class basic_ibufferstream<char>;
template class basic_obufferstream<char>;
}}
using namespace boost::interprocess;
static int bufferstream_test()
{
//Static big enough buffer
{
const int BufSize = 10001;
//This will be zero-initialized
static char buffer [BufSize];
bufferstream bufstream;
if(bufstream.tellg() != std::streampos(0)){
return 1;
}
if(bufstream.tellp() != std::streampos(0)){
return 1;
}
std::stringstream std_stringstream;
std::string str1, str2, str3("testline:");
int number1, number2;
//Make sure we have null in the last byte
bufstream.buffer(buffer, BufSize-1);
for(int i = 0; i < 100; ++i){
bufstream << "testline: " << i << std::endl;
std_stringstream << "testline: " << i << std::endl;
}
if(std::strcmp(buffer, std_stringstream.str().c_str()) != 0){
return 1;
}
//We shouldn't have reached the end of the buffer writing
if(bufstream.bad()){
assert(0);
return 1;
}
bufstream.buffer(buffer, BufSize-1);
for(int i = 0; i < 100; ++i){
bufstream >> str1 >> number1;
std_stringstream >> str2 >> number2;
if((str1 != str2) || (str1 != str3)){
assert(0); return 1;
}
if((number1 != number2) || (number1 != i)){
assert(0); return 1;
}
}
//We shouldn't have reached the end of the buffer reading
if(bufstream.eof()){
assert(0);
return 1;
}
}
//Static small buffer. Check if buffer
//overflow protection works.
{
const int BufSize = 101;
//This will be zero-initialized
static char buffer [BufSize];
bufferstream bufstream;
std::stringstream std_stringstream;
std::string str1;
int number1;
//Make sure we have null in the last byte
bufstream.buffer(buffer, BufSize-1);
for(int i = 0; i < 100; ++i){
bufstream << "testline: " << i << std::endl;
std_stringstream << "testline: " << i << std::endl;
}
//Contents should be different
if(std::strcmp(buffer, std_stringstream.str().c_str()) == 0){
return 1;
}
//The stream shouldn't be in good health
if(bufstream.good()){
assert(0);
return 1;
}
//The bad flag should be active. This indicates overflow attempt
if(!bufstream.bad()){
assert(0);
return 1;
}
//Now let's test read overflow
bufstream.clear();
bufstream.buffer(buffer, BufSize-1);
for(int i = 0; i < 100; ++i){
bufstream >> str1 >> number1;
}
//The stream shouldn't be in good health
if(bufstream.good()){
assert(0);
return 1;
}
//The eof flag indicates we have reached the end of the
//buffer while reading
if(!bufstream.eof()){
assert(0);
return 1;
}
}
return 0;
}
int main ()
{
if(bufferstream_test()){
return 1;
}
return 0;
}
#include <boost/interprocess/detail/config_end.hpp>