Setting tag sliver-openvswitch-2.2.90-1
[sliver-openvswitch.git] / tests / test-jsonrpc.c
index 06b1cf4..7251265 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2010 Nicira Networks.
+ * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include "timeval.h"
 #include "util.h"
 #include "vlog.h"
-
-static struct command all_commands[];
+#include "ovstest.h"
 
 static void usage(void) NO_RETURN;
 static void parse_options(int argc, char *argv[]);
+static struct command *get_all_commands(void);
 
-int
-main(int argc, char *argv[])
+static void
+test_jsonrpc_main(int argc, char *argv[])
 {
     proctitle_init(argc, argv);
     set_program_name(argv[0]);
-    time_init();
-    vlog_init();
     parse_options(argc, argv);
-    run_command(argc - optind, argv + optind, all_commands);
-    return 0;
+    run_command(argc - optind, argv + optind, get_all_commands());
 }
 
 static void
 parse_options(int argc, char *argv[])
 {
     enum {
-        OPT_BOOTSTRAP_CA_CERT = UCHAR_MAX + 1
+        OPT_BOOTSTRAP_CA_CERT = UCHAR_MAX + 1,
+        DAEMON_OPTION_ENUMS
     };
-    static struct option long_options[] = {
-        {"verbose", optional_argument, 0, 'v'},
-        {"help", no_argument, 0, 'h'},
+    static const struct option long_options[] = {
+        {"verbose", optional_argument, NULL, 'v'},
+        {"help", no_argument, NULL, 'h'},
         DAEMON_LONG_OPTIONS,
-#ifdef HAVE_OPENSSL
-        {"bootstrap-ca-cert", required_argument, 0, OPT_BOOTSTRAP_CA_CERT},
-        STREAM_SSL_LONG_OPTIONS
-#endif
-        {0, 0, 0, 0},
+        {"bootstrap-ca-cert", required_argument, NULL, OPT_BOOTSTRAP_CA_CERT},
+        STREAM_SSL_LONG_OPTIONS,
+        {NULL, 0, NULL, 0},
     };
     char *short_options = long_options_to_short_options(long_options);
 
@@ -85,13 +81,11 @@ parse_options(int argc, char *argv[])
 
         DAEMON_OPTION_HANDLERS
 
-#ifdef HAVE_OPENSSL
         STREAM_SSL_OPTION_HANDLERS
 
         case OPT_BOOTSTRAP_CA_CERT:
             stream_ssl_set_ca_cert_file(optarg, true);
             break;
-#endif
 
         case '?':
             exit(EXIT_FAILURE);
@@ -143,11 +137,11 @@ print_and_free_json(struct json *json)
 \f
 /* Command implementations. */
 
-static void
+static int
 handle_rpc(struct jsonrpc *rpc, struct jsonrpc_msg *msg, bool *done)
 {
-    struct jsonrpc_msg *reply = NULL;
     if (msg->type == JSONRPC_REQUEST) {
+        struct jsonrpc_msg *reply = NULL;
         if (!strcmp(msg->method, "echo")) {
             reply = jsonrpc_create_reply(json_clone(msg->params), msg->id);
         } else {
@@ -156,21 +150,19 @@ handle_rpc(struct jsonrpc *rpc, struct jsonrpc_msg *msg, bool *done)
             reply = jsonrpc_create_error(error, msg->id);
             ovs_error(0, "unknown request %s", msg->method);
         }
-
+        jsonrpc_send(rpc, reply);
+        return 0;
     } else if (msg->type == JSONRPC_NOTIFY) {
         if (!strcmp(msg->method, "shutdown")) {
             *done = true;
+            return 0;
         } else {
-            jsonrpc_error(rpc, ENOTTY);
             ovs_error(0, "unknown notification %s", msg->method);
+            return ENOTTY;
         }
     } else {
-        jsonrpc_error(rpc, EPROTO);
         ovs_error(0, "unsolicited JSON-RPC reply or error");
-    }
-
-    if (reply) {
-        jsonrpc_send(rpc, reply);
+        return EPROTO;
     }
 }
 
@@ -183,9 +175,7 @@ do_listen(int argc OVS_UNUSED, char *argv[])
     bool done;
     int error;
 
-    die_if_already_running();
-
-    error = pstream_open(argv[1], &pstream);
+    error = jsonrpc_pstream_open(argv[1], &pstream, DSCP_DEFAULT);
     if (error) {
         ovs_fatal(error, "could not listen on \"%s\"", argv[1]);
     }
@@ -219,12 +209,16 @@ do_listen(int argc OVS_UNUSED, char *argv[])
             if (!jsonrpc_get_backlog(rpc)) {
                 error = jsonrpc_recv(rpc, &msg);
                 if (!error) {
-                    handle_rpc(rpc, msg, &done);
+                    error = handle_rpc(rpc, msg, &done);
                     jsonrpc_msg_destroy(msg);
+                } else if (error == EAGAIN) {
+                    error = 0;
                 }
             }
 
-            error = jsonrpc_get_status(rpc);
+            if (!error) {
+                error = jsonrpc_get_status(rpc);
+            }
             if (error) {
                 jsonrpc_close(rpc);
                 ovs_error(error, "connection closed");
@@ -274,7 +268,8 @@ do_request(int argc OVS_UNUSED, char *argv[])
         ovs_fatal(0, "not a valid JSON-RPC request: %s", string);
     }
 
-    error = stream_open_block(argv[1], &stream);
+    error = stream_open_block(jsonrpc_stream_open(argv[1], &stream,
+                              DSCP_DEFAULT), &stream);
     if (error) {
         ovs_fatal(error, "could not open \"%s\"", argv[1]);
     }
@@ -313,7 +308,8 @@ do_notify(int argc OVS_UNUSED, char *argv[])
         ovs_fatal(0, "not a JSON RPC-valid notification: %s", string);
     }
 
-    error = stream_open_block(argv[1], &stream);
+    error = stream_open_block(jsonrpc_stream_open(argv[1], &stream,
+                              DSCP_DEFAULT), &stream);
     if (error) {
         ovs_fatal(error, "could not open \"%s\"", argv[1]);
     }
@@ -321,7 +317,7 @@ do_notify(int argc OVS_UNUSED, char *argv[])
 
     error = jsonrpc_send_block(rpc, msg);
     if (error) {
-        ovs_fatal(error, "could not send request");
+        ovs_fatal(error, "could not send notification");
     }
     jsonrpc_close(rpc);
 }
@@ -339,3 +335,11 @@ static struct command all_commands[] = {
     { "help", 0, INT_MAX, do_help },
     { NULL, 0, 0, NULL },
 };
+
+static struct command *
+get_all_commands(void)
+{
+    return all_commands;
+}
+
+OVSTEST_REGISTER("test-jsonrpc", test_jsonrpc_main);