unit-tests: Make message asserts more flexible

This commit is contained in:
Tobias Brunner
2016-06-17 18:48:02 +02:00
parent 32cfe1e00c
commit fbb0b3cb0a
2 changed files with 106 additions and 26 deletions
@@ -56,6 +56,46 @@ bool exchange_test_asserts_child_updown(listener_t *listener, ike_sa_t *ike_sa,
return TRUE; return TRUE;
} }
/**
* Assert a given message rule
*/
static void assert_message_rule(listener_message_assert_t *this, message_t *msg,
listener_message_rule_t *rule)
{
if (rule->expected)
{
if (rule->payload)
{
assert_listener_msg(msg->get_payload(msg, rule->payload),
this, "expected payload (%N) not found",
payload_type_names, rule->payload);
}
if (rule->notify)
{
assert_listener_msg(msg->get_notify(msg, rule->notify),
this, "expected notify payload (%N) not found",
notify_type_names, rule->notify);
}
}
else
{
if (rule->payload)
{
assert_listener_msg(!msg->get_payload(msg, rule->payload),
this, "unexpected payload (%N) found",
payload_type_names, rule->payload);
}
if (rule->notify)
{
assert_listener_msg(!msg->get_notify(msg, rule->notify),
this, "unexpected notify payload (%N) found",
notify_type_names, rule->notify);
}
}
}
/* /*
* Described in header * Described in header
*/ */
@@ -80,17 +120,14 @@ bool exchange_test_asserts_message(listener_t *listener, ike_sa_t *ike_sa,
"count in message (%d != %d)", this->count, "count in message (%d != %d)", this->count,
count); count);
} }
if (this->payload) if (this->num_rules)
{ {
assert_listener_msg(message->get_payload(message, this->payload), int i;
this, "expected payload (%N) not found",
payload_type_names, this->payload); for (i = 0; i < this->num_rules; i++)
} {
if (this->notify) assert_message_rule(this, message, &this->rules[i]);
{ }
assert_listener_msg(message->get_notify(message, this->notify),
this, "expected notify payload (%N) not found",
notify_type_names, this->notify);
} }
return FALSE; return FALSE;
} }
@@ -27,6 +27,7 @@
typedef struct listener_hook_assert_t listener_hook_assert_t; typedef struct listener_hook_assert_t listener_hook_assert_t;
typedef struct listener_message_assert_t listener_message_assert_t; typedef struct listener_message_assert_t listener_message_assert_t;
typedef struct listener_message_rule_t listener_message_rule_t;
struct listener_hook_assert_t { struct listener_hook_assert_t {
@@ -171,6 +172,29 @@ do { \
} \ } \
} while(FALSE) } while(FALSE)
/**
* Rules regarding payloads/notifies to expect/not expect in a message
*/
struct listener_message_rule_t {
/**
* Whether the payload/notify is expected in the message, FALSE to fail if
* it is found
*/
bool expected;
/**
* Payload type to expect/not expect
*/
payload_type_t payload;
/**
* Notify type to expect/not expect (paylod type does not have to be
* specified)
*/
notify_type_t notify;
};
/** /**
* Data used to check plaintext messages via listener_t * Data used to check plaintext messages via listener_t
*/ */
@@ -197,19 +221,19 @@ struct listener_message_assert_t {
bool incoming; bool incoming;
/** /**
* Payload count to expect * Payload count to expect (-1 to ignore the count)
*/ */
int count; int count;
/** /**
* Payload type to look for * Payloads to expect or not expect in a message
*/ */
payload_type_t payload; listener_message_rule_t *rules;
/** /**
* Notify type to look for * Number of rules
*/ */
notify_type_t notify; int num_rules;
}; };
/** /**
@@ -224,9 +248,8 @@ bool exchange_test_asserts_message(listener_t *this, ike_sa_t *ike_sa,
* *
* @param dir IN or OUT to check the next in- or outbound message * @param dir IN or OUT to check the next in- or outbound message
*/ */
#define assert_message_empty(dir) ({ \ #define assert_message_empty(dir) \
_assert_payload(dir, 0, 0, 0); \ _assert_payload(dir, 0)
})
/** /**
* Assert that the next in- or outbound plaintext message contains exactly * Assert that the next in- or outbound plaintext message contains exactly
@@ -235,9 +258,8 @@ bool exchange_test_asserts_message(listener_t *this, ike_sa_t *ike_sa,
* @param dir IN or OUT to check the next in- or outbound message * @param dir IN or OUT to check the next in- or outbound message
* @param expected expected payload type * @param expected expected payload type
*/ */
#define assert_single_payload(dir, expected) ({ \ #define assert_single_payload(dir, expected) \
_assert_payload(dir, 1, expected, 0); \ _assert_payload(dir, 1, { TRUE, expected, 0 })
})
/** /**
* Assert that the next in- or outbound plaintext message contains exactly * Assert that the next in- or outbound plaintext message contains exactly
@@ -246,18 +268,39 @@ bool exchange_test_asserts_message(listener_t *this, ike_sa_t *ike_sa,
* @param dir IN or OUT to check the next in- or outbound message * @param dir IN or OUT to check the next in- or outbound message
* @param expected expected notify type * @param expected expected notify type
*/ */
#define assert_single_notify(dir, expected) ({ \ #define assert_single_notify(dir, expected) \
_assert_payload(dir, 1, 0, expected); \ _assert_payload(dir, 1, { TRUE, 0, expected })
})
#define _assert_payload(dir, c, p, n) ({ \ /**
* Assert that the next in- or outbound plaintext message contains a notify
* of the given type.
*
* @param dir IN or OUT to check the next in- or outbound message
* @param expected expected notify type
*/
#define assert_notify(dir, expected) \
_assert_payload(dir, -1, { TRUE, 0, expected })
/**
* Assert that the next in- or outbound plaintext message does not contain a
* notify of the given type.
*
* @param dir IN or OUT to check the next in- or outbound message
* @param unexpected not expected notify type
*/
#define assert_no_notify(dir, unexpected) \
_assert_payload(dir, -1, { FALSE, 0, unexpected })
#define _assert_payload(dir, c, ...) ({ \
listener_message_rule_t _rules[] = { __VA_ARGS__ }; \
listener_message_assert_t _listener = { \ listener_message_assert_t _listener = { \
.listener = { .message = exchange_test_asserts_message, }, \ .listener = { .message = exchange_test_asserts_message, }, \
.file = __FILE__, \ .file = __FILE__, \
.line = __LINE__, \ .line = __LINE__, \
.incoming = streq(#dir, "IN") ? TRUE : FALSE, \ .incoming = streq(#dir, "IN") ? TRUE : FALSE, \
.count = c, \ .count = c, \
.payload = p, \ .rules = _rules, \
.num_rules = countof(_rules), \
}; \ }; \
charon->bus->add_listener(charon->bus, &_listener.listener); \ charon->bus->add_listener(charon->bus, &_listener.listener); \
}) })