1//////////////////////////////////////////////////////////////////////////////
2//
3// (C) Copyright Ion Gaztanaga 2006-2012. Distributed under the Boost
4// Software License, Version 1.0. (See accompanying file
5// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6//
7// See http://www.boost.org/libs/interprocess for documentation.
8//
9//////////////////////////////////////////////////////////////////////////////
10
11#include <boost/interprocess/streams/bufferstream.hpp>
12#include <sstream>
13#include <cstring>
14
15namespace boost{
16namespace interprocess{
17
18//Force instantiations to catch compile-time errors
19template class basic_bufferbuf<char>;
20template class basic_bufferstream<char>;
21template class basic_ibufferstream<char>;
22template class basic_obufferstream<char>;
23
24}}
25
26using namespace boost::interprocess;
27
28static int bufferstream_test()
29{
30 //Static big enough buffer
31 {
32 const int BufSize = 10001;
33 //This will be zero-initialized
34 static char buffer [BufSize];
35 bufferstream bufstream;
36 if(bufstream.tellg() != std::streampos(0)){
37 return 1;
38 }
39 if(bufstream.tellp() != std::streampos(0)){
40 return 1;
41 }
42 std::stringstream std_stringstream;
43 std::string str1, str2, str3("testline:");
44 int number1, number2;
45
46 //Make sure we have null in the last byte
47 bufstream.buffer(buf: buffer, length: BufSize-1);
48 for(int i = 0; i < 100; ++i){
49 bufstream << "testline: " << i << std::endl;
50 std_stringstream << "testline: " << i << std::endl;
51 }
52
53 if(std::strcmp(s1: buffer, s2: std_stringstream.str().c_str()) != 0){
54 return 1;
55 }
56
57 //We shouldn't have reached the end of the buffer writing
58 if(bufstream.bad()){
59 assert(0);
60 return 1;
61 }
62
63 bufstream.buffer(buf: buffer, length: BufSize-1);
64 for(int i = 0; i < 100; ++i){
65 bufstream >> str1 >> number1;
66 std_stringstream >> str2 >> number2;
67 if((str1 != str2) || (str1 != str3)){
68 assert(0); return 1;
69 }
70 if((number1 != number2) || (number1 != i)){
71 assert(0); return 1;
72 }
73 }
74 //We shouldn't have reached the end of the buffer reading
75 if(bufstream.eof()){
76 assert(0);
77 return 1;
78 }
79 }
80
81 //Static small buffer. Check if buffer
82 //overflow protection works.
83 {
84 const int BufSize = 101;
85 //This will be zero-initialized
86 static char buffer [BufSize];
87 bufferstream bufstream;
88 std::stringstream std_stringstream;
89 std::string str1;
90 int number1;
91
92 //Make sure we have null in the last byte
93 bufstream.buffer(buf: buffer, length: BufSize-1);
94 for(int i = 0; i < 100; ++i){
95 bufstream << "testline: " << i << std::endl;
96 std_stringstream << "testline: " << i << std::endl;
97 }
98
99 //Contents should be different
100 if(std::strcmp(s1: buffer, s2: std_stringstream.str().c_str()) == 0){
101 return 1;
102 }
103 //The stream shouldn't be in good health
104 if(bufstream.good()){
105 assert(0);
106 return 1;
107 }
108 //The bad flag should be active. This indicates overflow attempt
109 if(!bufstream.bad()){
110 assert(0);
111 return 1;
112 }
113
114 //Now let's test read overflow
115 bufstream.clear();
116 bufstream.buffer(buf: buffer, length: BufSize-1);
117 for(int i = 0; i < 100; ++i){
118 bufstream >> str1 >> number1;
119 }
120 //The stream shouldn't be in good health
121 if(bufstream.good()){
122 assert(0);
123 return 1;
124 }
125 //The eof flag indicates we have reached the end of the
126 //buffer while reading
127 if(!bufstream.eof()){
128 assert(0);
129 return 1;
130 }
131 }
132 return 0;
133}
134
135int main ()
136{
137 if(bufferstream_test()){
138 return 1;
139 }
140 return 0;
141}
142
143

source code of boost/libs/interprocess/test/bufferstream_test.cpp