#include "rmr.h"
#include "rmr_agnostic.h"
+// ---------------------------------------------------------------------------------------------
int mbuf_api_test( ) {
unsigned char* c;
int state;
int errors = 0;
char* buf;
+ void* ptr;
rmr_mbuf_t* mbuf;
+ rmr_mbuf_t* mbuf2;
+ rmr_mbuf_t* mbuf3;
+ uta_mhdr_t* hdr;
unsigned char src_buf[256];
+ unsigned char dest_buf[256];
+
+ // --- dummy up a message buffer --------------------------------------------------------
mbuf = (rmr_mbuf_t *) malloc( sizeof( *mbuf ) );
if( mbuf == NULL ) {
fprintf( stderr, "[FAIL] tester cannot allocate memory: mbuf\n" );
exit( 1 );
}
+ memset( mbuf, 0, sizeof( *mbuf ) );
+
+ mbuf->tp_buf = (void *) malloc( sizeof( char ) * 1024 ); // add a dummy header/payload
+ memset( mbuf->tp_buf, 0, sizeof( char ) * 1024 );
- mbuf->payload = (void *) malloc( sizeof( char ) * 1024 ); // add a dummy payload
- mbuf->tp_buf = mbuf->payload;
- mbuf->header = mbuf->payload;
+ mbuf->header = mbuf->tp_buf;
mbuf->alloc_len = 1024;
+ mbuf->payload = PAYLOAD_ADDR( mbuf->header );
+ hdr = (uta_mhdr_t *) mbuf->header;
+ mbuf->xaction = hdr->xid;
+
+
+
// --- test payload field access functions ---------------------------------------------------
memset( src_buf, 0, sizeof( src_buf ) );
errors += fail_if( i > 0, "(rv) attempt to copy bytes to meid with nil message" );
errno = 0;
+ strncpy( src_buf, "a very long string that should trigger an error when stuffing it into meid", sizeof( src_buf ) ); // ensure no zero byte at field length
i = rmr_bytes2meid( mbuf, src_buf, RMR_MAX_MEID + 1 );
errors += fail_if( errno == 0, "(errno) attempt to copy bytes to meid with large source buffer" );
errors += fail_if( i != RMR_MAX_MEID, "(rv) attempt to copy bytes to meid with large source buffer" );
+
+ errno = 0;
+ i = rmr_bytes2meid( mbuf, src_buf, RMR_MAX_MEID ); // it's not 0 terminated at length expect failure
+ errors += fail_if( errno == 0, "(errno) attempt to copy non-zero termianted bytes to meid with large source buffer" );
+ errors += fail_if( i != RMR_MAX_MEID, "(rv) attempt to copy bytes to meid with large source buffer" );
errno = 0;
+ memset( src_buf, 0, RMR_MAX_MEID+2 );
+ strcpy( src_buf, "smaller bytes" );
i = rmr_bytes2meid( mbuf, src_buf, RMR_MAX_MEID );
errors += fail_if( errno != 0, "copy bytes to meid; expected errno to be ok" );
errors += fail_if( i != RMR_MAX_MEID, "copy bytes to meid; expected return value to be max meid len" );
c = rmr_get_meid( mbuf, NULL ); // should allocate and return c
errors += fail_if( c == NULL, "get meid with nil dest pointer (did not allocate a buffer)" );
errors += fail_if( strcmp( c, "test-meid" ) != 0, "did not get expected meid from mbuffer" );
+ if( c ) {
+ free( c );
+ c = NULL;
+ }
c = rmr_get_meid( mbuf, c );
errors += fail_if( c == NULL, "get meid with a dest pointer returned no pointer" );
errors += fail_if( strcmp( c, "test-meid" ) != 0, "did not get expected meid from mbuffer" );
+ if( c ) {
+ free( c );
+ c = NULL;
+ }
// --- test transaction field access functions ---------------------------------------------------
+ snprintf( src_buf, sizeof( src_buf ), "xaction-test##################." ); // full 32 bytes
+
errno = 0;
i = rmr_bytes2xact( NULL, src_buf, RMR_MAX_XID );
errors += fail_if( errno == 0, "(errno) attempt to copy bytes to xact with nil message" );
errors += fail_if( errno != 0, "copy bytes to xact; expected errno to be ok" );
errors += fail_if( i != RMR_MAX_XID, "copy bytes to xact; expected return value to be max xact len" );
-
+ errno = 0;
+ ptr = rmr_get_xact( NULL, NULL );
+ errors += fail_if( errno == 0, "get xaction with nil msg did not set errno" );
+ errors += fail_not_nil( ptr, "get xaction with nil msg did not return a nil pointer" );
+
+ errno = 999;
+ ptr = rmr_get_xact( mbuf, NULL );
+ errors += fail_if( errno == 999, "get xaction with valid msg and nil dest didn't clear errno" );
+ errors += fail_not_equal( errno, 0, "get xaction with valid msg and nil dest set errno (a)" );
+ errors += fail_if_nil( ptr, "get xaction with valid msg and nil dest did not return a valid pointer" );
+ if( ptr ) {
+ i = strcmp( ptr, src_buf );
+ errors += fail_not_equal( i, 0, "get xaction did not fetch expected string cmp return (a) was not 0" );
+ free( ptr );
+ ptr = NULL;
+ }
+
+ errno = 999;
+ ptr = rmr_get_xact( mbuf, dest_buf );
+ errors += fail_if( errno == 999, "get xaction with valid msg and nil dest didn't clear errno" );
+ errors += fail_not_equal( errno, 0, "get xaction with valid msg and nil dest set errno (a)" );
+ errors += fail_if_nil( ptr, "get xaction with valid msg and valid dest did not return a valid pointer" );
+ errors += fail_if( ptr != dest_buf, "get xaction did not return pointer to dest string" );
+ if( ptr == dest_buf ) {
+ i = strcmp( ptr, src_buf );
+ errors += fail_not_equal( i, 0, "get xaction into dest string did not fetch expected string cmp return (a) was not 0" );
+ }
errno = 0;
snprintf( src_buf, sizeof( src_buf ), "xact-fits" );
errors += fail_if( i == RMR_OK, "(rv) attempt to copy string to xact with large source buffer" );
+ rmr_free_msg( mbuf );
// ------------ trace data tests ----------------------------------------------------------------
// CAUTION: to support standalone mbuf api tests, the underlying buffer reallocation functions are NOT used
state = rmr_get_trlen( NULL ); // coverage test on nil check
errors += fail_not_equal( state, 0, "get trace length with nil msg didn't return expected 0 status" );
+ ptr = rmr_trace_ref( NULL, NULL );
+ errors += fail_not_nil( ptr, "trace ref returned non-nil pointer when given nil message" );
+
+ mbuf = test_mk_msg( 2048, 0 ); // initially no trace size to force realloc
+ ptr = rmr_trace_ref( mbuf, NULL );
+ errors += fail_not_nil( ptr, "trace ref returned non-nil pointer when given a message without trace data" );
+
+ i = 100; // ensure that i is reset when there is no trace data
+ ptr = rmr_trace_ref( mbuf, &i );
+ errors += fail_not_nil( ptr, "trace ref returned non-nil pointer when given a message without trace data" );
+ errors += fail_not_equal( i, 0, "trace ref returned non zero size (a) when no trace info in message" );
+
+ i = 100;
+ mbuf = test_mk_msg( 2048, 113 ); // alloc with a trace data area
+ ptr = rmr_trace_ref( mbuf, &i );
+ errors += fail_if_nil( ptr, "trace ref returned nil pointer when given a message with trace data" );
+ errors += fail_not_equal( i, 113, "trace ref returned bad size (a), expected (b)" );
+
src_buf[0] = 0;
state = rmr_set_trace( mbuf, "foo bar was here", 17 ); // should force a realloc
errors += fail_not_nil( buf, "rmr_get_src returned a pointer when given a nil dest buffer" );
buf = rmr_get_src( mbuf, src_buf );
- errors += fail_not_equal( (int) buf, (int) src_buf, "rmr_get_src didn't return expexted buffer pointer" );
+ errors += fail_not_equalp( buf, src_buf, "rmr_get_src didn't return expexted buffer pointer" );
+
+ buf = rmr_get_srcip( NULL, NULL );
+ errors += fail_not_nil( buf, "get_srcip did not return nil when given nil pointers" );
+
+ buf = rmr_get_srcip( mbuf, NULL );
+ errors += fail_not_nil( buf, "get_srcip did not return nil when given nil destination" );
+
+ buf = rmr_get_srcip( mbuf, src_buf );
+ errors += fail_not_equalp( buf, src_buf, "rmr_get_srcip didn't return expexted buffer pointer" );
+
+ test_set_ver( mbuf, 2 ); // set older message version to ensure properly handled
+ buf = rmr_get_srcip( mbuf, src_buf );
return errors > 0; // overall exit code bad if errors