3 * tests for the module tmpfstream
5 * (c) Copyright 2010 by Intra2net AG
12 #define BOOST_TEST_DYN_LINK
13 #include <boost/test/unit_test.hpp>
16 #include <filefunc.hxx>
17 #include <tmpfstream.hpp>
20 #define DOUT(msg) std::cout << msg << std::endl
22 #define DOUT(msg) do {} while (0)
28 namespace bio = boost::iostreams;
30 BOOST_AUTO_TEST_SUITE(TestTmpfstream)
32 BOOST_AUTO_TEST_CASE(Tmpofstream)
34 tmpofstream tmpf("./tmp.XXXXXX");
36 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
37 BOOST_CHECK_EQUAL( false, tmpf.get_tmp_filename().empty() );
39 Stat stat(tmpf.get_tmp_filename());
41 DOUT("filename : " << tmpf.get_tmp_filename());
43 BOOST_CHECK_EQUAL( true, (bool)stat );
44 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
46 tmpf << "hello world" << endl;
49 BOOST_CHECK_EQUAL( false, tmpf.is_open() );
51 Stat stat2(tmpf.get_tmp_filename());
53 DOUT("stated path: " << stat2.path());
54 DOUT("filesize: " << stat2.size());
56 BOOST_CHECK_EQUAL( true, stat2.size() > 0 );
58 BOOST_CHECK_EQUAL( true, tmpf.unlink() );
60 Stat stat3(tmpf.get_tmp_filename());
61 BOOST_CHECK_EQUAL( false, (bool)stat3 );
65 BOOST_AUTO_TEST_CASE(TmpofstreamUnlink)
67 tmpofstream tmpf("./tmp.XXXXXX");
69 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
71 Stat stat(tmpf.get_tmp_filename());
72 BOOST_CHECK_EQUAL( true, (bool)stat );
73 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
75 tmpf << "hello world" << endl;
77 // keep open but delete file
80 BOOST_CHECK_EQUAL( false, (bool)stat );
82 // writing to already deleted file
83 // POSIX explicitly allows this
84 tmpf << "hello world" << endl;
86 BOOST_CHECK_EQUAL( true, tmpf.good() );
88 // file still gone after closing
91 BOOST_CHECK_EQUAL( false, (bool)stat );
94 BOOST_AUTO_TEST_CASE(TmpofstreamMove1)
99 tmpofstream tmpf("./tmp.XXXXXX");
101 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
103 Stat stat(tmpf.get_tmp_filename());
104 BOOST_CHECK_EQUAL( true, (bool)stat );
105 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
107 tmpf << "hello world" << endl;
108 BOOST_CHECK_EQUAL( true, tmpf.sync() );
110 BOOST_CHECK_EQUAL( true, tmpf.move(".foobar",false) );
113 BOOST_CHECK_EQUAL( false, (bool)stat );
115 Stat stat2(".foobar");
116 BOOST_CHECK_EQUAL( true, (bool)stat2 );
121 BOOST_CHECK_EQUAL( false, (bool)stat );
124 BOOST_CHECK_EQUAL( true, (bool)stat2 );
129 BOOST_AUTO_TEST_CASE(TmpofstreamMove2)
134 tmpofstream tmpf("./tmp.XXXXXX");
136 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
138 Stat stat(tmpf.get_tmp_filename());
139 BOOST_CHECK_EQUAL( true, (bool)stat );
140 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
142 tmpf << "hello world" << endl;
145 BOOST_CHECK_EQUAL( true, tmpf.move(".foobar",true) );
148 BOOST_CHECK_EQUAL( false, (bool)stat );
150 Stat stat2(".foobar");
151 BOOST_CHECK_EQUAL( true, (bool)stat2 );
156 BOOST_CHECK_EQUAL( false, (bool)stat );
159 BOOST_CHECK_EQUAL( true, (bool)stat2 );
164 BOOST_AUTO_TEST_CASE(TmpofstreamMoveOverwrite)
166 // prepare other file
167 write_file(".foobar","blah");
169 tmpofstream tmpf("./tmp.XXXXXX");
171 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
173 Stat stat(tmpf.get_tmp_filename());
174 BOOST_CHECK_EQUAL( true, (bool)stat );
175 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
177 tmpf << "hello world" << endl;
180 // no overwrite fails
181 BOOST_CHECK_EQUAL( false, tmpf.move(".foobar",false) );
183 // overwrite succeeds
184 BOOST_CHECK_EQUAL( true, tmpf.move(".foobar",true) );
187 BOOST_CHECK_EQUAL( false, (bool)stat );
189 Stat stat2(".foobar");
190 BOOST_CHECK_EQUAL( true, (bool)stat2 );
197 BOOST_AUTO_TEST_CASE(TmpofstreamMoveAfterUnlink)
202 tmpofstream tmpf("./tmp.XXXXXX");
204 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
206 Stat stat(tmpf.get_tmp_filename());
207 BOOST_CHECK_EQUAL( true, (bool)stat );
208 BOOST_CHECK_EQUAL( true, stat.is_regular_file() );
210 tmpf << "hello world" << endl;
213 BOOST_CHECK_EQUAL( true, tmpf.unlink() );
215 BOOST_CHECK_EQUAL( true, tmpf.is_unlinked() );
217 BOOST_CHECK_EQUAL( false, tmpf.move(".foobar") );
222 BOOST_AUTO_TEST_CASE(TmpofstreamDoubleMove)
228 tmpofstream tmpf("./tmp.XXXXXX");
230 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
232 Stat stat(tmpf.get_tmp_filename());
233 BOOST_CHECK_EQUAL( true, (bool)stat );
235 tmpf << "hello world" << endl;
238 BOOST_CHECK_EQUAL( true, tmpf.move(".foobar") );
241 BOOST_CHECK_EQUAL( false, (bool)stat );
243 Stat stat2(".foobar");
244 BOOST_CHECK_EQUAL( true, (bool)stat2 );
246 BOOST_CHECK_EQUAL( true, tmpf.move(".foobar2") );
249 BOOST_CHECK_EQUAL( false, (bool)stat );
252 BOOST_CHECK_EQUAL( false, (bool)stat2 );
254 Stat stat3(".foobar2");
255 BOOST_CHECK_EQUAL( true, (bool)stat3 );
260 BOOST_AUTO_TEST_CASE(TmpfstreamReadWrite)
262 tmpfstream tmpf("./tmp.XXXXXX",std::ios_base::out | std::ios_base::in );
263 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
265 tmpf << "hello world" << endl;
271 BOOST_CHECK_EQUAL( "hello world", input );
277 BOOST_AUTO_TEST_CASE(Tmpfcopystream)
279 write_file(".foobar","blah");
281 tmpfcopystream tmpf(".foobar");
282 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
284 tmpf << "hello world";
287 BOOST_CHECK_EQUAL( "blah", read_file(".foobar") );
290 BOOST_CHECK_EQUAL( false, tmpf.is_open() );
292 BOOST_CHECK_EQUAL( "hello world", read_file(".foobar") );
297 BOOST_AUTO_TEST_CASE(TmpfcopystreamDestructor)
299 write_file(".foobar","blah");
302 tmpfcopystream tmpf(".foobar");
303 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
305 tmpf << "hello world";
308 BOOST_CHECK_EQUAL( "blah", read_file(".foobar") );
311 BOOST_CHECK_EQUAL( "hello world", read_file(".foobar") );
316 BOOST_AUTO_TEST_CASE(TmpfcopystreamAbort)
318 write_file(".foobar","blah");
320 tmpfcopystream tmpf(".foobar");
321 BOOST_CHECK_EQUAL( true, tmpf.is_open() );
323 tmpf << "hello world";
326 // abort the overwriting, keep the old file
329 BOOST_CHECK_EQUAL( "blah", read_file(".foobar") );
334 BOOST_AUTO_TEST_CASE(TmpfcopystreamChmod)
336 write_file(".foobar","blah");
337 I2n::chmod(".foobar",0644);
338 Stat stat_orig(".foobar");
339 BOOST_CHECK_EQUAL( 0644, stat_orig.mode() );
341 tmpfcopystream tmpf(".foobar");
343 tmpf << "hello world";
346 tmpf.set_filemode_on_close(0640);
348 Stat stat_tmp(tmpf.get_tmp_filename());
349 BOOST_CHECK_EQUAL( 0600, stat_tmp.mode() );
354 BOOST_CHECK_EQUAL( 0640, stat_orig.mode() );
360 BOOST_AUTO_TEST_SUITE_END()