2014-11-19 16:16:43 +01:00
# include "FuseTest.h"
2014-11-25 18:43:50 +01:00
using : : testing : : StrEq ;
using : : testing : : _ ;
using : : testing : : Return ;
2014-11-27 16:51:15 +01:00
using : : testing : : Throw ;
using : : testing : : Action ;
using : : testing : : Invoke ;
2015-06-18 19:30:52 +02:00
using cpputils : : unique_ref ;
using cpputils : : make_unique_ref ;
2014-11-27 16:51:15 +01:00
namespace bf = boost : : filesystem ;
2014-11-28 14:46:45 +01:00
using namespace fspp : : fuse ;
2014-11-25 15:01:33 +01:00
MockFilesystem : : MockFilesystem ( ) { }
MockFilesystem : : ~ MockFilesystem ( ) { }
2014-11-25 18:43:50 +01:00
2014-11-27 16:51:15 +01:00
FuseTest : : FuseTest ( ) : fsimpl ( ) {
auto defaultAction = Throw ( FuseErrnoException ( EIO ) ) ;
ON_CALL ( fsimpl , openFile ( _ , _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , closeFile ( _ ) ) . WillByDefault ( defaultAction ) ;
2016-02-14 01:54:36 +01:00
ON_CALL ( fsimpl , lstat ( _ , _ ) ) . WillByDefault ( Throw ( FuseErrnoException ( ENOENT ) ) ) ;
ON_CALL ( fsimpl , fstat ( _ , _ ) ) . WillByDefault ( Throw ( FuseErrnoException ( ENOENT ) ) ) ;
2014-11-27 16:51:15 +01:00
ON_CALL ( fsimpl , truncate ( _ , _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , ftruncate ( _ , _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , read ( _ , _ , _ , _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , write ( _ , _ , _ , _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , fsync ( _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , fdatasync ( _ ) ) . WillByDefault ( defaultAction ) ;
2016-02-14 02:23:54 +01:00
ON_CALL ( fsimpl , access ( _ , _ ) ) . WillByDefault ( defaultAction ) ;
2015-04-25 03:26:59 +02:00
ON_CALL ( fsimpl , createAndOpenFile ( _ , _ , _ , _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , mkdir ( _ , _ , _ , _ ) ) . WillByDefault ( defaultAction ) ;
2014-11-27 16:51:15 +01:00
ON_CALL ( fsimpl , rmdir ( _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , unlink ( _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , rename ( _ , _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , readDir ( _ ) ) . WillByDefault ( defaultAction ) ;
2016-02-09 09:36:07 +01:00
ON_CALL ( fsimpl , utimens ( _ , _ , _ ) ) . WillByDefault ( defaultAction ) ;
2016-09-24 11:41:19 +02:00
ON_CALL ( fsimpl , statfs ( _ , _ ) ) . WillByDefault ( Invoke ( [ ] ( const char */ * path */ , struct statvfs * result ) {
2016-02-14 01:01:59 +01:00
: : statvfs ( " / " , result ) ; // As dummy value take the values from the root filesystem
} ) ) ;
2015-04-25 03:26:59 +02:00
ON_CALL ( fsimpl , chmod ( _ , _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , chown ( _ , _ , _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , createSymlink ( _ , _ , _ , _ ) ) . WillByDefault ( defaultAction ) ;
ON_CALL ( fsimpl , readSymlink ( _ , _ , _ ) ) . WillByDefault ( defaultAction ) ;
2016-02-14 02:23:54 +01:00
EXPECT_CALL ( fsimpl , access ( _ , _ ) ) . WillRepeatedly ( Return ( ) ) ;
2016-02-14 01:54:36 +01:00
ReturnIsDirOnLstat ( " / " ) ;
2014-11-27 16:51:15 +01:00
}
2015-06-18 19:30:52 +02:00
unique_ref < FuseTest : : TempTestFS > FuseTest : : TestFS ( ) {
return make_unique_ref < TempTestFS > ( & fsimpl ) ;
2014-11-27 16:51:15 +01:00
}
2016-06-04 09:45:49 +02:00
FuseTest : : TempTestFS : : TempTestFS ( MockFilesystem * fsimpl ) : _mountDir ( ) , _fuse ( fsimpl , " fusetest " , boost : : none ) , _fuse_thread ( & _fuse ) {
2016-05-10 01:07:02 +02:00
_fuse_thread . start ( _mountDir . path ( ) , { " -f " } ) ;
2014-11-27 16:51:15 +01:00
}
FuseTest : : TempTestFS : : ~ TempTestFS ( ) {
_fuse_thread . stop ( ) ;
}
const bf : : path & FuseTest : : TempTestFS : : mountDir ( ) const {
return _mountDir . path ( ) ;
}
Action < void ( const char * , struct : : stat * ) > FuseTest : : ReturnIsFileWithSize ( size_t size ) {
return Invoke ( [ size ] ( const char * , struct : : stat * result ) {
result - > st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH ;
result - > st_nlink = 1 ;
result - > st_size = size ;
} ) ;
}
//TODO Combine ReturnIsFile and ReturnIsFileFstat. This should be possible in gmock by either (a) using ::testing::Undefined as parameter type or (b) using action macros
Action < void ( const char * , struct : : stat * ) > FuseTest : : ReturnIsFile = ReturnIsFileWithSize ( 0 ) ;
Action < void ( int , struct : : stat * ) > FuseTest : : ReturnIsFileFstat =
Invoke ( [ ] ( int , struct : : stat * result ) {
result - > st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH ;
result - > st_nlink = 1 ;
} ) ;
2015-11-27 17:43:21 +01:00
Action < void ( int , struct : : stat * ) > FuseTest : : ReturnIsFileFstatWithSize ( size_t size ) {
return Invoke ( [ size ] ( int , struct : : stat * result ) {
result - > st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH ;
result - > st_nlink = 1 ;
result - > st_size = size ;
std : : cout < < " Return size: " < < size < < std : : endl ;
} ) ;
}
2014-11-27 16:51:15 +01:00
Action < void ( const char * , struct : : stat * ) > FuseTest : : ReturnIsDir =
Invoke ( [ ] ( const char * , struct : : stat * result ) {
result - > st_mode = S_IFDIR | S_IRUSR | S_IRGRP | S_IROTH | S_IXUSR | S_IXGRP | S_IXOTH ;
result - > st_nlink = 1 ;
} ) ;
2014-11-28 14:46:45 +01:00
Action < void ( const char * , struct : : stat * ) > FuseTest : : ReturnDoesntExist = Throw ( fspp : : fuse : : FuseErrnoException ( ENOENT ) ) ;
2014-11-27 16:51:15 +01:00
2014-11-25 18:43:50 +01:00
void FuseTest : : OnOpenReturnFileDescriptor ( const char * filename , int descriptor ) {
EXPECT_CALL ( fsimpl , openFile ( StrEq ( filename ) , _ ) ) . Times ( 1 ) . WillOnce ( Return ( descriptor ) ) ;
}
void FuseTest : : ReturnIsFileOnLstat ( const bf : : path & path ) {
2018-05-21 01:20:38 +02:00
EXPECT_CALL ( fsimpl , lstat ( : : testing : : StrEq ( path . string ( ) . c_str ( ) ) , : : testing : : _ ) ) . WillRepeatedly ( ReturnIsFile ) ;
2014-11-25 18:43:50 +01:00
}
2014-11-27 03:48:38 +01:00
void FuseTest : : ReturnIsFileOnLstatWithSize ( const bf : : path & path , const size_t size ) {
2018-05-21 01:20:38 +02:00
EXPECT_CALL ( fsimpl , lstat ( : : testing : : StrEq ( path . string ( ) . c_str ( ) ) , : : testing : : _ ) ) . WillRepeatedly ( ReturnIsFileWithSize ( size ) ) ;
2014-11-27 03:48:38 +01:00
}
2014-11-25 18:43:50 +01:00
void FuseTest : : ReturnIsDirOnLstat ( const bf : : path & path ) {
2018-05-21 01:20:38 +02:00
EXPECT_CALL ( fsimpl , lstat ( : : testing : : StrEq ( path . string ( ) . c_str ( ) ) , : : testing : : _ ) ) . WillRepeatedly ( ReturnIsDir ) ;
2014-11-25 18:43:50 +01:00
}
void FuseTest : : ReturnDoesntExistOnLstat ( const bf : : path & path ) {
2018-05-21 01:20:38 +02:00
EXPECT_CALL ( fsimpl , lstat ( : : testing : : StrEq ( path . string ( ) . c_str ( ) ) , : : testing : : _ ) ) . WillRepeatedly ( ReturnDoesntExist ) ;
2014-11-25 18:43:50 +01:00
}
void FuseTest : : ReturnIsFileOnFstat ( int descriptor ) {
EXPECT_CALL ( fsimpl , fstat ( descriptor , _ ) ) . WillRepeatedly ( ReturnIsFileFstat ) ;
}
2015-11-27 17:43:21 +01:00
void FuseTest : : ReturnIsFileOnFstatWithSize ( int descriptor , size_t size ) {
EXPECT_CALL ( fsimpl , fstat ( descriptor , _ ) ) . WillRepeatedly ( ReturnIsFileFstatWithSize ( size ) ) ;
}