Annotation of embedaddon/strongswan/src/libcharon/tests/utils/exchange_test_asserts.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2016-2017 Tobias Brunner
3: * HSR Hochschule fuer Technik Rapperswil
4: *
5: * This program is free software; you can redistribute it and/or modify it
6: * under the terms of the GNU General Public License as published by the
7: * Free Software Foundation; either version 2 of the License, or (at your
8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9: *
10: * This program is distributed in the hope that it will be useful, but
11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13: * for more details.
14: */
15:
16: #include <inttypes.h>
17:
18: #include <test_suite.h>
19:
20: #include "exchange_test_asserts.h"
21: #include "mock_ipsec.h"
22:
23: /*
24: * Described in header
25: */
26: bool exchange_test_asserts_hook(listener_t *listener)
27: {
28: listener_hook_assert_t *this = (listener_hook_assert_t*)listener;
29:
30: this->count++;
31: return TRUE;
32: }
33:
34: /*
35: * Described in header
36: */
37: bool exchange_test_asserts_ike_updown(listener_t *listener, ike_sa_t *ike_sa,
38: bool up)
39: {
40: listener_hook_assert_t *this = (listener_hook_assert_t*)listener;
41:
42: this->count++;
43: assert_listener_msg(this->up == up, this, "IKE_SA not '%s'",
44: this->up ? "up" : "down");
45: return TRUE;
46: }
47:
48: /*
49: * Described in header
50: */
51: bool exchange_test_asserts_child_updown(listener_t *listener, ike_sa_t *ike_sa,
52: child_sa_t *child_sa, bool up)
53: {
54: listener_hook_assert_t *this = (listener_hook_assert_t*)listener;
55:
56: this->count++;
57: assert_listener_msg(this->up == up, this, "CHILD_SA not '%s'",
58: this->up ? "up" : "down");
59: return TRUE;
60: }
61:
62: /*
63: * Described in header
64: */
65: bool exchange_test_asserts_ike_rekey(listener_t *listener, ike_sa_t *old,
66: ike_sa_t *new)
67: {
68: listener_hook_assert_t *this = (listener_hook_assert_t*)listener;
69: ike_sa_id_t *id;
70: uint64_t spi;
71:
72: this->count++;
73: id = old->get_id(old);
74: spi = id->get_initiator_spi(id);
75: assert_listener_msg(this->spi_old == spi, this, "unexpected old IKE_SA "
76: "%.16"PRIx64"_i instead of %.16"PRIx64"_i",
77: be64toh(spi), be64toh(this->spi_old));
78: id = new->get_id(new);
79: spi = id->get_initiator_spi(id);
80: assert_listener_msg(this->spi_new == spi, this, "unexpected new IKE_SA "
81: "%.16"PRIx64"_i instead of %.16"PRIx64"_i",
82: be64toh(spi), be64toh(this->spi_new));
83: return TRUE;
84: }
85:
86: /*
87: * Described in header
88: */
89: bool exchange_test_asserts_child_rekey(listener_t *listener, ike_sa_t *ike_sa,
90: child_sa_t *old, child_sa_t *new)
91: {
92: listener_hook_assert_t *this = (listener_hook_assert_t*)listener;
93: uint32_t spi, expected;
94:
95: this->count++;
96: spi = old->get_spi(old, TRUE);
97: expected = this->spi_old;
98: assert_listener_msg(expected == spi, this, "unexpected old CHILD_SA %.8x "
99: "instead of %.8x", spi, expected);
100: spi = new->get_spi(new, TRUE);
101: expected = this->spi_new;
102: assert_listener_msg(expected == spi, this, "unexpected new CHILD_SA %.8x "
103: "instead of %.8x", spi, expected);
104: return TRUE;
105: }
106:
107: /**
108: * Assert a given message rule
109: */
110: static void assert_message_rule(listener_message_assert_t *this, message_t *msg,
111: listener_message_rule_t *rule)
112: {
113: if (rule->expected)
114: {
115: if (rule->payload)
116: {
117: assert_listener_msg(msg->get_payload(msg, rule->payload),
118: this, "expected payload (%N) not found",
119: payload_type_names, rule->payload);
120:
121: }
122: if (rule->notify)
123: {
124: assert_listener_msg(msg->get_notify(msg, rule->notify),
125: this, "expected notify payload (%N) not found",
126: notify_type_names, rule->notify);
127: }
128: }
129: else
130: {
131: if (rule->payload)
132: {
133: assert_listener_msg(!msg->get_payload(msg, rule->payload),
134: this, "unexpected payload (%N) found",
135: payload_type_names, rule->payload);
136:
137: }
138: if (rule->notify)
139: {
140: assert_listener_msg(!msg->get_notify(msg, rule->notify),
141: this, "unexpected notify payload (%N) found",
142: notify_type_names, rule->notify);
143: }
144: }
145: }
146:
147: /*
148: * Described in header
149: */
150: bool exchange_test_asserts_message(listener_t *listener, ike_sa_t *ike_sa,
151: message_t *message, bool incoming, bool plain)
152: {
153: listener_message_assert_t *this = (listener_message_assert_t*)listener;
154:
155: if (plain && this->incoming == incoming)
156: {
157: if (this->count >= 0)
158: {
159: enumerator_t *enumerator;
160: int count = 0;
161: enumerator = message->create_payload_enumerator(message);
162: while (enumerator->enumerate(enumerator, NULL))
163: {
164: count++;
165: }
166: enumerator->destroy(enumerator);
167: assert_listener_msg(this->count == count, this, "unexpected payload "
168: "count in message (%d != %d)", this->count,
169: count);
170: }
171: if (this->num_rules)
172: {
173: int i;
174:
175: for (i = 0; i < this->num_rules; i++)
176: {
177: assert_message_rule(this, message, &this->rules[i]);
178: }
179: }
180: return FALSE;
181: }
182: return TRUE;
183: }
184:
185: /**
186: * Compare two SPIs
187: */
188: static int spis_cmp(const void *a, const void *b)
189: {
190: return *(const uint32_t*)a - *(const uint32_t*)b;
191: }
192:
193: /**
194: * Compare two SPIs to sort them
195: */
196: static int spis_sort(const void *a, const void *b, void *data)
197: {
198: return spis_cmp(a, b);
199: }
200:
201:
202: /*
203: * Described in header
204: */
205: void exchange_test_asserts_ipsec_sas(ipsec_sas_assert_t *sas)
206: {
207: enumerator_t *enumerator;
208: array_t *spis;
209: ike_sa_t *ike_sa;
210: uint32_t spi;
211: int i;
212:
213: spis = array_create(sizeof(uint32_t), 0);
214: for (i = 0; i < sas->count; i++)
215: {
216: array_insert(spis, ARRAY_TAIL, &sas->spis[i]);
217: }
218: array_sort(spis, spis_sort, NULL);
219:
220: enumerator = mock_ipsec_create_sa_enumerator();
221: while (enumerator->enumerate(enumerator, &ike_sa, &spi))
222: {
223: if (ike_sa == sas->ike_sa)
224: {
225: i = array_bsearch(spis, &spi, spis_cmp, NULL);
226: assert_listener_msg(i != -1, sas, "unexpected IPsec SA %.8x", spi);
227: array_remove(spis, i, NULL);
228: }
229: }
230: enumerator->destroy(enumerator);
231: for (i = 0; i < array_count(spis); i++)
232: {
233: array_get(spis, i, &spi);
234: assert_listener_msg(!spi, sas, "expected IPsec SA %.8x not found", spi);
235: }
236: array_destroy(spis);
237: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>