CI: Add silent cmake SonarCloud scan
[ric-plt/lib/rmr.git] / test / sr_nano_static_test.c
index 14c678f..cb2b9ff 100644 (file)
@@ -1,8 +1,8 @@
 // : vi ts=4 sw=4 noet :
 /*
 ==================================================================================
-           Copyright (c) 2019 Nokia
-           Copyright (c) 2018-2019 AT&T Intellectual Property.
+           Copyright (c) 2019-2021 Nokia
+           Copyright (c) 2018-2021 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.
 /*
        Generate a simple route table (for all but direct route table testing).
        This table contains multiple tables inasmuch as a second update set of
-       records follows the initial set. 
+       records follows the initial set.
 */
 static void gen_rt( uta_ctx_t* ctx ) {
        int             fd;
        char*   rt_stuff;               // strings for the route table
 
        rt_stuff =
+               "\r"                                                                            // ensure we are not screwed by broken OSes that insist on using \r
                "newrt|end\n"                                                           // end of table check before start of table found
                "# comment to drive full comment test\n"
                "\n"                                                                            // handle blank lines
@@ -59,6 +60,37 @@ static void gen_rt( uta_ctx_t* ctx ) {
                "newrt|start\n"                                                         // false start to drive detection
                "xxx|badentry to drive default case"
                "newrt|start\n"
+           "rte|0|localhost:4560,localhost:4562,dummy-test:1111\n"                                     // these are legitimate entries for our testing
+           "rte|1|localhost:4562;localhost:4561,localhost:4569,10.7.9.86:4560\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 );
+       if( fd < 0 ) {
+               fprintf( stderr, "<BUGGERED> unable to open file for testing route table gen\n" );
+               return;
+       }
+
+       setenv( "RMR_SEED_RT", "utesting.rt", 1 );
+       write( fd, rt_stuff, strlen( rt_stuff ) );
+       close( fd );
+       read_static_rt( ctx, 0 );
+       unlink( "utesting.rt" );
+}
+
+/*
+       Generates a legitimate table but with a missing newline on the last record.
+*/
+static void gen_mlnl_rt( uta_ctx_t* ctx ) {
+       int             fd;
+       char*   rt_stuff;               // strings for the route table
+
+       rt_stuff =
+               "newrt|start\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
@@ -66,7 +98,7 @@ static void gen_rt( uta_ctx_t* ctx ) {
            "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";
+               "newrt|end";                                                                                            // should not affect the loader
 
        fd = open( "utesting.rt", O_WRONLY | O_CREAT, 0600 );
        if( fd < 0 ) {
@@ -81,6 +113,44 @@ static void gen_rt( uta_ctx_t* ctx ) {
        unlink( "utesting.rt" );
 }
 
+/*
+       Generate an empty route table to test edge case.
+*/
+static void gen_empty_rt( uta_ctx_t* ctx ) {
+       int             fd;
+
+       fd = open( "utesting.rt", O_WRONLY | O_CREAT | O_TRUNC, 0600 );
+       if( fd < 0 ) {
+               fprintf( stderr, "<BUGGERED> unable to open file for testing route table gen\n" );
+               return;
+       }
+
+       setenv( "RMR_SEED_RT", "utesting.rt", 1 );
+       //write( fd, "", 0 );
+       close( fd );
+       read_static_rt( ctx, 0 );
+       unlink( "utesting.rt" );
+}
+
+/*
+       Generate an single byte route table to drive an edge handling case.
+*/
+static void gen_sb_rt( uta_ctx_t* ctx ) {
+       int             fd;
+
+       fd = open( "utesting.rt", O_WRONLY | O_CREAT | O_TRUNC, 0600 );
+       if( fd < 0 ) {
+               fprintf( stderr, "<BUGGERED> unable to open file for testing route table gen\n" );
+               return;
+       }
+
+       setenv( "RMR_SEED_RT", "utesting.rt", 1 );
+       write( fd, " ", 1 );
+       close( fd );
+       read_static_rt( ctx, 0 );
+       unlink( "utesting.rt" );
+}
+
 
 /*
        Drive the send and receive functions.  We also drive as much of the route
@@ -113,11 +183,27 @@ static int sr_nano_test() {
        ctx->mring = NULL;              //uta_mk_ring( 128 );
        ctx->max_plen = RMR_MAX_RCV_BYTES + sizeof( uta_mhdr_t );
        ctx->max_mlen = ctx->max_plen + sizeof( uta_mhdr_t );
-       ctx->my_name = strdup( "dummy-test" );
+       ctx->my_name = strdup( "dummy-test:1111" );
+       ctx->my_ip = strdup( "30.4.19.86:1111" );
        uta_lookup_rtg( ctx );
 
+       ctx->rtable = NULL;
+       gen_sb_rt( ctx );                                                       // generate and read a file with a sinle byte to test edge case
+       errors += fail_not_nil( ctx->rtable, "read single byte route table produced a table" );
+
+       ctx->rtable = NULL;
+       gen_empty_rt( ctx );                                            // generate and read an empty rt file to test edge case
+       errors += fail_not_nil( ctx->rtable, "read empty route table file produced a table" );
+
+       ctx->rtable = NULL;
+       gen_mlnl_rt( ctx );                                             // ensure that a file with missing last new line does not trip us up
+       errors += fail_if_nil( ctx->rtable, "read  route table file with missing last newline did not produce a table" );
+
+       ctx->rtable = NULL;
        gen_rt( ctx );                                                          // forces a static load with some known info since we don't start the rtc()
+       errors += fail_if_nil( ctx->rtable, "read  multi test route table file did not produce a table" );
        gen_rt( ctx );                                                          // force a second load to test cloning
+       errors += fail_if_nil( ctx->rtable, "read  multi test route table file to test clone did not produce a table" );
 
        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" );
@@ -182,8 +268,7 @@ static int sr_nano_test() {
        rtc( NULL );                            // coverage test with nil pointer
        rtc( ctx );
 
+       unlink( ".ut_rmr_verbose" );
 
-       // --- drive the route table things which are nanomsg specific ------
-
-       return !!errors;
+       return errors;
 }