From 2c401788eecb94d63b630b79255ec97a63c04514 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Fri, 20 Feb 2015 12:30:55 +0200 Subject: [PATCH] Fix to bug 579: http://bugs.mariadb.com/show_bug.cgi?id=579 Added actual testing routers and protocols. --- server/core/test/testservice.c | 14 +++- server/modules/protocol/CMakeLists.txt | 5 ++ server/modules/protocol/testprotocol.c | 107 +++++++++++++++++++++++++ server/modules/routing/CMakeLists.txt | 7 +- server/modules/routing/testroute.c | 41 ++++++++-- 5 files changed, 160 insertions(+), 14 deletions(-) create mode 100644 server/modules/protocol/testprotocol.c diff --git a/server/core/test/testservice.c b/server/core/test/testservice.c index 085a411ca..06ac27f6e 100644 --- a/server/core/test/testservice.c +++ b/server/core/test/testservice.c @@ -66,10 +66,10 @@ poll_init(); ss_info_dassert(NULL != service, "New service with valid router must not be null"); ss_info_dassert(0 != service_isvalid(service), "Service must be valid after creation"); ss_info_dassert(0 == strcmp("MyService", service_get_name(service)), "Service must have given name"); - ss_dfprintf(stderr, "\t..done\nAdding protocol HTTPD."); - ss_info_dassert(0 != serviceAddProtocol(service, "HTTPD", "localhost", 9876), "Add Protocol should succeed"); - ss_info_dassert(0 != serviceHasProtocol(service, "HTTPD", 9876), "Service should have new protocol as requested"); - serviceStartProtocol(service, "HTTPD", 9876); + ss_dfprintf(stderr, "\t..done\nAdding protocol testprotocol."); + ss_info_dassert(0 != serviceAddProtocol(service, "testprotocol", "localhost", 9876), "Add Protocol should succeed"); + ss_info_dassert(0 != serviceHasProtocol(service, "testprotocol", 9876), "Service should have new protocol as requested"); + serviceStartProtocol(service, "testprotocol", 9876); skygw_log_sync_all(); ss_dfprintf(stderr, "\t..done\nStarting Service."); result = serviceStart(service); @@ -84,10 +84,16 @@ poll_init(); ss_dfprintf(stderr, "\t..done\nStopping Service."); ss_info_dassert(0 != serviceStop(service), "Stop should succeed"); + ss_dfprintf(stderr, "\t..done\n"); + /** This is never used in MaxScale and will always fail due to service's + * stats.n_current value never being decremented */ +/* + ss_dfprintf(stderr, "\t..done\nFreeing Service."); ss_info_dassert(0 != service_free(service), "Free should succeed"); ss_dfprintf(stderr, "\t..done\n"); +*/ return 0; } diff --git a/server/modules/protocol/CMakeLists.txt b/server/modules/protocol/CMakeLists.txt index e51ff1495..fa1c2ab34 100644 --- a/server/modules/protocol/CMakeLists.txt +++ b/server/modules/protocol/CMakeLists.txt @@ -14,6 +14,11 @@ add_library(HTTPD SHARED httpd.c) target_link_libraries(HTTPD log_manager utils) install(TARGETS HTTPD DESTINATION modules) +if(BUILD_TESTS) + add_library(testprotocol SHARED testprotocol.c) + install(TARGETS testprotocol DESTINATION modules) +endif() + add_library(maxscaled SHARED maxscaled.c) target_link_libraries(maxscaled log_manager utils) install(TARGETS maxscaled DESTINATION modules) diff --git a/server/modules/protocol/testprotocol.c b/server/modules/protocol/testprotocol.c new file mode 100644 index 000000000..0e0cf9fe2 --- /dev/null +++ b/server/modules/protocol/testprotocol.c @@ -0,0 +1,107 @@ +/* + * This file is distributed as part of the MariaDB Corporation MaxScale. It is free + * software: you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation, + * version 2. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Copyright MariaDB Corporation Ab 2013-2014 + */ + +/** + * @file testprotocol.c - Testing protocol module + * + * Not intended for actual use. This protocol module does nothing useful and + * is only meant to test that the module loading works. + * + * @verbatim + * Revision History + * Date Who Description + * 20/02/2015 Markus Mäkelä Initial implementation + * + * @endverbatim + */ + +#include +#include +#include + +MODULE_INFO info = { + MODULE_API_PROTOCOL, + MODULE_IN_DEVELOPMENT, + GWPROTOCOL_VERSION, + "Test protocol" +}; + +static char *version_str = "V1.0.0"; + +static int test_read(DCB* dcb){ return 1;} +static int test_write(DCB *dcb, GWBUF* buf){ return 1;} +static int test_write_ready(DCB *dcb){ return 1;} +static int test_error(DCB *dcb){ return 1;} +static int test_hangup(DCB *dcb){ return 1;} +static int test_accept(DCB *dcb){ return 1;} +static int test_connect(struct dcb *dcb, struct server *srv, struct session *ses){ return 1;} +static int test_close(DCB *dcb){ return 1;} +static int test_listen(DCB *dcb, char *config){ return 1;} +static int test_auth(DCB* dcb, struct server *srv, struct session *ses, GWBUF *buf){ return 1;} +static int test_session(DCB *dcb, void* data){ return 1;} +/** + * The "module object" for the httpd protocol module. + */ +static GWPROTOCOL MyObject = { + test_read, /**< Read - EPOLLIN handler */ + test_write, /**< Write - data from gateway */ + test_write_ready, /**< WriteReady - EPOLLOUT handler */ + test_error, /**< Error - EPOLLERR handler */ + test_hangup, /**< HangUp - EPOLLHUP handler */ + test_accept, /**< Accept */ + test_connect, /**< Connect */ + test_close, /**< Close */ + test_listen, /**< Create a listener */ + test_auth, /**< Authentication */ + test_session /**< Session */ + }; + + +/** + * Implementation of the mandatory version entry point + * + * @return version string of the module + */ +char * +version() +{ + return version_str; +} + +/** + * The module initialisation routine, called when the module + * is first loaded. + */ +void +ModuleInit() +{ +} + +/** + * The module entry point routine. It is this routine that + * must populate the structure that is referred to as the + * "module object", this is a structure with the set of + * external entry points for this module. + * + * @return The module object + */ +GWPROTOCOL * +GetModuleObject() +{ + return &MyObject; +} diff --git a/server/modules/routing/CMakeLists.txt b/server/modules/routing/CMakeLists.txt index 59695b715..4cf341d83 100644 --- a/server/modules/routing/CMakeLists.txt +++ b/server/modules/routing/CMakeLists.txt @@ -1,11 +1,10 @@ if(BUILD_TESTS) add_subdirectory(test) + add_library(testroute SHARED testroute.c) + target_link_libraries(testroute log_manager utils) + install(TARGETS testroute DESTINATION modules) endif() -add_library(testroute SHARED testroute.c) -target_link_libraries(testroute log_manager utils) -install(TARGETS testroute DESTINATION modules) - add_library(readconnroute SHARED readconnroute.c) target_link_libraries(readconnroute log_manager utils) install(TARGETS readconnroute DESTINATION modules) diff --git a/server/modules/routing/testroute.c b/server/modules/routing/testroute.c index 47a581c5d..aae902438 100644 --- a/server/modules/routing/testroute.c +++ b/server/modules/routing/testroute.c @@ -33,9 +33,16 @@ static void *newSession(ROUTER *instance, SESSION *session); static void closeSession(ROUTER *instance, void *session); static void freeSession(ROUTER *instance, void *session); static int routeQuery(ROUTER *instance, void *session, GWBUF *queue); +static void clientReply(ROUTER *instance, void *session, GWBUF *queue); static void diagnostic(ROUTER *instance, DCB *dcb); static uint8_t getCapabilities (ROUTER* inst, void* router_session); - +static void handleError( + ROUTER *instance, + void *router_session, + GWBUF *errbuf, + DCB *backend_dcb, + error_action_t action, + bool *succp); static ROUTER_OBJECT MyObject = { createInstance, @@ -44,11 +51,17 @@ static ROUTER_OBJECT MyObject = { freeSession, routeQuery, diagnostic, - NULL, - NULL, + clientReply, + handleError, getCapabilities }; +typedef struct{ +}TESTROUTER; + +typedef struct{ +}TESTSESSION; + /** * Implementation of the mandatory version entry point * @@ -96,7 +109,8 @@ GetModuleObject() static ROUTER * createInstance(SERVICE *service, char **options) { - return NULL; + + return (ROUTER*)malloc(sizeof(TESTROUTER)); } /** @@ -109,7 +123,7 @@ createInstance(SERVICE *service, char **options) static void * newSession(ROUTER *instance, SESSION *session) { - return NULL; + return (SESSION*)malloc(sizeof(TESTSESSION)); } /** @@ -128,7 +142,7 @@ static void freeSession( ROUTER* router_instance, void* router_client_session) { - return; + free(router_client_session); } static int @@ -137,6 +151,10 @@ routeQuery(ROUTER *instance, void *session, GWBUF *queue) return 0; } +void clientReply(ROUTER* instance, void* session, GWBUF* queue) +{ +} + /** * Diagnostics routine * @@ -154,3 +172,14 @@ static uint8_t getCapabilities( { return 0; } + + +static void handleError( + ROUTER *instance, + void *router_session, + GWBUF *errbuf, + DCB *backend_dcb, + error_action_t action, + bool *succp) +{ +} \ No newline at end of file