From fcc5e57bc36d824f19275ee83f2c7acfdd6da6bd Mon Sep 17 00:00:00 2001 From: Marc Parisi Date: Mon, 9 Oct 2017 20:09:08 -0400 Subject: [PATCH] MINIFI-256: Resolve Putfile name and ensure that call backs over 1k that rely on the return code to be zero when finished receive zero --- libminifi/src/io/FileStream.cpp | 3 +- libminifi/src/processors/PutFile.cpp | 2 +- libminifi/test/unit/FileStreamTests.cpp | 37 ++++++++++++++++++++++++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/libminifi/src/io/FileStream.cpp b/libminifi/src/io/FileStream.cpp index a3e7ee1f60..93d6411a30 100644 --- a/libminifi/src/io/FileStream.cpp +++ b/libminifi/src/io/FileStream.cpp @@ -135,13 +135,14 @@ int FileStream::readData(uint8_t *buf, int buflen) { file_stream_->read(reinterpret_cast(buf), buflen); if ((file_stream_->rdstate() & (file_stream_->eofbit | file_stream_->failbit)) != 0) { file_stream_->clear(); + size_t prev_offset = offset_; file_stream_->seekg(0, file_stream_->end); file_stream_->seekp(0, file_stream_->end); int len = file_stream_->tellg(); offset_ = len; length_ = len; logger_->log_info("%s eof bit, ended at %d", path_, offset_); - return offset_; + return offset_-prev_offset; } else { offset_ += buflen; file_stream_->seekp(offset_); diff --git a/libminifi/src/processors/PutFile.cpp b/libminifi/src/processors/PutFile.cpp index 80aea6c666..cf7069099b 100644 --- a/libminifi/src/processors/PutFile.cpp +++ b/libminifi/src/processors/PutFile.cpp @@ -46,7 +46,7 @@ namespace processors { std::shared_ptr PutFile::id_generator_ = utils::IdGenerator::getIdGenerator(); -core::Property PutFile::Directory("Output Directory", "The output directory to which to put files", "."); +core::Property PutFile::Directory("Directory", "The output directory to which to put files", "."); core::Property PutFile::ConflictResolution("Conflict Resolution Strategy", "Indicates what should happen when a file with the same name already exists in the output directory", CONFLICT_RESOLUTION_STRATEGY_FAIL); diff --git a/libminifi/test/unit/FileStreamTests.cpp b/libminifi/test/unit/FileStreamTests.cpp index 5c86f1917f..92ff09235c 100644 --- a/libminifi/test/unit/FileStreamTests.cpp +++ b/libminifi/test/unit/FileStreamTests.cpp @@ -19,6 +19,7 @@ #include "io/FileStream.h" #include #include +#include #include #include "../TestBase.h" @@ -174,7 +175,6 @@ TEST_CASE("TestFileBadArgumentNoChange3", "[TestLoader]") { unlink(ss.str().c_str()); } - TEST_CASE("TestFileBeyondEnd3", "[TestLoader]") { TestController testController; char format[] = "/tmp/gt.XXXXXX"; @@ -208,3 +208,38 @@ TEST_CASE("TestFileBeyondEnd3", "[TestLoader]") { unlink(ss.str().c_str()); } + +TEST_CASE("TestFileExceedSize", "[TestLoader]") { + TestController testController; + char format[] = "/tmp/gt.XXXXXX"; + char *dir = testController.createTempDirectory(format); + + std::fstream file; + std::stringstream ss; + ss << dir << "/" << "tstFile.ext"; + std::string path = ss.str(); + file.open(path, std::ios::out); + for (int i = 0; i < 10240; i++) + file << "tempFile"; + file.close(); + + minifi::io::FileStream stream(path, 0, true); + std::vector readBuffer; + REQUIRE(stream.readData(readBuffer, stream.getSize()) == stream.getSize()); + + uint8_t* data = readBuffer.data(); + + stream.seek(0); + + std::vector verifybuffer; + + for (int i = 0; i < 10; i++) + REQUIRE(stream.readData(verifybuffer, 8192) == 8192); + REQUIRE(stream.readData(verifybuffer, 8192) == 0); + stream.seek(0); + for (int i = 0; i < 10; i++) + REQUIRE(stream.readData(verifybuffer, 8192) == 8192); + REQUIRE(stream.readData(verifybuffer, 8192) == 0); + + unlink(ss.str().c_str()); +}