void
FileOperationMetaTest::testFileOperationSubNone(
        auto_ptr<FileOperationInterface> & oper, const fs::path & fileMeta,
        const fs::path & fileEntity,
        const string & tapeName)
{
    string tape;
    char buffer[1024] = "hello,world!\n";
    char bufferRead[sizeof(buffer)];
    size_t size;
    struct stat stat;

    errno = 0;
    CPPUNIT_ASSERT( false == oper->GetStat(stat) );
    CPPUNIT_ASSERT_ERRNO_( ENOENT == errno);
    errno = 0;
    CPPUNIT_ASSERT( false == oper->Read(0,bufferRead,sizeof(bufferRead),size) );
    CPPUNIT_ASSERT_ERRNO_( EBADF == errno);
    errno = 0;
    CPPUNIT_ASSERT( false == oper->Write(0,buffer,sizeof(buffer),size) );
    CPPUNIT_ASSERT_ERRNO_( EBADF == errno);
    CPPUNIT_ASSERT( ! fs::exists(fileMeta) );
    CPPUNIT_ASSERT( ! fs::exists(fileEntity) );

    errno = 0;
    CPPUNIT_ASSERT( false == oper->OpenFile(O_RDWR) );
    CPPUNIT_ASSERT_ERRNO_( ENOENT == errno);
    CPPUNIT_ASSERT_MESSAGE( fileEntity.file_string(),
            true == oper->CreateFile(O_RDWR,0644,false) );
    CPPUNIT_ASSERT( fs::exists(fileMeta) );
    CPPUNIT_ASSERT( fs::exists(fileEntity) );
    CPPUNIT_ASSERT( true == oper->Delete() );
    CPPUNIT_ASSERT( ! fs::exists(fileMeta) );
    CPPUNIT_ASSERT( ! fs::exists(fileEntity) );

    CPPUNIT_ASSERT( true == oper->GetTape(tape) );
    CPPUNIT_ASSERT( tape == tapeName );
}
void
FileOperationMetaTest::testFileOperationSubCheckTruncate(
        auto_ptr<MetaManager> & meta,
        const fs::path & path,
        auto_ptr<FileOperationInterface> & oper,
        const fs::path & fileMeta,
        const fs::path & fileEntity,
        const string & tapeName)
{
    string tape;
    auto_ptr<Inode> inode;
    struct stat stat;
    char buffer[1024] = "hello,world!\n";

    CPPUNIT_ASSERT( fs::exists(fileMeta) );
    CPPUNIT_ASSERT( fs::exists(fileEntity) );
    CPPUNIT_ASSERT( true == oper->GetStat(stat) );
    CPPUNIT_ASSERT( sizeof(buffer) == stat.st_size );
    inode.reset(meta->GetInode(path));
    CPPUNIT_ASSERT( true == inode->GetTape(tape) );
    CPPUNIT_ASSERT( tape == tapeName );

    CPPUNIT_ASSERT( true == oper->Delete() );
}
void
FileOperationMetaTest::testFileOperationSubOpenDelete(
        auto_ptr<MetaManager> & meta,
        const fs::path & path,
        auto_ptr<FileOperationInterface> & oper,
        const fs::path & fileMeta,
        const fs::path & fileEntity,
        const string & tapeName)
{
    string tape;
    auto_ptr<Inode> inode;
    char buffer[1024] = "hello,world!\n";
    char bufferRead[sizeof(buffer)];
    size_t size;
    struct stat stat;

    CPPUNIT_ASSERT( fs::exists(fileMeta) );
    CPPUNIT_ASSERT( fs::exists(fileEntity) );
    inode.reset(meta->GetInode(path));
    CPPUNIT_ASSERT( true == inode->GetTape(tape) );

    tape.clear();
    CPPUNIT_ASSERT( true == oper->GetTape(tape) );
    CPPUNIT_ASSERT( tape == tapeName );
    tape.clear();
    CPPUNIT_ASSERT( true == inode->GetTape(tape) );
    CPPUNIT_ASSERT( tape == tapeName );

    CPPUNIT_ASSERT( true == oper->GetStat(stat) );
    errno = 0;
    CPPUNIT_ASSERT( false == oper->Read(0,bufferRead,sizeof(bufferRead),size) );
    CPPUNIT_ASSERT_ERRNO_( EBADF == errno);
    errno = 0;
    CPPUNIT_ASSERT( false == oper->Write(0,buffer,sizeof(buffer),size) );
    CPPUNIT_ASSERT_ERRNO_( EBADF == errno);

    errno = 0;
    CPPUNIT_ASSERT( false == oper->CreateFile(O_RDWR,0644,false) );
    CPPUNIT_ASSERT_ERRNO_( EEXIST == errno);

    CPPUNIT_ASSERT( true == oper->GetStat(stat) );
    errno = 0;
    CPPUNIT_ASSERT( false == oper->Read(0,bufferRead,sizeof(bufferRead),size) );
    CPPUNIT_ASSERT_ERRNO_( EBADF == errno);
    errno = 0;
    CPPUNIT_ASSERT( false == oper->Write(0,buffer,sizeof(buffer),size) );
    CPPUNIT_ASSERT_ERRNO_( EBADF == errno);

    CPPUNIT_ASSERT( true == oper->OpenFile(O_RDWR) );

    CPPUNIT_ASSERT( true == oper->GetStat(stat) );
    CPPUNIT_ASSERT( 0 == stat.st_size );

    memset(bufferRead,0,sizeof(bufferRead));
    CPPUNIT_ASSERT( true == oper->Read(0,bufferRead,sizeof(bufferRead),size) );
    CPPUNIT_ASSERT( 0 == size );

    tape.clear();
    CPPUNIT_ASSERT( true == inode->GetTape(tape) );
    CPPUNIT_ASSERT( tape == tapeName );

    CPPUNIT_ASSERT( true == oper->Write(0,buffer,sizeof(buffer),size) );
    memset(bufferRead,0,sizeof(bufferRead));
    CPPUNIT_ASSERT( true == oper->Read(0,bufferRead,sizeof(bufferRead),size) );
    CPPUNIT_ASSERT( sizeof(buffer) == size );
    CPPUNIT_ASSERT( true == oper->GetStat(stat) );
    CPPUNIT_ASSERT( sizeof(buffer) == stat.st_size );

    tape.clear();
    CPPUNIT_ASSERT( true == oper->GetTape(tape) );
    CPPUNIT_ASSERT( tape == tapeName );
    tape.clear();
    CPPUNIT_ASSERT( true == inode->GetTape(tape) );
    CPPUNIT_ASSERT( tape == tapeName );

    CPPUNIT_ASSERT( true == oper->Delete() );
    CPPUNIT_ASSERT( ! fs::exists(fileMeta) );
    CPPUNIT_ASSERT( ! fs::exists(fileEntity) );
}