1 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
2 // (C) Copyright 2004-2007 Jonathan Turkanis
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
6 // See http://www.boost.org/libs/iostreams for documentation.
8 #include <cstdio> // EOF.
9 #include <boost/iostreams/filtering_stream.hpp>
10 #include <boost/iostreams/stream.hpp>
11 #include <boost/shared_ptr.hpp>
12 #include <boost/test/test_tools.hpp>
13 #include <boost/test/unit_test.hpp>
14 #include "detail/temp_file.hpp"
15 #include "detail/verification.hpp"
18 using namespace boost
;
19 using namespace boost::iostreams
;
20 using namespace boost::iostreams::test
;
21 using boost::unit_test::test_suite
;
23 class closable_source
: public source
{
25 closable_source() : open_(new bool(true)) { }
26 std::streamsize
read(char*, std::streamsize
) { return 0; }
27 void open() { *open_
= true; }
28 void close() { *open_
= false; }
29 bool is_open() const { return *open_
; }
31 boost::shared_ptr
<bool> open_
;
34 class closable_input_filter
: public input_filter
{
36 closable_input_filter() : open_(new bool(true)) { }
38 template<typename Source
>
39 int get(Source
&) { return EOF
; }
41 void open() { *open_
= true; }
43 template<typename Source
>
44 void close(Source
&) { *open_
= false; }
46 bool is_open() const { return *open_
; }
48 boost::shared_ptr
<bool> open_
;
51 void auto_close_source()
53 // Rely on auto_close to close source.
56 stream
<closable_source
> in(src
);
57 BOOST_CHECK(src
.is_open());
58 BOOST_CHECK(in
.auto_close());
60 BOOST_CHECK(!src
.is_open());
62 // Use close() to close components.
65 stream
<closable_source
> in(src
);
66 BOOST_CHECK(src
.is_open());
67 BOOST_CHECK(in
.auto_close());
69 BOOST_CHECK(!src
.is_open());
72 // Use close() to close components, with auto_close disabled.
75 stream
<closable_source
> in(src
);
76 BOOST_CHECK(src
.is_open());
77 in
.set_auto_close(false);
79 BOOST_CHECK(!src
.is_open());
82 // Disable auto_close.
85 stream
<closable_source
> in(src
);
86 BOOST_CHECK(src
.is_open());
87 in
.set_auto_close(false);
88 BOOST_CHECK(!in
.auto_close());
90 BOOST_CHECK(src
.is_open());
93 void auto_close_filter()
96 closable_input_filter flt
;
98 // Rely on auto_close to close components.
100 filtering_istream in
;
103 BOOST_CHECK(flt
.is_open());
104 BOOST_CHECK(src
.is_open());
105 BOOST_CHECK(in
.auto_close());
107 BOOST_CHECK(!flt
.is_open());
108 BOOST_CHECK(!src
.is_open());
110 // Use reset() to close components.
114 filtering_istream in
;
117 BOOST_CHECK(flt
.is_open());
118 BOOST_CHECK(src
.is_open());
119 BOOST_CHECK(in
.auto_close());
121 BOOST_CHECK(!flt
.is_open());
122 BOOST_CHECK(!src
.is_open());
125 // Use reset() to close components, with auto_close disabled.
129 filtering_istream in
;
132 BOOST_CHECK(flt
.is_open());
133 BOOST_CHECK(src
.is_open());
134 in
.set_auto_close(false);
136 BOOST_CHECK(!flt
.is_open());
137 BOOST_CHECK(!src
.is_open());
140 // Disable auto_close.
144 filtering_istream in
;
147 BOOST_CHECK(flt
.is_open());
148 BOOST_CHECK(src
.is_open());
149 in
.set_auto_close(false);
150 BOOST_CHECK(!in
.auto_close());
152 BOOST_CHECK(flt
.is_open());
153 BOOST_CHECK(src
.is_open());
155 BOOST_CHECK(!flt
.is_open());
156 BOOST_CHECK(src
.is_open());
158 // Disable auto_close; disconnect and reconnect resource.
162 filtering_istream in
;
165 BOOST_CHECK(flt
.is_open());
166 BOOST_CHECK(src
.is_open());
167 in
.set_auto_close(false);
168 BOOST_CHECK(!in
.auto_close());
170 BOOST_CHECK(flt
.is_open());
171 BOOST_CHECK(src
.is_open());
174 BOOST_CHECK(!flt
.is_open());
175 BOOST_CHECK(!src
.is_open());
178 test_suite
* init_unit_test_suite(int, char* [])
180 test_suite
* test
= BOOST_TEST_SUITE("auto_close test");
181 test
->add(BOOST_TEST_CASE(&auto_close_source
));
182 test
->add(BOOST_TEST_CASE(&auto_close_filter
));