summaryrefslogtreecommitdiffstats
path: root/util/stream/zerocopy_output_ut.cpp
diff options
context:
space:
mode:
authorDevtools Arcadia <[email protected]>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <[email protected]>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/stream/zerocopy_output_ut.cpp
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/stream/zerocopy_output_ut.cpp')
-rw-r--r--util/stream/zerocopy_output_ut.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/util/stream/zerocopy_output_ut.cpp b/util/stream/zerocopy_output_ut.cpp
new file mode 100644
index 00000000000..e81f7fb056c
--- /dev/null
+++ b/util/stream/zerocopy_output_ut.cpp
@@ -0,0 +1,48 @@
+#include "zerocopy_output.h"
+
+#include <library/cpp/testing/unittest/registar.h>
+
+#include <util/generic/string.h>
+
+// This version of string output stream is written here only
+// for testing IZeroCopyOutput implementation of DoWrite.
+class TSimpleStringOutput: public IZeroCopyOutput {
+public:
+ TSimpleStringOutput(TString& s) noexcept
+ : S_(s)
+ {
+ }
+
+private:
+ size_t DoNext(void** ptr) override {
+ if (S_.size() == S_.capacity()) {
+ S_.reserve(FastClp2(S_.capacity() + 1));
+ }
+ size_t previousSize = S_.size();
+ S_.resize(S_.capacity());
+ *ptr = S_.begin() + previousSize;
+ return S_.size() - previousSize;
+ }
+
+ void DoUndo(size_t len) override {
+ Y_ENSURE(len <= S_.size());
+ S_.resize(S_.size() - len);
+ }
+
+ TString& S_;
+};
+
+Y_UNIT_TEST_SUITE(TestZerocopyOutput) {
+ Y_UNIT_TEST(Write) {
+ TString str;
+ TSimpleStringOutput output(str);
+ TString result;
+
+ for (size_t i = 0; i < 1000; ++i) {
+ result.push_back('a' + (i % 20));
+ }
+
+ output.Write(result.begin(), result.size());
+ UNIT_ASSERT_STRINGS_EQUAL(str, result);
+ }
+}