#include "mock_ipsec.h"
#include "mock_nonce_gen.h"
+#include <collections/array.h>
#include <credentials/sets/mem_cred.h>
typedef struct private_exchange_test_helper_t private_exchange_test_helper_t;
* IKE_SA SPI counter
*/
refcount_t ike_spi;
+
+ /**
+ * List of registered listeners
+ */
+ array_t *listeners;
};
/**
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
*/
.sender = mock_sender_create(),
.establish_sa = _establish_sa,
.process_message = _process_message,
+ .add_listener = _add_listener,
},
.creds = mem_cred_create(),
);
void exchange_test_helper_deinit()
{
private_exchange_test_helper_t *this;
+ listener_t *listener;
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);
this->creds->destroy(this->creds);
/* can't let charon do it as it happens too late */
charon->sender->destroy(charon->sender);
charon->sender = NULL;
+ array_destroy(this->listeners);
free(this);
}
*/
void (*process_message)(exchange_test_helper_t *this, ike_sa_t *sa,
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 {