blob: f828a2923e1868edf14c8c2d96b5c80c2585cc75 [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.
#include "src/virtualization/lib/vsh/util.h"
#include <lib/gtest/test_loop_fixture.h>
#include "src/virtualization/packages/biscotti_guest/third_party/protos/vsh.pb.h"
namespace {
class VshUtilTest : public gtest::TestLoopFixture {};
// Test sending and receiving messages by simulating a simple vsh session.
TEST_F(VshUtilTest, SendRecv) {
zx::socket client_end, server_end;
ASSERT_EQ(ZX_OK, zx::socket::create(ZX_SOCKET_STREAM, &client_end, &server_end));
{ // Client sends ConnectionSetupRequest
vm_tools::vsh::SetupConnectionRequest request;
auto env = request.mutable_env();
(*env)["ENV_VAR1"] = "ENV_VAR_VALUE_1";
(*env)["ENV_VAR2"] = "ENV_VAR_VALUE_2";
request.add_argv("echo");
request.add_argv("hello world");
ASSERT_TRUE(vsh::SendMessage(client_end, request));
}
{
vm_tools::vsh::SetupConnectionRequest request;
ASSERT_TRUE(vsh::RecvMessage(server_end, &request));
ASSERT_EQ(2, request.env_size());
auto env = request.env();
ASSERT_EQ(env["ENV_VAR1"], "ENV_VAR_VALUE_1");
ASSERT_EQ(env["ENV_VAR2"], "ENV_VAR_VALUE_2");
ASSERT_EQ(2, request.argv_size());
ASSERT_EQ(request.argv(0), "echo");
ASSERT_EQ(request.argv(1), "hello world");
}
{ // Server sends some stdout data
vm_tools::vsh::HostMessage request;
auto data_message = request.mutable_data_message();
data_message->set_data("hello world");
data_message->set_stream(vm_tools::vsh::StdioStream::STDOUT_STREAM);
ASSERT_TRUE(vsh::SendMessage(server_end, request));
}
{
vm_tools::vsh::HostMessage request;
ASSERT_TRUE(vsh::RecvMessage(client_end, &request));
ASSERT_TRUE(request.has_data_message());
auto data_message = request.data_message();
ASSERT_EQ("hello world", data_message.data());
ASSERT_EQ(vm_tools::vsh::StdioStream::STDOUT_STREAM, data_message.stream());
}
{ // Server sends exit message
vm_tools::vsh::HostMessage request;
auto status_message = request.mutable_status_message();
status_message->set_code(0);
status_message->set_status(vm_tools::vsh::ConnectionStatus::EXITED);
ASSERT_TRUE(vsh::SendMessage(server_end, request));
}
{
vm_tools::vsh::HostMessage request;
ASSERT_TRUE(vsh::RecvMessage(client_end, &request));
ASSERT_TRUE(request.has_status_message());
auto status_message = request.status_message();
ASSERT_EQ(0, status_message.code());
ASSERT_EQ(vm_tools::vsh::ConnectionStatus::EXITED, status_message.status());
}
}
} // namespace