@@ -25,6 +25,8 @@ limitations under the License.
2525#include < vector>
2626
2727#include " gtest/gtest.h"
28+ #include " absl/strings/cord.h"
29+ #include " absl/strings/cord_test_helpers.h"
2830#include " absl/strings/string_view.h"
2931#include " cpp/common.h"
3032#include " cpp/layout.pb.h"
@@ -116,6 +118,39 @@ TEST_P(ArrayRecordWriterTest, MoveTest) {
116118 }
117119}
118120
121+ TEST_P (ArrayRecordWriterTest, CordTest) {
122+ std::string encoded;
123+ ARThreadPool* pool = nullptr ;
124+ if (std::get<3 >(GetParam ())) {
125+ pool = ArrayRecordGlobalPool ();
126+ }
127+ auto options = GetOptions ();
128+ options.set_group_size (2 );
129+ auto writer = ArrayRecordWriter (
130+ riegeli::Maker<riegeli::StringWriter>(&encoded), options, pool);
131+
132+ absl::Cord flat_cord (" test" );
133+ // Empty string should not crash the writer.
134+ absl::Cord empty_cord (" " );
135+ absl::Cord fragmented_cord = absl::MakeFragmentedCord ({" aaa " , " " , " c" });
136+
137+ EXPECT_TRUE (writer.WriteRecord (flat_cord));
138+ EXPECT_TRUE (writer.WriteRecord (empty_cord));
139+ EXPECT_TRUE (writer.WriteRecord (fragmented_cord));
140+ ASSERT_TRUE (writer.Close ());
141+
142+ // Empty string should not crash the reader.
143+ std::vector<std::string> expected_strings{" test" , " " , " aaa c" };
144+
145+ auto reader =
146+ riegeli::RecordReader (riegeli::Maker<riegeli::StringReader>(encoded));
147+ for (const auto & expected : expected_strings) {
148+ std::string result;
149+ reader.ReadRecord (result);
150+ EXPECT_EQ (result, expected);
151+ }
152+ }
153+
119154TEST_P (ArrayRecordWriterTest, RandomDatasetTest) {
120155 std::mt19937 bitgen;
121156 constexpr uint32_t kGroupSize = 100 ;
0 commit comments