| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 3c5a855 commit 39ee48c
2 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -34,28 +34,15 @@ bulk_string_builder::fetch_size(std::string& buffer) { | |||
| 34 | 34 | ||
| 35 | 35 | void | |
| 36 | 36 | bulk_string_builder::fetch_str(std::string& buffer) { | |
| 37 | - //! if bytes are missing, fetch them from the buffer | ||
| 38 | - unsigned int nb_bytes_missing = m_str_size - m_str.size(); | ||
| 39 | - if (nb_bytes_missing) { | ||
| 40 | - unsigned int nb_bytes_to_transfer = buffer.size() < nb_bytes_missing ? buffer.size() : nb_bytes_missing; | ||
| 41 | - nb_bytes_missing -= nb_bytes_to_transfer; | ||
| 42 | - | ||
| 43 | - m_str.insert(m_str.end(), buffer.begin(), buffer.begin() + nb_bytes_to_transfer); | ||
| 44 | - buffer.erase(0, nb_bytes_to_transfer); | ||
| 45 | - } | ||
| 46 | - | ||
| 47 | - //! if after fetching content in the buffer, there are no more missing bytes, check for ending sequence | ||
| 48 | - //! always wait there are the two chars \r\n before consuming them | ||
| 49 | - if (not nb_bytes_missing) { | ||
| 50 | - if (buffer.size() < 2) | ||
| 51 | - return; | ||
| 37 | + if (buffer.size() < static_cast<unsigned int>(m_str_size) + 2) // also wait for end sequence | ||
| 38 | + return ; | ||
| 52 | 39 | ||
| 53 | - if (buffer[0] != '\r' or buffer[1] != '\n') | ||
| 54 | - throw redis_error("Wrong ending sequence"); | ||
| 40 | + if (buffer[m_str_size] != '\r' or buffer[m_str_size + 1] != '\n') | ||
| 41 | + throw redis_error("Wrong ending sequence"); | ||
| 55 | 42 | ||
| 56 | - buffer.erase(0, 2); | ||
| 57 | - build_reply(); | ||
| 58 | - } | ||
| 43 | + m_str = buffer.substr(0, m_str_size); | ||
| 44 | + buffer.erase(0, m_str_size + 2); | ||
| 45 | + build_reply(); | ||
| 59 | 46 | } | |
| 60 | 47 | ||
| 61 | 48 | builder_iface& | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,110 @@ | |||
| 1 | + #include <gtest/gtest.h> | ||
| 2 | + #include <cpp_redis/builders/bulk_string_builder.hpp> | ||
| 3 | + #include <cpp_redis/redis_error.hpp> | ||
| 4 | + | ||
| 5 | + TEST(BulkStringBuilder, WithNoData) { | ||
| 6 | + cpp_redis::builders::bulk_string_builder builder; | ||
| 7 | + | ||
| 8 | + EXPECT_EQ(false, builder.reply_ready()); | ||
| 9 | + } | ||
| 10 | + | ||
| 11 | + TEST(BulkStringBuilder, WithNotEnoughData) { | ||
| 12 | + cpp_redis::builders::bulk_string_builder builder; | ||
| 13 | + | ||
| 14 | + std::string buffer = "5\r\nhell"; | ||
| 15 | + builder << buffer; | ||
| 16 | + | ||
| 17 | + EXPECT_EQ(false, builder.reply_ready()); | ||
| 18 | + } | ||
| 19 | + | ||
| 20 | + TEST(BulkStringBuilder, WithPartOfEndSequence) { | ||
| 21 | + cpp_redis::builders::bulk_string_builder builder; | ||
| 22 | + | ||
| 23 | + std::string buffer = "5\r\nhello\r"; | ||
| 24 | + builder << buffer; | ||
| 25 | + | ||
| 26 | + EXPECT_EQ(false, builder.reply_ready()); | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + TEST(BulkStringBuilder, Null) { | ||
| 30 | + cpp_redis::builders::bulk_string_builder builder; | ||
| 31 | + | ||
| 32 | + std::string buffer = "-1\r\n"; | ||
| 33 | + builder << buffer; | ||
| 34 | + | ||
| 35 | + EXPECT_EQ(true, builder.reply_ready()); | ||
| 36 | + EXPECT_EQ("", buffer); | ||
| 37 | + | ||
| 38 | + auto reply = std::dynamic_pointer_cast<cpp_redis::bulk_string_reply>(builder.get_reply()); | ||
| 39 | + EXPECT_TRUE(reply != nullptr); | ||
| 40 | + EXPECT_EQ(true, reply->is_null()); | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + TEST(BulkStringBuilder, WithAllInOneTime) { | ||
| 44 | + cpp_redis::builders::bulk_string_builder builder; | ||
| 45 | + | ||
| 46 | + std::string buffer = "5\r\nhello\r\n"; | ||
| 47 | + builder << buffer; | ||
| 48 | + | ||
| 49 | + EXPECT_EQ(true, builder.reply_ready()); | ||
| 50 | + EXPECT_EQ("", buffer); | ||
| 51 | + | ||
| 52 | + auto reply = std::dynamic_pointer_cast<cpp_redis::bulk_string_reply>(builder.get_reply()); | ||
| 53 | + EXPECT_TRUE(reply != nullptr); | ||
| 54 | + EXPECT_EQ("hello", reply->str()); | ||
| 55 | + } | ||
| 56 | + | ||
| 57 | + TEST(BulkStringBuilder, WithAllInMultipleTimes) { | ||
| 58 | + cpp_redis::builders::bulk_string_builder builder; | ||
| 59 | + | ||
| 60 | + std::string buffer = "5\r\nhell"; | ||
| 61 | + builder << buffer; | ||
| 62 | + buffer += "o\r\n"; | ||
| 63 | + builder << buffer; | ||
| 64 | + | ||
| 65 | + EXPECT_EQ(true, builder.reply_ready()); | ||
| 66 | + EXPECT_EQ("", buffer); | ||
| 67 | + | ||
| 68 | + auto reply = std::dynamic_pointer_cast<cpp_redis::bulk_string_reply>(builder.get_reply()); | ||
| 69 | + EXPECT_TRUE(reply != nullptr); | ||
| 70 | + EXPECT_EQ("hello", reply->str()); | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + TEST(BulkStringBuilder, WithAllInMultipleTimes2) { | ||
| 74 | + cpp_redis::builders::bulk_string_builder builder; | ||
| 75 | + | ||
| 76 | + std::string buffer = "5\r\nhello"; | ||
| 77 | + builder << buffer; | ||
| 78 | + buffer += "\r\n"; | ||
| 79 | + builder << buffer; | ||
| 80 | + | ||
| 81 | + EXPECT_EQ(true, builder.reply_ready()); | ||
| 82 | + EXPECT_EQ("", buffer); | ||
| 83 | + | ||
| 84 | + auto reply = std::dynamic_pointer_cast<cpp_redis::bulk_string_reply>(builder.get_reply()); | ||
| 85 | + EXPECT_TRUE(reply != nullptr); | ||
| 86 | + EXPECT_EQ("hello", reply->str()); | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + TEST(BulkStringBuilder, WithAllInMultipleTimes3) { | ||
| 90 | + cpp_redis::builders::bulk_string_builder builder; | ||
| 91 | + | ||
| 92 | + std::string buffer = "5\r\nhello\r"; | ||
| 93 | + builder << buffer; | ||
| 94 | + buffer += "\n"; | ||
| 95 | + builder << buffer; | ||
| 96 | + | ||
| 97 | + EXPECT_EQ(true, builder.reply_ready()); | ||
| 98 | + EXPECT_EQ("", buffer); | ||
| 99 | + | ||
| 100 | + auto reply = std::dynamic_pointer_cast<cpp_redis::bulk_string_reply>(builder.get_reply()); | ||
| 101 | + EXPECT_TRUE(reply != nullptr); | ||
| 102 | + EXPECT_EQ("hello", reply->str()); | ||
| 103 | + } | ||
| 104 | + | ||
| 105 | + TEST(BulkStringBuilder, InvalidEndSequence) { | ||
| 106 | + cpp_redis::builders::bulk_string_builder builder; | ||
| 107 | + | ||
| 108 | + std::string buffer = "5\r\nhello\ra"; | ||
| 109 | + EXPECT_THROW(builder << buffer, cpp_redis::redis_error); | ||
| 110 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments