More changes for scan corrections and unit test coverage

Issue-ID: RIC-673

Signed-off-by: E. Scott Daniels <daniels@research.att.com>
Change-Id: I337e8caebda4d4585fbce2ab455caaa4f68be8f1
diff --git a/test/rt_static_test.c b/test/rt_static_test.c
index 8fd91ac..8bd91df 100644
--- a/test/rt_static_test.c
+++ b/test/rt_static_test.c
@@ -415,19 +415,57 @@
 		free( buf );
 	}
 
-fprintf( stderr, ">>>>>> test is overtly dropping rt table at %p\n", rt );
+	fprintf( stderr, "<INFO> test is overtly dropping rt table at %p\n", rt );
+	ctx->rtable = NULL;
 	uta_rt_drop( rt );
 	rt = NULL;
 
 
+	// --- force the load of a RT which has some edge case forcing issues
 	if( ctx ) {
-		if( (seed_fname = getenv( "RMR_SEED_RT" )) != NULL ) {
-			read_static_rt( ctx, 0 );
-			rt = ctx->rtable;
-			errors += fail_if_nil( rt, "read seed table didn't generate a rtable pointer in context" );
-			unsetenv( "RMR_SEED_RT" );				// remove for next test
-		}
+		char*	rt_stuff =
+				"newrt | start | dummy-seed\n"
+				"mse | 1  | -1 | localhost:84306\n"
+				"mse | 10  | -1 | localhost:84306\n"
+				"mse | 10  | 1 | localhost:84306\n"
+				"# should cause failure because there aren't 10 entries above\n"
+				"newrt | end | 10\n"
 
+				"# this table has no end\n"
+				"newrt | start | dummy-seed\n"
+				"mse | 1  | -1 | localhost:84306\n"
+				"mse | 10  | -1 | localhost:84306\n"
+				"mse | 10  | 1 | localhost:84306\n"
+				"# short record to drive test\n"
+				"del\n"
+				"del | 12 | 12\n"
+
+				"# this table should be ok\n"
+				"newrt | start | dummy-seed\n"
+				"mse | 1  | -1 | localhost:84306\n"
+				"mse | 10  | -1 | localhost:84306\n"
+				"mse | 10  | 1 | localhost:84306\n"
+				"newrt | end | 3\n"
+
+				"# for an update to the existing table\n"
+
+				"# not in progress; drive that exception check\n"
+				"update | end | 23\n"
+
+				"update | start | dummy-seed\n"
+				"mse | 2 | 2 | localhost:2222\n"
+				"# no table end for exception handling\n"
+
+				"update | start | dummy-seed\n"
+				"mse | 2 | 2 | localhost:2222\n"
+				"update | end | 1\n";
+
+		fprintf( stderr, "<INFO> loading RT from edge case static table\n" );
+		fprintf( stderr, "<INFO> %s\n", rt_stuff );
+		gen_custom_rt( ctx, rt_stuff );
+		errors += fail_if_nil( ctx->rtable, "edge case route table didn't generate a pointer into the context" );
+
+		unsetenv( "RMR_SEED_RT" );			// remove for next read try
 		read_static_rt( ctx, 0 );			// drive for not there coverage
 	}
 
@@ -620,5 +658,10 @@
 		errors += fail_not_nil( ep, "fd2ep delete returned a pointer for unknown mapping" );
 	#endif
 
+	// ---------------- misc coverage tests --------------------------------------------------------------------------
+		collect_things( NULL, NULL, NULL, NULL, NULL );				// these both return null, these test NP checks
+		collect_things( NULL, NULL, NULL, NULL, (void *) 1234 );		// the last is an invalid pointer, but check needed to force check on previous param
+		del_rte( NULL, NULL, NULL, NULL, NULL );
+
 	return !!errors;			// 1 or 0 regardless of count
 }
diff --git a/test/si95_test.c b/test/si95_test.c
index dfa44c3..70f13e8 100644
--- a/test/si95_test.c
+++ b/test/si95_test.c
@@ -88,9 +88,9 @@
 #include <si95/silisten.c>
 #include <si95/sinew.c>
 #include <si95/sinewses.c>
