From 0bd564a259e1647343e3137abe6b618d7ad09c18 Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Fri, 14 Apr 2023 09:24:00 -0500 Subject: [PATCH] [libc] Add a test to directly stimulate the RPC interface Currently, the RPC interface with the loader is only tested if the other tests fail. This test adds a direct test that runs a simple integer increment over the RPC handshake 10000 times. Depends on https://reviews.llvm.org/D148288 Reviewed By: lntue Differential Revision: https://reviews.llvm.org/D148342 --- libc/src/__support/RPC/rpc.h | 1 + libc/test/integration/startup/gpu/CMakeLists.txt | 9 +++++++ libc/test/integration/startup/gpu/rpc_test.cpp | 34 ++++++++++++++++++++++++ libc/utils/gpu/loader/Server.h | 6 +++++ 4 files changed, 50 insertions(+) create mode 100644 libc/test/integration/startup/gpu/rpc_test.cpp diff --git a/libc/src/__support/RPC/rpc.h b/libc/src/__support/RPC/rpc.h index e73dbaa..be5856b 100644 --- a/libc/src/__support/RPC/rpc.h +++ b/libc/src/__support/RPC/rpc.h @@ -34,6 +34,7 @@ enum Opcode : uint16_t { NOOP = 0, PRINT_TO_STDERR = 1, EXIT = 2, + TEST_INCREMENT = 3, }; /// A fixed size channel used to communicate between the RPC client and server. diff --git a/libc/test/integration/startup/gpu/CMakeLists.txt b/libc/test/integration/startup/gpu/CMakeLists.txt index 9bd7f67..a68873c 100644 --- a/libc/test/integration/startup/gpu/CMakeLists.txt +++ b/libc/test/integration/startup/gpu/CMakeLists.txt @@ -12,3 +12,12 @@ add_integration_test( FRANCE=Paris GERMANY=Berlin ) + +add_integration_test( + startup_rpc_test + SUITE libc-startup-tests + SRCS + rpc_test.cpp + DEPENDS + libc.src.__support.RPC.rpc_client +) diff --git a/libc/test/integration/startup/gpu/rpc_test.cpp b/libc/test/integration/startup/gpu/rpc_test.cpp new file mode 100644 index 0000000..3f823ae --- /dev/null +++ b/libc/test/integration/startup/gpu/rpc_test.cpp @@ -0,0 +1,34 @@ +//===-- Loader test to check the RPC interface with the loader ------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "src/__support/RPC/rpc_client.h" +#include "test/IntegrationTest/test.h" + +using namespace __llvm_libc; + +static void test_add_simple() { + constexpr int num_additions = 10000; + uint64_t cnt = 0; + for (int i = 0; i < num_additions; ++i) { + rpc::Port port = rpc::client.open(rpc::TEST_INCREMENT); + port.send_and_recv( + [=](rpc::Buffer *buffer) { + reinterpret_cast(buffer->data)[0] = cnt; + }, + [&](rpc::Buffer *buffer) { + cnt = reinterpret_cast(buffer->data)[0]; + }); + port.close(); + } + ASSERT_TRUE(cnt == num_additions && "Incorrect sum"); +} + +TEST_MAIN(int argc, char **argv, char **envp) { + test_add_simple(); + return 0; +} diff --git a/libc/utils/gpu/loader/Server.h b/libc/utils/gpu/loader/Server.h index 12565b0..af432fc 100644 --- a/libc/utils/gpu/loader/Server.h +++ b/libc/utils/gpu/loader/Server.h @@ -42,6 +42,12 @@ void handle_server() { }); break; } + case __llvm_libc::rpc::Opcode::TEST_INCREMENT: { + port->recv_and_send([](__llvm_libc::rpc::Buffer *buffer) { + reinterpret_cast(buffer->data)[0] += 1; + }); + break; + } default: port->recv([](__llvm_libc::rpc::Buffer *) { /* no-op */ }); return; -- 2.7.4