From 562250100cd0c7daa3d2fb02e59b13be3bdf978c Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Fri, 22 Dec 2017 13:17:45 +0100
Subject: [PATCH] fix test

---
 common/cpp/include/common/file_info.h         |  2 +-
 common/cpp/include/system_wrappers/io.h       | 12 ++++-----
 .../cpp/include/system_wrappers/system_io.h   | 16 +++++------
 common/cpp/src/system_io.cpp                  | 20 +++++++-------
 common/cpp/src/system_io_linux.cpp            | 14 +++++-----
 common/cpp/src/system_io_windows.cpp          | 14 +++++-----
 examples/worker/process_folder/CMakeLists.txt |  8 ++++++
 .../worker/process_folder/check_windows.bat   |  2 +-
 .../read_file_content/cleanup_windows.bat     |  1 +
 worker/api/cpp/src/folder_data_broker.cpp     |  2 +-
 worker/api/cpp/src/folder_data_broker.h       |  2 +-
 .../api/cpp/unittests/test_folder_broker.cpp  | 27 +++++++++----------
 12 files changed, 64 insertions(+), 56 deletions(-)

diff --git a/common/cpp/include/common/file_info.h b/common/cpp/include/common/file_info.h
index da182e342..88bd4f4af 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 8370b7b9d..88bb23570 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 666fa7e53..6c2c62646 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 66001ea13..6ee383e0c 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 a932a90d3..3c1bc09bb 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 4b2d113ed..5653ce87c 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 9fe64b422..91328be81 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 0735194dd..f03ab5c70 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 df76d9336..7766233db 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 bc7fc88a6..a6c263c44 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 27d960172..f5b622bda 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 1942f1198..7da3645ce 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*));
 };
 
 
-- 
GitLab