// 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
