unit-tests: Provide a wrapper around bus_t::add_listener and unregister them during cleanup
In case listeners on the stack are triggered while cleaning up after a test failed (e.g. via ike_sa_manager_t::flush) remaining listeners defined on the stack would cause a segmentation fault.
This commit is contained in:
@@ -18,6 +18,7 @@
|
|||||||
#include "mock_ipsec.h"
|
#include "mock_ipsec.h"
|
||||||
#include "mock_nonce_gen.h"
|
#include "mock_nonce_gen.h"
|
||||||
|
|
||||||
|
#include <collections/array.h>
|
||||||
#include <credentials/sets/mem_cred.h>
|
#include <credentials/sets/mem_cred.h>
|
||||||
|
|
||||||
typedef struct private_exchange_test_helper_t private_exchange_test_helper_t;
|
typedef struct private_exchange_test_helper_t private_exchange_test_helper_t;
|
||||||
@@ -42,6 +43,11 @@ struct private_exchange_test_helper_t {
|
|||||||
* IKE_SA SPI counter
|
* IKE_SA SPI counter
|
||||||
*/
|
*/
|
||||||
refcount_t ike_spi;
|
refcount_t ike_spi;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of registered listeners
|
||||||
|
*/
|
||||||
|
array_t *listeners;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -240,6 +246,13 @@ METHOD(exchange_test_helper_t, establish_sa, void,
|
|||||||
DESTROY_IF(backend.ike_cfg);
|
DESTROY_IF(backend.ike_cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
METHOD(exchange_test_helper_t, add_listener, void,
|
||||||
|
private_exchange_test_helper_t *this, listener_t *listener)
|
||||||
|
{
|
||||||
|
array_insert_create(&this->listeners, ARRAY_TAIL, listener);
|
||||||
|
charon->bus->add_listener(charon->bus, listener);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enable logging in charon as requested
|
* Enable logging in charon as requested
|
||||||
*/
|
*/
|
||||||
@@ -291,6 +304,7 @@ void exchange_test_helper_init(char *plugins)
|
|||||||
.sender = mock_sender_create(),
|
.sender = mock_sender_create(),
|
||||||
.establish_sa = _establish_sa,
|
.establish_sa = _establish_sa,
|
||||||
.process_message = _process_message,
|
.process_message = _process_message,
|
||||||
|
.add_listener = _add_listener,
|
||||||
},
|
},
|
||||||
.creds = mem_cred_create(),
|
.creds = mem_cred_create(),
|
||||||
);
|
);
|
||||||
@@ -327,13 +341,19 @@ void exchange_test_helper_init(char *plugins)
|
|||||||
void exchange_test_helper_deinit()
|
void exchange_test_helper_deinit()
|
||||||
{
|
{
|
||||||
private_exchange_test_helper_t *this;
|
private_exchange_test_helper_t *this;
|
||||||
|
listener_t *listener;
|
||||||
|
|
||||||
this = (private_exchange_test_helper_t*)exchange_test_helper;
|
this = (private_exchange_test_helper_t*)exchange_test_helper;
|
||||||
|
|
||||||
|
while (array_remove(this->listeners, ARRAY_HEAD, &listener))
|
||||||
|
{
|
||||||
|
charon->bus->remove_listener(charon->bus, listener);
|
||||||
|
}
|
||||||
lib->credmgr->remove_set(lib->credmgr, &this->creds->set);
|
lib->credmgr->remove_set(lib->credmgr, &this->creds->set);
|
||||||
this->creds->destroy(this->creds);
|
this->creds->destroy(this->creds);
|
||||||
/* can't let charon do it as it happens too late */
|
/* can't let charon do it as it happens too late */
|
||||||
charon->sender->destroy(charon->sender);
|
charon->sender->destroy(charon->sender);
|
||||||
charon->sender = NULL;
|
charon->sender = NULL;
|
||||||
|
array_destroy(this->listeners);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,6 +67,18 @@ struct exchange_test_helper_t {
|
|||||||
*/
|
*/
|
||||||
void (*process_message)(exchange_test_helper_t *this, ike_sa_t *sa,
|
void (*process_message)(exchange_test_helper_t *this, ike_sa_t *sa,
|
||||||
message_t *message);
|
message_t *message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a listener with the bus.
|
||||||
|
*
|
||||||
|
* Don't use bus_t::add_listener() directly for listeners on the stack
|
||||||
|
* as that could lead to invalid listeners registered when hooks are
|
||||||
|
* triggered during cleanup if a test case fails. All of the listeners
|
||||||
|
* added this way are unregistered with the bus before cleaning up.
|
||||||
|
*
|
||||||
|
* @param listener listener to add to the bus
|
||||||
|
*/
|
||||||
|
void (*add_listener)(exchange_test_helper_t *this, listener_t *listener);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct exchange_test_sa_conf_t {
|
struct exchange_test_sa_conf_t {
|
||||||
|
|||||||
Reference in New Issue
Block a user