-//#include <si95/sipoll.c>
+#include <si95/sipoll.c>
 //#include <si95/sircv.c>
-//#include <si95/sisend.c>
+#include <si95/sisend.c>
 #include <si95/sisendt.c>
 #include <si95/sishutdown.c>
 #include <si95/siterm.c>
@@ -197,9 +197,9 @@
 	int errors = 0;
 	int l;
 	struct sockaddr* addr;
-	char buf1[4096];
-	char buf2[4096];
-	char* dest;
+	char buf1[4096];			// space to build buffers for xlation
+	char*	hr_addr;			// human readable address returned
+	void* net_addr;				// a network address block of some type
 
 	addr = (struct sockaddr *) malloc( sizeof( struct sockaddr ) );
 /*
@@ -208,26 +208,75 @@
 	SIgenaddr( "    [ff02::4]:4567", PF_INET6, IPPROTO_TCP, SOCK_STREAM, &addr );
 */
 
-	dest = NULL;
+	l = SIaddress( NULL, NULL, 0 );
+	errors += fail_if_true( l != 0, "SIaddress given two null pointers didn't return 0 len" );
+	l = SIaddress( buf1, NULL, 0 );
+	errors += fail_if_true( l != 0, "SIaddress given null dest pointer didn't return 0 len" );
+	l = SIaddress( NULL, buf1, 0 );
+	errors += fail_if_true( l != 0, "SIaddress given null src pointer didn't return 0 len" );
+
+	net_addr = NULL;
 	snprintf( buf1, sizeof( buf1 ), "   [ff02::5:4001" );		// invalid address, drive leading space eater too
-	l = SIaddress( buf1, (void **)  &dest, AC_TOADDR6 );
+	l = SIaddress( buf1, (void **)  &net_addr, AC_TOADDR6 );
 	errors += fail_if_true( l > 0, "to addr6 with bad addr convdersion returned valid len" );
+	free( net_addr );
 
 	snprintf( buf1, sizeof( buf1 ), "[ff02::5]:4002" );		// v6 might not be supported so failure is OK here; driving for coverage
-	l=SIaddress( buf1, (void **) &dest, AC_TOADDR6 );
+	l = SIaddress( buf1, &net_addr, AC_TOADDR6 );
+	if( l > 0 ) {
+		l = SIaddress( net_addr, &hr_addr, AC_TODOT );						// convert the address back to hr string
+		errors += fail_if_true( l < 1, "v6 to dot conversion failed" );
+		errors += fail_if_nil( hr_addr, "v6 to dot conversion yields a nil pointer" );
+		free( net_addr );
+	}
 
 	snprintf( buf1, sizeof( buf1 ), "localhost:43086" );
-	l = SIaddress( buf1, (void **) &dest, AC_TOADDR );
-	errors += fail_if_true( l < 1, "to addr convdersion failed" );
+	l = SIaddress( buf1, (void **) &net_addr, AC_TOADDR );
+	errors += fail_if_true( l < 1, "v4 to addr conversion failed" );
 
-	snprintf( buf1, sizeof( buf1 ), "localhost:4004" );
-	l = SIaddress( buf1, (void **) &dest, AC_TODOT );
+	l = SIaddress( net_addr, &hr_addr, AC_TODOT );						// convert the address back to hr string
 	errors += fail_if_true( l < 1, "to dot convdersion failed" );
+	errors += fail_if_nil( hr_addr, "v4 to dot conversion yields a nil pointer" );
+	free( net_addr );
 
 	fprintf( stderr, "<INFO> addr module finished with %d errors\n", errors );
 	return errors;
 }
 
