This is an automated email from the ASF dual-hosted git repository. jamesge pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-brpc.git
The following commit(s) were added to refs/heads/master by this push: new 7e85374 Add UT for returning EAGAIN from the IReader 7e85374 is described below commit 7e85374b27266291909db1cdfce3b797def3502d Author: gejun <ge...@bilibili.com> AuthorDate: Tue May 14 21:11:45 2019 +0800 Add UT for returning EAGAIN from the IReader --- src/butil/recordio.h | 2 +- test/recordio_unittest.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/butil/recordio.h b/src/butil/recordio.h index 67b4994..cd50592 100755 --- a/src/butil/recordio.h +++ b/src/butil/recordio.h @@ -79,7 +79,7 @@ private: // Parse records from the IReader, corrupted records will be skipped. // Example: -// RecordReader rd(ireader); +// RecordReader rd(...); // Record rec; // while (rd.ReadNext(&rec)) { // // Handle the rec diff --git a/test/recordio_unittest.cpp b/test/recordio_unittest.cpp index d4a2c42..2fe9a08 100755 --- a/test/recordio_unittest.cpp +++ b/test/recordio_unittest.cpp @@ -8,8 +8,11 @@ namespace { class StringReader : public butil::IReader { public: - StringReader(const std::string& str) - : _str(str), _offset(0) {} + StringReader(const std::string& str, + bool report_eagain_on_end = false) + : _str(str) + , _offset(0) + , _report_eagain_on_end(report_eagain_on_end) {} ssize_t ReadV(const iovec* iov, int iovcnt) override { size_t total_nc = 0; @@ -25,11 +28,16 @@ public: break; } } + if (_report_eagain_on_end && total_nc == 0) { + errno = EAGAIN; + return -1; + } return total_nc; } private: std::string _str; size_t _offset; + bool _report_eagain_on_end; }; class StringWriter : public butil::IWriter { @@ -159,6 +167,50 @@ TEST(RecordIOTest, write_read_basic) { ASSERT_EQ(sw.str().size(), rr.read_bytes()); } +TEST(RecordIOTest, incomplete_reader) { + StringWriter sw; + butil::RecordWriter rw(&sw); + + butil::Record src; + butil::IOBuf* foo_val = src.MutableMeta("foo"); + foo_val->append("foo_data"); + ASSERT_EQ(0, rw.Write(src)); + + butil::IOBuf* bar_val = src.MutableMeta("bar"); + bar_val->append("bar_data"); + ASSERT_EQ(0, rw.Write(src)); + + ASSERT_EQ(0, rw.Flush()); + std::string data = sw.str(); + std::cout << "len=" << data.size() + << " content=" << butil::PrintedAsBinary(data, 256) << std::endl; + + StringReader sr(data, true); + butil::RecordReader rr(&sr); + + butil::Record r2; + ASSERT_TRUE(rr.ReadNext(&r2)); + ASSERT_EQ(0, rr.last_error()); + ASSERT_EQ((size_t)1, r2.MetaCount()); + ASSERT_EQ("foo", r2.MetaAt(0).name); + ASSERT_EQ("foo_data", *r2.MetaAt(0).data); + ASSERT_TRUE(r2.Payload().empty()); + + butil::Record r3; + ASSERT_TRUE(rr.ReadNext(&r3)); + ASSERT_EQ(0, rr.last_error()); + ASSERT_EQ((size_t)2, r3.MetaCount()); + ASSERT_EQ("foo", r3.MetaAt(0).name); + ASSERT_EQ("foo_data", *r3.MetaAt(0).data); + ASSERT_EQ("bar", r3.MetaAt(1).name); + ASSERT_EQ("bar_data", *r3.MetaAt(1).data); + ASSERT_TRUE(r3.Payload().empty()); + + ASSERT_FALSE(rr.ReadNext(NULL)); + ASSERT_EQ(EAGAIN, rr.last_error()); + ASSERT_EQ(sw.str().size(), rr.read_bytes()); +} + static std::string rand_string(int min_len, int max_len) { const int len = butil::fast_rand_in(min_len, max_len); std::string str; --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@brpc.apache.org For additional commands, e-mail: dev-h...@brpc.apache.org