diff --git a/common/cpp/include/common/file_info.h b/common/cpp/include/common/file_info.h index da182e34249b29e6ae9360855e35696d2158c33f..88bd4f4af0e7e087f82bd224a009b4d7a1642787 100644 --- a/common/cpp/include/common/file_info.h +++ b/common/cpp/include/common/file_info.h @@ -14,7 +14,7 @@ struct FileInfo { uint64_t size{0}; }; -typedef std::unique_ptr<uint8_t[]> FileData; +using FileData = std::unique_ptr<uint8_t[]>; } diff --git a/common/cpp/include/system_wrappers/io.h b/common/cpp/include/system_wrappers/io.h index 8370b7b9d0aa9da2212ff37df095ebb1ea9f23f6..88bb23570c31e0432294691861fb94ce4800f0c0 100644 --- a/common/cpp/include/system_wrappers/io.h +++ b/common/cpp/include/system_wrappers/io.h @@ -26,15 +26,15 @@ IOErrors IOErrorFromErrno(); class IO { public: - virtual FileData GetDataFromFile(const std::string& fname, uint64_t fsize, IOErrors* err) = 0; + virtual FileData GetDataFromFile(const std::string& fname, uint64_t fsize, IOErrors* err) const noexcept = 0; - virtual int open(const char* __file, int __oflag) = 0; - virtual int close(int __fd) = 0; - virtual int64_t read(int __fd, void* buf, size_t count) = 0; - virtual int64_t write(int __fd, const void* __buf, size_t __n) = 0; + virtual int open(const char* __file, int __oflag) const noexcept = 0; + virtual int close(int __fd) const noexcept = 0; + virtual int64_t read(int __fd, void* buf, size_t count) const noexcept = 0; + virtual int64_t write(int __fd, const void* __buf, size_t __n) const noexcept = 0; // this is not standard function - to be implemented differently in windows and linux - virtual std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) = 0; + virtual std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) const = 0; }; } diff --git a/common/cpp/include/system_wrappers/system_io.h b/common/cpp/include/system_wrappers/system_io.h index 666fa7e539d5b0d03a9811840728049372cafc4f..6c2c626465d9b8fb68416de6f61b3ce3e0b265ef 100644 --- a/common/cpp/include/system_wrappers/system_io.h +++ b/common/cpp/include/system_wrappers/system_io.h @@ -7,16 +7,16 @@ namespace hidra2 { class SystemIO final : public IO { public: - FileData GetDataFromFile(const std::string& fname, uint64_t fsize, IOErrors* err) override; - int open(const char* __file, int __oflag) override; - int close(int __fd) override; - int64_t read(int __fd, void* buf, size_t count) override; - int64_t write(int __fd, const void* __buf, size_t __n) override; - std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) override; + FileData GetDataFromFile(const std::string& fname, uint64_t fsize, IOErrors* err) const noexcept override; + int open(const char* __file, int __oflag) const noexcept override; + int close(int __fd) const noexcept override; + int64_t read(int __fd, void* buf, size_t count) const noexcept override; + int64_t write(int __fd, const void* __buf, size_t __n) const noexcept override; + std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) const override; private: - void ReadWholeFile(int fd, uint8_t* array, uint64_t fsize, IOErrors* err); + void ReadWholeFile(int fd, uint8_t* array, uint64_t fsize, IOErrors* err) const noexcept; void CollectFileInformationRecursivly(const std::string& path, - std::vector<FileInfo>& files, IOErrors* err); + std::vector<FileInfo>* files, IOErrors* err) const; }; } diff --git a/common/cpp/src/system_io.cpp b/common/cpp/src/system_io.cpp index 66001ea13bcd838345e025223b961eb33ddcf368..6ee383e0cdb0ec43f2c67d8fcfad800cf3d675c3 100644 --- a/common/cpp/src/system_io.cpp +++ b/common/cpp/src/system_io.cpp @@ -29,7 +29,7 @@ IOErrors IOErrorFromErrno() { return err; } -void SystemIO::ReadWholeFile(int fd, uint8_t* array, uint64_t fsize, IOErrors* err) { +void SystemIO::ReadWholeFile(int fd, uint8_t* array, uint64_t fsize, IOErrors* err) const noexcept { uint64_t totalbytes = 0; int64_t readbytes = 0; do { @@ -42,7 +42,7 @@ void SystemIO::ReadWholeFile(int fd, uint8_t* array, uint64_t fsize, IOErrors* e } } -FileData SystemIO::GetDataFromFile(const std::string& fname, uint64_t fsize, IOErrors* err) { +FileData SystemIO::GetDataFromFile(const std::string& fname, uint64_t fsize, IOErrors* err) const noexcept { int fd = open(fname.c_str(), O_RDONLY); *err = IOErrorFromErrno(); if (*err != IOErrors::kNoError) { @@ -72,28 +72,28 @@ FileData SystemIO::GetDataFromFile(const std::string& fname, uint64_t fsize, IOE return data; } -void SortFileList(std::vector<FileInfo>& file_list) { - std::sort(file_list.begin(), file_list.end(), +void SortFileList(std::vector<FileInfo>* file_list) { + std::sort(file_list->begin(), file_list->end(), [](FileInfo const & a, FileInfo const & b) { return a.modify_date < b.modify_date; }); } -void StripBasePath(const std::string& folder, std::vector<FileInfo>& file_list) { +void StripBasePath(const std::string& folder, std::vector<FileInfo>* file_list) { auto n_erase = folder.size() + 1; - for (auto& file : file_list) { + for (auto& file : *file_list) { file.relative_path.erase(0, n_erase); } } -std::vector<FileInfo> SystemIO::FilesInFolder(const std::string& folder, IOErrors* err) { +std::vector<FileInfo> SystemIO::FilesInFolder(const std::string& folder, IOErrors* err) const { std::vector<FileInfo> files{}; - CollectFileInformationRecursivly(folder, files, err); + CollectFileInformationRecursivly(folder, &files, err); if (*err != IOErrors::kNoError) { return {}; } - StripBasePath(folder, files); - SortFileList(files); + StripBasePath(folder, &files); + SortFileList(&files); return files; } diff --git a/common/cpp/src/system_io_linux.cpp b/common/cpp/src/system_io_linux.cpp index a932a90d39b4ce6af7e1c34217a7a81d0f456123..3c1bc09bb6da7d828fa9872cf08e6de34aa68d7e 100644 --- a/common/cpp/src/system_io_linux.cpp +++ b/common/cpp/src/system_io_linux.cpp @@ -73,7 +73,7 @@ FileInfo GetFileInfo(const string& path, const string& name, IOErrors* err) { } void ProcessFileEntity(const struct dirent* entity, const std::string& path, - std::vector<FileInfo>& files, IOErrors* err) { + std::vector<FileInfo>* files, IOErrors* err) { *err = IOErrors::kNoError; if (entity->d_type != DT_REG) { @@ -85,11 +85,11 @@ void ProcessFileEntity(const struct dirent* entity, const std::string& path, return; } - files.push_back(file_info); + files->push_back(file_info); } void SystemIO::CollectFileInformationRecursivly(const std::string& path, - std::vector<FileInfo>& files, IOErrors* err) { + std::vector<FileInfo>* files, IOErrors* err) const { auto dir = opendir((path).c_str()); if (dir == nullptr) { *err = IOErrorFromErrno(); @@ -113,19 +113,19 @@ void SystemIO::CollectFileInformationRecursivly(const std::string& path, } -int64_t SystemIO::read(int __fd, void* buf, size_t count) { +int64_t SystemIO::read(int __fd, void* buf, size_t count) const noexcept { return (int64_t) ::read(__fd, buf, count); } -int64_t SystemIO::write(int __fd, const void* __buf, size_t __n) { +int64_t SystemIO::write(int __fd, const void* __buf, size_t __n) const noexcept { return (int64_t) ::write(__fd, __buf, __n); } -int SystemIO::open(const char* __file, int __oflag) { +int SystemIO::open(const char* __file, int __oflag) const noexcept { return ::open(__file, __oflag); } -int SystemIO::close(int __fd) { +int SystemIO::close(int __fd) const noexcept { return ::close(__fd); } diff --git a/common/cpp/src/system_io_windows.cpp b/common/cpp/src/system_io_windows.cpp index 4b2d113ed0fd1b338a09b7a01d823a7c8939e94d..5653ce87c7ecd956c4af152cc0374b2edb44fd2a 100644 --- a/common/cpp/src/system_io_windows.cpp +++ b/common/cpp/src/system_io_windows.cpp @@ -59,7 +59,7 @@ bool IsDirectory(const WIN32_FIND_DATA f) { } void ProcessFileEntity(const WIN32_FIND_DATA f, const std::string& path, - std::vector<FileInfo>& files, IOErrors* err) { + std::vector<FileInfo>* files, IOErrors* err) { *err = IOErrors::kNoError; if (f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { @@ -74,12 +74,12 @@ void ProcessFileEntity(const WIN32_FIND_DATA f, const std::string& path, file_info.base_name = f.cFileName; file_info.relative_path = path; - files.push_back(file_info); + files->push_back(file_info); } void SystemIO::CollectFileInformationRecursivly(const std::string& path, - std::vector<FileInfo>& files, IOErrors* err) { + std::vector<FileInfo>* files, IOErrors* err) const { WIN32_FIND_DATA find_data; HANDLE handle = FindFirstFile((path + "\\*.*").c_str(), &find_data); if (handle == INVALID_HANDLE_VALUE) { @@ -107,21 +107,21 @@ void SystemIO::CollectFileInformationRecursivly(const std::string& path, } -int64_t SystemIO::read(int __fd, void* buf, size_t count) { +int64_t SystemIO::read(int __fd, void* buf, size_t count) const noexcept { return (int64_t) _read(__fd, buf, (unsigned int) count); } -int64_t SystemIO::write(int __fd, const void* __buf, size_t __n) { +int64_t SystemIO::write(int __fd, const void* __buf, size_t __n) const noexcept { return (int64_t) _write(__fd, __buf, (unsigned int) __n); } -int SystemIO::open(const char* __file, int __oflag) { +int SystemIO::open(const char* __file, int __oflag) const noexcept { int fd; errno = _sopen_s(&fd, __file, __oflag, _SH_DENYNO, _S_IREAD | _S_IWRITE); return fd; } -int SystemIO::close(int __fd) { +int SystemIO::close(int __fd) const noexcept { return ::_close(__fd); } diff --git a/examples/worker/process_folder/CMakeLists.txt b/examples/worker/process_folder/CMakeLists.txt index 9fe64b4226af1119f15a7b0226ce1eb54e4a79c6..91328be81451bba9347fa928b1b3721c2b0b8a86 100644 --- a/examples/worker/process_folder/CMakeLists.txt +++ b/examples/worker/process_folder/CMakeLists.txt @@ -11,6 +11,14 @@ set(SOURCE_FILES process_folder.cpp) add_executable(${TARGET_NAME} ${SOURCE_FILES}) target_link_libraries(${TARGET_NAME} common worker-api ${CMAKE_THREAD_LIBS_INIT}) set_target_properties(${TARGET_NAME} PROPERTIES LINKER_LANGUAGE CXX) +#use expression generator to get rid of VS adding Debug/Release folders +set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY + ${CMAKE_CURRENT_BINARY_DIR}$<$<CONFIG:Debug>:> + ) + +get_target_property(VAR ${TARGET_NAME} RUNTIME_OUTPUT_DIRECTORY) +message (STATUS ${VAR}) + if (CMAKE_COMPILER_IS_GNUCXX) set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS_DEBUG "--coverage") endif() diff --git a/examples/worker/process_folder/check_windows.bat b/examples/worker/process_folder/check_windows.bat index 0735194ddb50c577b1bd68a4fa84daff8cea61d1..f03ab5c7094ed5c5d2e9e9c555ba3b77018bac54 100644 --- a/examples/worker/process_folder/check_windows.bat +++ b/examples/worker/process_folder/check_windows.bat @@ -1,6 +1,6 @@ mkdir test echo "" > test/1 -worker_processfolder test | findstr "Processed 1 file(s)" +.\worker_processfolder test | findstr "Processed 1 file(s)" rmdir /S /Q test diff --git a/tests/system_io/read_file_content/cleanup_windows.bat b/tests/system_io/read_file_content/cleanup_windows.bat index df76d933609eb4d60e195057a5484f579e705061..7766233dba98146a47749d087d56b2e93758f7c0 100644 --- a/tests/system_io/read_file_content/cleanup_windows.bat +++ b/tests/system_io/read_file_content/cleanup_windows.bat @@ -1,2 +1,3 @@ rmdir /S /Q test +icacls file_noaccess /grant:r users:D del file_noaccess diff --git a/worker/api/cpp/src/folder_data_broker.cpp b/worker/api/cpp/src/folder_data_broker.cpp index bc7fc88a64b9c93b9efee0a77d84f59c5ca432ec..a6c263c448f60f49fdcb3b97702ca3a27b0920ce 100644 --- a/worker/api/cpp/src/folder_data_broker.cpp +++ b/worker/api/cpp/src/folder_data_broker.cpp @@ -52,7 +52,7 @@ WorkerErrorCode FolderDataBroker::Connect() { return MapIOError(io_err); } -WorkerErrorCode FolderDataBroker::CanGetData(FileInfo* info, FileData* data, int nfile) const { +WorkerErrorCode FolderDataBroker::CanGetData(FileInfo* info, FileData* data, int nfile) const noexcept { if (!is_connected_) { return WorkerErrorCode::kSourceNotConnected; } diff --git a/worker/api/cpp/src/folder_data_broker.h b/worker/api/cpp/src/folder_data_broker.h index 27d960172df27455c55688a5aead4c7f9dcb05e4..f5b622bdaf66663f4ebcc023f51339198861ea81 100644 --- a/worker/api/cpp/src/folder_data_broker.h +++ b/worker/api/cpp/src/folder_data_broker.h @@ -23,7 +23,7 @@ class FolderDataBroker final : public hidra2::DataBroker { int current_file_; std::string base_path_; std::vector<FileInfo> filelist_; - WorkerErrorCode CanGetData(FileInfo* info, FileData* data, int nfile) const; + WorkerErrorCode CanGetData(FileInfo* info, FileData* data, int nfile) const noexcept; std::mutex mutex_; }; diff --git a/worker/api/cpp/unittests/test_folder_broker.cpp b/worker/api/cpp/unittests/test_folder_broker.cpp index 1942f1198360b1ef3c47644de4b568ba5b33b2e8..7da3645ce8e96d3b3402a2ce81435349981cb358 100644 --- a/worker/api/cpp/unittests/test_folder_broker.cpp +++ b/worker/api/cpp/unittests/test_folder_broker.cpp @@ -1,6 +1,5 @@ #include <gmock/gmock.h> #include "gtest/gtest.h" -using ::testing::AtLeast; #include "worker/data_broker.h" #include "system_wrappers/io.h" @@ -16,7 +15,7 @@ using hidra2::IOErrors; using hidra2::FileInfo; using hidra2::FileData; - +using ::testing::AtLeast; using ::testing::Eq; using ::testing::Ne; using ::testing::Test; @@ -37,29 +36,29 @@ TEST(FolderDataBroker, SetCorrectIO) { class FakeIO: public IO { public: - virtual uint8_t* GetDataFromFileProxy(const std::string& fname, uint64_t fsize, IOErrors* err) { + virtual uint8_t* GetDataFromFileProxy(const std::string& fname, uint64_t fsize, IOErrors* err) const { *err = IOErrors::kNoError; return nullptr; }; - FileData GetDataFromFile(const std::string& fname, uint64_t fsize, IOErrors* err)override { + FileData GetDataFromFile(const std::string& fname, uint64_t fsize, IOErrors* err) const noexcept override { return FileData(GetDataFromFileProxy(fname, fsize, err)); }; - int open(const char* __file, int __oflag)override { + int open(const char* __file, int __oflag) const noexcept override { return 0; }; - int close(int __fd)override { + int close(int __fd)const noexcept override { return 0; }; - int64_t read(int __fd, void* buf, size_t count)override { + int64_t read(int __fd, void* buf, size_t count) const noexcept override { return 0; }; - int64_t write(int __fd, const void* __buf, size_t __n) override { + int64_t write(int __fd, const void* __buf, size_t __n) const noexcept override { return 0; }; - std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) override { + std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) const override { *err = IOErrors::kNoError; std::vector<FileInfo> file_infos; FileInfo fi; @@ -77,7 +76,7 @@ class FakeIO: public IO { class IOFolderNotFound: public FakeIO { public: - std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) override { + std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) const override { *err = IOErrors::kFileNotFound; return {}; } @@ -85,7 +84,7 @@ class IOFolderNotFound: public FakeIO { class IOFodlerUnknownError: public FakeIO { public: - std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) override { + std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) const override { *err = IOErrors::kUnknownError; return {}; } @@ -93,7 +92,7 @@ class IOFodlerUnknownError: public FakeIO { class IOEmptyFodler: public FakeIO { public: - std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) override { + std::vector<FileInfo> FilesInFolder(const std::string& folder, IOErrors* err) const override { *err = IOErrors::kNoError; return {}; } @@ -101,7 +100,7 @@ class IOEmptyFodler: public FakeIO { class IOCannotOpenFile: public FakeIO { public: - FileData GetDataFromFile(const std::string& fname, uint64_t fsize, IOErrors* err) override { + FileData GetDataFromFile(const std::string& fname, uint64_t fsize, IOErrors* err) const noexcept override { *err = IOErrors::kPermissionDenied; return {}; }; @@ -212,7 +211,7 @@ TEST_F(FolderDataBrokerTests, GetNextReturnsErrorWhenFilePermissionsDenied) { class OpenFileMock : public FakeIO { public: - MOCK_METHOD3(GetDataFromFileProxy, uint8_t* (const std::string&, uint64_t, IOErrors*)); + MOCK_CONST_METHOD3(GetDataFromFileProxy, uint8_t* (const std::string&, uint64_t, IOErrors*)); };