+/*
+	Prep related tests. These mostly drive cases that aren't driven by "normal"
+	connect, send, receive tests (e.g. UDP branches).
+*/
+static int prep() {
+	int		errors = 0;
+	void*	thing;					// the thing that should be returned
+
+	thing = SIlisten_prep( UDP_DEVICE, "localhost:1234", AF_INET );
+	errors += fail_if_nil( thing, "listen prep udp returned nil block" );
+
+	thing = SIlisten_prep( UDP_DEVICE, "localhost:1234", 84306 );		// this should fail
+	errors += fail_not_nil( thing, "listen prep udp returned valid block ptr for bogus family" );
+
+	thing = SIconn_prep( si_ctx, UDP_DEVICE, "localhost:1234", 84306 );		// again, expect to fail; bogus family
+	errors += fail_not_nil( thing, "conn prep udp returned valid block ptr for bogus family" );
+
+	return errors;
+}
+
+/*
+	Polling/waiting tests.  These are difficult at best because of the blocking
+	nature of things, not to mention needing to have real ports open etc.
+*/
+static int poll() {
+	int errors  = 0;
+	int status;
+
+	status = SIpoll( si_ctx, 1 );
+	errors += fail_if_true( status != 0, "poll failed" );
+
+	return errors;
+}
+
 
 /*
 	Connection oriented tests.
@@ -290,8 +339,12 @@
 		errors++;
 	} else {
 		errors += fail_if_true( buf[0] == 0, "get name returned buf with emtpy string" );
+		free( buf );
 	}
 
+	buf = SIgetname( -1 );			// invalid fd
+	errors += fail_not_nil( buf, "get name returned buf with non-emtpy string when given bad fd" );
+
 	fprintf( stderr, "<INFO> conn module finished with %d errors\n", errors );
 	return errors;
 }
@@ -398,12 +451,15 @@
 	errors += init();
 	errors += memory();
 	errors += addr();
+	errors += prep();
 	errors += conn();
 	errors += misc();
 
 	errors += new_sess();		// should leave a "connected" session at fd == 6
 	errors += send_tests();
 
+	errors += poll();
+
 	errors += cleanup();
 
 	test_summary( errors, "SI95 tests" );
diff --git a/test/test_gen_rt.c b/test/test_gen_rt.c
index 08c1276..5d9e366 100644
--- a/test/test_gen_rt.c
+++ b/test/test_gen_rt.c
@@ -37,6 +37,9 @@
 	is a good update. The same applies to the meid map; first has a bad counter
 	and some bad records to drive coverage testing. The end should leave a good
 	meid map in the table.
+
+	Once the file is generated, it is forced in via static read and the file
+	is unlinked.
 */
 static void gen_rt( uta_ctx_t* ctx ) {
 	int		fd;
@@ -72,7 +75,7 @@
 
 	rt_stuff = 												// add an meid map which will fail
 		"meid_map | start\n"
-		"mme_ar | e2t-1 | one two three four\n"
+		"mme_ar | e2t-1 | one two three four\r"				// also test bloody apple way with \r
 		"mme_del | one two\n"
 		"mme_del \n"										// short entries drive various checks for coverage
 		"mme_ar \n"											
@@ -118,19 +121,23 @@
 
 /*
 	Generate a custom route table file using the buffer passed in.
+	Then force it to be read into the current route table. The file
+	is unlinked when finished.
 */
 static void gen_custom_rt( uta_ctx_t* ctx, char* buf ) {
 	int		fd;
-	char* 	rt_stuff;		// strings for the route table
 
-	fd = open( "utesting.rt", O_WRONLY | O_CREAT, 0600 );
+	fd = open( "Xutesting.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 );
+	setenv( "RMR_SEED_RT", "Xutesting.rt", 1 );
 
-	write( fd, rt_stuff, strlen( buf ) );
+	fprintf( stderr, "<INFO> creating custom rt from buffer (%d bytes)\n", strlen (buf ) );
+	if( write( fd, buf, strlen( buf ) ) != strlen( buf ) ) {
+		fprintf( stderr, "<BUGGERED> write failed: %s\n", strerror( errno ) );
+	}
 
 	close( fd );
 	read_static_rt( ctx, 1 );								// force in verbose mode to see stats on tty if failure
diff --git a/test/test_si95_em.c b/test/test_si95_em.c
index 9eb7d94..3e70727 100644
--- a/test/test_si95_em.c
+++ b/test/test_si95_em.c
@@ -173,7 +173,7 @@
 	return 0;
 }
 
-static struct tp_blk *em_silisten_prep( struct ginfo_blk *gptr, int type, char* abuf, int family ) {
+static struct tp_blk *em_silisten_prep( int type, char* abuf, int family ) {
 	return NULL;
 }