Annotation of embedaddon/strongswan/src/libcharon/tests/utils/exchange_test_asserts.c, revision 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>