2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
8 As a special exception, if other files instantiate templates or use macros
9 or inline functions from this file, or you compile this file and link it
10 with other works to produce a work based on this file, this file
11 does not by itself cause the resulting work to be covered
12 by the GNU General Public License.
14 However the source code for this file must still be made available
15 in accordance with section (3) of the GNU General Public License.
17 This exception does not invalidate any other reasons why a work based
18 on this file might be covered by the GNU General Public License.
22 * tests for the module tmpfstream
24 * (c) Copyright 2010 by Intra2net AG
29 #define BOOST_TEST_DYN_LINK
30 #include <boost/test/unit_test.hpp>
33 #include <filefunc.hxx>
34 #include <tmpfstream.hpp>
37 #define DOUT(msg) std::cout << msg << std::endl
39 #define DOUT(msg) do {} while (0)
45 namespace bio = boost::iostreams;
47 BOOST_AUTO_TEST_SUITE(TestTmpfstream)
49 BOOST_AUTO_TEST_CASE(Tmpofstream)
51 tmpofstream tmpf("./tmp.XXXXXX");
53 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
54 BOOST_CHECK_EQUAL( false, tmpf.get_tmp_filename().empty() );
56 Stat stat(tmpf.get_tmp_filename());
58 DOUT("filename : " << tmpf.get_tmp_filename());
60 BOOST_CHECK_EQUAL( true, (bool)stat );
61 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
63 tmpf << "hello world" << endl;
66 BOOST_CHECK_EQUAL( false, tmpf.is_open() );
68 Stat stat2(tmpf.get_tmp_filename());
70 DOUT("stated path: " << stat2.path());
71 DOUT("filesize: " << stat2.size());
73 BOOST_CHECK_EQUAL( true, stat2.size() > 0 );
75 BOOST_CHECK_EQUAL( true, tmpf.unlink() );
77 Stat stat3(tmpf.get_tmp_filename());
78 BOOST_CHECK_EQUAL( false, (bool)stat3 );
82 BOOST_AUTO_TEST_CASE(TmpofstreamUnlink)
84 tmpofstream tmpf("./tmp.XXXXXX");
86 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
88 Stat stat(tmpf.get_tmp_filename());
89 BOOST_CHECK_EQUAL( true, (bool)stat );
90 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
92 tmpf << "hello world" << endl;
94 // keep open but delete file
97 BOOST_CHECK_EQUAL( false, (bool)stat );
99 // writing to already deleted file
100 // POSIX explicitly allows this
101 tmpf << "hello world" << endl;
103 BOOST_CHECK_EQUAL( true, tmpf.good() );
105 // file still gone after closing
108 BOOST_CHECK_EQUAL( false, (bool)stat );
111 BOOST_AUTO_TEST_CASE(TmpofstreamMove1)
116 tmpofstream tmpf("./tmp.XXXXXX");
118 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
120 Stat stat(tmpf.get_tmp_filename());
121 BOOST_CHECK_EQUAL( true, (bool)stat );
122 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
124 tmpf << "hello world" << endl;
125 BOOST_CHECK_EQUAL( true, tmpf.sync() );
127 BOOST_CHECK_EQUAL( true, tmpf.move(".foobar",false) );
130 BOOST_CHECK_EQUAL( false, (bool)stat );
132 Stat stat2(".foobar");
133 BOOST_CHECK_EQUAL( true, (bool)stat2 );
138 BOOST_CHECK_EQUAL( false, (bool)stat );
141 BOOST_CHECK_EQUAL( true, (bool)stat2 );
146 BOOST_AUTO_TEST_CASE(TmpofstreamMove2)
151 tmpofstream tmpf("./tmp.XXXXXX");
153 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
155 Stat stat(tmpf.get_tmp_filename());
156 BOOST_CHECK_EQUAL( true, (bool)stat );
157 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
159 tmpf << "hello world" << endl;
162 BOOST_CHECK_EQUAL( true, tmpf.move(".foobar",true) );
165 BOOST_CHECK_EQUAL( false, (bool)stat );
167 Stat stat2(".foobar");
168 BOOST_CHECK_EQUAL( true, (bool)stat2 );
173 BOOST_CHECK_EQUAL( false, (bool)stat );
176 BOOST_CHECK_EQUAL( true, (bool)stat2 );
181 BOOST_AUTO_TEST_CASE(TmpofstreamMoveOverwrite)
183 // prepare other file
184 write_file(".foobar","blah");
186 tmpofstream tmpf("./tmp.XXXXXX");
188 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
190 Stat stat(tmpf.get_tmp_filename());
191 BOOST_CHECK_EQUAL( true, (bool)stat );
192 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
194 tmpf << "hello world" << endl;
197 // no overwrite fails
198 BOOST_CHECK_EQUAL( false, tmpf.move(".foobar",false) );
200 // overwrite succeeds
201 BOOST_CHECK_EQUAL( true, tmpf.move(".foobar",true) );
204 BOOST_CHECK_EQUAL( false, (bool)stat );
206 Stat stat2(".foobar");
207 BOOST_CHECK_EQUAL( true, (bool)stat2 );
214 BOOST_AUTO_TEST_CASE(TmpofstreamMoveAfterUnlink)
219 tmpofstream tmpf("./tmp.XXXXXX");
221 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
223 Stat stat(tmpf.get_tmp_filename());
224 BOOST_CHECK_EQUAL( true, (bool)stat );
225 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
227 tmpf << "hello world" << endl;
230 BOOST_CHECK_EQUAL( true, tmpf.unlink() );
232 BOOST_CHECK_EQUAL( true, tmpf.is_unlinked() );
234 BOOST_CHECK_EQUAL( false, tmpf.move(".foobar") );
239 BOOST_AUTO_TEST_CASE(TmpofstreamDoubleMove)
245 tmpofstream tmpf("./tmp.XXXXXX");
247 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
249 Stat stat(tmpf.get_tmp_filename());
250 BOOST_CHECK_EQUAL( true, (bool)stat );
252 tmpf << "hello world" << endl;
255 BOOST_CHECK_EQUAL( true, tmpf.move(".foobar") );
258 BOOST_CHECK_EQUAL( false, (bool)stat );
260 Stat stat2(".foobar");
261 BOOST_CHECK_EQUAL( true, (bool)stat2 );
263 BOOST_CHECK_EQUAL( true, tmpf.move(".foobar2") );
266 BOOST_CHECK_EQUAL( false, (bool)stat );
269 BOOST_CHECK_EQUAL( false, (bool)stat2 );
271 Stat stat3(".foobar2");
272 BOOST_CHECK_EQUAL( true, (bool)stat3 );
277 BOOST_AUTO_TEST_CASE(TmpfstreamReadWrite)
279 tmpfstream tmpf("./tmp.XXXXXX",std::ios_base::out | std::ios_base::in );
280 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
282 tmpf << "hello world" << endl;
288 BOOST_CHECK_EQUAL( "hello world", input );
294 BOOST_AUTO_TEST_CASE(Tmpfcopystream)
296 write_file(".foobar","blah");
298 tmpfcopystream tmpf(".foobar");
299 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
301 tmpf << "hello world";
304 BOOST_CHECK_EQUAL( "blah", read_file(".foobar") );
307 BOOST_CHECK_EQUAL( false, tmpf.is_open() );
309 BOOST_CHECK_EQUAL( "hello world", read_file(".foobar") );
314 BOOST_AUTO_TEST_CASE(TmpfcopystreamDestructor)
316 write_file(".foobar","blah");
319 tmpfcopystream tmpf(".foobar");
320 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
322 tmpf << "hello world";
325 BOOST_CHECK_EQUAL( "blah", read_file(".foobar") );
328 BOOST_CHECK_EQUAL( "hello world", read_file(".foobar") );
333 BOOST_AUTO_TEST_CASE(TmpfcopystreamAbort)
335 write_file(".foobar","blah");
337 tmpfcopystream tmpf(".foobar");
338 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
340 tmpf << "hello world";
343 // abort the overwriting, keep the old file
346 BOOST_CHECK_EQUAL( "blah", read_file(".foobar") );
351 BOOST_AUTO_TEST_CASE(TmpfcopystreamChmod)
353 write_file(".foobar","blah");
354 I2n::chmod(".foobar",0644);
355 Stat stat_orig(".foobar");
356 BOOST_CHECK_EQUAL( 0644, stat_orig.mode() );
358 tmpfcopystream tmpf(".foobar");
360 tmpf << "hello world";
363 tmpf.set_filemode_on_close(0640);
365 Stat stat_tmp(tmpf.get_tmp_filename());
366 BOOST_CHECK_EQUAL( 0600, stat_tmp.mode() );
371 BOOST_CHECK_EQUAL( 0640, stat_orig.mode() );
376 BOOST_AUTO_TEST_CASE(CreateError)
378 tmpofstream tmpf("/this/dir/really/does/not/exist/tmp.XXXXXX");
380 BOOST_CHECK_EQUAL( false, tmpf.is_open() );
383 BOOST_AUTO_TEST_SUITE_END()