blob: 36e6654cf116fe3a605a9bc984bfaa54aa11dc3e [file] [log] [blame]
// Copyright 2019 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 LIB_VIRTUALIZATION_TESTING_FAKE_GUEST_VSOCK_H_
#define LIB_VIRTUALIZATION_TESTING_FAKE_GUEST_VSOCK_H_
#include <fuchsia/virtualization/cpp/fidl.h>
#include <unordered_map>
namespace guest {
namespace testing {
class FakeHostVsock;
// FakeGuestVsock provides a way to simulate a guest interation over the virtio-
// vsock bus in tests.
class FakeGuestVsock {
public:
FakeGuestVsock(FakeHostVsock* host_vsock) : host_vsock_(host_vsock) {}
// Attempts to establish a vsock connection to the host endpoint on the given
// port. For this to succeed, some other component must have already setup
// a listener on that port using the
// |fuchsia::virtualization::HostVsockEndpoint| returned from the enclosing
// |fuchsia::virtualization::Realm|.
using ConnectCallback = fit::function<void(zx::handle)>;
zx_status_t ConnectToHost(uint32_t port, ConnectCallback callback);
// Sets up a listener on the provided port to accept in-bound connections
// from the host. The |acceptor| may be called multiple times if the host
// attempts to establish multiple connections to the port.
//
// Returns |ZX_ERR_ALREADY_BOUND| if |Listen| has already been called with the
// same port.
using Acceptor = fit::function<zx_status_t(zx::handle)>;
zx_status_t Listen(uint32_t port, Acceptor);
protected:
friend class FakeHostVsock;
void AcceptConnectionFromHost(
uint32_t port, zx::handle handle,
fuchsia::virtualization::HostVsockEndpoint::ConnectCallback callback);
void AcceptConnection2FromHost(
uint32_t port, zx::socket client, zx::socket guest,
fuchsia::virtualization::HostVsockEndpoint::Connect2Callback callback);
private:
FakeHostVsock* host_vsock_;
std::unordered_map<uint32_t, Acceptor> listeners_;
};
} // namespace testing
} // namespace guest
#endif // LIB_VIRTUALIZATION_TESTING_FAKE_GUEST_VSOCK_H_