blob: d3a0e5325969fd81e41fbb9bf2ae6a114a294398 [file] [log] [blame]
// Copyright 2020 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.
#ifndef SRC_SYS_RUN_TEST_COMPONENT_OUTPUT_COLLECTOR_H_
#define SRC_SYS_RUN_TEST_COMPONENT_OUTPUT_COLLECTOR_H_
#include <lib/async/cpp/wait.h>
#include <lib/async/dispatcher.h>
#include <lib/fpromise/bridge.h>
#include <lib/fpromise/promise.h>
#include <lib/zx/socket.h>
#include <zircon/assert.h>
#include <cstdio>
#include <memory>
#include <vector>
#include <fbl/unique_fd.h>
namespace run {
// This class captures the output from the socket and then buffers that output by newline.
// This can be used to pass file decriptors to launched components and capture their standard
// output.
class OutputCollector {
public:
static std::unique_ptr<OutputCollector> Create();
using OutputCallBack = fit::function<void(std::string s)>;
zx::socket TakeServer() {
ZX_ASSERT_MSG(server_socket_.is_valid(), "This function should be called only once");
return std::move(server_socket_);
}
explicit OutputCollector(zx::socket log_socket, zx::socket server_socket);
~OutputCollector();
void CollectOutput(OutputCallBack callback, async_dispatcher_t *dispatcher);
/// Signals when this class is done processing output socket.
fpromise::promise<> SignalWhenDone();
private:
void Close();
void Handler(async_dispatcher_t *, async::WaitBase *, zx_status_t, const zx_packet_signal_t *);
std::vector<uint8_t> buf_;
OutputCallBack callback_;
zx::socket server_socket_;
zx::socket log_socket_;
async::WaitMethod<OutputCollector, &OutputCollector::Handler> wait_;
std::unique_ptr<OutputCollector> self_;
std::vector<fpromise::bridge<>> done_signals_;
};
} // namespace run
#endif // SRC_SYS_RUN_TEST_COMPONENT_OUTPUT_COLLECTOR_H_