// // FileTest.cpp // // $Id: //poco/1.2/Foundation/testsuite/src/FileTest.cpp#3 $ // // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. // and Contributors. // // Permission is hereby granted, free of charge, to any person or organization // obtaining a copy of the software and accompanying documentation covered by // this license (the "Software") to use, reproduce, display, distribute, // execute, and transmit the Software, and to prepare derivative works of the // Software, and to permit third-parties to whom the Software is furnished to // do so, all subject to the following: // // The copyright notices in the Software and this entire statement, including // the above license grant, this restriction and the following disclaimer, // must be included in all copies of the Software, in whole or in part, and // all derivative works of the Software, unless such copies or derivative // works are solely in the form of machine-executable object code generated by // a source language processor. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. // #include "FileTest.h" #include "CppUnit/TestCaller.h" #include "CppUnit/TestSuite.h" #include "Poco/File.h" #include "Poco/TemporaryFile.h" #include "Poco/Path.h" #include "Poco/Exception.h" #include "Poco/Thread.h" #include #include using Poco::File; using Poco::TemporaryFile; using Poco::Path; using Poco::Exception; using Poco::Timestamp; using Poco::Thread; FileTest::FileTest(const std::string& name): CppUnit::TestCase(name) { } FileTest::~FileTest() { } void FileTest::testFileAttributes1() { File f("testfile.dat"); assert (!f.exists()); try { bool flag = f.canRead(); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { bool flag = f.canWrite(); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { bool flag = f.isFile(); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { bool flag = f.isDirectory(); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { Timestamp ts = f.created(); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { Timestamp ts = f.getLastModified(); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { Timestamp ts; f.setLastModified(ts); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { File::FileSize fs = f.getSize(); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { f.setSize(0); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { f.setWriteable(); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { f.setReadOnly(); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { f.copyTo("copy.dat"); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { f.moveTo("copy.dat"); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { f.renameTo("copy.dat"); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } try { f.remove(); failmsg("file does not exist - must throw exception"); } catch (Exception&) { } } void FileTest::testCreateFile() { File f("testfile.dat"); bool created = f.createFile(); assert (created); created = f.createFile(); assert (!created); } void FileTest::testFileAttributes2() { TemporaryFile f; bool created = f.createFile(); Timestamp ts; assert (created); assert (f.exists()); assert (f.canRead()); assert (f.canWrite()); assert (f.isFile()); assert (!f.isDirectory()); Timestamp tsc = f.created(); Timestamp tsm = f.getLastModified(); assert (tsc - ts >= -2000000 && tsc - ts <= 2000000); assert (tsm - ts >= -2000000 && tsm - ts <= 2000000); f.setWriteable(false); assert (!f.canWrite()); assert (f.canRead()); f.setReadOnly(false); assert (f.canWrite()); assert (f.canRead()); ts = Timestamp::fromEpochTime(1000000); f.setLastModified(ts); assert (f.getLastModified() == ts); } void FileTest::testCompare() { File f1("abc.txt"); File f2("def.txt"); File f3("abc.txt"); assert (f1 == f3); assert (!(f1 == f2)); assert (f1 != f2); assert (!(f1 != f3)); assert (!(f1 == f2)); assert (f1 < f2); assert (f1 <= f2); assert (!(f2 < f1)); assert (!(f2 <= f1)); assert (f2 > f1); assert (f2 >= f1); assert (!(f1 > f2)); assert (!(f1 >= f2)); assert (f1 <= f3); assert (f1 >= f3); } void FileTest::testRootDir() { #if defined(POCO_OS_FAMILY_WINDOWS) File f1("/"); File f2("c:/"); File f3("c:\\"); File f4("\\"); assert (f1.exists()); assert (f2.exists()); assert (f3.exists()); assert (f4.exists()); #else File f1("/"); assert (f1.exists()); #endif } void FileTest::testSwap() { File f1("abc.txt"); File f2("def.txt"); f1.swap(f2); assert (f1.path() == "def.txt"); assert (f2.path() == "abc.txt"); } void FileTest::testSize() { std::ofstream ostr("testfile.dat"); ostr << "Hello, world!" << std::endl; ostr.close(); File f("testfile.dat"); assert (f.getSize() > 0); f.setSize(0); assert (f.getSize() == 0); } void FileTest::testDirectory() { File d("testdir"); try { d.remove(true); } catch (...) { } TemporaryFile::registerForDeletion("testdir"); bool created = d.createDirectory(); assert (created); assert (d.isDirectory()); assert (!d.isFile()); std::vector files; d.list(files); assert (files.empty()); File f = Path("testdir/file1", Path::PATH_UNIX); f.createFile(); f = Path("testdir/file2", Path::PATH_UNIX); f.createFile(); f = Path("testdir/file3", Path::PATH_UNIX); f.createFile(); d.list(files); assert (files.size() == 3); std::set fs; fs.insert(files.begin(), files.end()); assert (fs.find("file1") != fs.end()); assert (fs.find("file2") != fs.end()); assert (fs.find("file3") != fs.end()); File dd(Path("testdir/testdir2/testdir3", Path::PATH_UNIX)); dd.createDirectories(); assert (dd.exists()); assert (dd.isDirectory()); File ddd(Path("testdir/testdirB/testdirC/testdirD", Path::PATH_UNIX)); ddd.createDirectories(); assert (ddd.exists()); assert (ddd.isDirectory()); d.remove(true); } void FileTest::testCopy() { std::ofstream ostr("testfile.dat"); ostr << "Hello, world!" << std::endl; ostr.close(); File f1("testfile.dat"); TemporaryFile f2; f1.copyTo(f2.path()); assert (f2.exists()); assert (f1.getSize() == f2.getSize()); } void FileTest::testMove() { std::ofstream ostr("testfile.dat"); ostr << "Hello, world!" << std::endl; ostr.close(); File f1("testfile.dat"); File::FileSize sz = f1.getSize(); TemporaryFile f2; f1.moveTo(f2.path()); assert (f2.exists()); assert (f2.getSize() == sz); assert (f1.exists()); assert (f1 == f2); } void FileTest::testRename() { std::ofstream ostr("testfile.dat"); ostr << "Hello, world!" << std::endl; ostr.close(); File f1("testfile.dat"); File f2("testfile2.dat"); f1.renameTo(f2.path()); assert (f2.exists()); assert (f1.exists()); assert (f1 == f2); f2.remove(); } void FileTest::setUp() { File f("testfile.dat"); try { f.remove(); } catch (...) { } } void FileTest::tearDown() { File f("testfile.dat"); try { f.remove(); } catch (...) { } } CppUnit::Test* FileTest::suite() { CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("FileTest"); CppUnit_addTest(pSuite, FileTest, testFileAttributes1); CppUnit_addTest(pSuite, FileTest, testFileAttributes2); CppUnit_addTest(pSuite, FileTest, testCompare); CppUnit_addTest(pSuite, FileTest, testSwap); CppUnit_addTest(pSuite, FileTest, testSize); CppUnit_addTest(pSuite, FileTest, testDirectory); CppUnit_addTest(pSuite, FileTest, testCopy); CppUnit_addTest(pSuite, FileTest, testMove); CppUnit_addTest(pSuite, FileTest, testRename); CppUnit_addTest(pSuite, FileTest, testRootDir); return pSuite; }