changeset 87:d09e0dbe90e6

Added more tests on the message module. All functions are at least called now
author Sebastien Decugis <sdecugis@nict.go.jp>
date Tue, 15 Jul 2008 12:06:27 +0900
parents 7dce32fd436b
children 2f46f6491c04
files waaad/tests/testmesg.c
diffstat 1 files changed, 206 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/waaad/tests/testmesg.c	Tue Jul 15 10:46:32 2008 +0900
+++ b/waaad/tests/testmesg.c	Tue Jul 15 12:06:27 2008 +0900
@@ -245,21 +245,21 @@
 			CHECK( 0, dict_new ( DICT_AVP, &avp_data , NULL, &gavp ) );
 			
 			/* Macro to search AVP and create a rule */		
-			#define ADD_RULE( _parent, _vendor, _avpname, _pos, _min, _max, _tpl ) {		\
+			#define ADD_RULE( _parent, _vendor, _avpname, _pos, _min, _max, _tpl, _ord ) {		\
 				dict_object_t * _avp = NULL;							\
 				dict_avp_request_t _req = { (_vendor), 0, (_avpname) };				\
 				dict_rule_data_t _data;								\
 				CHECK( 0, dict_search ( DICT_AVP, AVP_BY_NAME_AND_VENDOR, &_req, &_avp ) );	\
 				_data.rule_avp = _avp;								\
 				_data.rule_position = (_pos);							\
-				_data.rule_order = 1;								\
+				_data.rule_order = (_ord);							\
 				_data.rule_min = (_min);							\
 				_data.rule_max = (_max);							\
 				_data.rule_template = (_tpl);							\
 				CHECK( 0, dict_new ( DICT_RULE, &_data , (_parent), NULL ) );			\
 			}
 			
-			ADD_RULE(gavp, 73565, "AVP Test - os", RULE_OPTIONAL,   -1, -1,  3);
+			ADD_RULE(gavp, 73565, "AVP Test - os", RULE_OPTIONAL,   -1, -1,  3, 0);
 			
 		}
 			
@@ -270,12 +270,30 @@
 			
 			CHECK( 0, dict_search ( DICT_APPLICATION, APPLICATION_BY_NAME, "Application test", &application ) );
 			CHECK( 0, dict_new ( DICT_COMMAND, &cmd_data , application, &command ) );
-			ADD_RULE(command, 0,     "AVP Test - no vendor - f32", 	RULE_FIXED_HEAD, -1,  1,  0);
-			ADD_RULE(command, 73565, "AVP Test - i64",		RULE_REQUIRED,   -1, -1,  0);
-			ADD_RULE(command, 73565, "AVP Test - enumi32", 		RULE_OPTIONAL,   -1, -1,  0);
-			ADD_RULE(command, 73565, "AVP Test - os", 		RULE_OPTIONAL,   -1, -1,  0);
-			ADD_RULE(command, 73565, "AVP Test - enumos", 		RULE_OPTIONAL,   -1, -1,  0);
-			ADD_RULE(command, 73565, "AVP Test - grouped", 		RULE_OPTIONAL,   -1, -1,  0);
+			ADD_RULE(command, 0,     "AVP Test - no vendor - f32", 	RULE_FIXED_HEAD, -1,  1,  0, 1);
+			ADD_RULE(command, 73565, "AVP Test - i64",		RULE_REQUIRED,   -1, -1,  0, 0);
+			ADD_RULE(command, 73565, "AVP Test - enumi32", 		RULE_OPTIONAL,   -1, -1,  0, 0);
+			ADD_RULE(command, 73565, "AVP Test - os", 		RULE_OPTIONAL,   -1, -1,  0, 0);
+			ADD_RULE(command, 73565, "AVP Test - enumos", 		RULE_OPTIONAL,   -1, -1,  0, 0);
+			ADD_RULE(command, 73565, "AVP Test - grouped", 		RULE_OPTIONAL,   -1, -1,  0, 0);
+		}
+		
+		{
+			dict_object_t * gavp = NULL;
+			dict_avp_data_t avp_data = { 73574, 73565, "AVP Test - rules", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_GROUPED };
+			
+			CHECK( 0, dict_new ( DICT_AVP, &avp_data , NULL, &gavp ) );
+			
+			ADD_RULE(gavp,     0, "AVP Test - no vendor - f32", RULE_FIXED_HEAD,   0, 1, 0, 1);
+			ADD_RULE(gavp, 73565, "AVP Test - i64", 	    RULE_FIXED_HEAD,  -1, 1, 0, 2);
+			ADD_RULE(gavp, 73565, "AVP Test - enumi32", 	    RULE_FIXED_HEAD,  -1, 1, 0, 3);
+			ADD_RULE(gavp, 73565, "AVP Test - os", 	    	    RULE_REQUIRED,     2, 3, 0, 0);
+			ADD_RULE(gavp, 73565, "AVP Test - enumos",     	    RULE_OPTIONAL,     0, 1, 0, 0);
+			ADD_RULE(gavp, 73565, "AVP Test - grouped",         RULE_FIXED_TAIL,  -1, 1, 0, 1);
+			
+			#if 0
+			dict_dump ( gavp, 0, 2 );
+			#endif
 		}
 		#if 0
 		{
@@ -603,12 +621,13 @@
 		
 	}
 	
