Classes | Functions

mitkSceneIOTest.cpp File Reference

#include "mitkTestingMacros.h"
#include "mitkTestingConfig.h"
#include "mitkSceneIO.h"
#include "mitkStandaloneDataStorage.h"
#include "mitkStandardFileLocations.h"
#include "mitkDataNodeFactory.h"
#include "mitkCoreObjectFactory.h"
#include "mitkBaseData.h"
#include "mitkImage.h"
#include "mitkSurface.h"
#include "mitkPointSet.h"
#include "Poco/File.h"
#include "Poco/TemporaryFile.h"
#include <ulimit.h>
#include <errno.h>

Go to the source code of this file.

Classes

class  SceneIOTestClass

Functions

int mitkSceneIOTest (int, char *[])

Function Documentation

int mitkSceneIOTest ( int  ,
char *  [] 
)

Definition at line 213 of file mitkSceneIOTest.cpp.

References SceneIOTestClass::FillStorage(), mitk::TestManager::GetInstance(), MITK_TEST_BEGIN, MITK_TEST_CONDITION_REQUIRED, MITK_TEST_END, MITK_TEST_OUTPUT, MITK_TEST_OUTPUT_DIR, MITK_TEST_OUTPUT_NO_ENDL, mitk::StandaloneDataStorage::New(), mitk::SceneIO::New(), and SceneIOTestClass::VerifyStorage().

{
  MITK_TEST_BEGIN("SceneIO")
  std::string sceneFileName;

  for (unsigned int i = 0; i < 1; ++i) // TODO change to " < 2" to check cases where file system would be full
  {
    if (i == 1)
    {
      // call ulimit and restrict maximum file size to something small
      #ifndef WIN32
        errno = 0;
        long int value = ulimit(UL_SETFSIZE, 1);
        MITK_TEST_CONDITION_REQUIRED( value != -1, "ulimit() returned with errno = " << errno );
      #else
        continue;
      #endif
    }
  
    // create a data storage and fill it with some test data
    mitk::SceneIO::Pointer sceneIO = mitk::SceneIO::New();
    MITK_TEST_CONDITION_REQUIRED(sceneIO.IsNotNull(),"SceneIO instantiation") 
    
    mitk::DataStorage::Pointer storage = mitk::StandaloneDataStorage::New().GetPointer();
    MITK_TEST_CONDITION_REQUIRED(storage.IsNotNull(),"StandaloneDataStorage instantiation");

    SceneIOTestClass::FillStorage(storage);

    // attempt to save it
    Poco::Path newname( Poco::TemporaryFile::tempName() );
    sceneFileName = std::string( MITK_TEST_OUTPUT_DIR ) + Poco::Path::separator() + newname.getFileName() + ".zip";
    MITK_TEST_CONDITION_REQUIRED( sceneIO->SaveScene( storage->GetAll(), storage, sceneFileName), "Saving scene file '" << sceneFileName << "'");

    // test if no errors were reported
    mitk::SceneIO::FailedBaseDataListType::ConstPointer failedNodes = sceneIO->GetFailedNodes();
    if (failedNodes.IsNotNull() && !failedNodes->empty())
    {
      MITK_TEST_OUTPUT( << "The following nodes could not be serialized:");
      for ( mitk::SceneIO::FailedBaseDataListType::const_iterator iter = failedNodes->begin();
            iter != failedNodes->end();
            ++iter )
      {
        MITK_TEST_OUTPUT_NO_ENDL( << " - ");
        if ( mitk::BaseData* data =(*iter)->GetData() )
        {
          MITK_TEST_OUTPUT_NO_ENDL( << data->GetNameOfClass());
        }
        else
        {
          MITK_TEST_OUTPUT_NO_ENDL( << "(NULL)");
        }

        MITK_TEST_OUTPUT( << " contained in node '" << (*iter)->GetName() << "'");
        // \TODO: should we fail the test case if failed properties exist?
      }
    }

    mitk::PropertyList::ConstPointer failedProperties = sceneIO->GetFailedProperties();
    if (failedProperties.IsNotNull() && !failedProperties->IsEmpty())
    {
      MITK_TEST_OUTPUT( << "The following properties could not be serialized:");
      const mitk::PropertyList::PropertyMap* propmap = failedProperties->GetMap();
      for ( mitk::PropertyList::PropertyMap::const_iterator iter = propmap->begin();
            iter != propmap->end();
            ++iter )
      {
        MITK_TEST_OUTPUT( << " - " << iter->second.first->GetNameOfClass() << " associated to key '" << iter->first << "'");
        // \TODO: should we fail the test case if failed properties exist?
      }
    }
    MITK_TEST_CONDITION_REQUIRED(failedProperties.IsNotNull() && failedProperties->IsEmpty(), "Checking if all properties have been saved.")
    MITK_TEST_CONDITION_REQUIRED(failedNodes.IsNotNull() && failedNodes->empty(), "Checking if all nodes have been saved.")

    //Now do the loading part
    sceneIO = mitk::SceneIO::New();

    //Load scene into the datastorage and clean the DS first
    MITK_TEST_OUTPUT(<< "Loading scene again");
    storage = sceneIO->LoadScene(sceneFileName,storage,true);

    // test if no errors were reported
    failedNodes = sceneIO->GetFailedNodes();
    if (failedNodes.IsNotNull() && !failedNodes->empty())
    {
      MITK_TEST_OUTPUT( << "The following nodes could not be serialized:");
      for ( mitk::SceneIO::FailedBaseDataListType::const_iterator iter = failedNodes->begin();
            iter != failedNodes->end();
            ++iter )
      {
        MITK_TEST_OUTPUT_NO_ENDL( << " - ");
        if ( mitk::BaseData* data =(*iter)->GetData() )
        {
          MITK_TEST_OUTPUT_NO_ENDL( << data->GetNameOfClass());
        }
        else
        {
          MITK_TEST_OUTPUT_NO_ENDL( << "(NULL)");
        }

        MITK_TEST_OUTPUT( << " contained in node '" << (*iter)->GetName() << "'");
        // \TODO: should we fail the test case if failed properties exist?
      }
    }

    failedProperties = sceneIO->GetFailedProperties();
    if (failedProperties.IsNotNull() && !failedProperties->IsEmpty())
    {
      MITK_TEST_OUTPUT( << "The following properties could not be serialized:");
      const mitk::PropertyList::PropertyMap* propmap = failedProperties->GetMap();
      for ( mitk::PropertyList::PropertyMap::const_iterator iter = propmap->begin();
            iter != propmap->end();
            ++iter )
      {
        MITK_TEST_OUTPUT( << " - " << iter->second.first->GetNameOfClass() << " associated to key '" << iter->first << "'");
        // \TODO: should we fail the test case if failed properties exist?
      }
    }

    // check if data storage content has been restored correctly
    SceneIOTestClass::VerifyStorage(storage);
  
  }
  // if no sub-test failed remove the scene file, otherwise it is kept for debugging purposes
  if ( mitk::TestManager::GetInstance()->NumberOfFailedTests() == 0 )
  {    
    Poco::File pocoSceneFile( sceneFileName );
    MITK_TEST_CONDITION_REQUIRED( pocoSceneFile.exists(), "Checking if scene file still exists before cleaning up." )
    pocoSceneFile.remove();
  }
  MITK_TEST_END();
}
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines