summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/interprocess/test/bufferstream_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/interprocess/test/bufferstream_test.cpp')
-rw-r--r--src/boost/libs/interprocess/test/bufferstream_test.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/src/boost/libs/interprocess/test/bufferstream_test.cpp b/src/boost/libs/interprocess/test/bufferstream_test.cpp
new file mode 100644
index 000000000..6b6cb24c2
--- /dev/null
+++ b/src/boost/libs/interprocess/test/bufferstream_test.cpp
@@ -0,0 +1,144 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (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>