enhance(API): Add multi-threaded call
[ric-plt/lib/rmr.git] / test / sr_nng_static_test.c
index 9b936cc..809deba 100644 (file)
@@ -1,14 +1,14 @@
 // : vi ts=4 sw=4 noet :
 /*
 ==================================================================================
 // : vi ts=4 sw=4 noet :
 /*
 ==================================================================================
-        Copyright (c) 2019 Nokia 
-        Copyright (c) 2018-2019 AT&T Intellectual Property.
+           Copyright (c) 2019 Nokia
+           Copyright (c) 2018-2019 AT&T Intellectual Property.
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
 
 
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
 
-       http://www.apache.org/licenses/LICENSE-2.0
+          http://www.apache.org/licenses/LICENSE-2.0
 
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
 
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
@@ -21,7 +21,7 @@
 /*
        Mmemonic:       sr_nng_static_test.c
        Abstract:       Test the send/receive funcitons. These are meant to be included at compile
 /*
        Mmemonic:       sr_nng_static_test.c
        Abstract:       Test the send/receive funcitons. These are meant to be included at compile
-                               time by the test driver.  
+                               time by the test driver.
 
        Author:         E. Scott Daniels
        Date:           3 April 2019
 
        Author:         E. Scott Daniels
        Date:           3 April 2019
 #include <errno.h>
 #include <string.h>
 #include <stdint.h>
 #include <errno.h>
 #include <string.h>
 #include <stdint.h>
+#include <pthread.h>
+#include <semaphore.h>
 
 
-#include "../src/common/include/rmr.h"
-#include "../src/common/include/rmr_agnostic.h"
+#include "rmr.h"
+#include "rmr_agnostic.h"
 
 /*
        Generate a simple route table (for all but direct route table testing).
 
 /*
        Generate a simple route table (for all but direct route table testing).
+       This gets tricky inasmuch as we generate two in one; first a whole table 
+       and then two update tables. The first is a table with a bad counter in the
+       last record to test that we don't load that table and error. The second
+       is a good update.
 */
 static void gen_rt( uta_ctx_t* ctx ) {
        int             fd;
        char*   rt_stuff;               // strings for the route table
 
 */
 static void gen_rt( uta_ctx_t* ctx ) {
        int             fd;
        char*   rt_stuff;               // strings for the route table
 
-       rt_stuff = 
-               "newrt|start\n"                                                         // false start to drive detection 
+       rt_stuff =
+               "newrt|end\n"                                                           // end of table check before start of table found
+               "# comment to drive full comment test\n"
+               "\n"                                                                            // handle blank lines
+               "   \n"                                                                         // handle blank lines
+           "mse|4|10|localhost:4561\n"                                 // entry before start message
+           "rte|4|localhost:4561\n"                                    // entry before start message
+               "newrt|start\n"                                                         // false start to drive detection
                "xxx|badentry to drive default case"
                "newrt|start\n"
                "xxx|badentry to drive default case"
                "newrt|start\n"
-        "rte|0|localhost:4560,localhost:4562\n"
-        "rte|1|localhost:4562;localhost:4561,localhost:4569\n"
-        "rte|2|localhost:4562\n"
-           "rte|4|localhost:4561\n"
-               "rte|5|localhost:4563\n"
-        "rte|6|localhost:4562\n"
+           "rte|0|localhost:4560,localhost:4562\n"                                     // these are legitimate entries for our testing
+           "rte|1|localhost:4562;localhost:4561,localhost:4569\n"
+           "rte|2|localhost:4562| 10\n"                                                                // new subid at end
+           "mse|4|10|localhost:4561\n"                                                                 // new msg/subid specifier rec
+           "mse|4|localhost:4561\n"                                                                    // new mse entry with less than needed fields
+               "   rte|   5   |localhost:4563    #garbage comment\n"           // tests white space cleanup
+           "rte|6|localhost:4562\n"
                "newrt|end\n";
 
        fd = open( "utesting.rt", O_WRONLY | O_CREAT, 0600 );
                "newrt|end\n";
 
        fd = open( "utesting.rt", O_WRONLY | O_CREAT, 0600 );
@@ -64,9 +77,24 @@ static void gen_rt( uta_ctx_t* ctx ) {
        }
 
        setenv( "RMR_SEED_RT", "utesting.rt", 1 );
        }
 
        setenv( "RMR_SEED_RT", "utesting.rt", 1 );
+       write( fd, rt_stuff, strlen( rt_stuff ) );              // write in the whole table
+
+       rt_stuff =
+               "updatert|start\n"                                                                      // this is an update to the table
+           "mse|4|99|fooapp:9999,barapp:9999;logger:9999\n"    // update just one entry
+               "updatert|end | 3\n";                                                           // bad count; this update should be rejected
+       write( fd, rt_stuff, strlen( rt_stuff ) );
+
+       rt_stuff =
+               "updatert|start\n"                                                                      // this is an update to the table
+           "mse|4|10|fooapp:4561,barapp:4561;logger:9999\n"    // update just one entry
+               "del|2|-1\n"                                                                            // delete an entry; not there so no action
+               "del|2|10\n"                                                                            // delete an entry
+               "updatert|end | 3\n";                                                           // end table; updates have a count as last field
        write( fd, rt_stuff, strlen( rt_stuff ) );
        write( fd, rt_stuff, strlen( rt_stuff ) );
+       
        close( fd );
        close( fd );
-       read_static_rt( ctx, 0 );
+       read_static_rt( ctx, 1 );                                                               // force in verbose mode to see stats on tty if failure
        unlink( "utesting.rt" );
 }
 
        unlink( "utesting.rt" );
 }
 
