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 | |
15 | namespace boost{ |
16 | namespace interprocess{ |
17 | |
18 | //Force instantiations to catch compile-time errors |
19 | template class basic_bufferbuf<char>; |
20 | template class basic_bufferstream<char>; |
21 | template class basic_ibufferstream<char>; |
22 | template class basic_obufferstream<char>; |
23 | |
24 | }} |
25 | |
26 | using namespace boost::interprocess; |
27 | |
28 | static 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 | |
135 | int main () |
136 | { |
137 | if(bufferstream_test()){ |
138 | return 1; |
139 | } |
140 | return 0; |
141 | } |
142 | |
143 | |