diff --git a/src/sequenceParser/ItemStat.cpp b/src/sequenceParser/ItemStat.cpp index 9d3b63f..19f057d 100644 --- a/src/sequenceParser/ItemStat.cpp +++ b/src/sequenceParser/ItemStat.cpp @@ -27,7 +27,7 @@ ItemStat::ItemStat( const Item& item, const bool approximative ) , maxSize(0) , realSize(0) , sizeOnDisk(0) - , accessTime(0) + , accessTime(-1) , modificationTime(-1) , lastChangeTime(-1) , ownerCanRead(false) @@ -62,7 +62,7 @@ ItemStat::ItemStat( const Item& item, const bool approximative ) statSequence( item, approximative ); break; } - case eTypeUndefined: + default: break; } } @@ -101,7 +101,11 @@ void ItemStat::setGroupName() void ItemStat::statLink( const boost::filesystem::path& path ) { boost::system::error_code errorCode; - modificationTime = bfs::last_write_time(path, errorCode); + const long long last_write_time = bfs::last_write_time(path, errorCode); + if(errorCode == boost::system::errc::success) + { + modificationTime = last_write_time; + } #ifdef __UNIX__ struct stat statInfos; @@ -132,11 +136,13 @@ void ItemStat::statLink( const boost::filesystem::path& path ) void ItemStat::statFolder( const boost::filesystem::path& path ) { - using namespace boost::filesystem; boost::system::error_code errorCode; - - fullNbHardLinks = nbHardLinks = bfs::hard_link_count( path, errorCode ); - modificationTime = bfs::last_write_time( path, errorCode ); + const size_t hard_link_count = bfs::hard_link_count(path, errorCode); + if(errorCode == boost::system::errc::success) + { + fullNbHardLinks = nbHardLinks = hard_link_count; + modificationTime = bfs::last_write_time(path, errorCode); + } #ifdef __UNIX__ struct stat statInfos; @@ -165,13 +171,16 @@ void ItemStat::statFolder( const boost::filesystem::path& path ) void ItemStat::statFile( const boost::filesystem::path& path ) { - using namespace boost::filesystem; boost::system::error_code errorCode; - fullNbHardLinks = nbHardLinks = bfs::hard_link_count( path, errorCode ); - size = bfs::file_size( path, errorCode ); - minSize = size; - maxSize = size; - modificationTime = bfs::last_write_time( path, errorCode ); + const size_t hard_link_count = bfs::hard_link_count(path, errorCode); + if(errorCode == boost::system::errc::success) + { + fullNbHardLinks = nbHardLinks = hard_link_count; + size = bfs::file_size(path, errorCode); + minSize = size; + maxSize = size; + modificationTime = bfs::last_write_time(path, errorCode); + } #ifdef __UNIX__ struct stat statInfos; @@ -198,9 +207,6 @@ void ItemStat::statFile( const boost::filesystem::path& path ) void ItemStat::statSequence( const Item& item, const bool approximative ) { - using namespace boost::filesystem; - using namespace sequenceParser; - #ifdef __UNIX__ struct stat statInfos; const int statStatus = lstat(item.getAbsoluteFirstFilename().c_str(), &statInfos); diff --git a/test/pyTest/testStat.py b/test/pyTest/testStat.py index 38e00ae..b4e46ab 100644 --- a/test/pyTest/testStat.py +++ b/test/pyTest/testStat.py @@ -60,6 +60,43 @@ def checkCommonParameters(itemStat): assert_equals(itemStat.otherCanExecute, False) +def checkUnsetItemStat(itemStat): + """ + Check attributes of the given itemStat that should not be set. + """ + # user and group + assert_equals(itemStat.userName, "unknown") + assert_equals(itemStat.groupName, "unknown") + # check id + assert_equals(itemStat.deviceId, 0) + assert_equals(itemStat.inodeId, 0) + assert_equals(itemStat.userId, 0) + assert_equals(itemStat.groupId, 0) + # nb hard links + assert_equals(itemStat.nbHardLinks, 0) + assert_equals(itemStat.fullNbHardLinks, 0) + # check size + assert_equals(itemStat.size, 0) + assert_equals(itemStat.minSize, 0) + assert_equals(itemStat.maxSize, 0) + assert_equals(itemStat.realSize, 0) + assert_equals(itemStat.sizeOnDisk, 0) + # time + assert_equals(itemStat.accessTime, -1) + assert_equals(itemStat.modificationTime, -1) + assert_equals(itemStat.lastChangeTime, -1) + # permissions + assert_equals(itemStat.ownerCanRead, False) + assert_equals(itemStat.ownerCanWrite, False) + assert_equals(itemStat.ownerCanExecute, False) + assert_equals(itemStat.groupCanRead, False) + assert_equals(itemStat.groupCanWrite, False) + assert_equals(itemStat.groupCanExecute, False) + assert_equals(itemStat.otherCanRead, False) + assert_equals(itemStat.otherCanWrite, False) + assert_equals(itemStat.otherCanExecute, False) + + def testFileStat(): """ Check stats of a single file. @@ -85,6 +122,25 @@ def testFileStat(): assert_less_equal(itemStat.lastChangeTime, currentTime) +def testFileDeleted(): + """ + Check stats of a file which is deleted between the browse and the stat. + """ + # create new elements + fileToDelete = "fileToDelete.txt" + createFile(root_path, fileToDelete) + # browse the all directory + items = seq.browse(root_path) + # remove the last file created and get the stats of this file + itemStat = None + for item in items: + if item.getFilename() == fileToDelete: + os.remove(os.path.join(root_path, fileToDelete)) + itemStat = seq.ItemStat(item) + break + checkUnsetItemStat(itemStat) + + def testSymLinkStat(): """ Check stats of a folder. @@ -119,6 +175,25 @@ def testSymLinkStat(): assert_equals(itemStat.otherCanExecute, True) +def testSymLinkDeleted(): + """ + Check stats of a symbolic link which is deleted between the browse and the stat. + """ + # create new symbolic link + linkToDelete = "linkToDelete.txt" + createSymLink(root_path, "plop.txt", linkToDelete) + # browse the all directory + items = seq.browse(root_path) + # remove the last file created and get the stats of this symbolic link + itemStat = None + for item in items: + if item.getFilename() == linkToDelete: + os.remove(os.path.join(root_path, linkToDelete)) + itemStat = seq.ItemStat(item) + break + checkUnsetItemStat(itemStat) + + def testFolderStat(): """ Check stats of a folder. @@ -138,6 +213,25 @@ def testFolderStat(): assert_greater_equal(itemStat.sizeOnDisk, itemStat.size) +def testFolderDeleted(): + """ + Check stats of a folder which is deleted between the browse and the stat. + """ + # create new folder + folderToDelete = "folderToDelete" + createFolder(root_path, folderToDelete) + # browse the all directory + items = seq.browse(root_path) + # remove the last file created and get the stats of this folder + itemStat = None + for item in items: + if item.getFilename() == folderToDelete: + shutil.rmtree(os.path.join(root_path, folderToDelete)) + itemStat = seq.ItemStat(item) + break + checkUnsetItemStat(itemStat) + + def testSequenceStat(): """ Check stats of a sequence. @@ -158,40 +252,36 @@ def testSequenceStat(): assert_greater_equal(itemStat.sizeOnDisk, itemStat.size) +def testSequenceDeleted(): + """ + Check stats of a sequence which is deleted between the browse and the stat. + """ + # create new sequence + files_to_create = [ + "bar.001.jpg", + "bar.002.jpg", + "bar.003.jpg", + ] + for f in files_to_create: + createFile(root_path, f) + # browse the all directory + items = seq.browse(root_path) + # remove the last file created and get the stats of this symbolic link + itemStat = None + for item in items: + if item.getFilename() == "bar.###.jpg": + os.remove(os.path.join(root_path, "bar.001.jpg")) + os.remove(os.path.join(root_path, "bar.002.jpg")) + os.remove(os.path.join(root_path, "bar.003.jpg")) + itemStat = seq.ItemStat(item) + break + checkUnsetItemStat(itemStat) + + def testUndefinedStat(): """ Check stats of a file which is tagged as undefined. """ itemFile = seq.Item(seq.eTypeUndefined, os.path.join(root_path, "plop.txt")) itemStat = seq.ItemStat(itemFile) - # user and group - assert_equals(itemStat.userName, "unknown") - assert_equals(itemStat.groupName, "unknown") - # check id - assert_equals(itemStat.deviceId, 0) - assert_equals(itemStat.inodeId, 0) - assert_equals(itemStat.userId, 0) - assert_equals(itemStat.groupId, 0) - # nb hard links - assert_equals(itemStat.nbHardLinks, 0) - assert_equals(itemStat.fullNbHardLinks, 0) - # check size - assert_equals(itemStat.size, 0) - assert_equals(itemStat.minSize, 0) - assert_equals(itemStat.maxSize, 0) - assert_equals(itemStat.realSize, 0) - assert_equals(itemStat.sizeOnDisk, 0) - # time - assert_equals(itemStat.accessTime, 0) - assert_equals(itemStat.modificationTime, -1) - assert_equals(itemStat.lastChangeTime, -1) - # permissions - assert_equals(itemStat.ownerCanRead, False) - assert_equals(itemStat.ownerCanWrite, False) - assert_equals(itemStat.ownerCanExecute, False) - assert_equals(itemStat.groupCanRead, False) - assert_equals(itemStat.groupCanWrite, False) - assert_equals(itemStat.groupCanExecute, False) - assert_equals(itemStat.otherCanRead, False) - assert_equals(itemStat.otherCanWrite, False) - assert_equals(itemStat.otherCanExecute, False) + checkUnsetItemStat(itemStat)