| // Copyright 2016 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "src/lib/fsl/socket/socket_drainer.h" | |
| #include <lib/fit/function.h> | |
| #include "lib/gtest/test_loop_fixture.h" | |
| #include "src/lib/fsl/socket/strings.h" | |
| namespace fsl { | |
| namespace { | |
| using SocketDrainerTest = ::gtest::TestLoopFixture; | |
| class Client : public SocketDrainer::Client { | |
| public: | |
| Client(fit::function<void()> available_callback, fit::function<void()> completion_callback) | |
| : available_callback_(std::move(available_callback)), | |
| completion_callback_(std::move(completion_callback)) {} | |
| ~Client() override {} | |
| std::string GetValue() { return value_; } | |
| private: | |
| void OnDataAvailable(const void* data, size_t num_bytes) override { | |
| value_.append(static_cast<const char*>(data), num_bytes); | |
| available_callback_(); | |
| } | |
| void OnDataComplete() override { completion_callback_(); } | |
| std::string value_; | |
| fit::function<void()> available_callback_; | |
| fit::function<void()> completion_callback_; | |
| }; | |
| TEST_F(SocketDrainerTest, ReadData) { | |
| Client client([] {}, [] {}); | |
| SocketDrainer drainer(&client); | |
| drainer.Start(fsl::WriteStringToSocket("Hello")); | |
| RunLoopUntilIdle(); | |
| EXPECT_EQ("Hello", client.GetValue()); | |
| } | |
| TEST_F(SocketDrainerTest, DeleteOnCallback) { | |
| std::unique_ptr<SocketDrainer> drainer; | |
| Client client([&drainer] { drainer.reset(); }, [] {}); | |
| drainer = std::make_unique<SocketDrainer>(&client); | |
| drainer->Start(fsl::WriteStringToSocket("H")); | |
| RunLoopUntilIdle(); | |
| EXPECT_EQ("H", client.GetValue()); | |
| EXPECT_EQ(nullptr, drainer.get()); | |
| } | |
| TEST_F(SocketDrainerTest, ShutdownRead) { | |
| Client client([] {}, [] {}); | |
| SocketDrainer drainer(&client); | |
| zx::socket socket1, socket2; | |
| ASSERT_EQ(ZX_OK, zx::socket::create(0u, &socket1, &socket2)); | |
| drainer.Start(std::move(socket2)); | |
| char buf[] = {'H', 'e', 'l', 'l', 'o'}; | |
| socket1.write(0u, buf, sizeof(buf), nullptr); | |
| socket1.shutdown(ZX_SOCKET_SHUTDOWN_WRITE); | |
| RunLoopUntilIdle(); | |
| EXPECT_EQ("Hello", client.GetValue()); | |
| } | |
| } // namespace | |
| } // namespace fsl |