|
3 | 3 | #include <workerd/jsg/jsg-test.h> |
4 | 4 | #include <workerd/tests/test-fixture.h> |
5 | 5 | #include <workerd/util/own-util.h> |
| 6 | +#include <workerd/util/stream-utils.h> |
6 | 7 |
|
7 | 8 | #include <kj/async-io.h> |
8 | 9 | #include <kj/compat/gzip.h> |
@@ -132,6 +133,32 @@ class MemoryAsyncOutputStream final: public kj::AsyncOutputStream { |
132 | 133 | kj::Vector<kj::byte> data; |
133 | 134 | }; |
134 | 135 |
|
| 136 | +struct MockEndable final: public EndableAsyncOutputStream { |
| 137 | + bool isEnded = false; |
| 138 | + kj::Vector<kj::byte> data; |
| 139 | + |
| 140 | + kj::Promise<void> write(kj::ArrayPtr<const kj::byte> buffer) override { |
| 141 | + data.addAll(buffer); |
| 142 | + co_return; |
| 143 | + } |
| 144 | + |
| 145 | + kj::Promise<void> write(kj::ArrayPtr<const kj::ArrayPtr<const kj::byte>> pieces) override { |
| 146 | + for (auto piece: pieces) { |
| 147 | + data.addAll(piece); |
| 148 | + } |
| 149 | + co_return; |
| 150 | + } |
| 151 | + |
| 152 | + kj::Promise<void> whenWriteDisconnected() override { |
| 153 | + return kj::NEVER_DONE; |
| 154 | + } |
| 155 | + |
| 156 | + kj::Promise<void> end() override { |
| 157 | + isEnded = true; |
| 158 | + co_return; |
| 159 | + } |
| 160 | +}; |
| 161 | + |
135 | 162 | // ====================================================================================== |
136 | 163 | // Core WritableStreamSink Interface Tests |
137 | 164 |
|
@@ -517,5 +544,23 @@ KJ_TEST("IoContext aware wrapper") { |
517 | 544 | KJ_ASSERT(inner.data == "some data"_kjb); |
518 | 545 | } |
519 | 546 |
|
| 547 | +// ====================================================================================== |
| 548 | +// EndableAsyncOutputStream Tests |
| 549 | + |
| 550 | +KJ_TEST("EndableAsyncOutputStream") { |
| 551 | + TestFixture fixture; |
| 552 | + MockEndable inner; |
| 553 | + auto fakeOwn = kj::Own<MockEndable>(&inner, kj::NullDisposer::instance); |
| 554 | + auto sink = newWritableStreamSink(kj::mv(fakeOwn)); |
| 555 | + |
| 556 | + fixture.runInIoContext([&](const auto& environment) -> kj::Promise<void> { |
| 557 | + co_await sink->write("some data"_kjb); |
| 558 | + co_await sink->end(); |
| 559 | + }); |
| 560 | + |
| 561 | + KJ_ASSERT(inner.data == "some data"_kjb); |
| 562 | + KJ_ASSERT(inner.isEnded); |
| 563 | +} |
| 564 | + |
520 | 565 | } // namespace |
521 | 566 | } // namespace workerd::api::streams |
0 commit comments