1 // (C) Copyright 2014 Jorge Lodos
2 // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com)
3 // (C) Copyright 2004-2007 Jonathan Turkanis
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
6 
7 // See http://www.boost.org/libs/iostreams for documentation.
8 
9 #include <sstream>
10 #include <boost/iostreams/device/file.hpp>
11 #include <boost/iostreams/filtering_stream.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"
16 
17 using namespace std;
18 using namespace boost;
19 using namespace boost::iostreams;
20 using namespace boost::iostreams::test;
21 using boost::unit_test::test_suite;
22 
verification_function_seekable_test()23 void verification_function_seekable_test()
24 {
25     {
26         temp_file f;
27         fstream io(f.name().c_str(), BOOST_IOS::in | BOOST_IOS::out | BOOST_IOS::binary | BOOST_IOS::trunc);
28         BOOST_CHECK_MESSAGE(
29             test_seekable_in_chars(io),
30             "failed using test_seekable_in_chars"
31         );
32         io.close();
33     }
34 
35     {
36         temp_file f;
37         fstream io(f.name().c_str(), BOOST_IOS::in | BOOST_IOS::out | BOOST_IOS::binary | BOOST_IOS::trunc);
38         BOOST_CHECK_MESSAGE(
39             test_seekable_in_chunks(io),
40             "failed using test_seekable_in_chunks"
41         );
42         io.close();
43     }
44 
45     {
46         temp_file f;
47         fstream io(f.name().c_str(), BOOST_IOS::in | BOOST_IOS::out | BOOST_IOS::binary | BOOST_IOS::trunc);
48         for (int i = 0; i < data_reps; ++i)
49             io.write(narrow_data(), chunk_size);
50         io.seekg(0, BOOST_IOS::beg);
51         BOOST_CHECK_MESSAGE(
52             test_input_seekable(io),
53             "failed using test_input_seekable"
54         );
55         io.close();
56     }
57 
58     {
59         temp_file f;
60         fstream io(f.name().c_str(), BOOST_IOS::in | BOOST_IOS::out | BOOST_IOS::binary | BOOST_IOS::trunc);
61         BOOST_CHECK_MESSAGE(
62             test_output_seekable(io),
63             "failed using test_output_seekable"
64         );
65         io.close();
66     }
67 }
68 
verification_function_dual_seekable_test()69 void verification_function_dual_seekable_test()
70 {
71    {
72        stringstream ss(BOOST_IOS::in | BOOST_IOS::out);
73        BOOST_CHECK_MESSAGE(
74             test_seekable_in_chars(ss),
75             "failed using test_seekable_in_chars"
76        );
77    }
78 
79    {
80        stringstream ss(BOOST_IOS::in | BOOST_IOS::out);
81        BOOST_CHECK_MESSAGE(
82             test_seekable_in_chunks(ss),
83             "failed using test_seekable_in_chunks"
84        );
85    }
86 
87    {
88        string s;
89        for (int i = 0; i < data_reps; ++i)
90             s.append(narrow_data(), chunk_size);
91        stringstream ss(s, BOOST_IOS::in | BOOST_IOS::out);
92        BOOST_CHECK_MESSAGE(
93             test_input_seekable(ss),
94             "failed using test_input_seekable"
95        );
96    }
97 
98    {
99        stringstream ss(BOOST_IOS::in | BOOST_IOS::out);
100        BOOST_CHECK_MESSAGE(
101             test_output_seekable(ss),
102             "failed using test_output_seekable"
103        );
104    }
105 
106    {
107        stringstream ss(BOOST_IOS::in | BOOST_IOS::out);
108        BOOST_CHECK_MESSAGE(
109             test_dual_seekable(ss),
110             "failed using test_dual_seekable"
111        );
112    }
113 }
114 
dual_seekable_test()115 void dual_seekable_test()
116 {
117    {
118        stringstream ss(BOOST_IOS::in | BOOST_IOS::out);
119        filtering_stream<dual_seekable> io(ss);
120        io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit);
121        BOOST_CHECK_MESSAGE(
122             test_seekable_in_chars(io),
123             "failed seeking within a string, in chars"
124        );
125    }
126 
127    {
128        stringstream ss(BOOST_IOS::in | BOOST_IOS::out);
129        filtering_stream<dual_seekable> io(ss);
130        io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit);
131        BOOST_CHECK_MESSAGE(
132             test_seekable_in_chunks(io),
133             "failed seeking within a string, in chunks"
134        );
135    }
136 
137    {
138        string s;
139        for (int i = 0; i < data_reps; ++i)
140             s.append(narrow_data(), chunk_size);
141        stringstream ss(s, BOOST_IOS::in | BOOST_IOS::out);
142        filtering_stream<dual_seekable> io(ss);
143        io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit);
144        BOOST_CHECK_MESSAGE(
145             test_input_seekable(io),
146             "failed seeking within a string source"
147        );
148    }
149 
150    {
151        stringstream ss(BOOST_IOS::in | BOOST_IOS::out);
152        filtering_stream<dual_seekable> io(ss);
153        io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit);
154        BOOST_CHECK_MESSAGE(
155             test_output_seekable(io),
156             "failed seeking within a string sink"
157        );
158    }
159 
160    {
161        stringstream ss(BOOST_IOS::in | BOOST_IOS::out);
162        filtering_stream<dual_seekable> io(ss);
163        io.exceptions(BOOST_IOS::failbit | BOOST_IOS::badbit);
164        BOOST_CHECK_MESSAGE(
165             test_dual_seekable(io),
166             "failed dual seeking within a string"
167        );
168    }
169 }
170 
init_unit_test_suite(int,char * [])171 test_suite* init_unit_test_suite(int, char* [])
172 {
173    test_suite* test = BOOST_TEST_SUITE("dual seekable test");
174    test->add(BOOST_TEST_CASE(&verification_function_seekable_test));
175    test->add(BOOST_TEST_CASE(&verification_function_dual_seekable_test));
176    test->add(BOOST_TEST_CASE(&dual_seekable_test));
177    return test;
178 }
179