4 * @brief Tests to test the Generator class generator_t
9 * Copyright (C) 2005 Jan Hutter, Martin Willi
10 * Hochschule fuer Technik Rapperswil
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
19 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 #include "generator_test.h"
27 #include "../globals.h"
28 #include "../generator.h"
29 #include "../utils/allocator.h"
30 #include "../utils/logger_manager.h"
31 #include "../utils/logger.h"
32 #include "../payloads/encodings.h"
33 #include "../payloads/ike_header.h"
34 #include "../payloads/transform_attribute.h"
35 #include "../payloads/transform_substructure.h"
36 #include "../payloads/proposal_substructure.h"
41 void test_generator_with_header_payload(tester_t
*tester
)
43 generator_t
*generator
;
44 ike_header_t
*header_data
;
45 chunk_t generated_data
;
49 logger
= global_logger_manager
->create_logger(global_logger_manager
,TESTER
,"header payload");
51 header_data
= ike_header_create();
53 header_data->initiator_spi = 1;
54 header_data->responder_spi = 2;
55 header_data->next_payload = 3;
56 header_data->maj_version = 4;
57 header_data->min_version = 5;
58 header_data->exchange_type = 6;
59 header_data->flags.initiator = TRUE;
60 header_data->flags.version = FALSE;
61 header_data->flags.response = TRUE;
62 header_data->message_id = 7;
63 header_data->length = 8;
65 generator
= generator_create();
66 tester
->assert_true(tester
,(generator
!= NULL
), "generator create check");
68 status
= generator
->generate_payload(generator
,(payload_t
*) header_data
);
69 tester
->assert_true(tester
,(status
== SUCCESS
),"generate_payload call check");
71 tester
->assert_true(tester
,(generator
->write_to_chunk(generator
,&generated_data
) == SUCCESS
),"write_to_chunk call check");
73 u_int8_t expected_generation
[] = {
84 tester
->assert_true(tester
,(generated_data
.len
== sizeof(expected_generation
)), "compare generated data length");
85 logger
->log_chunk(logger
,RAW
,"generated header",&generated_data
);
86 tester
->assert_true(tester
,(memcmp(expected_generation
,generated_data
.ptr
,sizeof(expected_generation
)) == 0), "compare generated data 1");
87 allocator_free_chunk(generated_data
);
89 tester
->assert_true(tester
,(generator
->destroy(generator
) == SUCCESS
), "generator destroy call check");
91 header_data->initiator_spi = 0x22000054231234LL;
92 header_data->responder_spi = 0x122398;
93 header_data->next_payload = 0xF3;
94 header_data->maj_version = 0x2;
95 header_data->min_version = 0x0;
96 header_data->exchange_type = 0x12;
97 header_data->flags.initiator = TRUE;
98 header_data->flags.version = TRUE;
99 header_data->flags.response = TRUE;
100 header_data->message_id = 0x33AFF3;
101 header_data->length = 0xAA11F;
103 generator
= generator_create();
104 tester
->assert_true(tester
,(generator
!= NULL
), "generator create check");
106 status
= generator
->generate_payload(generator
,(payload_t
*)header_data
);
107 tester
->assert_true(tester
,(status
== SUCCESS
),"generate_payload call check");
109 tester
->assert_true(tester
,(generator
->write_to_chunk(generator
,&generated_data
) == SUCCESS
),"write_to_chunk call check");
111 u_int8_t expected_generation2
[] = {
121 logger
->log_chunk(logger
,RAW
,"generated header",&generated_data
);
123 tester
->assert_true(tester
,(memcmp(expected_generation2
,generated_data
.ptr
,sizeof(expected_generation2
)) == 0), "compare generated data 2");
124 allocator_free_chunk(generated_data
);
126 header_data
->destroy(header_data
);
128 global_logger_manager
->destroy_logger(global_logger_manager
,logger
);
129 tester
->assert_true(tester
,(generator
->destroy(generator
) == SUCCESS
), "generator destroy call check");
133 * Described in header
135 void test_generator_with_transform_attribute(tester_t
*tester
)
137 generator_t
*generator
;
138 transform_attribute_t
*attribute
;
140 chunk_t generated_data
;
143 logger
= global_logger_manager
->create_logger(global_logger_manager
,TESTER
,"transform_attribute payload");
146 /* test empty attribute */
147 generator
= generator_create();
148 tester
->assert_true(tester
,(generator
!= NULL
), "generator create check");
149 attribute
= transform_attribute_create();
150 status
= generator
->generate_payload(generator
,(payload_t
*)attribute
);
151 tester
->assert_true(tester
,(status
== SUCCESS
),"generate_payload call check");
152 tester
->assert_true(tester
,(generator
->write_to_chunk(generator
,&generated_data
) == SUCCESS
),"write_to_chunk call check");
153 logger
->log_chunk(logger
,RAW
,"generated attribute",&generated_data
);
155 u_int8_t expected_generation
[] = {
158 tester
->assert_true(tester
,(memcmp(expected_generation
,generated_data
.ptr
,sizeof(expected_generation
)) == 0), "compare generated data");
159 allocator_free_chunk(generated_data
);
160 tester
->assert_true(tester
,(attribute
->destroy(attribute
) == SUCCESS
), "attribute destroy call check");
161 tester
->assert_true(tester
,(generator
->destroy(generator
) == SUCCESS
), "generator destroy call check");
163 /* test attribute with 2 byte data */
164 generator
= generator_create();
165 tester
->assert_true(tester
,(generator
!= NULL
), "generator create check");
167 attribute
= transform_attribute_create();
168 u_int16_t dataval
= 5768;
170 data
.ptr
= (void *) &dataval
;
173 attribute
->set_value(attribute
,data
);
175 status
= generator
->generate_payload(generator
,(payload_t
*)attribute
);
176 tester
->assert_true(tester
,(status
== SUCCESS
),"generate_payload call check");
177 tester
->assert_true(tester
,(generator
->write_to_chunk(generator
,&generated_data
) == SUCCESS
),"write_to_chunk call check");
178 logger
->log_chunk(logger
,RAW
,"generated attribute",&generated_data
);
180 u_int8_t expected_generation2
[] = {
183 tester
->assert_true(tester
,(memcmp(expected_generation2
,generated_data
.ptr
,sizeof(expected_generation2
)) == 0), "compare generated data");
185 allocator_free_chunk(generated_data
);
186 tester
->assert_true(tester
,(attribute
->destroy(attribute
) == SUCCESS
), "attribute destroy call check");
187 tester
->assert_true(tester
,(generator
->destroy(generator
) == SUCCESS
), "generator destroy call check");
191 /* test attribute with 25 byte data */
192 generator
= generator_create();
193 tester
->assert_true(tester
,(generator
!= NULL
), "generator create check");
195 attribute
= transform_attribute_create();
196 char *stringval
= "ddddddddddeeeeeeeeeefffff";
197 data
.ptr
= (void *) stringval
;
200 status
= attribute
->set_value(attribute
,data
);
201 tester
->assert_true(tester
,(status
== SUCCESS
),"set_value call check");
203 status
= attribute
->set_attribute_type(attribute
,456);
204 tester
->assert_true(tester
,(status
== SUCCESS
),"set_attribute_type call check");
207 status
= generator
->generate_payload(generator
,(payload_t
*)attribute
);
208 tester
->assert_true(tester
,(status
== SUCCESS
),"generate_payload call check");
209 tester
->assert_true(tester
,(generator
->write_to_chunk(generator
,&generated_data
) == SUCCESS
),"write_to_chunk call check");
210 logger
->log_chunk(logger
,RAW
,"generated attribute",&generated_data
);
212 u_int8_t expected_generation3
[] = {
222 tester
->assert_true(tester
,(memcmp(expected_generation3
,generated_data
.ptr
,sizeof(expected_generation3
)) == 0), "compare generated data");
224 allocator_free_chunk(generated_data
);
225 tester
->assert_true(tester
,(attribute
->destroy(attribute
) == SUCCESS
), "attribute destroy call check");
226 tester
->assert_true(tester
,(generator
->destroy(generator
) == SUCCESS
), "generator destroy call check");
229 global_logger_manager
->destroy_logger(global_logger_manager
,logger
);
235 * Described in header
237 void test_generator_with_transform_substructure(tester_t
*tester
)
239 generator_t
*generator
;
240 transform_attribute_t
*attribute1
, *attribute2
;
241 transform_substructure_t
*transform
;
244 chunk_t generated_data
;
247 logger
= global_logger_manager
->create_logger(global_logger_manager
,TESTER
,"transform substr.");
249 /* create generator */
250 generator
= generator_create();
251 tester
->assert_true(tester
,(generator
!= NULL
), "generator create check");
253 /* create attribute 1 */
254 attribute1
= transform_attribute_create();
255 char *stringval
= "abcd";
256 data
.ptr
= (void *) stringval
;
258 status
= attribute1
->set_value(attribute1
,data
);
259 tester
->assert_true(tester
,(status
== SUCCESS
),"set_value call check");
260 status
= attribute1
->set_attribute_type(attribute1
,0);
261 tester
->assert_true(tester
,(status
== SUCCESS
),"set_attribute_type call check");
262 logger
->log(logger
,CONTROL
,"attribute1 created");
264 /* create attribute 2 */
265 attribute2
= transform_attribute_create();
267 data
.ptr
= (void *) stringval
;
269 status
= attribute2
->set_value(attribute2
,data
);
270 tester
->assert_true(tester
,(status
== SUCCESS
),"set_value call check");
271 status
= attribute2
->set_attribute_type(attribute2
,0);
272 tester
->assert_true(tester
,(status
== SUCCESS
),"set_attribute_type call check");
273 logger
->log(logger
,CONTROL
,"attribute2 created");
275 /* create transform */
276 transform
= transform_substructure_create();
277 tester
->assert_true(tester
,(transform
!= NULL
), "transform create check");
278 status
= transform
->add_transform_attribute(transform
,attribute1
);
279 tester
->assert_true(tester
,(status
== SUCCESS
),"add_transform_attribute call check");
280 status
= transform
->add_transform_attribute(transform
,attribute2
);
281 tester
->assert_true(tester
,(status
== SUCCESS
),"add_transform_attribute call check");
282 status
= transform
->set_transform_type(transform
,5); /* hex 5 */
283 tester
->assert_true(tester
,(status
== SUCCESS
),"set_transform_type call check");
284 status
= transform
->set_transform_id(transform
,65000); /* hex FDE8 */
285 tester
->assert_true(tester
,(status
== SUCCESS
),"set_transform_id call check");
288 logger
->log(logger
,CONTROL
,"transform created");
290 status
= generator
->generate_payload(generator
,(payload_t
*)transform
);
291 tester
->assert_true(tester
,(status
== SUCCESS
),"generate_payload call check");
292 tester
->assert_true(tester
,(generator
->write_to_chunk(generator
,&generated_data
) == SUCCESS
),"write_to_chunk call check");
293 logger
->log_chunk(logger
,RAW
,"generated transform",&generated_data
);
295 u_int8_t expected_generation3
[] = {
303 tester
->assert_true(tester
,(memcmp(expected_generation3
,generated_data
.ptr
,sizeof(expected_generation3
)) == 0), "compare generated data");
305 allocator_free_chunk(generated_data
);
306 tester
->assert_true(tester
,(transform
->destroy(transform
) == SUCCESS
), "transform destroy call check");
307 tester
->assert_true(tester
,(generator
->destroy(generator
) == SUCCESS
), "generator destroy call check");
310 global_logger_manager
->destroy_logger(global_logger_manager
,logger
);
315 * Described in header
317 void test_generator_with_proposal_substructure(tester_t
*tester
)
319 generator_t
*generator
;
320 transform_attribute_t
*attribute1
, *attribute2
, *attribute3
;
321 transform_substructure_t
*transform1
, *transform2
;
322 proposal_substructure_t
*proposal
;
325 chunk_t generated_data
;
328 logger
= global_logger_manager
->create_logger(global_logger_manager
,TESTER
,"transform substr.");
330 /* create generator */
331 generator
= generator_create();
332 tester
->assert_true(tester
,(generator
!= NULL
), "generator create check");
334 /* create attribute 1 */
335 attribute1
= transform_attribute_create();
336 char *stringval
= "abcd";
337 data
.ptr
= (void *) stringval
;
339 status
= attribute1
->set_value(attribute1
,data
);
340 tester
->assert_true(tester
,(status
== SUCCESS
),"set_value call check");
341 status
= attribute1
->set_attribute_type(attribute1
,0);
342 tester
->assert_true(tester
,(status
== SUCCESS
),"set_attribute_type call check");
343 logger
->log(logger
,CONTROL
,"attribute1 created");
345 /* create attribute 2 */
346 attribute2
= transform_attribute_create();
348 data
.ptr
= (void *) stringval
;
350 status
= attribute2
->set_value(attribute2
,data
);
351 tester
->assert_true(tester
,(status
== SUCCESS
),"set_value call check");
352 status
= attribute2
->set_attribute_type(attribute2
,0);
353 tester
->assert_true(tester
,(status
== SUCCESS
),"set_attribute_type call check");
354 logger
->log(logger
,CONTROL
,"attribute2 created");
356 /* create attribute 3 */
357 attribute3
= transform_attribute_create();
359 data
.ptr
= (void *) stringval
;
361 status
= attribute3
->set_value(attribute3
,data
);
362 tester
->assert_true(tester
,(status
== SUCCESS
),"set_value call check");
363 status
= attribute3
->set_attribute_type(attribute3
,0);
364 tester
->assert_true(tester
,(status
== SUCCESS
),"set_attribute_type call check");
365 logger
->log(logger
,CONTROL
,"attribute3 created");
367 /* create transform 1*/
368 transform1
= transform_substructure_create();
369 tester
->assert_true(tester
,(transform1
!= NULL
), "transform create check");
370 status
= transform1
->add_transform_attribute(transform1
,attribute1
);
371 tester
->assert_true(tester
,(status
== SUCCESS
),"add_transform_attribute call check");
372 status
= transform1
->add_transform_attribute(transform1
,attribute2
);
373 tester
->assert_true(tester
,(status
== SUCCESS
),"add_transform_attribute call check");
374 status
= transform1
->set_transform_type(transform1
,5); /* hex 5 */
375 tester
->assert_true(tester
,(status
== SUCCESS
),"set_transform_type call check");
376 status
= transform1
->set_transform_id(transform1
,65000); /* hex FDE8 */
377 tester
->assert_true(tester
,(status
== SUCCESS
),"set_transform_id call check");
379 /* create transform 2*/
380 transform2
= transform_substructure_create();
381 tester
->assert_true(tester
,(transform2
!= NULL
), "transform create check");
382 status
= transform2
->add_transform_attribute(transform2
,attribute3
);
383 tester
->assert_true(tester
,(status
== SUCCESS
),"add_transform_attribute call check");
384 status
= transform2
->set_transform_type(transform2
,3); /* hex 3 */
385 tester
->assert_true(tester
,(status
== SUCCESS
),"set_transform_type call check");
386 status
= transform2
->set_transform_id(transform2
,4); /* hex 4 */
387 tester
->assert_true(tester
,(status
== SUCCESS
),"set_transform_id call check");
389 logger
->log(logger
,CONTROL
,"transforms created");
391 proposal
= proposal_substructure_create();
392 tester
->assert_true(tester
,(proposal
!= NULL
), "proposal create check");
394 stringval
= "ABCDEFGH";
395 data
.ptr
= (void *) stringval
;
398 status
= proposal
->add_transform_substructure(proposal
,transform1
);
399 tester
->assert_true(tester
,(status
== SUCCESS
),"add_transform_substructure call check");
400 status
= proposal
->add_transform_substructure(proposal
,transform2
);
401 tester
->assert_true(tester
,(status
== SUCCESS
),"add_transform_substructure call check");
402 status
= proposal
->set_spi(proposal
,data
);
403 tester
->assert_true(tester
,(status
== SUCCESS
),"set_spi call check");
404 status
= proposal
->set_proposal_number(proposal
,7);
405 tester
->assert_true(tester
,(status
== SUCCESS
),"set_proposal_number call check");
406 status
= proposal
->set_protocol_id(proposal
,4);
407 tester
->assert_true(tester
,(status
== SUCCESS
),"set_protocol_id call check");
410 status
= generator
->generate_payload(generator
,(payload_t
*)proposal
);
411 tester
->assert_true(tester
,(status
== SUCCESS
),"generate_payload call check");
412 tester
->assert_true(tester
,(generator
->write_to_chunk(generator
,&generated_data
) == SUCCESS
),"write_to_chunk call check");
413 logger
->log_chunk(logger
,RAW
,"generated transform",&generated_data
);
415 u_int8_t expected_generation
[] = {
416 /* proposal header */
422 /* first transform */
425 /* first transform attributes */
430 /* second transform */
433 /* second transform attributes */
437 tester
->assert_true(tester
,(memcmp(expected_generation
,generated_data
.ptr
,sizeof(expected_generation
)) == 0), "compare generated data");
439 allocator_free_chunk(generated_data
);
440 tester
->assert_true(tester
,(proposal
->destroy(proposal
) == SUCCESS
), "proposal destroy call check");
441 tester
->assert_true(tester
,(generator
->destroy(generator
) == SUCCESS
), "generator destroy call check");
444 global_logger_manager
->destroy_logger(global_logger_manager
,logger
);