X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=test%2Ftest_nng_em.c;h=c2c1e801675c415821fc5948b11296fec61976f2;hb=8c6756d9d6f94beca0bc382f97383ca5e79d16c7;hp=c2101f5490d95f611f4bc5a4cde7c3944526f3f3;hpb=412d53dfa2f9b5b56a448797d0dfec3b0f11f666;p=ric-plt%2Flib%2Frmr.git diff --git a/test/test_nng_em.c b/test/test_nng_em.c index c2101f5..c2c1e80 100644 --- a/test/test_nng_em.c +++ b/test/test_nng_em.c @@ -40,129 +40,7 @@ #define _em_nn #include - -static int em_send_failures = 0; // test programme can set this to emulate eagain send failures -static int em_timeout = -1; // set by set socket option -static int em_mtc_msgs = 0; // set to generate 'received' messages with mt-call header data -static int return_value = 0; // functions should return this value -static int rcv_count = 0; // receive counter for transaction id to allow test to rest -static int rcv_delay = 0; // forced delay before call to rcvmsg starts to work - -static int gates_ok = 0; -static pthread_mutex_t rcv_gate; - - -// ----------- epoll emulation --------------------------------------------- - -// CAUTION: sys/epoll.h must be included before this define and function will properly compile. -#define epoll_wait em_wait -/* - Every other call returns 1 ready; alternate calls return 0 ready. - Mostly for testing the timeout receive call. First call should return - something ready and the second should return nothing ready so we can - drive both cases. -*/ -static int em_wait( int fd, void* events, int n, int to ) { - static int ready = 0; - - ready = !ready; - return ready; -} - - - -/* - Simulated v1 message for receive to return. This needs to match the RMr header - so that we can fill in length, type and xaction id things. -#define MSG_VER 1 -struct em_msg { - int32_t mtype; // message type ("long" network integer) - int32_t plen; // payload length - int32_t rmr_ver; // our internal message version number - unsigned char xid[32]; // space for user transaction id or somesuch - unsigned char sid[32]; // sender ID for return to sender needs - unsigned char src[16]; // name of the sender (source) - unsigned char meid[32]; // managed element id. - struct timespec ts; // timestamp ??? -}; -*/ - -/* - v2 message; should be able to use it for everything that is set up here as - we don't add a payload even if setting a v1 type. -*/ -#define ALT_MSG_VER 1 // alternate every so often -#define MSG_VER 2 // default version to insert -struct em_msg { - int32_t mtype; // message type ("long" network integer) - int32_t plen; // payload length - int32_t rmr_ver; // our internal message version number - unsigned char xid[32]; // space for user transaction id or somesuch - unsigned char sid[32]; // sender ID for return to sender needs - unsigned char src[64]; // name of the sender (source) - unsigned char meid[32]; // managed element id. - struct timespec ts; // timestamp ??? - - // V2 extension - int32_t flags; // HFL_* constants - int32_t len0; // length of the RMr header data - int32_t len1; // length of the tracing data - int32_t len2; // length of data 1 (d1) - int32_t len3; // length of data 2 (d2) - int32_t sub_id; // subscription id (-1 invalid) -}; - - - -// -- emulation control functions ------------------------------------------------------ - -/* - Test app can call this to have all emulated functions return failure instead - of success. -*/ -static void en_set_return( int rv ) { - return_value = rv; -} - - - -static int em_nng_foo() { - fprintf( stderr, "emulated functions in play" ); -} - - -/* - Turns on/off the generation of multi-threaded call messages -*/ -static int em_set_mtc_msgs( int state ) { - em_mtc_msgs = state; -} - -/* - Returns the size of the header we inserted -*/ -static int em_hdr_size() { - if( em_mtc_msgs ) { - return (int) sizeof( struct em_msg ) + 4; - } - - return (int) sizeof( struct em_msg ); -} - -static void em_set_rcvcount( int v ) { - rcv_count = v; -} - -static void em_set_rcvdelay( int v ) { - rcv_delay = v; -} - -static void em_start() { - if( ! gates_ok ) { - pthread_mutex_init( &rcv_gate, NULL ); - gates_ok = 1; - } -} +#include "test_common_em.c" // things common to all emulation code //-------------------------------------------------------------------------- #ifdef EMULATE_NNG @@ -170,6 +48,7 @@ struct nn_msghdr { int boo; }; +#define SOCKET_TYPE nng_socket // socket representation is different in each transport /* Receive message must allocate a new buffer and return the pointer into *m. @@ -195,8 +74,8 @@ static int em_nng_recvmsg( nng_socket s, nng_msg ** m, int i ) { d1_size = 4; } - b = (void *) malloc( 2048 ); if( m != NULL ) { + b = (void *) malloc( 2048 ); memset( b, 0, 2048 ); *m = (nng_msg *) b; @@ -231,10 +110,14 @@ static int em_nng_recvmsg( nng_socket s, nng_msg ** m, int i ) { } pthread_mutex_unlock( &rcv_gate ); snprintf( msg->xid, 32, "%015d", rcv_count ); // simple transaction id so we can test receive specific and ring stuff - snprintf( msg->src, 16, "localhost:4562" ); // set src id (unrealistic) so that rts() can be tested + snprintf( msg->src, 64, "localhost:4562" ); // set src id (unrealistic) so that rts() can be tested + snprintf( msg->srcip, 64, "89.2.19.19:4562" ); // set src ip for rts testing + + //fprintf( stderr, ">>> simulated received message: %s %s p=%p len0=%d\n", msg->src, msg->srcip, msg, (int) ntohl( msg->len0 ) ); + } else { + fprintf( stderr, " em: simulated receive no msg pointer provided\n" ); } - //fprintf( stderr, ">>> simulated received message: %s\n", msg->xid ); return return_value; } @@ -280,10 +163,10 @@ static int em_nng_sub0_open(nng_socket * s ) { return return_value; } static int em_nng_recv(nng_socket s, void * v, size_t * t, int i ) { - return return_value; } static int em_nng_send( nng_socket s, void* m, int l, int f ) { + free( m ); // we must ditch the message as nng does (or reuses) return return_value; } @@ -325,13 +208,11 @@ static int em_nng_msg_alloc( nng_msg** mp, size_t l ) { */ static void em_nng_free( void* p, size_t l ) { if( p ) { - //fprintf( stderr, ">>>>> not freed: %p\n", p ); free( p ); } } static void em_nng_msg_free( void* p ) { if( p ) { - //fprintf( stderr, ">>>>> not freed: %p\n", p ); free( p ); } } @@ -405,6 +286,8 @@ static int em_nng_getopt_int( nng_socket s, void* con, int* target ) { #else +#define SOCKET_TYPE int // socket representation is different in each transport + // ----------------------- emulated nano functions -------------------------- struct em_nn_msghdr { @@ -452,6 +335,7 @@ static int em_nn_recv (int s, void *m, size_t len, int flags ) { static int count = 0; // we'll simulate a message going in by dropping an rmr-ish msg with transaction id only int trace_size = 0; static int counter = 0; // if timeout value is set; we return timeout (eagain) every 3 calls + int d1_size = 0; if( em_timeout > 0 ) { counter++; @@ -460,6 +344,10 @@ static int em_nn_recv (int s, void *m, size_t len, int flags ) { } } + if( em_mtc_msgs ) { + d1_size = 4; + } + b = (void *) malloc( 2048 ); if( m != NULL ) { // blindly we assume this is 2k or bigger memset( m, 0, 2048 ); @@ -474,14 +362,17 @@ static int em_nn_recv (int s, void *m, size_t len, int flags ) { msg->plen = htonl( 220 ); msg->len0 = htonl( sizeof( struct em_msg ) ); msg->len1 = htonl( trace_size ); + msg->len2 = htonl( d1_size ); + msg->len3 = htonl( 0 ); snprintf( msg->xid, 32, "%015d", count++ ); // simple transaction id so we can test receive specific and ring stuff - snprintf( msg->src, 16, "localhost:4562" ); // set src id (unrealistic) so that rts() can be tested + snprintf( msg->src, 64, "localhost:4562" ); // set src id (unrealistic) so that rts() can be tested + snprintf( msg->srcip, 64, "89.2.19.19:4562" ); // set src ip for rts testing //fprintf( stderr, " returning message len=%d\n\n", ntohl( msg->plen ) ); } else { fprintf( stderr, " message was nil\n\n" ); } - //fprintf( stderr, ">>> simulated received message: %s len=%d\n", msg->xid, msg->plen ); + //fprintf( stderr, ">>> simulated received message: %s %s len=%d p=%p\n", msg->src, msg->srcip, ntohl( msg->plen ), m ); return 2048; } @@ -494,6 +385,7 @@ static int em_nn_recvmsg (int s, struct nn_msghdr *msghdr, int flags ) { } static void em_nn_freemsg( void* ptr ) { + free( ptr ); return; }