summaryrefslogtreecommitdiffstats
path: root/src/spdk/test/rpc_client
diff options
context:
space:
mode:
Diffstat (limited to 'src/spdk/test/rpc_client')
-rw-r--r--src/spdk/test/rpc_client/.gitignore1
-rw-r--r--src/spdk/test/rpc_client/Makefile56
-rwxr-xr-xsrc/spdk/test/rpc_client/rpc_client.sh36
-rw-r--r--src/spdk/test/rpc_client/rpc_client_test.c118
4 files changed, 211 insertions, 0 deletions
diff --git a/src/spdk/test/rpc_client/.gitignore b/src/spdk/test/rpc_client/.gitignore
new file mode 100644
index 00000000..e878ca3a
--- /dev/null
+++ b/src/spdk/test/rpc_client/.gitignore
@@ -0,0 +1 @@
+rpc_client_test
diff --git a/src/spdk/test/rpc_client/Makefile b/src/spdk/test/rpc_client/Makefile
new file mode 100644
index 00000000..50e976a2
--- /dev/null
+++ b/src/spdk/test/rpc_client/Makefile
@@ -0,0 +1,56 @@
+#
+# BSD LICENSE
+#
+# Copyright (c) Intel Corporation.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Intel Corporation nor the names of its
+# contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..)
+include $(SPDK_ROOT_DIR)/mk/spdk.common.mk
+include $(SPDK_ROOT_DIR)/mk/spdk.app.mk
+include $(SPDK_ROOT_DIR)/mk/spdk.modules.mk
+
+APP = rpc_client_test
+
+C_SRCS := rpc_client_test.c
+
+SPDK_LIB_LIST = jsonrpc json log util
+
+LIBS += $(SPDK_LIB_LINKER_ARGS) $(ENV_LINKER_ARGS)
+
+all : $(APP)
+ @:
+
+$(APP) : $(OBJS) $(SPDK_LIB_FILES)
+ $(LINK_C)
+
+clean :
+ $(CLEAN_C) $(APP)
+
+include $(SPDK_ROOT_DIR)/mk/spdk.deps.mk
diff --git a/src/spdk/test/rpc_client/rpc_client.sh b/src/spdk/test/rpc_client/rpc_client.sh
new file mode 100755
index 00000000..296a6fff
--- /dev/null
+++ b/src/spdk/test/rpc_client/rpc_client.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+
+testdir=$(readlink -f $(dirname $0))
+rootdir=$(readlink -f $testdir/../..)
+
+set -e
+
+source $rootdir/test/common/autotest_common.sh
+
+function rpc_client_test() {
+ if [ $(uname -s) = Linux ]; then
+ local conf=$rootdir/test/bdev/bdev.conf.in
+
+ if [ ! -e $conf ]; then
+ return 1
+ fi
+
+ $rootdir/test/app/bdev_svc/bdev_svc -i 0 -c ${conf} &
+ svc_pid=$!
+ echo "Process bdev_svc pid: $svc_pid"
+ waitforlisten $svc_pid
+ trap "killprocess $svc_pid" SIGINT SIGTERM EXIT
+
+ $rootdir/test/rpc_client/rpc_client_test
+
+ killprocess $svc_pid
+ fi
+
+ return 0
+}
+
+timing_enter rpc_client
+rpc_client_test
+timing_exit rpc_client
+
+trap - SIGINT SIGTERM EXIT
diff --git a/src/spdk/test/rpc_client/rpc_client_test.c b/src/spdk/test/rpc_client/rpc_client_test.c
new file mode 100644
index 00000000..68f84713
--- /dev/null
+++ b/src/spdk/test/rpc_client/rpc_client_test.c
@@ -0,0 +1,118 @@
+/*-
+ * BSD LICENSE
+ *
+ * Copyright (c) Intel Corporation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Intel Corporation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "spdk/stdinc.h"
+#include "spdk/event.h"
+#include "spdk/jsonrpc.h"
+
+#define RPC_MAX_METHODS 200
+
+static const char *g_rpcsock_addr = SPDK_DEFAULT_RPC_ADDR;
+static int g_addr_family = AF_UNIX;
+
+#define RPC_MAX_METHODS 200
+
+struct get_jsonrpc_methods_resp {
+ char *method_names[RPC_MAX_METHODS];
+ size_t method_num;
+};
+
+static int
+get_jsonrpc_method_json_parser(void *parser_ctx,
+ const struct spdk_json_val *result)
+{
+ struct get_jsonrpc_methods_resp *resp = parser_ctx;
+
+ return spdk_json_decode_array(result, spdk_json_decode_string, resp->method_names,
+ RPC_MAX_METHODS, &resp->method_num, sizeof(char *));
+}
+
+static int
+spdk_jsonrpc_client_check_rpc_method(struct spdk_jsonrpc_client *client, char *method_name)
+{
+ int rc, i;
+ struct get_jsonrpc_methods_resp resp = {};
+ struct spdk_json_write_ctx *w;
+ struct spdk_jsonrpc_client_request *request;
+
+ request = spdk_jsonrpc_client_create_request();
+ if (request == NULL) {
+ return -ENOMEM;
+ }
+
+ w = spdk_jsonrpc_begin_request(request, 1, "get_rpc_methods");
+ spdk_jsonrpc_end_request(request, w);
+ spdk_jsonrpc_client_send_request(client, request);
+ spdk_jsonrpc_client_free_request(request);
+
+ rc = spdk_jsonrpc_client_recv_response(client, get_jsonrpc_method_json_parser, &resp);
+
+ if (rc) {
+ goto out;
+ }
+
+ for (i = 0; i < (int)resp.method_num; i++) {
+ if (strcmp(method_name, resp.method_names[i]) == 0) {
+ rc = 0;
+ goto out;
+ }
+ }
+
+ rc = -1;
+
+out:
+ for (i = 0; i < (int)resp.method_num; i++) {
+ SPDK_NOTICELOG("%s\n", resp.method_names[i]);
+ free(resp.method_names[i]);
+ }
+
+ return rc;
+}
+
+int main(int argc, char **argv)
+{
+ struct spdk_jsonrpc_client *client;
+ int rc;
+ char *method_name = "get_rpc_methods";
+
+ client = spdk_jsonrpc_client_connect(g_rpcsock_addr, g_addr_family);
+ if (!client) {
+ return EXIT_FAILURE;
+ }
+
+ rc = spdk_jsonrpc_client_check_rpc_method(client, method_name);
+
+ spdk_jsonrpc_client_close(client);
+
+ return rc ? EXIT_FAILURE : 0;
+}