X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=tests%2Ftest-vconn.c;h=17f4c1a384aa6e2130a0867cbd348246588b8269;hb=8fb7d02686ed85ad799dfd902ea88d977dab1868;hp=5dd38f0f881d78d298ceb0d041c325247de5ab97;hpb=48d84b1706f76882bc5265c09257e70899fb9c41;p=cascardo%2Fovs.git diff --git a/tests/test-vconn.c b/tests/test-vconn.c index 5dd38f0f8..17f4c1a38 100644 --- a/tests/test-vconn.c +++ b/tests/test-vconn.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. + * 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. @@ -15,27 +15,28 @@ */ #include -#include "vconn.h" +#undef NDEBUG +#include "openvswitch/vconn.h" +#include #include #include #include #include #include #include "command-line.h" +#include "fatal-signal.h" #include "ofp-msgs.h" #include "ofp-util.h" #include "ofpbuf.h" #include "openflow/openflow.h" +#include "ovstest.h" #include "poll-loop.h" #include "socket-util.h" #include "stream.h" #include "stream-ssl.h" #include "timeval.h" #include "util.h" -#include "vlog.h" - -#undef NDEBUG -#include +#include "openvswitch/vlog.h" struct fake_pvconn { const char *type; @@ -59,9 +60,9 @@ static void check_errno(int a, int b, const char *as, const char *file, int line) { if (a != b) { - char *str_b = strdup(strerror(abs(b))); + char *str_b = xstrdup(ovs_strerror(abs(b))); ovs_fatal(0, "%s:%d: %s is %d (%s) but should be %d (%s)", - file, line, as, a, strerror(abs(a)), b, str_b); + file, line, as, a, ovs_strerror(abs(a)), b, str_b); } } @@ -140,27 +141,41 @@ fpv_destroy(struct fake_pvconn *fpv) /* Connects to a fake_pvconn with vconn_open(), then closes the listener and * verifies that vconn_connect() reports 'expected_error'. */ static void -test_refuse_connection(int argc OVS_UNUSED, char *argv[]) +test_refuse_connection(struct ovs_cmdl_context *ctx) { - const char *type = argv[1]; + const char *type = ctx->argv[1]; struct fake_pvconn fpv; struct vconn *vconn; int error; fpv_create(type, &fpv); - CHECK_ERRNO(vconn_open(fpv.vconn_name, OFP10_VERSION, &vconn, - DSCP_DEFAULT), 0); + CHECK_ERRNO(vconn_open(fpv.vconn_name, 0, DSCP_DEFAULT, &vconn), 0); fpv_close(&fpv); vconn_run(vconn); error = vconn_connect_block(vconn); if (!strcmp(type, "tcp")) { - if (error != ECONNRESET && error != EPIPE) { + if (error != ECONNRESET && error != EPIPE +#ifdef _WIN32 + && error != WSAECONNRESET +#endif + ) { + ovs_fatal(0, "unexpected vconn_connect() return value %d (%s)", + error, ovs_strerror(error)); + } + } else if (!strcmp(type, "unix")) { +#ifndef _WIN32 + CHECK_ERRNO(error, EPIPE); +#else + CHECK_ERRNO(error, WSAECONNRESET); +#endif + } else if (!strcmp(type, "ssl")) { + if (error != EPROTO && error != ECONNRESET) { ovs_fatal(0, "unexpected vconn_connect() return value %d (%s)", - error, strerror(error)); + error, ovs_strerror(error)); } } else { - CHECK_ERRNO(error, !strcmp(type, "unix") ? EPIPE : EPROTO); + ovs_fatal(0, "invalid connection type %s", type); } vconn_close(vconn); @@ -171,25 +186,28 @@ test_refuse_connection(int argc OVS_UNUSED, char *argv[]) * closes it immediately, and verifies that vconn_connect() reports * 'expected_error'. */ static void -test_accept_then_close(int argc OVS_UNUSED, char *argv[]) +test_accept_then_close(struct ovs_cmdl_context *ctx) { - const char *type = argv[1]; + const char *type = ctx->argv[1]; struct fake_pvconn fpv; struct vconn *vconn; int error; fpv_create(type, &fpv); - CHECK_ERRNO(vconn_open(fpv.vconn_name, OFP10_VERSION, &vconn, - DSCP_DEFAULT), 0); + CHECK_ERRNO(vconn_open(fpv.vconn_name, 0, DSCP_DEFAULT, &vconn), 0); vconn_run(vconn); stream_close(fpv_accept(&fpv)); fpv_close(&fpv); error = vconn_connect_block(vconn); if (!strcmp(type, "tcp") || !strcmp(type, "unix")) { - if (error != ECONNRESET && error != EPIPE) { + if (error != ECONNRESET && error != EPIPE +#ifdef _WIN32 + && error != WSAECONNRESET +#endif + ) { ovs_fatal(0, "unexpected vconn_connect() return value %d (%s)", - error, strerror(error)); + error, ovs_strerror(error)); } } else { CHECK_ERRNO(error, EPROTO); @@ -203,17 +221,16 @@ test_accept_then_close(int argc OVS_UNUSED, char *argv[]) * reads the hello message from it, then closes the connection and verifies * that vconn_connect() reports 'expected_error'. */ static void -test_read_hello(int argc OVS_UNUSED, char *argv[]) +test_read_hello(struct ovs_cmdl_context *ctx) { - const char *type = argv[1]; + const char *type = ctx->argv[1]; struct fake_pvconn fpv; struct vconn *vconn; struct stream *stream; int error; fpv_create(type, &fpv); - CHECK_ERRNO(vconn_open(fpv.vconn_name, OFP10_VERSION, &vconn, - DSCP_DEFAULT), 0); + CHECK_ERRNO(vconn_open(fpv.vconn_name, 0, DSCP_DEFAULT, &vconn), 0); vconn_run(vconn); stream = fpv_accept(&fpv); fpv_destroy(&fpv); @@ -225,7 +242,7 @@ test_read_hello(int argc OVS_UNUSED, char *argv[]) if (retval == sizeof hello) { enum ofpraw raw; - CHECK(hello.version, OFP10_VERSION); + CHECK(hello.version, OFP13_VERSION); CHECK(ofpraw_decode_partial(&raw, &hello, sizeof hello), 0); CHECK(raw, OFPRAW_OFPT_HELLO); CHECK(ntohs(hello.length), sizeof hello); @@ -245,7 +262,7 @@ test_read_hello(int argc OVS_UNUSED, char *argv[]) error = vconn_connect_block(vconn); if (error != ECONNRESET && error != EPIPE) { ovs_fatal(0, "unexpected vconn_connect() return value %d (%s)", - error, strerror(error)); + error, ovs_strerror(error)); } vconn_close(vconn); } @@ -266,8 +283,7 @@ test_send_hello(const char *type, const void *out, size_t out_size, size_t n_sent; fpv_create(type, &fpv); - CHECK_ERRNO(vconn_open(fpv.vconn_name, OFP10_VERSION, &vconn, - DSCP_DEFAULT), 0); + CHECK_ERRNO(vconn_open(fpv.vconn_name, 0, DSCP_DEFAULT, &vconn), 0); vconn_run(vconn); stream = fpv_accept(&fpv); fpv_destroy(&fpv); @@ -299,7 +315,7 @@ test_send_hello(const char *type, const void *out, size_t out_size, if (retval == sizeof hello) { enum ofpraw raw; - CHECK(hello.version, OFP10_VERSION); + CHECK(hello.version, OFP13_VERSION); CHECK(ofpraw_decode_partial(&raw, &hello, sizeof hello), 0); CHECK(raw, OFPRAW_OFPT_HELLO); CHECK(ntohs(hello.length), sizeof hello); @@ -345,12 +361,12 @@ test_send_hello(const char *type, const void *out, size_t out_size, /* Try connecting and sending a normal hello, which should succeed. */ static void -test_send_plain_hello(int argc OVS_UNUSED, char *argv[]) +test_send_plain_hello(struct ovs_cmdl_context *ctx) { - const char *type = argv[1]; + const char *type = ctx->argv[1]; struct ofpbuf *hello; - hello = ofpraw_alloc_xid(OFPRAW_OFPT_HELLO, OFP10_VERSION, + hello = ofpraw_alloc_xid(OFPRAW_OFPT_HELLO, OFP13_VERSION, htonl(0x12345678), 0); test_send_hello(type, hello->data, hello->size, 0); ofpbuf_delete(hello); @@ -360,13 +376,13 @@ test_send_plain_hello(int argc OVS_UNUSED, char *argv[]) * the specification says that implementations must accept and ignore extra * data). */ static void -test_send_long_hello(int argc OVS_UNUSED, char *argv[]) +test_send_long_hello(struct ovs_cmdl_context *ctx) { - const char *type = argv[1]; + const char *type = ctx->argv[1]; struct ofpbuf *hello; enum { EXTRA_BYTES = 8 }; - hello = ofpraw_alloc_xid(OFPRAW_OFPT_HELLO, OFP10_VERSION, + hello = ofpraw_alloc_xid(OFPRAW_OFPT_HELLO, OFP13_VERSION, htonl(0x12345678), EXTRA_BYTES); ofpbuf_put_zeros(hello, EXTRA_BYTES); ofpmsg_update_length(hello); @@ -377,12 +393,12 @@ test_send_long_hello(int argc OVS_UNUSED, char *argv[]) /* Try connecting and sending an echo request instead of a hello, which should * fail with EPROTO. */ static void -test_send_echo_hello(int argc OVS_UNUSED, char *argv[]) +test_send_echo_hello(struct ovs_cmdl_context *ctx) { - const char *type = argv[1]; + const char *type = ctx->argv[1]; struct ofpbuf *echo; - echo = ofpraw_alloc_xid(OFPRAW_OFPT_ECHO_REQUEST, OFP10_VERSION, + echo = ofpraw_alloc_xid(OFPRAW_OFPT_ECHO_REQUEST, OFP13_VERSION, htonl(0x12345678), 0); test_send_hello(type, echo->data, echo->size, EPROTO); ofpbuf_delete(echo); @@ -391,9 +407,9 @@ test_send_echo_hello(int argc OVS_UNUSED, char *argv[]) /* Try connecting and sending a hello packet that has its length field as 0, * which should fail with EPROTO. */ static void -test_send_short_hello(int argc OVS_UNUSED, char *argv[]) +test_send_short_hello(struct ovs_cmdl_context *ctx) { - const char *type = argv[1]; + const char *type = ctx->argv[1]; struct ofp_header hello; memset(&hello, 0, sizeof hello); @@ -403,41 +419,46 @@ test_send_short_hello(int argc OVS_UNUSED, char *argv[]) /* Try connecting and sending a hello packet that has a bad version, which * should fail with EPROTO. */ static void -test_send_invalid_version_hello(int argc OVS_UNUSED, char *argv[]) +test_send_invalid_version_hello(struct ovs_cmdl_context *ctx) { - const char *type = argv[1]; + const char *type = ctx->argv[1]; struct ofpbuf *hello; - hello = ofpraw_alloc_xid(OFPRAW_OFPT_HELLO, OFP10_VERSION, + hello = ofpraw_alloc_xid(OFPRAW_OFPT_HELLO, OFP13_VERSION, htonl(0x12345678), 0); ((struct ofp_header *) hello->data)->version = 0; test_send_hello(type, hello->data, hello->size, EPROTO); ofpbuf_delete(hello); } -static const struct command commands[] = { - {"refuse-connection", 1, 1, test_refuse_connection}, - {"accept-then-close", 1, 1, test_accept_then_close}, - {"read-hello", 1, 1, test_read_hello}, - {"send-plain-hello", 1, 1, test_send_plain_hello}, - {"send-long-hello", 1, 1, test_send_long_hello}, - {"send-echo-hello", 1, 1, test_send_echo_hello}, - {"send-short-hello", 1, 1, test_send_short_hello}, - {"send-invalid-version-hello", 1, 1, test_send_invalid_version_hello}, - {NULL, 0, 0, NULL}, +static const struct ovs_cmdl_command commands[] = { + {"refuse-connection", NULL, 1, 1, test_refuse_connection}, + {"accept-then-close", NULL, 1, 1, test_accept_then_close}, + {"read-hello", NULL, 1, 1, test_read_hello}, + {"send-plain-hello", NULL, 1, 1, test_send_plain_hello}, + {"send-long-hello", NULL, 1, 1, test_send_long_hello}, + {"send-echo-hello", NULL, 1, 1, test_send_echo_hello}, + {"send-short-hello", NULL, 1, 1, test_send_short_hello}, + {"send-invalid-version-hello", NULL, 1, 1, test_send_invalid_version_hello}, + {NULL, NULL, 0, 0, NULL}, }; -int -main(int argc, char *argv[]) +static void +test_vconn_main(int argc, char *argv[]) { + struct ovs_cmdl_context ctx = { + .argc = argc - 1, + .argv = argv + 1, + }; + set_program_name(argv[0]); - vlog_set_levels(NULL, VLF_ANY_FACILITY, VLL_EMER); + vlog_set_levels(NULL, VLF_ANY_DESTINATION, VLL_EMER); vlog_set_levels(NULL, VLF_CONSOLE, VLL_DBG); - signal(SIGPIPE, SIG_IGN); + fatal_ignore_sigpipe(); time_alarm(10); - run_command(argc - 1, argv + 1, commands); - - return 0; + ovs_cmdl_run_command(&ctx, commands); } + +OVSTEST_REGISTER("test-vconn", test_vconn_main);