-	/* Test the parsing of buffers */
+	/* Test the parsing of buffers and messages */
 	{
 		msg_t * msg;
 		
 		/* Test the msg_parse_buffer function */
 		{
+			CHECK( EBADMSG, msg_parse_buffer( buf, 340, &msg) );
 			CHECK( 0, msg_parse_buffer( buf, 343, &msg) );
 			#if 0
 			msg_dump_walk(msg);
@@ -617,10 +636,72 @@
 		
 		/* Test the msg_parse_dict function */
 		{
+			/* Test with an unknown command code */
+			{
+				/* reinit the msg */
+				CHECK( 0, msg_free ( msg, 1 ) );
+				
+				/* Change the command-code */
+				buf[5] = 0x11;
+				CHECK( 0, msg_parse_buffer( buf, 343, &msg) );
+				CHECK( ENOTSUP, msg_parse_dict( msg ) );
+				
+				/* reset */
+				CHECK( 0, msg_free ( msg, 1 ) );
+				buf[5] = 0x01;
+			}
+			
+			/* Test with an unknown Mandatory AVP */
+			{
+				buf[20] = 0x11;	/* New AVP code = 0x11011F5F, undefined */
+				buf[24] = 0x40; /* Add the 'M' flag */
+				
+				/* Check that we cannot support this message now */
+				CHECK( 0, msg_parse_buffer( buf, 343, &msg) );
+				CHECK( ENOTSUP, msg_parse_dict( msg ) );
+				
+				/* reset */
+				CHECK( 0, msg_free ( msg, 1 ) );
+				buf[20] = 0x00;
+				buf[24] = 0x00;
+			}
+			
+			/* Test with an unknown optional AVP */
+			{
+				buf[20] = 0x11;	/* New AVP code = 0x11011F5F, undefined */
+				
+				/* Check that we can support this message now */
+				CHECK( 0, msg_parse_buffer( buf, 343, &msg) );
+				CHECK( 0, msg_parse_dict( msg ) );
+				
+				#if 0
+				msg_dump_walk(msg);
+				#endif
+				
+				/* Now test the "getraw" function */
+				{
+					msg_avp_t * avp;
+					unsigned char * raw;
+					
+					CHECK( 0, msg_browse( msg, MSG_BRW_FIRST_CHILD, &avp, NULL) );
+					
+					CHECK( 0, msg_avp_getrawdata ( avp, &raw ) );
+					
+					CHECK( 0, memcmp(raw, buf + 28, 4) ); /* This is the representation of "3.1415" */
+					
+				}
+				
+				/* reset */
+				CHECK( 0, msg_free ( msg, 1 ) );
+				buf[20] = 0x00;
+			}
+			
+			CHECK( 0, msg_parse_buffer( buf, 343, &msg) );
 			CHECK( 0, msg_parse_dict( msg ) );
 			#if 0
 			msg_dump_walk(msg);
 			#endif
+			
 			/* Now we can free the buffer. */
 			memset(buf, 0, 343);
 			free(buf);
@@ -631,6 +712,121 @@
 			dict_object_t * rule;
 			
 			CHECK( 0, msg_parse_rules( msg, &rule ) );
+			
+			/* Use the "AVP Test - rules" AVP to test the rules */
+			{
+				msg_avp_t * tavp = NULL;
+				msg_avp_t * tempavp = NULL;
+				msg_avp_t * childavp = NULL;
+				
+				ADD_AVP( msg, MSG_BRW_LAST_CHILD, tavp, 73565, "AVP Test - rules" );
+				
+				/* Create a conforming message first */
+				ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp,     0, "AVP Test - no vendor - f32" );
+				ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - i64" );
+				ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - enumi32" );
+				ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - os" );
+				ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - os" );
+				ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - grouped" );
+				
+				/* Check the message is still conform */
+				CHECK( 0, msg_parse_rules( msg, &rule ) );
+				
+				/* The first avp is optional in fixed position, so remove it and check the message is still OK */
+				CHECK( 0, msg_browse ( tavp, MSG_BRW_FIRST_CHILD, &childavp, NULL) );
+				CHECK( 0, msg_free ( childavp, 0 ) );
+				CHECK( 0, msg_parse_rules( msg, &rule ) );
+				ADD_AVP( tavp, MSG_BRW_FIRST_CHILD, childavp,     0, "AVP Test - no vendor - f32" );
+				
+				
+				/* Now break some rules and check it is detected */
+				#define CHECK_CONFLICT( _msg, _ruleavp, _avpvendor )		{				\
+					dict_object_t * _rule;									\
+					CHECK( EBADMSG,  msg_parse_rules( msg, &_rule ) );					\
+					if ((_ruleavp) == NULL) {								\
+						CHECK( NULL, _rule);								\
+					} else {										\
+						dict_rule_data_t _ruledata;							\
+						dict_object_t * _avp;								\
+						dict_avp_request_t _req = { (_avpvendor), 0, (_ruleavp) };			\
+						CHECK( 0, dict_search ( DICT_AVP, AVP_BY_NAME_AND_VENDOR, &_req, &_avp ) );	\
+						CHECK( 0, dict_getval( _rule, &_ruledata ) );					\
+						CHECK( _avp, _ruledata.rule_avp );						\
+					}											\
+				}
+
+				{
+					/* Test the FIXED_HEAD rules positions: add another AVP before the third */
+					CHECK( 0, msg_browse ( tavp, MSG_BRW_FIRST_CHILD, &tempavp, NULL) ); /* tempavp is the novendor avp */
+					CHECK( 0, msg_browse ( tempavp, MSG_BRW_NEXT, &tempavp, NULL) );     /* tempavp is the i64 avp */
+					ADD_AVP( tempavp, MSG_BRW_NEXT, childavp, 73565, "AVP Test - os" );
+					
+					CHECK_CONFLICT( msg, "AVP Test - enumi32", 73565 );
+					
+					/* Now remove this AVP */
+					CHECK( 0, msg_free ( childavp, 0 ) );
+				}
+				{
+					/* Remove the third AVP, same rule must conflict */
+					CHECK( 0, msg_browse ( tempavp, MSG_BRW_NEXT, &childavp, NULL) );     /* childavp is the enumi32 avp */
+					CHECK( 0, msg_free ( childavp, 0 ) );
+					
+					CHECK_CONFLICT( msg, "AVP Test - enumi32", 73565 );
+					
+					/* Add the AVP back */
+					ADD_AVP( tempavp, MSG_BRW_NEXT, childavp, 73565, "AVP Test - enumi32" );
+				}
+				
+				{
+					/* Test the minimum value in the REQUIRED rule: delete one of the os AVPs */
+					CHECK( 0, msg_browse ( childavp, MSG_BRW_NEXT, &tempavp, NULL) );     /* tempavp is the os avp */
+					CHECK( 0, msg_free ( tempavp, 0 ) );
+					
+					CHECK_CONFLICT( msg, "AVP Test - os", 73565 );	/* The rule requires at least 2 AVP, we have only 1 */
+					
+					/* Now add this AVP */
+					ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - os" );
+				}
+				{
+					/* Test the maximum value in the REQUIRED rule: add more of the os AVPs */
+					ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - os" );
+					ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - os" );
+					
+					CHECK_CONFLICT( msg, "AVP Test - os", 73565 );	/* The rule requires at most 3 AVP, we have 4 */
+					
+					/* Now delete these AVP */
+					CHECK( 0, msg_free ( tempavp, 0 ) );
+					CHECK( 0, msg_browse ( childavp, MSG_BRW_NEXT, &tempavp, NULL) );
+					CHECK( 0, msg_free ( tempavp, 0 ) );
+				}
+				
+				{
+					/* Test the maximum value in the OPTIONAL rule: add 2 enumos AVPs */
+					ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - enumos" );
+					
+					/* The message is still conform */
+					CHECK( 0, msg_parse_rules( msg, &rule ) );
+					
+					/* Now break the rule */
+					ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - enumos" );
+					
+					CHECK_CONFLICT( msg, "AVP Test - enumos", 73565 );	/* The rule requires at most 3 AVP, we have 4 */
+					
+					/* Now delete this AVP */
+					CHECK( 0, msg_free ( tempavp, 0 ) );
+				}
+				
+				{
+					/* Test the RULE_FIXED_TAIL rules positions: add another AVP at the end */
+					ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - os" );
+					
+					CHECK_CONFLICT( msg, "AVP Test - grouped", 73565 );
+					
+					/* Now remove this AVP */
+					CHECK( 0, msg_free ( childavp, 0 ) );
+				}
+				
+			}
 		}
 	
 	}
"Welcome to our mercurial repository"