X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fcore%2Ftest_core_quota_compliance.c;h=4dee958f2db0d6586b2b2b7a4df99da0e9bcea1c;hb=7b00dd51218edbd9182caa664cfce185edc2cc45;hp=01eafbfe0e47479317c7bbec70bc265f9eafafb2;hpb=24dc89edc8d7f9eb5f23cd3e804fd9732858fbee;p=oweals%2Fgnunet.git diff --git a/src/core/test_core_quota_compliance.c b/src/core/test_core_quota_compliance.c index 01eafbfe0..4dee958f2 100644 --- a/src/core/test_core_quota_compliance.c +++ b/src/core/test_core_quota_compliance.c @@ -20,6 +20,7 @@ /** * @file core/test_core_quota_compliance.c * @brief testcase for core_api.c focusing quota compliance on core level + * @author Christian Grothoff */ #include "platform.h" #include "gnunet_arm_service.h" @@ -53,7 +54,7 @@ #define FAST_TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 150) #define MTYPE 12345 -#define MESSAGESIZE 1024 +#define MESSAGESIZE (1024 - 8) #define MEASUREMENT_LENGTH GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) static unsigned long long total_bytes_sent; @@ -70,7 +71,7 @@ struct PeerContext { struct GNUNET_CONFIGURATION_Handle *cfg; struct GNUNET_CORE_Handle *ch; - struct GNUNET_CORE_TransmitHandle *nth; + struct GNUNET_MQ_Handle *mq; struct GNUNET_TRANSPORT_OfferHelloHandle *oh; struct GNUNET_PeerIdentity id; struct GNUNET_MessageHeader *hello; @@ -106,21 +107,17 @@ static int running; struct TestMessage { struct GNUNET_MessageHeader header; - uint32_t num; + uint32_t num GNUNET_PACKED; + uint8_t pad[MESSAGESIZE]; }; static void terminate_peer (struct PeerContext *p) { - if (NULL != p->nth) - { - GNUNET_CORE_notify_transmit_ready_cancel (p->nth); - p->nth = NULL; - } if (NULL != p->ch) { - GNUNET_CORE_disconnect (p->ch); + GNUNET_CORE_disconnecT (p->ch); p->ch = NULL; } if (NULL != p->ghh) @@ -342,85 +339,44 @@ measurement_stop (void *cls) } -static size_t -transmit_ready (void *cls, - size_t size, - void *buf) +static void +do_transmit (void *cls) { - char *cbuf = buf; - struct TestMessage hdr; - unsigned int ret; - - p1.nth = NULL; - GNUNET_assert (size <= GNUNET_CONSTANTS_MAX_ENCRYPTED_MESSAGE_SIZE); - if (NULL == buf) - { - if ( (NULL != p1.ch) && - (1 == p1.connect_status) ) - GNUNET_break (NULL != - (p1.nth = - GNUNET_CORE_notify_transmit_ready (p1.ch, - GNUNET_NO, - GNUNET_CORE_PRIO_BEST_EFFORT, - FAST_TIMEOUT, - &p2.id, - MESSAGESIZE, - &transmit_ready, - &p1))); - return 0; - } - GNUNET_assert (tr_n < TOTAL_MSGS); - ret = 0; - GNUNET_assert (size >= MESSAGESIZE); - GNUNET_assert (NULL != buf); - cbuf = buf; - do - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Sending message %u of size %u at offset %u\n", - tr_n, - MESSAGESIZE, - ret); - hdr.header.size = htons (MESSAGESIZE); - hdr.header.type = htons (MTYPE); - hdr.num = htonl (tr_n); - GNUNET_memcpy (&cbuf[ret], - &hdr, - sizeof (struct TestMessage)); - ret += sizeof (struct TestMessage); - memset (&cbuf[ret], - tr_n, - MESSAGESIZE - sizeof (struct TestMessage)); - ret += MESSAGESIZE - sizeof (struct TestMessage); - tr_n++; - if (0 == GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK, - 16)) - break; /* sometimes pack buffer full, sometimes not */ - } - while (size - ret >= MESSAGESIZE); + struct TestMessage *hdr; + struct GNUNET_MQ_Envelope *env; + + env = GNUNET_MQ_msg (hdr, + MTYPE); + hdr->num = htonl (tr_n); + memset (&hdr->pad, + tr_n, + MESSAGESIZE); + tr_n++; GNUNET_SCHEDULER_cancel (err_task); err_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &terminate_task_error, NULL); - - total_bytes_sent += ret; - return ret; + total_bytes_sent += sizeof (struct TestMessage); + GNUNET_MQ_send (p1.mq, + env); } -static void +static void * connect_notify (void *cls, - const struct GNUNET_PeerIdentity *peer) + const struct GNUNET_PeerIdentity *peer, + struct GNUNET_MQ_Handle *mq) { struct PeerContext *pc = cls; if (0 == memcmp (&pc->id, peer, sizeof (struct GNUNET_PeerIdentity))) - return; /* loopback */ + return NULL; /* loopback */ GNUNET_assert (0 == pc->connect_status); pc->connect_status = 1; + pc->mq = mq; if (pc == &p1) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -440,32 +396,23 @@ connect_notify (void *cls, GNUNET_SCHEDULER_add_delayed (MEASUREMENT_LENGTH, &measurement_stop, NULL); - - GNUNET_break (NULL != - (p1.nth = - GNUNET_CORE_notify_transmit_ready (p1.ch, - GNUNET_NO, - GNUNET_CORE_PRIO_BEST_EFFORT, - TIMEOUT, - &p2.id, - MESSAGESIZE, - &transmit_ready, - &p1))); + do_transmit (NULL); } + return pc; } static void disconnect_notify (void *cls, - const struct GNUNET_PeerIdentity *peer) + const struct GNUNET_PeerIdentity *peer, + void *internal_cls) { struct PeerContext *pc = cls; - if (0 == memcmp (&pc->id, - peer, - sizeof (struct GNUNET_PeerIdentity))) + if (NULL == internal_cls) return; /* loopback */ pc->connect_status = 0; + pc->mq = NULL; if (NULL != measure_task) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -473,121 +420,58 @@ disconnect_notify (void *cls, GNUNET_SCHEDULER_cancel (measure_task); measure_task = NULL; } - if (NULL != pc->nth) - { - GNUNET_CORE_notify_transmit_ready_cancel (pc->nth); - pc->nth = NULL; - } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Encrypted connection to `%s' cut\n", GNUNET_i2s (peer)); } -static int -inbound_notify (void *cls, - const struct GNUNET_PeerIdentity *other, - const struct GNUNET_MessageHeader *message) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Core provides inbound data from `%s' %u.\n", - GNUNET_i2s (other), - (unsigned int) ntohs (message->size)); - total_bytes_recv += ntohs (message->size); - return GNUNET_OK; -} - -static int -outbound_notify (void *cls, - const struct GNUNET_PeerIdentity *other, - const struct GNUNET_MessageHeader *message) -{ - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Core notifies about outbound data for `%s'.\n", - GNUNET_i2s (other)); - return GNUNET_OK; -} - - -static size_t -transmit_ready (void *cls, size_t size, void *buf); - - -static int -process_mtype (void *cls, - const struct GNUNET_PeerIdentity *peer, - const struct GNUNET_MessageHeader *message) +static void +handle_test (void *cls, + const struct TestMessage *hdr) { static int n; - const struct TestMessage *hdr; - hdr = (const struct TestMessage *) message; - if (MTYPE != ntohs (message->type)) - return GNUNET_SYSERR; - if (ntohs (message->size) != MESSAGESIZE) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Expected message %u of size %u, got %u bytes of message %u\n", - n, - MESSAGESIZE, - ntohs (message->size), - ntohl (hdr->num)); - GNUNET_SCHEDULER_cancel (err_task); - err_task = GNUNET_SCHEDULER_add_now (&terminate_task_error, - NULL); - return GNUNET_SYSERR; - } + total_bytes_recv += sizeof (struct TestMessage); if (ntohl (hdr->num) != n) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Expected message %u of size %u, got %u bytes of message %u\n", + "Expected message %u, got message %u\n", n, - MESSAGESIZE, - ntohs (message->size), ntohl (hdr->num)); GNUNET_SCHEDULER_cancel (err_task); err_task = GNUNET_SCHEDULER_add_now (&terminate_task_error, NULL); - return GNUNET_SYSERR; + return; } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Got message %u of size %u\n", - ntohl (hdr->num), - ntohs (message->size)); + "Got message %u\n", + ntohl (hdr->num)); n++; if (0 == (n % 10)) FPRINTF (stderr, "%s", "."); if (GNUNET_YES == running) - GNUNET_break (NULL != - (p1.nth = GNUNET_CORE_notify_transmit_ready (p1.ch, - GNUNET_NO, - GNUNET_CORE_PRIO_BEST_EFFORT, - FAST_TIMEOUT, - &p2.id, - MESSAGESIZE, - &transmit_ready, - &p1))); - return GNUNET_OK; + do_transmit (NULL); } -static struct GNUNET_CORE_MessageHandler handlers[] = { - {&process_mtype, MTYPE, 0}, - {NULL, 0, 0} -}; - - - static void init_notify (void *cls, const struct GNUNET_PeerIdentity *my_identity) { struct PeerContext *p = cls; + struct GNUNET_MQ_MessageHandler handlers[] = { + GNUNET_MQ_hd_fixed_size (test, + MTYPE, + struct TestMessage, + NULL), + GNUNET_MQ_handler_end () + }; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Connection to CORE service of `%4s' established\n", + "Connection to CORE service of `%s' established\n", GNUNET_i2s (my_identity)); GNUNET_assert (NULL != my_identity); p->id = *my_identity; @@ -596,17 +480,12 @@ init_notify (void *cls, GNUNET_assert (ok == 2); OKPP; /* connect p2 */ - p2.ch = - GNUNET_CORE_connect (p2.cfg, - &p2, - &init_notify, - &connect_notify, - &disconnect_notify, - &inbound_notify, - GNUNET_YES, - &outbound_notify, - GNUNET_YES, - handlers); + p2.ch = GNUNET_CORE_connecT (p2.cfg, + &p2, + &init_notify, + &connect_notify, + &disconnect_notify, + handlers); } else { @@ -646,22 +525,28 @@ process_hello (void *cls, GNUNET_assert (message != NULL); p->hello = GNUNET_malloc (ntohs (message->size)); GNUNET_memcpy (p->hello, message, ntohs (message->size)); - if ((p == &p1) && (NULL == p2.oh)) + if ( (p == &p1) && + (NULL == p2.oh) ) p2.oh = GNUNET_TRANSPORT_offer_hello (p2.cfg, message, &offer_hello_done, &p2); - if ((p == &p2) && (NULL == p1.oh)) + if ( (p == &p2) && + (NULL == p1.oh) ) p1.oh = GNUNET_TRANSPORT_offer_hello (p1.cfg, message, &offer_hello_done, &p1); - if ((p == &p1) && (p2.hello != NULL) && (NULL == p1.oh)) + if ( (p == &p1) && + (NULL != p2.hello) && + (NULL == p1.oh) ) p1.oh = GNUNET_TRANSPORT_offer_hello (p1.cfg, p2.hello, &offer_hello_done, &p1); - if ((p == &p2) && (p1.hello != NULL) && (NULL == p2.oh) ) + if ( (p == &p2) && + (NULL != p1.hello) && + (NULL == p2.oh) ) p2.oh = GNUNET_TRANSPORT_offer_hello (p2.cfg, p1.hello, &offer_hello_done, @@ -708,6 +593,14 @@ run (void *cls, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { + struct GNUNET_MQ_MessageHandler handlers[] = { + GNUNET_MQ_hd_fixed_size (test, + MTYPE, + struct TestMessage, + NULL), + GNUNET_MQ_handler_end () + }; + GNUNET_assert (ok == 1); OKPP; err_task = @@ -760,17 +653,12 @@ run (void *cls, "WAN_QUOTA_OUT", ¤t_quota_p2_out)); - p1.ch = - GNUNET_CORE_connect (p1.cfg, - &p1, - &init_notify, - &connect_notify, - &disconnect_notify, - &inbound_notify, - GNUNET_YES, - &outbound_notify, - GNUNET_YES, - handlers); + p1.ch = GNUNET_CORE_connecT (p1.cfg, + &p1, + &init_notify, + &connect_notify, + &disconnect_notify, + handlers); } @@ -820,6 +708,30 @@ check () } +static void +cleanup_directory (int test) +{ + switch (test) { + case SYMMETRIC: + GNUNET_DISK_directory_remove ("/tmp/test-gnunet-core-quota-sym-peer-1/"); + GNUNET_DISK_directory_remove ("/tmp/test-gnunet-core-quota-sym-peer-2/"); + break; + case ASYMMETRIC_SEND_LIMITED: + GNUNET_DISK_directory_remove + ("/tmp/test-gnunet-core-quota-asym-send-lim-peer-1/"); + GNUNET_DISK_directory_remove + ("/tmp/test-gnunet-core-quota-asym-send-lim-peer-2/"); + break; + case ASYMMETRIC_RECV_LIMITED: + GNUNET_DISK_directory_remove + ("/tmp/test-gnunet-core-quota-asym-recv-lim-peer-1/"); + GNUNET_DISK_directory_remove + ("/tmp/test-gnunet-core-quota-asym-recv-lim-peer-2/"); + break; + } +} + + int main (int argc, char *argv[]) @@ -827,63 +739,30 @@ main (int argc, int ret; test = -1; - if (strstr (argv[0], "_symmetric") != NULL) + if (NULL != strstr (argv[0], + "_symmetric")) { test = SYMMETRIC; } - else if (strstr (argv[0], "_asymmetric_send") != NULL) + else if (NULL != strstr (argv[0], + "_asymmetric_send")) { test = ASYMMETRIC_SEND_LIMITED; } - else if (strstr (argv[0], "_asymmetric_recv") != NULL) + else if (NULL != strstr (argv[0], + "_asymmetric_recv")) { test = ASYMMETRIC_RECV_LIMITED; } GNUNET_assert (test != -1); - if (test == SYMMETRIC) - { - GNUNET_DISK_directory_remove ("/tmp/test-gnunet-core-quota-sym-peer-1/"); - GNUNET_DISK_directory_remove ("/tmp/test-gnunet-core-quota-sym-peer-2/"); - } - else if (test == ASYMMETRIC_SEND_LIMITED) - { - GNUNET_DISK_directory_remove - ("/tmp/test-gnunet-core-quota-asym-send-lim-peer-1/"); - GNUNET_DISK_directory_remove - ("/tmp/test-gnunet-core-quota-asym-send-lim-peer-2/"); - } - else if (test == ASYMMETRIC_RECV_LIMITED) - { - GNUNET_DISK_directory_remove - ("/tmp/test-gnunet-core-quota-asym-recv-lim-peer-1/"); - GNUNET_DISK_directory_remove - ("/tmp/test-gnunet-core-quota-asym-recv-lim-peer-2/"); - } - + cleanup_directory (test); GNUNET_log_setup ("test-core-quota-compliance", "WARNING", NULL); ret = check (); - if (test == SYMMETRIC) - { - GNUNET_DISK_directory_remove ("/tmp/test-gnunet-core-quota-sym-peer-1/"); - GNUNET_DISK_directory_remove ("/tmp/test-gnunet-core-quota-sym-peer-2/"); - } - else if (test == ASYMMETRIC_SEND_LIMITED) - { - GNUNET_DISK_directory_remove - ("/tmp/test-gnunet-core-quota-asym-send-lim-peer-1/"); - GNUNET_DISK_directory_remove - ("/tmp/test-gnunet-core-quota-asym-send-lim-peer-2/"); - } - else if (test == ASYMMETRIC_RECV_LIMITED) - { - GNUNET_DISK_directory_remove - ("/tmp/test-gnunet-core-quota-asym-recv-lim-peer-1/"); - GNUNET_DISK_directory_remove - ("/tmp/test-gnunet-core-quota-asym-recv-lim-peer-2/"); - } + cleanup_directory (test); return ret; } + /* end of test_core_quota_compliance.c */