Annotation of embedaddon/strongswan/src/libcharon/tests/utils/exchange_test_helper.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2016 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: /**
                     17:  * This class and singleton object initializes charon and provides helper
                     18:  * methods to create unit tests for IKEv2 exchanges.
                     19:  *
                     20:  * It also registers special implementations for the kernel_ipsec_t interface,
                     21:  * the sender and provides dummy configs and credentials.
                     22:  *
                     23:  * @defgroup exchange_test_helper exchange_test_helper
                     24:  * @{ @ingroup test_utils_c
                     25:  */
                     26: 
                     27: #ifndef EXCHANGE_TEST_HELPER_H_
                     28: #define EXCHANGE_TEST_HELPER_H_
                     29: 
                     30: #include <daemon.h>
                     31: 
                     32: #include "mock_sender.h"
                     33: 
                     34: typedef struct exchange_test_helper_t exchange_test_helper_t;
                     35: typedef struct exchange_test_sa_conf_t exchange_test_sa_conf_t;
                     36: 
                     37: struct exchange_test_helper_t {
                     38: 
                     39:        /**
                     40:         * Sender instance used during tests
                     41:         */
                     42:        mock_sender_t *sender;
                     43: 
                     44:        /**
                     45:         * Set the initial byte of all nonces generated by future nonce
                     46:         * generators (already instantiated nonce generators are not affected).
                     47:         */
                     48:        u_char nonce_first_byte;
                     49: 
                     50:        /**
                     51:         * Creates an established IKE_SA/CHILD_SA
                     52:         *
                     53:         * @param[out] init             IKE_SA of the initiator
                     54:         * @param[out] resp             IKE_SA of the responder
                     55:         * @param conf                  configuration for SAs
                     56:         */
                     57:        void (*establish_sa)(exchange_test_helper_t *this, ike_sa_t **init,
                     58:                                                 ike_sa_t **resp, exchange_test_sa_conf_t *conf);
                     59: 
                     60:        /**
                     61:         * Similar to establish_sa() but does only create the SA and config
                     62:         * objects, no exchanges are initiated/handled.  The returned child_cfg
                     63:         * object is that created for the initiator to be used for a call to
                     64:         * initiate(). The config objects for the responder are managed and
                     65:         * provided by an internal config backend.
                     66:         *
                     67:         * Note that the responder SPIs are not yet set.
                     68:         *
                     69:         * @param[out] init             IKE_SA of the initiator
                     70:         * @param[out] resp             IKE_SA of the responder
                     71:         * @param conf                  configuration for SAs
                     72:         * @return                              child_cfg for the initiator
                     73:         */
                     74:        child_cfg_t *(*create_sa)(exchange_test_helper_t *this, ike_sa_t **init,
                     75:                                                          ike_sa_t **resp, exchange_test_sa_conf_t *conf);
                     76: 
                     77:        /**
                     78:         * Pass a message to the given IKE_SA for processing, setting the IKE_SA on
                     79:         * the bus while processing the message.
                     80:         *
                     81:         * @param ike_sa                the IKE_SA receiving the message
                     82:         * @param message               the message, or NULL to pass the next message in the
                     83:         *                                              send queue (adopted)
                     84:         * @return                              return value from ike_sa_t::process_message()
                     85:         */
                     86:        status_t (*process_message)(exchange_test_helper_t *this, ike_sa_t *sa,
                     87:                                                                message_t *message);
                     88: 
                     89:        /**
                     90:         * Register a listener with the bus.
                     91:         *
                     92:         * Don't use bus_t::add_listener() directly for listeners on the stack
                     93:         * as that could lead to invalid listeners registered when hooks are
                     94:         * triggered during cleanup if a test case fails.  All of the listeners
                     95:         * added this way are unregistered with the bus before cleaning up.
                     96:         *
                     97:         * @param listener              listener to add to the bus
                     98:         */
                     99:        void (*add_listener)(exchange_test_helper_t *this, listener_t *listener);
                    100: };
                    101: 
                    102: struct exchange_test_sa_conf_t {
                    103: 
                    104:        /**
                    105:         * Configuration for initiator and responder
                    106:         */
                    107:        struct {
                    108:                /** IKE proposal */
                    109:                char *ike;
                    110:                /** ESP proposal */
                    111:                char *esp;
                    112:                /** Support for childless IKE_SAs */
                    113:                childless_t childless;
                    114:        } initiator, responder;
                    115: };
                    116: 
                    117: /**
                    118:  * Since we don't use the IKE_SA manager to checkout SAs use this to call a
                    119:  * method on the given IKE_SA in its context.
                    120:  */
                    121: #define call_ikesa(sa, method, ...) ({ \
                    122:        charon->bus->set_sa(charon->bus, sa); \
                    123:        sa->method(sa, ##__VA_ARGS__); \
                    124:        charon->bus->set_sa(charon->bus, NULL); \
                    125: })
                    126: 
                    127: /**
                    128:  * The one and only instance of the helper object.
                    129:  *
                    130:  * Set between exchange_test_helper_setup() and exchange_test_helper_teardown()
                    131:  * calls.
                    132:  */
                    133: extern exchange_test_helper_t *exchange_test_helper;
                    134: 
                    135: /**
                    136:  * Initialize charon and the helper object.
                    137:  *
                    138:  * @param plugins                      plugins to load
                    139:  */
                    140: void exchange_test_helper_init(char *plugins);
                    141: 
                    142: /**
                    143:  * Deinitialize the helper object.
                    144:  */
                    145: void exchange_test_helper_deinit();
                    146: 
                    147: #endif /** EXCHANGE_TEST_HELPER_H_ @} */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>