@@ -77,7 +105,7 @@ static void gen_rt( uta_ctx_t* ctx ) {
 
        Send and receive functions are indirectly exercised from the rmr_nng_static_test
        module as it tests the user facing send/receive/call/rts functions. These tests
 
        Send and receive functions are indirectly exercised from the rmr_nng_static_test
        module as it tests the user facing send/receive/call/rts functions. These tests
-       should exercise specific cases for the internal functions as they will not 
+       should exercise specific cases for the internal functions as they will not
        specifically be driven elsewhere.
 */
 static int sr_nng_test() {
        specifically be driven elsewhere.
 */
 static int sr_nng_test() {
@@ -92,6 +120,7 @@ static int sr_nng_test() {
        nng_socket nn_dummy_sock;                                       // dummy needed to drive send
        int             size;
        int             i;
        nng_socket nn_dummy_sock;                                       // dummy needed to drive send
        int             size;
        int             i;
+       void*   p;
 
        //ctx = rmr_init( "tcp:4360", 2048, 0 );                                // do NOT call init -- that starts the rtc thread which isn't good here
        ctx = (uta_ctx_t *) malloc( sizeof( uta_ctx_t ) );              // alloc the context manually
 
        //ctx = rmr_init( "tcp:4360", 2048, 0 );                                // do NOT call init -- that starts the rtc thread which isn't good here
        ctx = (uta_ctx_t *) malloc( sizeof( uta_ctx_t ) );              // alloc the context manually
@@ -104,6 +133,10 @@ static int sr_nng_test() {
        uta_lookup_rtg( ctx );
 
        gen_rt( ctx );                                                          // forces a static load with some known info since we don't start the rtc()
        uta_lookup_rtg( ctx );
 
        gen_rt( ctx );                                                          // forces a static load with some known info since we don't start the rtc()
+       gen_rt( ctx );                                                          // force a second load to test cloning
+
+       p = rt_ensure_ep( NULL, "foo" );                                // drive for coverage
+       errors += fail_not_nil( p,  "rt_ensure_ep did not return nil when given nil route table" );
 
        state = rmr_ready( NULL );
        errors += fail_if_true( state, "reported ready when given a nil context" );
 
        state = rmr_ready( NULL );
        errors += fail_if_true( state, "reported ready when given a nil context" );
@@ -121,7 +154,7 @@ static int sr_nng_test() {
        errors += fail_not_equal( mbuf->flags, mb2->flags, "clone did not duplicate flags" );
        errors += fail_not_equal( mbuf->alloc_len, mb2->alloc_len, "clone did not dup alloc-len" );
        errors += fail_not_equal( mbuf->state, mb2->state, "clone did not dup state" );
        errors += fail_not_equal( mbuf->flags, mb2->flags, "clone did not duplicate flags" );
        errors += fail_not_equal( mbuf->alloc_len, mb2->alloc_len, "clone did not dup alloc-len" );
        errors += fail_not_equal( mbuf->state, mb2->state, "clone did not dup state" );
-       rmr_free_msg( mb2 );    
+       rmr_free_msg( mb2 );
 
        mbuf = rmr_send_msg( NULL, mbuf );
        errors += fail_if_nil( mbuf, "send with nil context but buffere didn't return buffer" );
 
        mbuf = rmr_send_msg( NULL, mbuf );
        errors += fail_if_nil( mbuf, "send with nil context but buffere didn't return buffer" );
@@ -131,7 +164,7 @@ static int sr_nng_test() {
                mbuf = rmr_rcv_msg( ctx, NULL );
        }
 
                mbuf = rmr_rcv_msg( ctx, NULL );
        }
 
-       size = 2048 - sizeof( uta_mhdr_t );             // emulated nng receive allocates 2K payloads
+       size = 2048 - em_hdr_size();            // emulated nng receive allocates 2K buffers -- subtract off header size
        state = rmr_payload_size( mbuf );
        errors += fail_not_equal( state, size, "payload size didn't return expected value" );   // receive should always give 4k buffer
 
        state = rmr_payload_size( mbuf );
        errors += fail_not_equal( state, size, "payload size didn't return expected value" );   // receive should always give 4k buffer
 
@@ -184,7 +217,7 @@ static int sr_nng_test() {
        ctx->shutdown = 1;                      // should force rtc to quit on first pass
        rtc( NULL );                            // coverage test with nil pointer
        rtc( ctx );
        ctx->shutdown = 1;                      // should force rtc to quit on first pass
        rtc( NULL );                            // coverage test with nil pointer
        rtc( ctx );
-       
+
 
        return !!errors;
 }
 
        return !!errors;
 }