Skip to content
Snippets Groups Projects
Commit 153e00bc authored by Sergey Yakubov's avatar Sergey Yakubov
Browse files

more unittests for getnext

parent 977191ca
No related branches found
No related tags found
No related merge requests found
#ifndef HIDRA2_FILE_INFO_H
#define HIDRA2_FILE_INFO_H
#include <cinttypes>
#include <vector>
#include <chrono>
namespace hidra2 {
......@@ -11,5 +13,8 @@ struct FileInfo {
std::chrono::system_clock::time_point modify_date;
};
typedef std::vector<uint8_t> FileData;
}
#endif //HIDRA2_FILE_INFO_H
......@@ -13,6 +13,7 @@ namespace hidra2 {
enum class IOErrors {
NO_ERROR,
FILE_NOT_FOUND,
READ_ERROR,
PERMISSIONS_DENIED,
UNKWOWN_ERROR
};
......@@ -22,7 +23,7 @@ IOErrors IOErrorFromErrno();
class IO {
public:
virtual int OpenFileToRead(const std::string& fname, IOErrors* err) = 0;
virtual FileData GetDataFromFile(const std::string &fname, IOErrors* err) = 0;
virtual int open(const char* __file, int __oflag) = 0;
virtual int close(int __fd) = 0;
......
......@@ -7,7 +7,7 @@ namespace hidra2 {
class SystemIO final : public IO {
public:
int OpenFileToRead(const std::string& fname, IOErrors* err);
FileData GetDataFromFile(const std::string &fname, IOErrors* err);
int open(const char* __file, int __oflag);
int close(int __fd);
ssize_t read(int __fd, void* buf, size_t count);
......
......@@ -2,10 +2,13 @@
#include <unistd.h>
#include <system_wrappers/system_io.h>
int hidra2::SystemIO::OpenFileToRead(const std::string& fname, IOErrors* err) {
int fd = ::open(fname.c_str(), O_RDONLY);
hidra2::FileData hidra2::SystemIO::GetDataFromFile(const std::string &fname, IOErrors* err) {
int fd = open(fname.c_str(), O_RDONLY);
*err = IOErrorFromErrno();
return fd;
if (*err != IOErrors::NO_ERROR) {
return {};
}
}
......
......@@ -16,14 +16,13 @@ enum class WorkerErrorCode {
SOURCE_NOT_FOUND,
SOURCE_NOT_CONNECTED,
SOURCE_ALREADY_CONNECTED,
ERROR_READING_FROM_SOURCE,
PERMISSIONS_DENIED,
NO_DATA,
WRONG_INPUT,
UNKNOWN_IO_ERROR
};
typedef std::vector<char> FileData;
class DataBroker {
public:
virtual WorkerErrorCode Connect() = 0;
......
......@@ -7,15 +7,18 @@ namespace hidra2 {
WorkerErrorCode MapIOError(IOErrors io_err) {
WorkerErrorCode err;
switch (io_err) { // we do not use map due to performance reasons
case IOErrors::NO_ERROR:
err = WorkerErrorCode::OK;
break;
case IOErrors::FILE_NOT_FOUND:
err = WorkerErrorCode::SOURCE_NOT_FOUND;
break;
case IOErrors::PERMISSIONS_DENIED:
err = WorkerErrorCode::PERMISSIONS_DENIED;
break;
case IOErrors::NO_ERROR:
err = WorkerErrorCode::OK;
break;
case IOErrors::FILE_NOT_FOUND:
err = WorkerErrorCode::SOURCE_NOT_FOUND;
break;
case IOErrors::PERMISSIONS_DENIED:
err = WorkerErrorCode::PERMISSIONS_DENIED;
break;
case IOErrors::READ_ERROR:
err = WorkerErrorCode::ERROR_READING_FROM_SOURCE;
break;
default:
err = WorkerErrorCode::UNKNOWN_IO_ERROR;
break;
......@@ -74,9 +77,9 @@ WorkerErrorCode FolderDataBroker::GetNext(FileInfo* info, FileData* data) {
}
IOErrors ioerr;
auto fd = io__->OpenFileToRead(base_path_ + "/" + info->relative_path +
(info->relative_path.empty() ? "" : "/") +
info->base_name, &ioerr);
*data = io__->GetDataFromFile(base_path_ + "/" + info->relative_path +
(info->relative_path.empty() ? "" : "/") +
info->base_name, &ioerr);
return MapIOError(ioerr);
}
......
......@@ -36,9 +36,9 @@ TEST(FolderDataBroker, SetCorrectIO) {
class FakeIO: public IO {
public:
int OpenFileToRead(const std::string& fname, IOErrors* err) {
FileData GetDataFromFile(const std::string &fname, IOErrors* err) {
*err = IOErrors::NO_ERROR;
return 1;
return {};
};
int open(const char* __file, int __oflag) {
......@@ -95,9 +95,9 @@ class IOEmptyFodler: public FakeIO {
class IOCannotOpenFile: public FakeIO {
public:
int OpenFileToRead(const std::string& fname, IOErrors* err) {
FileData GetDataFromFile(const std::string &fname, IOErrors* err) {
*err = IOErrors::PERMISSIONS_DENIED;
return 1;
return {};
};
};
......@@ -203,10 +203,10 @@ TEST_F(FolderDataBrokerTests, GetNextReturnsErrorWhenFilePermissionsDenied) {
class OpenFileMock : public FakeIO {
public:
MOCK_METHOD2(OpenFileToRead, int(const std::string&, IOErrors*));
MOCK_METHOD2(GetDataFromFile, FileData(const std::string&, IOErrors*));
};
TEST_F(FolderDataBrokerTests, GetNextCallsOpenFileWithFileName) {
TEST_F(FolderDataBrokerTests, GetNextCallsGetDataFileWithFileName) {
OpenFileMock mock;
data_broker->io__.reset(&mock);
data_broker->Connect();
......@@ -214,13 +214,43 @@ TEST_F(FolderDataBrokerTests, GetNextCallsOpenFileWithFileName) {
FileData data;
auto err = IOErrors::NO_ERROR;
EXPECT_CALL(mock, OpenFileToRead("/path/to/file/1", _)).
WillOnce(DoAll(testing::SetArgPointee<1>(IOErrors::NO_ERROR), testing::Return(1)));
EXPECT_CALL(mock, GetDataFromFile("/path/to/file/1", _)).
WillOnce(DoAll(testing::SetArgPointee<1>(IOErrors::NO_ERROR), testing::Return(FileData{})));
data_broker->GetNext(&fi, &data);
data_broker->io__.release();
}
TEST_F(FolderDataBrokerTests, GetNextReturnsData) {
OpenFileMock mock;
data_broker->io__.reset(&mock);
data_broker->Connect();
FileInfo fi;
FileData data;
EXPECT_CALL(mock, GetDataFromFile(_, _)).
WillOnce(DoAll(testing::SetArgPointee<1>(IOErrors::NO_ERROR), testing::Return(FileData{'1'})));
data_broker->GetNext(&fi, &data);
data_broker->io__.release();
// Mock::AllowLeak(mock);
ASSERT_THAT(data[0],Eq('1'));
}
TEST_F(FolderDataBrokerTests, GetNextReturnsErrorWhenCannotReadData) {
OpenFileMock mock;
data_broker->io__.reset(&mock);
data_broker->Connect();
FileInfo fi;
FileData data;
EXPECT_CALL(mock, GetDataFromFile(_, _)).
WillOnce(DoAll(testing::SetArgPointee<1>(IOErrors::READ_ERROR), testing::Return(FileData{})));
auto err = data_broker->GetNext(&fi, &data);
data_broker->io__.release();
ASSERT_THAT(err,Eq(WorkerErrorCode::ERROR_READING_FROM_SOURCE));
ASSERT_TRUE(data.empty());
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment