Mercurial > hg > freeDiameter
annotate tests/testmesg.c @ 662:2e94ef0515d7 1.1.0-rc1
Updated copyright information
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Fri, 14 Jan 2011 16:27:21 +0900 |
parents | f198d16fa7f4 |
children | 4a9f08d6b6ba |
rev | line source |
---|---|
0 | 1 /********************************************************************************************************* |
2 * Software License Agreement (BSD License) * | |
3 * Author: Sebastien Decugis <sdecugis@nict.go.jp> * | |
4 * * | |
662
2e94ef0515d7
Updated copyright information
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
658
diff
changeset
|
5 * Copyright (c) 2011, WIDE Project and NICT * |
0 | 6 * All rights reserved. * |
7 * * | |
8 * Redistribution and use of this software in source and binary forms, with or without modification, are * | |
9 * permitted provided that the following conditions are met: * | |
10 * * | |
11 * * Redistributions of source code must retain the above * | |
12 * copyright notice, this list of conditions and the * | |
13 * following disclaimer. * | |
14 * * | |
15 * * Redistributions in binary form must reproduce the above * | |
16 * copyright notice, this list of conditions and the * | |
17 * following disclaimer in the documentation and/or other * | |
18 * materials provided with the distribution. * | |
19 * * | |
20 * * Neither the name of the WIDE Project or NICT nor the * | |
21 * names of its contributors may be used to endorse or * | |
22 * promote products derived from this software without * | |
23 * specific prior written permission of WIDE Project and * | |
24 * NICT. * | |
25 * * | |
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * | |
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * | |
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * | |
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * | |
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * | |
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * | |
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * | |
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * | |
34 *********************************************************************************************************/ | |
35 | |
36 #include "tests.h" | |
37 | |
38 /* Main test routine */ | |
39 int main(int argc, char *argv[]) | |
40 { | |
41 struct msg * acr = NULL; | |
42 struct avp * pi = NULL, *avp1, *avp2; | |
43 unsigned char * buf = NULL; | |
44 | |
45 /* First, initialize the daemon modules */ | |
46 INIT_FD(); | |
47 | |
48 /* Create the message object from model */ | |
49 { | |
50 struct dict_object * acr_model = NULL; | |
51 | |
52 /* Now find the ACR dictionary object */ | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
53 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Accounting-Request", &acr_model, ENOENT ) ); |
0 | 54 |
55 /* Create the instance, using the templates */ | |
56 CHECK( 0, fd_msg_new ( acr_model, 0, &acr ) ); | |
57 | |
58 /* Check there is no child */ | |
59 CHECK( ENOENT, fd_msg_browse ( acr, MSG_BRW_FIRST_CHILD, NULL, NULL) ); | |
60 | |
61 #if 0 | |
62 /* For debug: dump the object */ | |
63 fd_log_debug("Dumping Accounting-Request empty message\n"); | |
64 fd_msg_dump_walk( 0, acr ); | |
65 #endif | |
66 } | |
67 | |
68 /* Create the Proxy-Info AVP from model */ | |
69 { | |
70 struct dict_object * pi_model = NULL; | |
71 | |
72 /* Now find the ACR dictionary object */ | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
73 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Proxy-Info", &pi_model, ENOENT ) ); |
0 | 74 |
75 /* Create the instance, using the templates */ | |
76 CHECK( 0, fd_msg_avp_new ( pi_model, 0, &pi ) ); | |
77 | |
78 #if 0 | |
79 /* For debug: dump the object */ | |
80 fd_log_debug("Dumping Proxy-Info AVP\n"); | |
81 fd_msg_dump_walk(0, pi); | |
82 fd_log_debug("Dumping dictionary model\n"); | |
83 fd_dict_dump_object(pi_model); | |
84 #endif | |
85 | |
86 } | |
87 | |
88 /* Get a reference to the current last AVP in the message */ | |
89 { | |
90 int diff = 0; | |
91 | |
92 CHECK( 0, fd_msg_avp_new ( NULL, 0, &avp1 ) ); | |
93 CHECK( 0, fd_msg_avp_add ( acr, MSG_BRW_LAST_CHILD, avp1) ); | |
94 | |
95 CHECK( 0, fd_msg_browse ( acr, MSG_BRW_LAST_CHILD, &avp2, &diff) ); | |
96 CHECK( 1, diff ); | |
97 CHECK( avp1, avp2 ); | |
98 | |
99 /* Check that we cannot add this AVP to another object since it is already linked */ | |
100 CHECK( EINVAL, fd_msg_avp_add( pi, MSG_BRW_LAST_CHILD, avp1) ); | |
101 } | |
102 | |
103 /* Now add the Proxy-Info AVP at the end of the message */ | |
104 { | |
105 CHECK( 0, fd_msg_avp_add( acr, MSG_BRW_LAST_CHILD, pi) ); | |
106 #if 0 | |
107 /* For debug: dump the object */ | |
108 fd_log_debug("Dumping Accounting-Request with Proxy-Info AVP at the end\n"); | |
109 fd_msg_dump_walk(0, acr); | |
110 #endif | |
111 } | |
112 | |
113 /* Check the last child is now the proxy-Info */ | |
114 { | |
115 CHECK( 0, fd_msg_browse ( acr, MSG_BRW_LAST_CHILD, &avp2, NULL) ); | |
116 CHECK( pi, avp2 ); | |
117 } | |
118 | |
119 /* Check that the avp before the proxy-info is the previous last one */ | |
120 { | |
121 int diff = 0; | |
122 CHECK( 0, fd_msg_browse ( pi, MSG_BRW_PREV, &avp2, &diff) ); | |
123 CHECK( avp1, avp2 ); | |
124 CHECK( 0, diff); | |
125 } | |
126 | |
127 /* Check that there are no AVP after the proxy-info */ | |
128 CHECK( ENOENT, fd_msg_browse ( pi, MSG_BRW_NEXT, NULL, NULL) ); | |
129 | |
130 /* Test the fd_msg_free function unlinks the object properly */ | |
131 { | |
132 struct dict_object * rr_model = NULL; | |
133 | |
134 /* Now find the dictionary object */ | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
135 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Route-Record", &rr_model, ENOENT ) ); |
0 | 136 |
137 /* Create the instance, using the templates */ | |
138 CHECK( 0, fd_msg_avp_new ( rr_model, 0, &avp1 ) ); | |
139 | |
140 /* Add the AVP at the end of the message */ | |
141 CHECK( 0, fd_msg_avp_add( pi, MSG_BRW_NEXT, avp1) ); | |
142 | |
143 /* Check the last AVP of the message is now this one */ | |
144 CHECK( 0, fd_msg_browse ( acr, MSG_BRW_LAST_CHILD, &avp2, NULL) ); | |
145 CHECK( avp1, avp2 ); | |
146 | |
147 /* Now delete it */ | |
148 CHECK( 0, fd_msg_free( avp1 ) ); | |
149 | |
150 /* Check the last AVP of the message is back to pi */ | |
151 CHECK( 0, fd_msg_browse ( acr, MSG_BRW_LAST_CHILD, &avp2, NULL) ); | |
152 CHECK( pi, avp2 ); | |
153 | |
154 /* Delete the whole message */ | |
155 CHECK( 0, fd_msg_free( acr ) ); | |
156 } | |
157 | |
158 /* Recreate the message object */ | |
159 { | |
160 struct dict_object * acr_model = NULL; | |
161 | |
162 /* Now find the ACR dictionary object */ | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
163 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Accounting-Request", &acr_model, ENOENT ) ); |
0 | 164 |
165 /* Create the instance, using the templates */ | |
166 CHECK( 0, fd_msg_new ( acr_model, 0, &acr ) ); | |
167 } | |
168 | |
169 /* Now let's create some additional Dictionary objects for the test */ | |
170 { | |
171 /* The constant values used here are totally arbitrary chosen */ | |
172 struct dict_object * vendor; | |
173 { | |
174 struct dict_vendor_data vendor_data = { 73565, "Vendor test" }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
175 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_VENDOR, &vendor_data , NULL, &vendor ) ); |
0 | 176 } |
177 | |
178 { | |
179 struct dict_application_data app_data = { 73566, "Application test" }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
180 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_APPLICATION, &app_data , vendor, NULL ) ); |
0 | 181 } |
182 | |
183 { | |
184 struct dict_avp_data avp_data = { 73567, 0, "AVP Test - no vendor - f32", 0, 0, AVP_TYPE_FLOAT32 }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
185 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , NULL, NULL ) ); |
0 | 186 } |
187 | |
188 { | |
189 struct dict_object * type = NULL; | |
190 struct dict_type_data type_data = { AVP_TYPE_INTEGER64, "Int64 test" }; | |
191 struct dict_avp_data avp_data = { 73568, 73565, "AVP Test - i64", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_INTEGER64 }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
192 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
193 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) ); |
0 | 194 } |
195 | |
196 { | |
197 struct dict_object * type = NULL; | |
198 struct dict_type_data type_data = { AVP_TYPE_INTEGER32, "Enum32 test" }; | |
199 struct dict_enumval_data val1 = { "i32 const test (val 1)", { .i32 = 1 } }; | |
200 struct dict_enumval_data val2 = { "i32 const test (val 2)", { .i32 = 2 } }; | |
201 struct dict_enumval_data val3 = { "i32 const test (val -5)",{ .i32 = -5 } }; | |
202 struct dict_avp_data avp_data = { 73569, 73565, "AVP Test - enumi32", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_INTEGER32 }; | |
203 | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
204 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
205 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
206 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val1 , type, NULL ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
207 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val2 , type, NULL ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
208 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val3 , type, NULL ) ); |
0 | 209 } |
210 | |
211 { | |
212 struct dict_object * type = NULL; | |
213 struct dict_type_data type_data = { AVP_TYPE_OCTETSTRING, "OS test" }; | |
214 struct dict_avp_data avp_data = { 73570, 73565, "AVP Test - os", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_OCTETSTRING }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
215 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
216 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) ); |
0 | 217 } |
218 | |
219 { | |
220 struct dict_object * type = NULL; | |
221 struct dict_type_data type_data = { AVP_TYPE_OCTETSTRING, "OS enum test" }; | |
222 struct dict_enumval_data val1 = { "os const test (Test)", { .os = { (unsigned char *)"Test", 4 } } }; | |
223 struct dict_enumval_data val2 = { "os const test (waaad)", { .os = { (unsigned char *)"waaad", 5 } } }; | |
224 struct dict_enumval_data val3 = { "os const test (waa)", { .os = { (unsigned char *)"waaad", 3 } } }; | |
225 struct dict_avp_data avp_data = { 73571, 73565, "AVP Test - enumos", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_OCTETSTRING }; | |
226 | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
227 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_TYPE, &type_data , NULL, &type ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
228 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , type, NULL ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
229 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val1 , type, NULL ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
230 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val2 , type, NULL ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
231 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_ENUMVAL, &val3 , type, NULL ) ); |
0 | 232 } |
233 | |
234 { | |
235 struct dict_object * gavp = NULL; | |
236 struct dict_avp_data avp_data = { 73572, 73565, "AVP Test - grouped", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_GROUPED }; | |
237 | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
238 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , NULL, &gavp ) ); |
0 | 239 |
240 /* Macro to search AVP and create a rule */ | |
241 #define ADD_RULE( _parent, _vendor, _avpname, _pos, _min, _max, _ord ) { \ | |
242 struct dict_object * _avp = NULL; \ | |
243 struct dict_avp_request _req = { (_vendor), 0, (_avpname) }; \ | |
244 struct dict_rule_data _data; \ | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
245 CHECK( 0, fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &_req, &_avp, ENOENT));\ |
0 | 246 _data.rule_avp = _avp; \ |
247 _data.rule_position = (_pos); \ | |
248 _data.rule_order = (_ord); \ | |
249 _data.rule_min = (_min); \ | |
250 _data.rule_max = (_max); \ | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
251 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_RULE, &_data , (_parent), NULL ) ); \ |
0 | 252 } |
253 | |
254 ADD_RULE(gavp, 73565, "AVP Test - os", RULE_OPTIONAL, -1, -1, 0); | |
255 | |
256 } | |
257 | |
258 { | |
259 struct dict_object * application = NULL; | |
260 struct dict_object * command = NULL; | |
261 struct dict_cmd_data cmd_data = { 73573, "Test-Command-Request", CMD_FLAG_REQUEST, CMD_FLAG_REQUEST }; | |
262 | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
263 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_APPLICATION, APPLICATION_BY_NAME, "Application test", &application, ENOENT ) ); |
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
264 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_COMMAND, &cmd_data , application, &command ) ); |
0 | 265 ADD_RULE(command, 0, "AVP Test - no vendor - f32", RULE_FIXED_HEAD, -1, 1, 1); |
266 ADD_RULE(command, 73565, "AVP Test - i64", RULE_REQUIRED, -1, -1, 0); | |
267 ADD_RULE(command, 73565, "AVP Test - enumi32", RULE_OPTIONAL, -1, -1, 0); | |
268 ADD_RULE(command, 73565, "AVP Test - os", RULE_OPTIONAL, -1, -1, 0); | |
269 ADD_RULE(command, 73565, "AVP Test - enumos", RULE_OPTIONAL, -1, -1, 0); | |
270 ADD_RULE(command, 73565, "AVP Test - grouped", RULE_OPTIONAL, -1, -1, 0); | |
271 } | |
272 | |
273 { | |
274 struct dict_object * gavp = NULL; | |
275 struct dict_avp_data avp_data = { 73574, 73565, "AVP Test - rules", AVP_FLAG_VENDOR, AVP_FLAG_VENDOR, AVP_TYPE_GROUPED }; | |
276 | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
277 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , NULL, &gavp ) ); |
0 | 278 |
279 ADD_RULE(gavp, 0, "AVP Test - no vendor - f32", RULE_FIXED_HEAD, 0, 1, 1); | |
280 ADD_RULE(gavp, 73565, "AVP Test - i64", RULE_FIXED_HEAD, -1, 1, 2); | |
281 ADD_RULE(gavp, 73565, "AVP Test - enumi32", RULE_FIXED_HEAD, -1, 1, 3); | |
282 ADD_RULE(gavp, 73565, "AVP Test - os", RULE_REQUIRED, 2, 3, 0); | |
283 ADD_RULE(gavp, 73565, "AVP Test - enumos", RULE_OPTIONAL, 0, 1, 0); | |
284 ADD_RULE(gavp, 73565, "AVP Test - grouped", RULE_FIXED_TAIL, -1, 1, 1); | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
285 /* ABNF : |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
286 < no vendor - f32 > |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
287 < i64 > |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
288 < enumi32 > |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
289 2*3 { os } |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
290 *1 [ enumos ] |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
291 < grouped > |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
292 */ |
0 | 293 #if 0 |
294 fd_dict_dump_object ( gavp ); | |
295 #endif | |
296 } | |
297 #if 0 | |
298 { | |
299 fd_dict_dump_object ( vendor ); | |
300 } | |
301 #endif | |
302 } | |
303 | |
304 /* Now create some values and check the length is correctly handled */ | |
305 { | |
306 struct dict_object * cmd_model = NULL; | |
307 struct msg * msg = NULL; | |
308 struct dict_object * avp_model = NULL; | |
309 struct avp * avp = NULL; | |
310 union avp_value value; | |
311 | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
312 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Test-Command-Request", &cmd_model, ENOENT ) ); |
0 | 313 |
314 /* Check an error is trigged if the AVP has no value set */ | |
315 { | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
316 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "AVP Test - no vendor - f32", &avp_model, ENOENT ) ); |
0 | 317 |
318 CHECK( 0, fd_msg_new ( cmd_model, 0, &msg ) ); | |
319 CHECK( 0, fd_msg_avp_new ( avp_model, 0, &avp ) ); | |
320 | |
321 CHECK( 0, fd_msg_avp_add ( msg, MSG_BRW_FIRST_CHILD, avp ) ); | |
322 | |
323 CHECK( EINVAL, fd_msg_update_length ( avp ) ); | |
324 CHECK( EINVAL, fd_msg_update_length ( msg ) ); | |
325 | |
326 CHECK( 0, fd_msg_free( msg ) ); | |
327 } | |
328 | |
329 /* Check the sizes are handled properly */ | |
330 { | |
331 struct avp * avpi = NULL; | |
332 struct avp * avpch = NULL; | |
333 struct avp_hdr * avpdata = NULL; | |
334 struct msg_hdr * msgdata = NULL; | |
335 #define ADD_AVP( _parent, _position, _avpi, _avpvendor, _avpname) { \ | |
336 struct dict_object * _avp = NULL; \ | |
337 struct dict_avp_request _req = { (_avpvendor), 0, (_avpname) }; \ | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
338 CHECK( 0, fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &_req, &_avp, ENOENT));\ |
0 | 339 CHECK( 0, fd_msg_avp_new ( _avp, 0, &_avpi ) ); \ |
340 CHECK( 0, fd_msg_avp_add ( (_parent), (_position), _avpi ) ); \ | |
341 } | |
342 /* Create a message with many AVP inside */ | |
343 CHECK( 0, fd_msg_new ( cmd_model, 0, &msg ) ); | |
344 CHECK( 0, fd_msg_hdr ( msg, &msgdata ) ); | |
345 | |
346 /* Avp no vendor, float32 => size = 12 */ | |
347 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 0, "AVP Test - no vendor - f32" ); | |
348 value.f32 = 3.1415; | |
349 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
350 CHECK( 0, fd_msg_update_length ( avpi ) ); | |
351 #if 0 | |
352 fd_log_debug("AVP no vendor, value 3.1415:\n"); | |
353 fd_msg_dump_one(0, avpi); | |
354 #endif | |
355 CHECK( 0, fd_msg_avp_hdr ( avpi, &avpdata ) ); | |
356 CHECK( 12, avpdata->avp_len ); | |
357 | |
358 /* Check what happens when we delete the value */ | |
359 CHECK( 0, fd_msg_avp_setvalue ( avpi, NULL ) ); | |
360 CHECK( EINVAL, fd_msg_update_length ( avpi ) ); | |
361 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
362 | |
363 /* Add a vendor AVP, integer64 => size = 20 */ | |
364 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 73565, "AVP Test - i64" ); | |
365 value.i64 = 0x123456789abcdeLL; | |
366 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
367 CHECK( 0, fd_msg_update_length ( avpi ) ); | |
368 #if 0 | |
369 fd_log_debug("AVP vendor, value 0x123456789abcdeL:\n"); | |
370 fd_msg_dump_one(0, avpi); | |
371 #endif | |
372 CHECK( 0, fd_msg_avp_hdr ( avpi, &avpdata ) ); | |
373 CHECK( 20, avpdata->avp_len ); | |
374 | |
375 /* Check the size of the message is 20 (header) + 12 + 20 = 52 */ | |
376 CHECK( 0, fd_msg_update_length ( msg ) ); | |
377 CHECK( 52, msgdata->msg_length ); | |
378 | |
379 /* Add an AVP with an enum value */ | |
380 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 73565, "AVP Test - enumi32" ); | |
381 { | |
382 struct dict_object * type_model = NULL; | |
383 struct dict_object * value_model = NULL; | |
384 struct dict_enumval_request request; | |
385 | |
386 CHECK( 0, fd_msg_model ( avpi, &avp_model ) ); | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
387 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_TYPE, TYPE_OF_AVP, avp_model, &type_model, ENOENT ) ); |
0 | 388 memset(&request, 0, sizeof(request)); |
389 request.type_obj = type_model; | |
390 request.search.enum_name = "i32 const test (val 2)"; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
391 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &request, &value_model, ENOENT ) ); |
0 | 392 CHECK( 0, fd_dict_getval ( value_model, &request.search ) ); |
393 CHECK( 0, fd_msg_avp_setvalue ( avpi, &request.search.enum_value ) ); | |
394 #if 0 | |
395 fd_log_debug("AVP enum i32, value 2 (from const):\n"); | |
396 fd_msg_dump_one(0, avpi); | |
397 #endif | |
398 } | |
399 | |
400 /* Add an AVP with an enum value, negative */ | |
401 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 73565, "AVP Test - enumi32" ); | |
402 { | |
403 struct dict_object * type_model = NULL; | |
404 struct dict_object * value_model = NULL; | |
405 struct dict_enumval_request request; | |
406 | |
407 CHECK( 0, fd_msg_model ( avpi, &avp_model ) ); | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
408 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_TYPE, TYPE_OF_AVP, avp_model, &type_model, ENOENT ) ); |
0 | 409 memset(&request, 0, sizeof(request)); |
410 request.type_obj = type_model; | |
411 request.search.enum_name = "i32 const test (val -5)"; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
412 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &request, &value_model, ENOENT ) ); |
0 | 413 CHECK( 0, fd_dict_getval ( value_model, &request.search ) ); |
414 CHECK( 0, fd_msg_avp_setvalue ( avpi, &request.search.enum_value ) ); | |
415 #if 0 | |
416 fd_log_debug("AVP enum i32, value -5 (from const):\n"); | |
417 fd_msg_dump_one(0, avpi); | |
418 #endif | |
419 /* Check the size is correct ( 12 for header + 4 for value ) */ | |
420 CHECK( 0, fd_msg_update_length ( avpi ) ); | |
421 CHECK( 0, fd_msg_avp_hdr ( avpi, &avpdata ) ); | |
422 CHECK( 16, avpdata->avp_len ); | |
423 } | |
424 | |
425 /* Now add a value which is not a constant into an enumerated AVP */ | |
426 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 73565, "AVP Test - enumi32" ); | |
427 value.i32 = -10; | |
428 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
429 CHECK( 0, fd_msg_update_length ( avpi ) ); | |
430 #if 0 | |
431 fd_log_debug("AVP vendor enum i32, value -10 (not const):\n"); | |
432 fd_msg_dump_one(0, avpi); | |
433 #endif | |
434 | |
435 /* Add an octetstring AVP */ | |
436 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 73565, "AVP Test - os" ); | |
437 { | |
438 unsigned char buf[90]; | |
439 memcpy(&buf, "This\0 is a buffer of dat\a. It is not a string so we can have any c\0ntr\0l character here...\0\0", 89); | |
440 value.os.data = buf; | |
441 value.os.len = 89; | |
442 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
443 memset(&buf, 0, sizeof(buf)); /* Test that the OS value is really copied */ | |
444 CHECK( 0, fd_msg_update_length ( avpi ) ); | |
2
d8ce06172629
Added a global debug level var
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
1
diff
changeset
|
445 #if 0 |
0 | 446 fd_log_debug("AVP octet string, 'This\\0 is a b...'\n"); |
447 fd_msg_dump_one(0, avpi); | |
448 #endif | |
449 CHECK( 0, fd_msg_avp_hdr ( avpi, &avpdata ) ); | |
450 CHECK( 101, avpdata->avp_len ); | |
451 CHECK( 'T', avpdata->avp_value->os.data[0] ); | |
452 CHECK( 'i', avpdata->avp_value->os.data[6] ); | |
453 } | |
454 | |
455 /* Check the size of the message is 20 (header) + 12 + 20 + 16 * 3 + 101 + 3 (padding) = 204 */ | |
456 CHECK( 0, fd_msg_update_length ( msg ) ); | |
457 CHECK( 204, msgdata->msg_length ); | |
458 | |
459 /* Add an octetstring from an enumerated constant */ | |
460 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 73565, "AVP Test - enumos" ); | |
461 { | |
462 struct dict_object * type_model = NULL; | |
463 struct dict_object * value_model = NULL; | |
464 struct dict_enumval_request request; | |
465 | |
466 CHECK( 0, fd_msg_model ( avpi, &avp_model ) ); | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
467 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_TYPE, TYPE_OF_AVP, avp_model, &type_model, ENOENT ) ); |
0 | 468 memset(&request, 0, sizeof(request)); |
469 request.type_obj = type_model; | |
470 request.search.enum_name = "os const test (waaad)"; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
471 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &request, &value_model, ENOENT ) ); |
0 | 472 CHECK( 0, fd_dict_getval ( value_model, &request.search ) ); |
473 CHECK( 0, fd_msg_avp_setvalue ( avpi, &request.search.enum_value ) ); | |
474 #if 0 | |
475 fd_log_debug("AVP Enumuerated OctetString (from const):\n"); | |
476 fd_msg_dump_one(0, avpi); | |
477 #endif | |
478 /* Check the size is correct ( 12 for header + 5 for value ) */ | |
479 CHECK( 0, fd_msg_update_length ( avpi ) ); | |
480 CHECK( 0, fd_msg_avp_hdr ( avpi, &avpdata ) ); | |
481 CHECK( 17, avpdata->avp_len ); | |
482 } | |
483 | |
484 /* Add an octetstring from an enumerated constant */ | |
485 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 73565, "AVP Test - enumos" ); | |
486 { | |
487 struct dict_object * type_model = NULL; | |
488 struct dict_object * value_model = NULL; | |
489 struct dict_enumval_request request; | |
490 | |
491 CHECK( 0, fd_msg_model ( avpi, &avp_model ) ); | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
492 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_TYPE, TYPE_OF_AVP, avp_model, &type_model, ENOENT ) ); |
0 | 493 memset(&request, 0, sizeof(request)); |
494 request.type_obj = type_model; | |
495 request.search.enum_name = "os const test (waa)"; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
496 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_ENUMVAL, ENUMVAL_BY_STRUCT, &request, &value_model, ENOENT ) ); |
0 | 497 CHECK( 0, fd_dict_getval ( value_model, &request.search ) ); |
498 CHECK( 0, fd_msg_avp_setvalue ( avpi, &request.search.enum_value ) ); | |
499 #if 0 | |
500 fd_log_debug("AVP Enumuerated OctetString (from const):\n"); | |
501 fd_msg_dump_one(0, avpi); | |
502 #endif | |
503 /* Check the size is correct ( 12 for header + 3 for value ) */ | |
504 CHECK( 0, fd_msg_update_length ( avpi ) ); | |
505 CHECK( 0, fd_msg_avp_hdr ( avpi, &avpdata ) ); | |
506 CHECK( 15, avpdata->avp_len ); | |
507 } | |
508 | |
509 | |
510 /* Check the size of the message is 20 (header) + 12 + 20 + 16 * 3 + (101 + 3) + (17 + 3) + (15 + 1) = 240 */ | |
511 CHECK( 0, fd_msg_update_length ( msg ) ); | |
512 CHECK( 240, msgdata->msg_length ); | |
513 | |
514 /* Now test the grouped AVPs */ | |
515 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 73565, "AVP Test - grouped" ); | |
516 ADD_AVP( avpi, MSG_BRW_LAST_CHILD, avpch, 73565, "AVP Test - os" ); | |
517 { | |
518 value.os.data = (unsigned char *)"12345678"; | |
519 value.os.len = 8; | |
520 CHECK( 0, fd_msg_avp_setvalue ( avpch, &value ) ); | |
521 #if 0 | |
522 fd_log_debug("AVP octet string, '1234678'\n"); | |
523 fd_msg_dump_one(0, avpch); | |
524 #endif | |
525 CHECK( 0, fd_msg_update_length ( avpch ) ); | |
526 CHECK( 0, fd_msg_avp_hdr ( avpch, &avpdata ) ); | |
527 CHECK( 20, avpdata->avp_len ); | |
528 } | |
529 ADD_AVP( avpi, MSG_BRW_LAST_CHILD, avpch, 73565, "AVP Test - os" ); | |
530 { | |
531 value.os.data = (unsigned char *)"123456789"; | |
532 value.os.len = 9; | |
533 CHECK( 0, fd_msg_avp_setvalue ( avpch, &value ) ); | |
534 #if 0 | |
535 fd_log_debug("AVP octet string, '12346789'\n"); | |
536 fd_msg_dump_one(0, avpch); | |
537 #endif | |
538 } | |
539 | |
540 /* Check the size is updated recursively: (gavp hdr: 12) + (avp1: 20) + (avp2: 21 + 3) = 56 */ | |
541 CHECK( 0, fd_msg_update_length ( avpi ) ); | |
542 CHECK( 0, fd_msg_avp_hdr ( avpi, &avpdata ) ); | |
543 CHECK( 56, avpdata->avp_len ); | |
544 | |
545 /* Add another similar grouped AVP, to have lot of padding */ | |
546 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 73565, "AVP Test - grouped" ); | |
547 ADD_AVP( avpi, MSG_BRW_LAST_CHILD, avpch, 73565, "AVP Test - os" ); | |
548 { | |
549 value.os.data = (unsigned char *)"1"; | |
550 value.os.len = 1; | |
551 CHECK( 0, fd_msg_avp_setvalue ( avpch, &value ) ); | |
552 } | |
553 ADD_AVP( avpi, MSG_BRW_LAST_CHILD, avpch, 73565, "AVP Test - os" ); | |
554 { | |
555 value.os.data = (unsigned char *)"1234567"; | |
556 value.os.len = 7; | |
557 CHECK( 0, fd_msg_avp_setvalue ( avpch, &value ) ); | |
558 } | |
559 | |
560 /* Now check the global size of the message, if padding is correctly handled */ | |
561 /* size = 20 (header) + 12 + 20 + 16 * 3 + (101 + 3) + (17 + 3) + (15 + 1) | |
562 * + ( 12 + ( 20 + 21) + 3 ) # padding for the grouped AVP = 3 | |
563 * + ( 12 + ( (13 + 3) + 19 ) + 1 ) # and 1 for this one | |
564 * size = 240 + 56 + 48 = 344 | |
565 */ | |
566 CHECK( 0, fd_msg_update_length ( msg ) ); | |
567 #if 0 | |
568 fd_msg_dump_walk(0, msg); | |
569 #endif | |
570 CHECK( 344, msgdata->msg_length ); | |
571 | |
572 /* Set the application to the test application: 73566 */ | |
573 msgdata->msg_appl = 73566; | |
574 | |
575 /* Set the hop-by-hop ID to a random value: 0x4b44b41d */ | |
576 msgdata->msg_hbhid = 0x4b44b41d; | |
577 /* Set the end-to-end ID to a random value: 0xe2ee2e1d */ | |
578 msgdata->msg_eteid = 0xe2ee2e1d; | |
579 } | |
580 | |
581 /* Test the msg_bufferize function */ | |
582 { | |
583 | |
584 CHECK( 0, fd_msg_bufferize( msg, &buf, NULL ) ); | |
585 | |
586 /* Test the first bytes */ | |
587 CHECK( 0x01, buf[0] ); /* Version */ | |
588 CHECK( 0x00, buf[1] ); /* Length: 344 = 0x000158 */ | |
589 CHECK( 0x01, buf[2] ); | |
590 CHECK( 0x58, buf[3] ); | |
591 CHECK( 0x80, buf[4] ); /* flags: only "R" is set. */ | |
592 CHECK( 0x01, buf[5] ); /* Command code: 73573 = 0x011F65 */ | |
593 CHECK( 0x1F, buf[6] ); | |
594 CHECK( 0x65, buf[7] ); | |
595 CHECK( 0x00, buf[8] ); /* App ID: 73566 = 0x00011F5E */ | |
596 CHECK( 0x01, buf[9] ); | |
597 CHECK( 0x1F, buf[10] ); | |
598 CHECK( 0x5E, buf[11] ); | |
599 CHECK( 0x4b, buf[12] ); /* hop-by-hop id: 0x4b44b41d */ | |
600 CHECK( 0x44, buf[13] ); | |
601 CHECK( 0xb4, buf[14] ); | |
602 CHECK( 0x1d, buf[15] ); | |
603 CHECK( 0xe2, buf[16] ); /* end-to-end id: 0xe2ee2e1d */ | |
604 CHECK( 0xee, buf[17] ); | |
605 CHECK( 0x2e, buf[18] ); | |
606 CHECK( 0x1d, buf[19] ); | |
607 | |
608 CHECK( 0x00, buf[20] ); /* First AVP (AVP Test - no vendor - f32) begin: code 73567 = 0x00011F5F */ | |
609 CHECK( 0x01, buf[21] ); | |
610 CHECK( 0x1F, buf[22] ); | |
611 CHECK( 0x5F, buf[23] ); | |
612 CHECK( 0x00, buf[24] ); /* flags: 0 */ | |
613 CHECK( 0x00, buf[25] ); /* length: 12 = 0x00000c */ | |
614 CHECK( 0x00, buf[26] ); | |
615 CHECK( 0x0C, buf[27] ); | |
616 CHECK( 0x40, buf[28] ); /* Value: 3.1415: sign = '+' => most significant bit = 0 */ | |
617 CHECK( 0x49, buf[29] ); /* 2 <= 3.1415 < 4 => exponent = 1 => biaised (on 8 bits) = (decimal) 128 = (binary) 100 0000 0 */ | |
618 CHECK( 0x0e, buf[30] ); /* significand = (decimal) 1.57075 = (binary) 1.100 1001 0000 1110 0101 0110 */ | |
619 CHECK( 0x56, buf[31] ); /* total => 0100 0000 0100 1001 0000 1110 0101 0110 = (hexa) 40 49 0e 56*/ | |
620 | |
621 /* The other AVPs will be tested by successful parsing... */ | |
622 } | |
623 | |
624 /* Now free the message, we keep only the buffer. */ | |
625 CHECK( 0, fd_msg_free( msg ) ); | |
626 | |
627 } | |
628 | |
629 /* Test the parsing of buffers and messages */ | |
630 { | |
631 unsigned char * buf_cpy = NULL; | |
632 struct msg * msg; | |
633 | |
634 #define CPYBUF() { \ | |
635 buf_cpy = malloc(344); \ | |
636 CHECK( buf_cpy ? 1 : 0, 1); \ | |
637 memcpy(buf_cpy, buf, 344); \ | |
638 } | |
639 | |
640 /* Test the msg_parse_buffer function */ | |
641 { | |
642 CPYBUF(); | |
643 CHECK( EBADMSG, fd_msg_parse_buffer( &buf_cpy, 340, &msg) ); | |
644 | |
645 CPYBUF(); | |
646 CHECK( 0, fd_msg_parse_buffer( &buf_cpy, 344, &msg) ); | |
647 #if 0 | |
648 fd_msg_dump_walk(0, msg); | |
649 #endif | |
650 | |
651 /* reinit the msg */ | |
652 CHECK( 0, fd_msg_free ( msg ) ); | |
653 | |
654 } | |
655 | |
656 /* Test the fd_msg_search_avp function */ | |
657 { | |
658 struct dict_object * avp_model; | |
659 struct avp * found; | |
660 struct avp_hdr * avpdata = NULL; | |
661 | |
662 /* Now find the ACR dictionary object */ | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
663 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "AVP Test - no vendor - f32", &avp_model, ENOENT ) ); |
0 | 664 |
665 CPYBUF(); | |
666 CHECK( 0, fd_msg_parse_buffer( &buf_cpy, 344, &msg) ); | |
667 | |
668 /* Search this AVP instance in the msg */ | |
669 CHECK( 0, fd_msg_search_avp( msg, avp_model, &found ) ); | |
670 | |
671 /* Check the AVP value is 3.1415 */ | |
672 CHECK( 0, fd_msg_avp_hdr ( found, &avpdata ) ); | |
673 CHECK( 3.1415F, avpdata->avp_value->f32 ); | |
674 | |
675 /* reinit the msg */ | |
676 CHECK( 0, fd_msg_free ( msg ) ); | |
677 | |
678 } | |
679 | |
680 /* Test the msg_parse_dict function */ | |
681 { | |
682 /* Test with an unknown command code */ | |
683 { | |
684 CPYBUF(); | |
685 | |
686 /* Change the command-code */ | |
687 buf_cpy[5] = 0x11; | |
688 CHECK( 0, fd_msg_parse_buffer( &buf_cpy, 344, &msg) ); | |
114
5b3868944e2b
Reporting errors in parse_dict function
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
35
diff
changeset
|
689 CHECK( ENOTSUP, fd_msg_parse_dict( msg, fd_g_config->cnf_dict, NULL ) ); |
0 | 690 |
691 /* reset */ | |
692 CHECK( 0, fd_msg_free ( msg ) ); | |
693 } | |
694 | |
695 /* Test with an unknown Mandatory AVP */ | |
696 { | |
697 CPYBUF(); | |
698 | |
699 buf_cpy[20] = 0x11; /* New AVP code = 0x11011F5F, undefined */ | |
700 buf_cpy[24] = 0x40; /* Add the 'M' flag */ | |
701 | |
702 /* Check that we cannot support this message now */ | |
703 CHECK( 0, fd_msg_parse_buffer( &buf_cpy, 344, &msg) ); | |
114
5b3868944e2b
Reporting errors in parse_dict function
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
35
diff
changeset
|
704 CHECK( ENOTSUP, fd_msg_parse_dict( msg, fd_g_config->cnf_dict, NULL ) ); |
0 | 705 |
706 /* reset */ | |
707 CHECK( 0, fd_msg_free ( msg ) ); | |
708 } | |
709 | |
710 /* Test with an unknown optional AVP */ | |
711 { | |
712 CPYBUF(); | |
713 | |
714 buf_cpy[20] = 0x11; /* New AVP code = 0x11011F5F, undefined */ | |
715 | |
716 /* Check that we can support this message now */ | |
717 CHECK( 0, fd_msg_parse_buffer( &buf_cpy, 344, &msg) ); | |
114
5b3868944e2b
Reporting errors in parse_dict function
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
35
diff
changeset
|
718 CHECK( 0, fd_msg_parse_dict( msg, fd_g_config->cnf_dict, NULL ) ); |
0 | 719 |
720 #if 0 | |
721 fd_msg_dump_walk(0, msg); | |
722 #endif | |
723 | |
724 /* reset */ | |
725 CHECK( 0, fd_msg_free ( msg ) ); | |
726 } | |
727 | |
728 CHECK( 0, fd_msg_parse_buffer( &buf, 344, &msg) ); | |
114
5b3868944e2b
Reporting errors in parse_dict function
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
35
diff
changeset
|
729 CHECK( 0, fd_msg_parse_dict( msg, fd_g_config->cnf_dict, NULL ) ); |
0 | 730 #if 0 |
731 fd_msg_dump_walk(0, msg); | |
732 #endif | |
733 } | |
734 | |
735 /* Now test the msg_parse_rule function */ | |
736 { | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
737 struct fd_pei pei; |
0 | 738 |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
739 CHECK( 0, fd_msg_parse_rules( msg, fd_g_config->cnf_dict, &pei ) ); |
0 | 740 |
741 /* Use the "AVP Test - rules" AVP to test the rules */ | |
742 { | |
743 struct avp * tavp = NULL; | |
744 struct avp * tempavp = NULL; | |
745 struct avp * childavp = NULL; | |
746 | |
747 ADD_AVP( msg, MSG_BRW_LAST_CHILD, tavp, 73565, "AVP Test - rules" ); | |
748 | |
749 /* Create a conforming message first */ | |
750 ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 0, "AVP Test - no vendor - f32" ); | |
751 ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - i64" ); | |
752 ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - enumi32" ); | |
753 ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - os" ); | |
754 ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - os" ); | |
755 ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - grouped" ); | |
756 | |
757 /* Check the message is still conform */ | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
758 CHECK( 0, fd_msg_parse_rules( msg, fd_g_config->cnf_dict, &pei ) ); |
0 | 759 |
760 /* The first avp is optional in fixed position, so remove it and check the message is still OK */ | |
761 CHECK( 0, fd_msg_browse ( tavp, MSG_BRW_FIRST_CHILD, &childavp, NULL) ); | |
762 CHECK( 0, fd_msg_free ( childavp ) ); | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
763 CHECK( 0, fd_msg_parse_rules( msg, fd_g_config->cnf_dict, &pei ) ); |
0 | 764 ADD_AVP( tavp, MSG_BRW_FIRST_CHILD, childavp, 0, "AVP Test - no vendor - f32" ); |
765 | |
766 | |
767 /* Now break some rules and check it is detected */ | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
768 #define CHECK_CONFLICT( _msg, _error, _conflictavp_name, _conflictavp_vnd ) { \ |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
769 struct fd_pei _pei; \ |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
770 CHECK( EBADMSG, fd_msg_parse_rules( _msg, fd_g_config->cnf_dict, &_pei ) ); \ |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
771 if (_error) { \ |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
772 CHECK( 0, strcmp( _error, _pei.pei_errcode ) ); \ |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
773 } \ |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
774 if ((_conflictavp_name) == NULL) { \ |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
775 CHECK( NULL, _pei.pei_avp); \ |
0 | 776 } else { \ |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
777 struct dict_avp_request _req = { (_conflictavp_vnd), 0, (_conflictavp_name) }; \ |
0 | 778 struct dict_object * _avp; \ |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
779 struct dict_object * _conflict; \ |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
780 CHECK( 1, (_pei.pei_avp) ? 1 : 0 ); \ |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
781 CHECK( 0, fd_msg_model( _pei.pei_avp, &_conflict ) ); \ |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
782 CHECK( 0, fd_dict_search( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_AND_VENDOR, &_req, &_avp, ENOENT)); \ |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
783 CHECK( _avp, _conflict ); \ |
0 | 784 } \ |
785 } | |
786 | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
787 /* ABNF : |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
788 < no vendor - f32 > |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
789 < i64 > |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
790 < enumi32 > |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
791 2*3 { os } |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
792 *1 [ enumos ] |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
793 < grouped > |
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
794 */ |
0 | 795 { |
796 /* Test the FIXED_HEAD rules positions: add another AVP before the third */ | |
797 CHECK( 0, fd_msg_browse ( tavp, MSG_BRW_FIRST_CHILD, &tempavp, NULL) ); /* tempavp is the novendor avp */ | |
798 CHECK( 0, fd_msg_browse ( tempavp, MSG_BRW_NEXT, &tempavp, NULL) ); /* tempavp is the i64 avp */ | |
799 ADD_AVP( tempavp, MSG_BRW_NEXT, childavp, 73565, "AVP Test - os" ); | |
800 | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
801 CHECK_CONFLICT( msg, "DIAMETER_MISSING_AVP", "AVP Test - enumi32", 73565 ); |
0 | 802 |
803 /* Now remove this AVP */ | |
804 CHECK( 0, fd_msg_free ( childavp ) ); | |
805 } | |
806 { | |
807 /* Remove the third AVP, same rule must conflict */ | |
808 CHECK( 0, fd_msg_browse ( tempavp, MSG_BRW_NEXT, &childavp, NULL) ); /* childavp is the enumi32 avp */ | |
809 CHECK( 0, fd_msg_free ( childavp ) ); | |
810 | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
811 CHECK_CONFLICT( msg, "DIAMETER_MISSING_AVP", "AVP Test - enumi32", 73565 ); |
0 | 812 |
813 /* Add the AVP back */ | |
814 ADD_AVP( tempavp, MSG_BRW_NEXT, childavp, 73565, "AVP Test - enumi32" ); | |
815 } | |
816 | |
817 { | |
818 /* Test the minimum value in the REQUIRED rule: delete one of the os AVPs */ | |
819 CHECK( 0, fd_msg_browse ( childavp, MSG_BRW_NEXT, &tempavp, NULL) ); /* tempavp is the os avp */ | |
820 CHECK( 0, fd_msg_free ( tempavp ) ); | |
821 | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
822 CHECK_CONFLICT( msg, "DIAMETER_MISSING_AVP", "AVP Test - os", 73565 ); /* The rule requires at least 2 AVP, we have only 1 */ |
0 | 823 |
824 /* Now add this AVP */ | |
825 ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - os" ); | |
826 } | |
827 { | |
828 /* Test the maximum value in the REQUIRED rule: add more of the os AVPs */ | |
829 ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - os" ); | |
830 ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - os" ); | |
831 | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
832 CHECK_CONFLICT( msg, "DIAMETER_AVP_OCCURS_TOO_MANY_TIMES", "AVP Test - os", 73565 ); /* The rule requires at most 3 AVP, we have 4 */ |
0 | 833 |
834 /* Now delete these AVP */ | |
835 CHECK( 0, fd_msg_free ( tempavp ) ); | |
836 CHECK( 0, fd_msg_browse ( childavp, MSG_BRW_NEXT, &tempavp, NULL) ); | |
837 CHECK( 0, fd_msg_free ( tempavp ) ); | |
838 } | |
839 | |
840 { | |
841 /* Test the maximum value in the OPTIONAL rule: add 2 enumos AVPs */ | |
842 ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - enumos" ); | |
843 | |
844 /* The message is still conform */ | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
845 CHECK( 0, fd_msg_parse_rules( msg, fd_g_config->cnf_dict, &pei ) ); |
0 | 846 |
847 /* Now break the rule */ | |
848 ADD_AVP( childavp, MSG_BRW_NEXT, tempavp, 73565, "AVP Test - enumos" ); | |
849 | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
850 CHECK_CONFLICT( msg, "DIAMETER_AVP_OCCURS_TOO_MANY_TIMES", "AVP Test - enumos", 73565 ); |
0 | 851 |
852 /* Now delete this AVP */ | |
853 CHECK( 0, fd_msg_free ( tempavp ) ); | |
854 } | |
855 | |
856 { | |
857 /* Test the RULE_FIXED_TAIL rules positions: add another AVP at the end */ | |
858 ADD_AVP( tavp, MSG_BRW_LAST_CHILD, childavp, 73565, "AVP Test - os" ); | |
859 | |
35
6486e97f56ae
Added test for modified message parsing
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
10
diff
changeset
|
860 CHECK_CONFLICT( msg, "DIAMETER_MISSING_AVP", "AVP Test - grouped", 73565 ); |
0 | 861 |
862 /* Now remove this AVP */ | |
863 CHECK( 0, fd_msg_free ( childavp ) ); | |
864 } | |
865 } | |
866 } | |
867 } | |
868 | |
869 /* Test the msg_avp_value_interpret and msg_avp_value_encode functions. use the Address type and Host-IP-Address AVPs */ | |
870 { | |
871 struct dict_object * cer_model = NULL; | |
872 struct msg * cer = NULL; | |
873 | |
874 struct dict_object * hia_model = NULL; | |
875 struct avp *avp4, *avp6; | |
876 #define TEST_IP4 "192.168.100.101" | |
877 char buf4[INET_ADDRSTRLEN]; | |
878 #define TEST_IP6 "1111:2222:3333:4444:1234:5678:9abc:def0" | |
879 char buf6[INET6_ADDRSTRLEN]; | |
880 | |
881 struct sockaddr_storage ss; | |
882 struct sockaddr_in sin, *psin; | |
883 struct sockaddr_in6 sin6, *psin6; | |
884 | |
885 /* Find the CER dictionary object */ | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
886 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Capabilities-Exchange-Request", &cer_model, ENOENT ) ); |
0 | 887 |
888 /* Now find the Host-IP-Address dictionary object */ | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
889 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Host-IP-Address", &hia_model, ENOENT ) ); |
0 | 890 |
891 /* Create the msg instance */ | |
892 CHECK( 0, fd_msg_new ( cer_model, 0, &cer ) ); | |
893 | |
894 /* Create the avp instances */ | |
895 CHECK( 0, fd_msg_avp_new ( hia_model, 0, &avp4 ) ); | |
896 CHECK( 0, fd_msg_avp_new ( hia_model, 0, &avp6 ) ); | |
897 | |
898 /* Set the value of the IP avp */ | |
899 sin.sin_family = AF_INET; | |
900 CHECK( 1, inet_pton( AF_INET, TEST_IP4, &sin.sin_addr.s_addr ) ); | |
901 CHECK( 0, fd_msg_avp_value_encode ( &sin, avp4 ) ); | |
902 | |
903 /* Set the value of the IP6 avp */ | |
904 sin6.sin6_family = AF_INET6; | |
905 CHECK( 1, inet_pton( AF_INET6, TEST_IP6, &sin6.sin6_addr.s6_addr ) ); | |
906 CHECK( 0, fd_msg_avp_value_encode ( &sin6, avp6 ) ); | |
907 | |
908 /* Add these AVPs in the message */ | |
909 CHECK( 0, fd_msg_avp_add( cer, MSG_BRW_LAST_CHILD, avp4) ); | |
910 CHECK( 0, fd_msg_avp_add( cer, MSG_BRW_LAST_CHILD, avp6) ); | |
911 | |
912 /* Create the buffer for this message */ | |
913 CHECK( 0, fd_msg_bufferize( cer, &buf, NULL ) ); | |
914 | |
915 /* Now free the message, we keep only the buffer. */ | |
916 CHECK( 0, fd_msg_free( cer ) ); | |
917 | |
918 /* Check the content of the buffer is correct (skip command header) */ | |
919 CHECK( 0x00, buf[20] ); /* First AVP (IP4) begins: code 257 = 0x00000101 */ | |
920 CHECK( 0x00, buf[21] ); | |
921 CHECK( 0x01, buf[22] ); | |
922 CHECK( 0x01, buf[23] ); | |
923 CHECK( 0x40, buf[24] ); /* flags: M */ | |
924 CHECK( 0x00, buf[25] ); /* length: 8+6 = 0x00000e */ | |
925 CHECK( 0x00, buf[26] ); | |
926 CHECK( 0x0E, buf[27] ); | |
927 CHECK( 0x00, buf[28] ); /* Value: AddressType 1 */ | |
928 CHECK( 0x01, buf[29] ); | |
929 CHECK( 192, buf[30] ); /* 192.168.100.101 */ | |
930 CHECK( 168, buf[31] ); | |
931 CHECK( 100, buf[32] ); | |
932 CHECK( 101, buf[33] ); | |
933 | |
934 CHECK( 0x00, buf[34] ); /* Padding */ | |
935 CHECK( 0x00, buf[35] ); | |
936 | |
937 CHECK( 0x00, buf[36] ); /* Second AVP (IP6) begins: code 257 = 0x00000101 */ | |
938 CHECK( 0x00, buf[37] ); | |
939 CHECK( 0x01, buf[38] ); | |
940 CHECK( 0x01, buf[39] ); | |
941 CHECK( 0x40, buf[40] ); /* flags: M */ | |
942 CHECK( 0x00, buf[41] ); /* length: 8+18 = 0x00001a */ | |
943 CHECK( 0x00, buf[42] ); | |
944 CHECK( 0x1A, buf[43] ); | |
945 CHECK( 0x00, buf[44] ); /* Value: AddressType 2 */ | |
946 CHECK( 0x02, buf[45] ); | |
947 CHECK( 0x11, buf[46] ); /* 1111:2222:3333:4444:1234:5678:9abc:def0 */ | |
948 CHECK( 0x11, buf[47] ); | |
949 CHECK( 0x22, buf[48] ); | |
950 CHECK( 0x22, buf[49] ); | |
951 CHECK( 0x33, buf[50] ); | |
952 CHECK( 0x33, buf[51] ); | |
953 CHECK( 0x44, buf[52] ); | |
954 CHECK( 0x44, buf[53] ); | |
955 CHECK( 0x12, buf[54] ); | |
956 CHECK( 0x34, buf[55] ); | |
957 CHECK( 0x56, buf[56] ); | |
958 CHECK( 0x78, buf[57] ); | |
959 CHECK( 0x9a, buf[58] ); | |
960 CHECK( 0xbc, buf[59] ); | |
961 CHECK( 0xde, buf[60] ); | |
962 CHECK( 0xf0, buf[61] ); | |
963 | |
964 /* Ok, now let's recreate the message */ | |
965 CHECK( 0, fd_msg_parse_buffer( &buf, 64, &cer) ); | |
114
5b3868944e2b
Reporting errors in parse_dict function
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
35
diff
changeset
|
966 CHECK( 0, fd_msg_parse_dict( cer, fd_g_config->cnf_dict, NULL ) ); |
0 | 967 |
968 /* Get the pointers to the first and last AVP */ | |
969 CHECK( 0, fd_msg_browse( cer, MSG_BRW_FIRST_CHILD, &avp4, NULL) ); | |
970 CHECK( 0, fd_msg_browse( cer, MSG_BRW_LAST_CHILD, &avp6, NULL) ); | |
971 | |
972 /* Try and interpret the data in the AVPs */ | |
973 CHECK( 0, fd_msg_avp_value_interpret ( avp4, &ss ) ); | |
974 psin = (struct sockaddr_in *)&ss; | |
975 CHECK( AF_INET, psin->sin_family ); | |
976 CHECK( 0, (inet_ntop( AF_INET, &psin->sin_addr.s_addr, buf4, sizeof(buf4) ) == NULL) ? errno : 0 ); | |
977 CHECK( 0, strcmp( buf4, TEST_IP4 ) ); | |
978 | |
979 CHECK( 0, fd_msg_avp_value_interpret ( avp6, &ss ) ); | |
980 psin6 = (struct sockaddr_in6 *)&ss; | |
981 CHECK( AF_INET6, psin6->sin6_family ); | |
982 CHECK( 0, (inet_ntop( AF_INET6, &psin6->sin6_addr.s6_addr, buf6, sizeof(buf6) ) == NULL) ? errno : 0 ); | |
983 CHECK( 0, strcasecmp( buf6, TEST_IP6 ) ); | |
984 | |
985 /* Ok, it's done */ | |
986 CHECK( 0, fd_msg_free( cer ) ); | |
987 } | |
988 | |
989 /* Check proper encoding / decoding for all basic types of AVP */ | |
990 { | |
991 { | |
992 struct dict_avp_data avp_data = { 91001, 0, "AVP Test 2 - os", 0, 0, AVP_TYPE_OCTETSTRING }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
993 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , NULL, NULL ) ); |
0 | 994 } |
995 { | |
996 struct dict_avp_data avp_data = { 91002, 0, "AVP Test 2 - i32", 0, 0, AVP_TYPE_INTEGER32 }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
997 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , NULL, NULL ) ); |
0 | 998 } |
999 { | |
1000 struct dict_avp_data avp_data = { 91003, 0, "AVP Test 2 - i64", 0, 0, AVP_TYPE_INTEGER64 }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
1001 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , NULL, NULL ) ); |
0 | 1002 } |
1003 { | |
1004 struct dict_avp_data avp_data = { 91004, 0, "AVP Test 2 - u32", 0, 0, AVP_TYPE_UNSIGNED32 }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
1005 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , NULL, NULL ) ); |
0 | 1006 } |
1007 { | |
1008 struct dict_avp_data avp_data = { 91005, 0, "AVP Test 2 - u64", 0, 0, AVP_TYPE_UNSIGNED64 }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
1009 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , NULL, NULL ) ); |
0 | 1010 } |
1011 { | |
1012 struct dict_avp_data avp_data = { 91006, 0, "AVP Test 2 - f32", 0, 0, AVP_TYPE_FLOAT32 }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
1013 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , NULL, NULL ) ); |
0 | 1014 } |
1015 { | |
1016 struct dict_avp_data avp_data = { 91007, 0, "AVP Test 2 - f64", 0, 0, AVP_TYPE_FLOAT64 }; | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
1017 CHECK( 0, fd_dict_new ( fd_g_config->cnf_dict, DICT_AVP, &avp_data , NULL, NULL ) ); |
0 | 1018 } |
1019 | |
1020 { | |
1021 struct dict_object * cmd_model = NULL; | |
1022 struct msg * msg = NULL; | |
1023 struct avp * avp = NULL; | |
1024 union avp_value value; | |
1025 struct avp * avpi = NULL; | |
1026 struct avp_hdr * avpdata = NULL; | |
1027 struct msg_hdr * msgdata = NULL; | |
1028 | |
10
c5c99c73c2bf
Added some extensions and functions in the daemon
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
8
diff
changeset
|
1029 CHECK( 0, fd_dict_search ( fd_g_config->cnf_dict, DICT_COMMAND, CMD_BY_NAME, "Test-Command-Request", &cmd_model, ENOENT ) ); |
0 | 1030 |
1031 /* Create a message */ | |
1032 CHECK( 0, fd_msg_new ( cmd_model, 0, &msg ) ); | |
1033 CHECK( 0, fd_msg_hdr ( msg, &msgdata ) ); | |
1034 | |
1035 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 0, "AVP Test 2 - os" ); | |
1036 value.os.data = (unsigned char *) "waaad"; | |
1037 value.os.len = 6; | |
1038 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
1039 | |
1040 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 0, "AVP Test 2 - i32" ); | |
1041 value.i32 = 0x123456; | |
1042 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
1043 | |
1044 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 0, "AVP Test 2 - i32" ); | |
1045 value.i32 = -0x123456; | |
1046 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
1047 | |
1048 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 0, "AVP Test 2 - i64" ); | |
1049 value.i64 = 0x11223344556677LL; | |
1050 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
1051 | |
1052 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 0, "AVP Test 2 - i64" ); | |
1053 value.i64 = -0x11223344556677LL; | |
1054 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
1055 | |
1056 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 0, "AVP Test 2 - u32" ); | |
1057 value.u32 = 0xFEDCBA98; | |
1058 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
1059 | |
1060 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 0, "AVP Test 2 - u64" ); | |
1061 value.u64 = 0x123456789abcdef0LL; | |
1062 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
1063 | |
1064 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 0, "AVP Test 2 - f32" ); | |
1065 value.f32 = 2097153.0F; | |
1066 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
1067 | |
1068 ADD_AVP( msg, MSG_BRW_LAST_CHILD, avpi, 0, "AVP Test 2 - f64" ); | |
1069 value.f64 = -1099511627777LL; | |
1070 CHECK( 0, fd_msg_avp_setvalue ( avpi, &value ) ); | |
1071 | |
1072 /* Ok now bufferize */ | |
1073 CHECK( 0, fd_msg_bufferize( msg, &buf, NULL ) ); | |
1074 | |
1075 /* Test the first bytes */ | |
1076 CHECK( 0x01, buf[0] ); /* Version */ | |
1077 CHECK( 0x00, buf[1] ); /* Length: 148 = 0x000094 */ | |
1078 CHECK( 0x00, buf[2] ); | |
1079 CHECK( 0x94, buf[3] ); | |
1080 CHECK( 0x80, buf[4] ); /* flags: only "R" is set. */ | |
1081 CHECK( 0x01, buf[5] ); /* Command code: 73573 = 0x011F65 */ | |
1082 CHECK( 0x1F, buf[6] ); | |
1083 CHECK( 0x65, buf[7] ); | |
1084 CHECK( 0x00, buf[8] ); /* App ID */ | |
1085 CHECK( 0x01, buf[9] ); | |
1086 CHECK( 0x1F, buf[10] ); | |
1087 CHECK( 0x5E, buf[11] ); | |
1088 CHECK( 0x00, buf[12] ); /* hop-by-hop id */ | |
1089 CHECK( 0x00, buf[13] ); | |
1090 CHECK( 0x00, buf[14] ); | |
1091 CHECK( 0x00, buf[15] ); | |
1092 CHECK( 0x00, buf[16] ); /* end-to-end id */ | |
1093 CHECK( 0x00, buf[17] ); | |
1094 CHECK( 0x00, buf[18] ); | |
1095 CHECK( 0x00, buf[19] ); | |
1096 | |
1097 CHECK( 0x00, buf[20] ); /* First AVP (AVP Test 2 - os) begin: code 91001 = 0x00016379 */ | |
1098 CHECK( 0x01, buf[21] ); | |
1099 CHECK( 0x63, buf[22] ); | |
1100 CHECK( 0x79, buf[23] ); | |
1101 CHECK( 0x00, buf[24] ); /* flags: 0 */ | |
1102 CHECK( 0x00, buf[25] ); /* length: 14 = 0x00000e */ | |
1103 CHECK( 0x00, buf[26] ); | |
1104 CHECK( 0x0e, buf[27] ); | |
1105 | |
1106 CHECK( 0x77, buf[28] ); /* "waaad\0" + padding */ | |
1107 CHECK( 0x61, buf[29] ); | |
1108 CHECK( 0x61, buf[30] ); | |
1109 CHECK( 0x61, buf[31] ); | |
1110 CHECK( 0x64, buf[32] ); | |
1111 CHECK( 0x00, buf[33] ); | |
1112 CHECK( 0x00, buf[34] ); | |
1113 CHECK( 0x00, buf[35] ); | |
1114 | |
1115 /* 36 ~ 43 : 2nd AVP header (size at last octet) */ | |
1116 CHECK( 0x0c, buf[43] ); | |
1117 CHECK( 0x00, buf[44] ); /* 0x123456 stored in integer32 in network byte order */ | |
1118 CHECK( 0x12, buf[45] ); | |
1119 CHECK( 0x34, buf[46] ); | |
1120 CHECK( 0x56, buf[47] ); | |
1121 | |
1122 /* 48 ~ 55 : next AVP header */ | |
1123 CHECK( 0xff, buf[56] ); /* -0x123456 stored in integer32 in network byte order. */ | |
1124 CHECK( 0xed, buf[57] ); /* We assume that two's complement is the correct representation, although it's not clearly specified. */ | |
1125 CHECK( 0xcb, buf[58] ); /* 00 12 34 56 inversed => FF ED CB A9 */ | |
1126 CHECK( 0xaa, buf[59] ); /* then "+1" => FF ED CB AA */ | |
1127 | |
1128 /* 60 ~ 67 : next header */ | |
1129 CHECK( 0x10, buf[67] ); /* (the size) */ | |
1130 CHECK( 0x00, buf[68] ); /* 0x11223344556677 in network byte order */ | |
1131 CHECK( 0x11, buf[69] ); | |
1132 CHECK( 0x22, buf[70] ); | |
1133 CHECK( 0x33, buf[71] ); | |
1134 CHECK( 0x44, buf[72] ); | |
1135 CHECK( 0x55, buf[73] ); | |
1136 CHECK( 0x66, buf[74] ); | |
1137 CHECK( 0x77, buf[75] ); | |
1138 | |
1139 /* 76 ~ 83 : next header */ | |
1140 CHECK( 0xFF, buf[84] ); /* - 0x11223344556677 (in two's complement) */ | |
1141 CHECK( 0xEE, buf[85] ); /* gives FF EE DD CC BB AA 99 89 */ | |
1142 CHECK( 0xDD, buf[86] ); | |
1143 CHECK( 0xCC, buf[87] ); | |
1144 CHECK( 0xBB, buf[88] ); | |
1145 CHECK( 0xAA, buf[89] ); | |
1146 CHECK( 0x99, buf[90] ); | |
1147 CHECK( 0x89, buf[91] ); | |
1148 | |
1149 /* 92 ~ 99 : next header */ | |
1150 CHECK( 0x0c, buf[99] ); /* (the size) */ | |
1151 CHECK( 0xFE, buf[100]); /* 0xFEDCBA98 in network byte order */ | |
1152 CHECK( 0xDC, buf[101]); | |
1153 CHECK( 0xBA, buf[102]); | |
1154 CHECK( 0x98, buf[103]); | |
1155 | |
1156 /* 104 ~ 111 : next header */ | |
1157 CHECK( 0x10, buf[111] ); /* (the size) */ | |
1158 CHECK( 0x12, buf[112]); /* 0x123456789abcdef0LL in network byte order */ | |
1159 CHECK( 0x34, buf[113]); | |
1160 CHECK( 0x56, buf[114]); | |
1161 CHECK( 0x78, buf[115]); | |
1162 CHECK( 0x9a, buf[116]); | |
1163 CHECK( 0xbc, buf[117]); | |
1164 CHECK( 0xde, buf[118]); | |
1165 CHECK( 0xf0, buf[119]); | |
1166 | |
1167 /* 120 ~ 127 : next header */ | |
1168 CHECK( 0x0c, buf[127] ); /* (the size) */ | |
1169 CHECK( 0x4a, buf[128]); /* http://en.wikipedia.org/wiki/IEEE_754-1985 to get descvription of the format */ | |
1170 CHECK( 0x00, buf[129]); /* v = 2097153 = 2^21 + 2 ^ 0; sign : "+", 2^21 <= v < 2^22 => exponent = 21; biaised on 8 bits => 21 + 127 => 100 1010 0 */ | |
1171 CHECK( 0x00, buf[130]); /* v = (+1) * (1 ^ 21) * ( 1 + 2^-21 ) => significand 000 0000 0000 0000 0000 0100 */ | |
1172 CHECK( 0x04, buf[131]); /* result: 4a 00 00 04 */ | |
1173 | |
1174 /* 132 ~ 139 : next header */ | |
1175 CHECK( 0x10, buf[139] ); /* (the size) */ | |
1176 CHECK( 0xc2, buf[140]); /* -1099511627777L ( 2^40 + 1 ) in network byte order */ | |
1177 CHECK( 0x70, buf[141]); /* sign: - => most significant bit = 1 */ | |
1178 CHECK( 0x00, buf[142]); /* 2^40 <= v < 2^41 => biaised exponent on 11 bits: 1023 + 40: 100 0010 0111 */ | |
1179 CHECK( 0x00, buf[143]); /* significand: 1 + 2^-40 => 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001 0000 0000 0000 */ | |
1180 CHECK( 0x00, buf[144]); /* result: c2 70 00 00 00 00 10 00 */ | |
1181 CHECK( 0x00, buf[145]); | |
1182 CHECK( 0x10, buf[146]); | |
1183 CHECK( 0x00, buf[147]); | |
1184 | |
1185 | |
1186 | |
1187 /* Okay, now delete the message and parse the buffer, then check we obtain the same values back */ | |
1188 #if 0 | |
1189 fd_msg_dump_walk(0, msg); | |
1190 #endif | |
1191 CHECK( 0, fd_msg_free( msg ) ); | |
1192 | |
1193 CHECK( 0, fd_msg_parse_buffer( &buf, 148, &msg) ); | |
114
5b3868944e2b
Reporting errors in parse_dict function
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
35
diff
changeset
|
1194 CHECK( 0, fd_msg_parse_dict( msg, fd_g_config->cnf_dict, NULL ) ); |
0 | 1195 #if 0 |
1196 fd_msg_dump_walk(0, msg); | |
1197 #endif | |
1198 | |
1199 CHECK( 0, fd_msg_browse ( msg, MSG_BRW_FIRST_CHILD, &avp, NULL) ); | |
1200 CHECK( 0, fd_msg_avp_hdr ( avp, &avpdata ) ); | |
1201 CHECK( 6, avpdata->avp_value->os.len ); | |
1202 CHECK( 'w', (char)(avpdata->avp_value->os.data[0]) ); | |
1203 CHECK( 'a', (char)(avpdata->avp_value->os.data[1]) ); | |
1204 CHECK( 'd', (char)(avpdata->avp_value->os.data[4]) ); | |
1205 CHECK( '\0', (char)(avpdata->avp_value->os.data[5]) ); | |
1206 | |
1207 CHECK( 0, fd_msg_browse ( avp, MSG_BRW_NEXT, &avp, NULL) ); | |
1208 CHECK( 0, fd_msg_avp_hdr ( avp, &avpdata ) ); | |
1209 CHECK( 0x123456, avpdata->avp_value->i32 ); | |
1210 | |
1211 CHECK( 0, fd_msg_browse ( avp, MSG_BRW_NEXT, &avp, NULL) ); | |
1212 CHECK( 0, fd_msg_avp_hdr ( avp, &avpdata ) ); | |
1213 CHECK( -0x123456, avpdata->avp_value->i32 ); | |
1214 | |
1215 CHECK( 0, fd_msg_browse ( avp, MSG_BRW_NEXT, &avp, NULL) ); | |
1216 CHECK( 0, fd_msg_avp_hdr ( avp, &avpdata ) ); | |
1217 CHECK( 0x11223344556677LL, avpdata->avp_value->i64 ); | |
1218 | |
1219 CHECK( 0, fd_msg_browse ( avp, MSG_BRW_NEXT, &avp, NULL) ); | |
1220 CHECK( 0, fd_msg_avp_hdr ( avp, &avpdata ) ); | |
1221 CHECK( -0x11223344556677LL, avpdata->avp_value->i64 ); | |
1222 | |
1223 CHECK( 0, fd_msg_browse ( avp, MSG_BRW_NEXT, &avp, NULL) ); | |
1224 CHECK( 0, fd_msg_avp_hdr ( avp, &avpdata ) ); | |
1225 CHECK( 0xFEDCBA98, avpdata->avp_value->u32 ); | |
1226 | |
1227 CHECK( 0, fd_msg_browse ( avp, MSG_BRW_NEXT, &avp, NULL) ); | |
1228 CHECK( 0, fd_msg_avp_hdr ( avp, &avpdata ) ); | |
1229 CHECK( 0x123456789abcdef0LL, avpdata->avp_value->u64 ); | |
1230 | |
1231 CHECK( 0, fd_msg_browse ( avp, MSG_BRW_NEXT, &avp, NULL) ); | |
1232 CHECK( 0, fd_msg_avp_hdr ( avp, &avpdata ) ); | |
1233 CHECK( 2097153.0F, avpdata->avp_value->f32 ); | |
1234 | |
1235 CHECK( 0, fd_msg_browse ( avp, MSG_BRW_NEXT, &avp, NULL) ); | |
1236 CHECK( 0, fd_msg_avp_hdr ( avp, &avpdata ) ); | |
1237 CHECK( -1099511627777LL, avpdata->avp_value->f64 ); | |
1238 | |
1239 CHECK( 0, fd_msg_free( msg ) ); | |
1240 } | |
1241 } | |
1242 | |
1243 | |
1244 /* That's all for the tests yet */ | |
1245 PASSTEST(); | |
1246 } | |
1247 |