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.)
5 
6 // See http://www.boost.org/libs/iostreams for documentation.
7 
8 #include <algorithm>  // equal.
9 #include <fstream>
10 #include <boost/iostreams/device/back_inserter.hpp>
11 #include <boost/iostreams/device/file.hpp>
12 #include <boost/iostreams/device/null.hpp>
13 #include <boost/iostreams/filtering_stream.hpp>
14 #include <boost/iostreams/stream.hpp>
15 #include <boost/iostreams/operations.hpp>
16 #include <boost/test/test_tools.hpp>
17 #include <boost/test/unit_test.hpp>
18 #include "detail/filters.hpp"
19 #include "detail/temp_file.hpp"
20 #include "detail/verification.hpp"
21 
22 using namespace std;
23 using namespace boost;
24 using namespace boost::iostreams;
25 using namespace boost::iostreams::test;
26 using boost::unit_test::test_suite;
27 
flush_test()28 void flush_test()
29 {
30     {
31         stream_buffer<null_sink> null;
32         null.open(null_sink());
33         BOOST_CHECK_MESSAGE(
34             iostreams::flush(null),
35             "failed flushing stream_buffer"
36         );
37         BOOST_CHECK_MESSAGE(
38             null.strict_sync(),
39             "failed strict-syncing stream_buffer with "
40             "non-flushable resource"
41         );
42     }
43 
44     {
45         stream<null_sink> null;
46         null.open(null_sink());
47         BOOST_CHECK_MESSAGE(
48             iostreams::flush(null),
49             "failed flushing stream"
50         );
51         BOOST_CHECK_MESSAGE(
52             null.strict_sync(),
53             "failed strict-syncing stream with "
54             "non-flushable resource"
55         );
56     }
57 
58     {
59         filtering_ostream null;
60         null.push(null_sink());
61         BOOST_CHECK_MESSAGE(
62             iostreams::flush(null),
63             "failed flushing filtering_ostream"
64         );
65         BOOST_CHECK_MESSAGE(
66             null.strict_sync(),
67             "failed strict-syncing filtering_ostream with "
68             "non-flushable resource"
69         );
70     }
71 
72     {
73         filtering_ostream null;
74         null.push(tolower_filter());
75         null.push(null_sink());
76         BOOST_CHECK_MESSAGE(
77             iostreams::flush(null),
78             "failed flushing filtering_ostream with non-flushable filter"
79         );
80         BOOST_CHECK_MESSAGE(
81             !null.strict_sync(),
82             "strict-syncing filtering_ostream with "
83             "non-flushable filter succeeded"
84         );
85     }
86 
87     {
88         vector<char> dest1;
89         vector<char> dest2;
90         filtering_ostream out;
91         out.set_auto_close(false);
92         out.push(flushable_output_filter());
93 
94         // Write to dest1.
95         out.push(iostreams::back_inserter(dest1));
96         write_data_in_chunks(out);
97         out.flush();
98 
99         // Write to dest2.
100         out.pop();
101         out.push(iostreams::back_inserter(dest2));
102         write_data_in_chunks(out);
103         out.flush();
104 
105         BOOST_CHECK_MESSAGE(
106             dest1.size() == dest2.size() &&
107             std::equal(dest1.begin(), dest1.end(), dest2.begin()),
108             "failed flush filtering_ostream with auto_close disabled"
109         );
110     }
111 
112     {
113         vector<char> dest1;
114         vector<char> dest2;
115         filtering_ostream out;
116         out.set_auto_close(false);
117         out.push(flushable_output_filter());
118         out.push(flushable_output_filter());
119 
120         // Write to dest1.
121         out.push(iostreams::back_inserter(dest1));
122         write_data_in_chunks(out);
123         out.flush();
124 
125         // Write to dest2.
126         out.pop();
127         out.push(iostreams::back_inserter(dest2));
128         write_data_in_chunks(out);
129         out.flush();
130 
131         BOOST_CHECK_MESSAGE(
132             dest1.size() == dest2.size() &&
133             std::equal(dest1.begin(), dest1.end(), dest2.begin()),
134             "failed flush filtering_ostream with two flushable filters "
135             "with auto_close disabled"
136         );
137     }
138 }
139 
init_unit_test_suite(int,char * [])140 test_suite* init_unit_test_suite(int, char* [])
141 {
142     test_suite* test = BOOST_TEST_SUITE("flush test");
143     test->add(BOOST_TEST_CASE(&flush_test));
144     return test;
145 }
146