[Box Backup-commit] COMMIT r1011 - in box/chris/general: lib/common test/common

boxbackup-dev at fluffy.co.uk boxbackup-dev at fluffy.co.uk
Fri Oct 13 23:38:57 BST 2006


Author: chris
Date: 2006-10-13 23:38:57 +0100 (Fri, 13 Oct 2006)
New Revision: 1011

Added:
   box/chris/general/lib/common/InvisibleTempFileStream.cpp
   box/chris/general/lib/common/InvisibleTempFileStream.h
Modified:
   box/chris/general/test/common/testcommon.cpp
Log:
 * Added InvisibleTempFileStream class and unit tests for it


Copied: box/chris/general/lib/common/InvisibleTempFileStream.cpp (from rev 968, box/chris/general/lib/common/FileStream.cpp)
===================================================================
--- box/chris/general/lib/common/InvisibleTempFileStream.cpp	                        (rev 0)
+++ box/chris/general/lib/common/InvisibleTempFileStream.cpp	2006-10-13 22:38:57 UTC (rev 1011)
@@ -0,0 +1,39 @@
+// --------------------------------------------------------------------------
+//
+// File
+//		Name:    InvisibleTempFileStream.cpp
+//		Purpose: IOStream interface to temporary files that
+//			delete themselves
+//		Created: 2006/10/13
+//
+// --------------------------------------------------------------------------
+
+#include "Box.h"
+#include "InvisibleTempFileStream.h"
+
+#include "MemLeakFindOn.h"
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    InvisibleTempFileStream::InvisibleTempFileStream
+//			(const char *, int, int)
+//		Purpose: Constructor, opens invisible file
+//		Created: 2006/10/13
+//
+// --------------------------------------------------------------------------
+InvisibleTempFileStream::InvisibleTempFileStream(const char *Filename, int flags, int mode)
+#ifdef WIN32
+	: FileStream(::openfile(Filename, flags | O_TEMPORARY, mode))
+#else
+	: FileStream(::open(Filename, flags, mode))
+#endif
+{
+	#ifndef WIN32
+	if(unlink(Filename) != 0)
+	{
+		MEMLEAKFINDER_NOT_A_LEAK(this);
+		THROW_EXCEPTION(CommonException, OSFileOpenError)
+	}
+	#endif
+}

Copied: box/chris/general/lib/common/InvisibleTempFileStream.h (from rev 968, box/chris/general/lib/common/FileStream.h)
===================================================================
--- box/chris/general/lib/common/InvisibleTempFileStream.h	                        (rev 0)
+++ box/chris/general/lib/common/InvisibleTempFileStream.h	2006-10-13 22:38:57 UTC (rev 1011)
@@ -0,0 +1,35 @@
+// --------------------------------------------------------------------------
+//
+// File
+//		Name:    InvisibleTempFileStream.h
+//		Purpose: FileStream interface to temporary files that 
+//			delete themselves
+//		Created: 2006/10/13
+//
+// --------------------------------------------------------------------------
+
+#ifndef INVISIBLETEMPFILESTREAM__H
+#define INVISIBLETEMPFILESTREAM__H
+
+#include "FileStream.h"
+
+class InvisibleTempFileStream : public FileStream
+{
+public:
+	InvisibleTempFileStream(const char *Filename, 
+#ifdef WIN32
+		int flags = (O_RDONLY | O_BINARY),
+#else
+		int flags = O_RDONLY,
+#endif
+		int mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH));
+
+private:	
+	InvisibleTempFileStream(const InvisibleTempFileStream &rToCopy) 
+	: FileStream(INVALID_FILE)
+	{ /* do not call */ }
+};
+
+#endif // INVISIBLETEMPFILESTREAM__H
+
+

Modified: box/chris/general/test/common/testcommon.cpp
===================================================================
--- box/chris/general/test/common/testcommon.cpp	2006-10-13 22:36:56 UTC (rev 1010)
+++ box/chris/general/test/common/testcommon.cpp	2006-10-13 22:38:57 UTC (rev 1011)
@@ -16,6 +16,7 @@
 #include "FdGetLine.h"
 #include "Guards.h"
 #include "FileStream.h"
+#include "InvisibleTempFileStream.h"
 #include "IOStreamGetLine.h"
 #include "NamedLock.h"
 #include "ReadGatherStream.h"
@@ -134,6 +135,54 @@
 
 int test(int argc, const char *argv[])
 {
+	// Test self-deleting temporary file streams
+	std::string tempfile("testfiles/tempfile");
+	TEST_CHECK_THROWS(InvisibleTempFileStream fs(tempfile.c_str()), 
+		CommonException, OSFileOpenError);
+	InvisibleTempFileStream fs(tempfile.c_str(), O_CREAT);
+
+#ifdef WIN32
+	// file is still visible under Windows
+	TEST_THAT(TestFileExists(tempfile.c_str()));
+
+	// opening it again should work
+	InvisibleTempFileStream fs2(tempfile.c_str());
+	TEST_THAT(TestFileExists(tempfile.c_str()));
+
+	// opening it to create should work
+	InvisibleTempFileStream fs3(tempfile.c_str(), O_CREAT);
+	TEST_THAT(TestFileExists(tempfile.c_str()));
+
+	// opening it to create exclusively should fail
+	TEST_CHECK_THROWS(InvisibleTempFileStream fs4(tempfile.c_str(), 
+		O_CREAT | O_EXCL), CommonException, OSFileOpenError);
+
+#else
+	// file is not visible under Unix
+	TEST_THAT(!TestFileExists(tempfile.c_str()));
+
+	// opening it again should fail
+	TEST_CHECK_THROWS(InvisibleTempFileStream fs2(tempfile.c_str()),
+		CommonException, OSFileOpenError);
+
+	// opening it to create should work
+	InvisibleTempFileStream fs3(tempfile.c_str(), O_CREAT);
+	TEST_THAT(!TestFileExists(tempfile.c_str()));
+
+	// opening it to create exclusively should work
+	InvisibleTempFileStream fs4(tempfile.c_str(), O_CREAT | O_EXCL);
+	TEST_THAT(!TestFileExists(tempfile.c_str()));
+
+	fs4.Close();
+#endif
+
+	fs.Close();
+	fs2.Close();
+	fs3.Close();
+
+	// now that it's closed, it should be invisible on all platforms
+	TEST_THAT(!TestFileExists(tempfile.c_str()));
+
 	// Test memory leak detection
 #ifdef BOX_MEMORY_LEAK_TESTING
 	{




More information about the Boxbackup-commit mailing list