summaryrefslogtreecommitdiff
path: root/cleopatre/application/libmme
diff options
context:
space:
mode:
Diffstat (limited to 'cleopatre/application/libmme')
-rw-r--r--cleopatre/application/libmme/src/mme.c66
-rw-r--r--cleopatre/application/libmme/utests/src/mme_utests.c279
2 files changed, 274 insertions, 71 deletions
diff --git a/cleopatre/application/libmme/src/mme.c b/cleopatre/application/libmme/src/mme.c
index e025beefe0..db43ff15f1 100644
--- a/cleopatre/application/libmme/src/mme.c
+++ b/cleopatre/application/libmme/src/mme.c
@@ -46,6 +46,10 @@
mme_error_t mme_init (mme_ctx_t *ctx, const mme_type_t mmtype, unsigned char *buffer, const unsigned int length)
{
+ /* protect from null pointers */
+ if (ctx == NULL || buffer == NULL)
+ return MME_ERROR_GEN;
+
ctx->buffer = buffer;
ctx->mmtype = mmtype;
ctx->length = length;
@@ -67,11 +71,14 @@ mme_error_t mme_init (mme_ctx_t *ctx, const mme_type_t mmtype, unsigned char *bu
mme_error_t mme_get_length (mme_ctx_t *ctx, unsigned int *length)
{
+ /* protect from null pointers */
+ if (ctx == NULL || length == NULL)
+ return MME_ERROR_GEN;
/* check if ctx has been inititalized */
if (ctx->status == MME_STATUS_INIT)
return MME_ERROR_NOT_INIT;
- *length = ctx->length;
+ *length = ctx->tail - ctx->head;
return MME_SUCCESS;
}
@@ -85,11 +92,14 @@ mme_error_t mme_get_length (mme_ctx_t *ctx, unsigned int *length)
mme_error_t mme_get_free_space (mme_ctx_t *ctx, unsigned int *length)
{
+ /* protect from null pointers */
+ if (ctx == NULL || length == NULL)
+ return MME_ERROR_GEN;
/* check if ctx has been inititalized */
if (ctx->status == MME_STATUS_INIT)
return MME_ERROR_NOT_INIT;
- *length = ctx->tail - ctx->head;
+ *length = ctx->length - (ctx->tail - ctx->head);
return MME_SUCCESS;
}
@@ -112,13 +122,19 @@ mme_error_t mme_push (mme_ctx_t *ctx, const void *data, unsigned int *length)
int free = 0;
int delta = 0;
+ /* protect from null pointers */
+ if (ctx == NULL || data == NULL || length == NULL)
+ return MME_ERROR_GEN;
/* check if ctx has been inititalized */
if (ctx->status == MME_STATUS_INIT)
return MME_ERROR_NOT_INIT;
free = ctx->length - (ctx->tail - ctx->head);
if (*length > free)
+ {
+ *length = free;
return MME_ERROR_SPACE;
+ }
/* make place in front, if needed */
if (*length > ctx->head)
@@ -166,16 +182,22 @@ mme_error_t mme_put (mme_ctx_t *ctx, void *data, unsigned int *length)
int free = 0;
int delta = 0;
+ /* protect from null pointers */
+ if (ctx == NULL || data == NULL || length == NULL)
+ return MME_ERROR_GEN;
/* check if ctx has been inititalized */
if (ctx->status == MME_STATUS_INIT)
return MME_ERROR_NOT_INIT;
free = ctx->length - (ctx->tail - ctx->head);
if (*length > free)
+ {
+ *length = free;
return MME_ERROR_SPACE;
+ }
/* make place after payload, if needed */
- if (*length > ctx->head)
+ if (*length > ctx->length - ctx->tail)
{
/*
* *length
@@ -216,13 +238,19 @@ mme_error_t mme_put (mme_ctx_t *ctx, void *data, unsigned int *length)
mme_error_t mme_pull (mme_ctx_t *ctx, void *data, unsigned int *length)
{
+ /* protect from null pointers */
+ if (ctx == NULL || data == NULL || length == NULL)
+ return MME_ERROR_GEN;
/* check if ctx has been inititalized */
if (ctx->status == MME_STATUS_INIT)
return MME_ERROR_NOT_INIT;
/* check if it is demanded more data than we have in payload */
if (*length > ctx->tail - ctx->head)
+ {
+ *length = ctx->tail - ctx->head;
return MME_ERROR_ENOUGH;
+ }
memcpy(data, (unsigned char *)(ctx->buffer + ctx->head), *length);
ctx->head += *length;
@@ -244,13 +272,19 @@ mme_error_t mme_pull (mme_ctx_t *ctx, void *data, unsigned int *length)
mme_error_t mme_pop (mme_ctx_t *ctx, void *data, unsigned int *length)
{
+ /* protect from null pointers */
+ if (ctx == NULL || data == NULL || length == NULL)
+ return MME_ERROR_GEN;
/* check if ctx has been inititalized */
if (ctx->status == MME_STATUS_INIT)
return MME_ERROR_NOT_INIT;
/* check if it is demanded more data than we have in payload */
if (*length > ctx->tail - ctx->head)
+ {
+ *length = ctx->tail - ctx->head;
return MME_ERROR_ENOUGH;
+ }
memcpy(data, (unsigned char *)(ctx->buffer + ctx->tail - *length), *length);
ctx->tail -= *length;
@@ -306,7 +340,11 @@ mme_error_t mme_send (mme_ctx_t *ctx, mme_send_type_t type, unsigned char *iface
int res, len;
int i;
int pkt_nfo_sz = sizeof(pkt_info);
+ mme_error_t ret;
+ /* protect from null pointers */
+ if (ctx == NULL || confirm_ctx == NULL ||iface == NULL || dest == NULL)
+ return MME_ERROR_GEN;
/* check if ctx has been inititalized */
if (ctx->status == MME_STATUS_INIT)
return MME_ERROR_NOT_INIT;
@@ -354,7 +392,6 @@ mme_error_t mme_send (mme_ctx_t *ctx, mme_send_type_t type, unsigned char *iface
* --- Create MME header ---
*/
/* Find src mac addr (can be eth0 or plc interface) */
- strcpy(ifr.ifr_name, (char *)iface);
ioctl(raw, SIOCGIFHWADDR, &ifr);
for( i = 0; i < 6; i++ )
{
@@ -496,7 +533,7 @@ mme_error_t mme_send (mme_ctx_t *ctx, mme_send_type_t type, unsigned char *iface
* by HP AV standard difference is in LSB, i.e. if REQ LSBs are ...00,
* CNF will be ...01, IND ...10 and RSP ...11 */
if ( memcmp(pkt_info.sll_addr, dest, 6) == 0 && /* we received packet from correct source */
- ((MME_t *)pkt)->mmtype == type + 1 ) /* correct response to our request */
+ ((MME_t *)pkt)->mmtype == ctx->mmtype + 1 ) /* correct response to our request */
{
break; /* good answer - go out and process the package */
}
@@ -514,7 +551,9 @@ mme_error_t mme_send (mme_ctx_t *ctx, mme_send_type_t type, unsigned char *iface
len -= sizeof(MME_t);
/* copy the packet into the receive buffer */
- mme_put( confirm_ctx, pkt, (unsigned int *)&len );
+ ret = mme_put( confirm_ctx, pkt, (unsigned int *)&len );
+ if (ret != MME_SUCCESS)
+ return ret;
} while (!last_pkt);
@@ -553,7 +592,11 @@ mme_error_t mme_listen (mme_ctx_t *ctx, unsigned char *iface, unsigned char *sou
struct timeval waittime;
int res, len;
int pkt_nfo_sz = sizeof(pkt_info);
+ mme_error_t ret;
+ /* protect from null pointers */
+ if (ctx == NULL || iface == NULL || source == NULL)
+ return MME_ERROR_GEN;
/* check if ctx has been inititalized */
if (ctx->status == MME_STATUS_INIT)
return MME_ERROR_NOT_INIT;
@@ -659,12 +702,19 @@ mme_error_t mme_listen (mme_ctx_t *ctx, unsigned char *iface, unsigned char *sou
len -= sizeof(MME_t);
/* copy the packet into the receive buffer */
- mme_put( ctx, pkt, (unsigned int *)&len );
+ ret = mme_put( ctx, pkt, (unsigned int *)&len );
+ if (ret != MME_SUCCESS)
+ return ret;
} while (!last_pkt);
/* and now whe we assembled the message, call the processing function */
- listen_cb(ctx, iface, source);
+ if (listen_cb != NULL)
+ {
+ ret = listen_cb(ctx, iface, source);
+ if (ret != MME_SUCCESS)
+ return ret;
+ }
return MME_SUCCESS;
}
diff --git a/cleopatre/application/libmme/utests/src/mme_utests.c b/cleopatre/application/libmme/utests/src/mme_utests.c
index 83c9ee217c..9237f9f31d 100644
--- a/cleopatre/application/libmme/utests/src/mme_utests.c
+++ b/cleopatre/application/libmme/utests/src/mme_utests.c
@@ -50,11 +50,11 @@
/** local defines */
#define BUFF_LEN 1024
#define BIG_BUFF_LEN 4096 /* to force message fragmenting */
-#define DATA_SIZE 100
+#define DATA_SIZE 256
#define IFACE "tap0"
#define DST_ADDR_STR "aa:bb:cc:dd:ee:ff"
-#define HEAD 100
+#define HEAD 256
#define MSG_LEN 3200 /* more than 2 packets */
//#define MSG_LEN 2
#define TAIL ( HEAD + MSG_LEN )
@@ -66,7 +66,8 @@
#endif
/** local variables */
-mme_ctx_t ctx;
+mme_ctx_t s_ctx;
+mme_ctx_t *ctx = &s_ctx;
const unsigned short mmtype = 0x0; /* CC_CCO_APPOINT.REQ */
const unsigned int len = BUFF_LEN;
unsigned char buffer[BUFF_LEN] = {0};
@@ -90,6 +91,15 @@ unsigned char snd_buff[BIG_BUFF_LEN] = {0};
unsigned char rcv_buff[BIG_BUFF_LEN] = {0};
unsigned char dst_addr[6];
+#define DATA_SIZE_PUSH 512 /* will force payload move right; HEAD + 512 = 768; free space until the end of the buff 1024 - 768 = 256*/
+#define DATA_SIZE_PUT 512 /* to force move left of the head for 256 bytes */
+unsigned char data_push[DATA_SIZE_PUSH];
+unsigned char data_put[DATA_SIZE_PUT];
+#define FAKE_PAYLOAD_LEN 256
+unsigned char fake_payload[FAKE_PAYLOAD_LEN];
+
+int listen_var = 0;
+
#if 0
/* fixtures - run before and after each unit test */
void setup(void)
@@ -285,10 +295,9 @@ static void* thread_sender(void *unused)
memset(thr_buff + HEAD, 0xcc, MSG_LEN/2);
memset(thr_buff+ HEAD + MSG_LEN/2, 0xee, MSG_LEN/2);
- sleep(2);
-
+ /* first wait 1 sec to be sure that our server is bloacked on receive in mme_listen */
+ sleep(1);
/* send the payload */
-printf("thr_ctx->mmtype = %d\n", thr_ctx->mmtype);
send_message();
TRACE("Thread 'sender' stop\n");
@@ -514,15 +523,18 @@ START_TEST (test_mme_init)
mme_error_t ret;
/*zero-out ctx */
- memset((unsigned char *)&ctx, 0x0, sizeof(mme_ctx_t));
+ memset((unsigned char *)ctx, 0x0, sizeof(mme_ctx_t));
//Check arguments
- ret = mme_init(&ctx, mmtype, buffer, len);
+ ret = mme_init(ctx, mmtype, buffer, len);
fail_if(ret != MME_SUCCESS, "mme_init fail");
- fail_if ((&ctx)->length != len, "wrong lenth init");
- fail_if ((&ctx)->mmtype != mmtype, "wrong mmtype init");
- fail_if ((&ctx)->buffer != buffer, "wrong length init");
+ fail_if (ctx->length != len, "wrong lenth init");
+ fail_if (ctx->mmtype != mmtype, "wrong mmtype init");
+ fail_if (ctx->buffer != buffer, "wrong length init");
+ fail_if (ctx->head != 0, "wrong head init");
+ fail_if (ctx->tail != 0, "wrong tail init");
+ fail_if (ctx->tail != 0, "wrong tail init");
}
END_TEST
@@ -531,74 +543,136 @@ START_TEST (test_mme_get_length)
unsigned int chklen;
mme_error_t ret;
+ /* SETUP CONTEXT PAYLOAD - will be used in following unit tests
+ * before getting length we will set-up our contex, not to be init vanilla (with head and tail 0) */
+ ctx->head = HEAD;
+ ctx->tail = HEAD + FAKE_PAYLOAD_LEN;
+ memset(fake_payload, 0xdd, FAKE_PAYLOAD_LEN);
+ memcpy(ctx->buffer + ctx->head, fake_payload, ctx->tail - ctx->head);
+
//Check arguments
- ret = mme_get_length(&ctx, &chklen);
+ ret = mme_get_length(ctx, &chklen);
fail_if(ret != MME_SUCCESS, "mme_get_length fail");
+ /* we did one push before checking the payload length */
+ fail_if (chklen != FAKE_PAYLOAD_LEN, "wrong length returned");
+}
+END_TEST
- fail_if (chklen != (&ctx)->length, "wrong length returned");
+START_TEST (test_mme_get_free_space)
+{
+ unsigned int chkspace;
+ mme_error_t ret;
+
+ //Check arguments
+ ret = mme_get_free_space(ctx, &chkspace);
+ fail_if(ret != MME_SUCCESS, "mme_get_free_space fail");
+
+ fail_if (chkspace != BUFF_LEN - FAKE_PAYLOAD_LEN, "wrong space returned");
+ fail_if (mme_get_free_space(ctx, NULL) != MME_ERROR_GEN, "wrong null pointer protection");
}
END_TEST
START_TEST (test_mme_push)
{
- unsigned char data[DATA_SIZE];
mme_error_t ret;
int i;
unsigned int size;
+ /*
+ * state of buffer :
+ *
+ * HEAD FAKE_PAYLOAD_LEN 1024
+ * |---------|=======================|--------------------------------------|
+ * head tail = HEAD + FAKE_PAYLOAD_LEN
+ */
+
/* initialize data array to some value, for example 0, 1, 2, ... */
- for (i=0; i<DATA_SIZE; i++)
+ for (i=0; i<sizeof(data_push); i++)
{
- data[i] = i;
+ data_push[i] = i;
}
- size = sizeof(data);
+ size = sizeof(data_push);
//Check arguments
- ret = mme_push(&ctx, data, &size);
+ ret = mme_push(ctx, data_push, &size);
fail_if(ret != MME_SUCCESS, "mme_push fail");
- for (i=0; i<DATA_SIZE; i++)
+ fail_if ( memcmp( ctx->buffer + ctx->head, data_push, sizeof(data_push) ) != 0, "wrong data pushed" );
+ if (sizeof(data_push) > ctx->head)
{
- fail_if ( ( (&ctx)->buffer + (&ctx)->head )[i] != i, "wrong data pushed" );
+ fail_if ( ctx->head != 0, "old payload wrongly shifted" );
+ fail_if ( memcmp( ctx->buffer + ctx->head + sizeof(data_push), fake_payload,
+ FAKE_PAYLOAD_LEN) != 0, "old payload wrongly shifted" );
+ if (sizeof(data_push) < ctx->head + (BUFF_LEN - ctx->tail) - 3) /* if we have at least 3 bytes of free space left */
+ {
+ /* check if finish at good place */
+ fail_if ( memcmp( ctx->buffer + ctx->head + sizeof(data_push) + FAKE_PAYLOAD_LEN,
+ "\x00\x00\x00", 3) != 0, "old payload wrongly shifted" );
+ }
}
-}
-END_TEST
-START_TEST (test_mme_get_free_space)
-{
- unsigned int chkspace;
- mme_error_t ret;
-
- //Check arguments
- ret = mme_get_free_space(&ctx, &chkspace);
- fail_if(ret != MME_SUCCESS, "mme_get_free_space fail");
-
- fail_if (chkspace != BUFF_LEN - DATA_SIZE, "wrong space returned");
+ size = 5000;
+ fail_if ( mme_push(ctx, data_push, &size) != MME_ERROR_SPACE, "free space detectoin does not work" );
}
END_TEST
START_TEST (test_mme_put)
{
- unsigned char data[DATA_SIZE];
mme_error_t ret;
int i;
unsigned int size;
+ /*
+ * state of buffer :
+ *
+ * 768 1024
+ * |============================|---------|
+ * head tail
+ */
+
/* initialize data array to some value, for example 0, 1, 2, ... */
- for (i=0; i<DATA_SIZE; i++)
+ for (i=0; i<sizeof(data_put); i--)
{
- data[i] = i;
+ data_put[i] = i;
}
- size = sizeof(data);
+ size = sizeof(data_put);
+
+ /* make space in the begining */
+ ctx->head = 512; /* move head on the right to 512 */
+ ctx->head = 768; /* it was already here after mme_push, but just to be sure */
+ memset(ctx->buffer, 0x0, 512); /* zero-out the begining, so we can observe payload shift */
+ /*
+ * state of buffer :
+ *
+ * 512 768 1024
+ * |--------|============================|---------|
+ * head tail
+ */
//Check arguments
- ret = mme_put(&ctx, data, &size);
+ /* firs put a little chun k, to check if it works */
+ size = sizeof(data_put) / 4;
+ ret = mme_put(ctx, data_put, &size);
fail_if(ret != MME_SUCCESS, "mme_put fail");
- for (i=0; i<DATA_SIZE; i++)
+ fail_if ( memcmp( ctx->buffer + ctx->tail - sizeof(data_put), data_put, sizeof(data_put) / 4 ) != 0, "wrong data put");
+
+ /* this leaves us with 512 (before head) + 128 (after tail) bytes of free space */
+ size = sizeof(data_put); /* bigger size of trailing 128 bytes that will provoke shifting payload left */
+ ret = mme_put(ctx, data_put, &size);
+ fail_if(ret != MME_SUCCESS, "mme_put fail");
+ if (sizeof(data_put) > BUFF_LEN - ctx->tail) /* in this case we have shift */
{
- fail_if ( ( (&ctx)->buffer + (&ctx)->tail - DATA_SIZE )[i] != i, "wrong data put" );
+ fail_if ( memcmp( ctx->buffer + ctx->tail - sizeof(data_put), data_put, sizeof(data_put)) != 0, "wrong data shift");
+ if ( sizeof(data_put) < ctx->head + (BUFF_LEN - ctx->tail) - 3 ) /* if we have at least 3 bytes of free space left */
+ {
+ fail_if ( memcmp( ctx->buffer + ctx->head - 3, "\x00\x00\x00", 3) != 0, "wrong data shift");
+ }
}
+
+ size = 5000;
+ ret = mme_put(ctx, data_put, &size);
+ fail_if(ret != MME_ERROR_SPACE, "mme_put fail");
}
END_TEST
@@ -606,45 +680,78 @@ START_TEST (test_mme_pull)
{
unsigned char data[DATA_SIZE];
mme_error_t ret;
- int i;
unsigned int size;
/*zero-out data */
- memset(data, 0x0, sizeof(mme_ctx_t));
+ memset(data, 0x0, sizeof(data));
+
+ /*zero-out buffer, we will redefine it */
+ memset(ctx->buffer, 0x0, sizeof(ctx->buffer));
+ /* reset head, tail */
+ ctx->head = HEAD;
+ ctx->tail = HEAD + FAKE_PAYLOAD_LEN;
+ /* set the fake payload into buffer */
+ memcpy(ctx->buffer + ctx->head, fake_payload, ctx->tail - ctx->head);
+ /*
+ * state of buffer :
+ *
+ * HEAD FAKE_PAYLOAD_LEN 1024
+ * |---------|=======================|--------------------------------------|
+ * head tail = HEAD + FAKE_PAYLOAD_LEN
+ */
- size = sizeof(data);
+
+ size = FAKE_PAYLOAD_LEN;
//Check arguments
- ret = mme_pull(&ctx, data, &size);
+ ret = mme_pull(ctx, data, &size);
fail_if(ret != MME_SUCCESS, "mme_pull fail");
- for (i=0; i<DATA_SIZE; i++)
- {
- fail_if ( data[i] != i, "wrong data pulled" );
- }
+ /* check if we correctly pulled data that we previously pushed */
+ fail_if ( memcmp( data, fake_payload, sizeof(data) ) != 0, "wrong data pulled" );
+
+ ret = mme_pull(ctx, data, &size);
+ fail_if(ret != MME_ERROR_ENOUGH, "wrong enough data detection");
}
END_TEST
START_TEST (test_mme_pop)
{
- unsigned char data[DATA_SIZE];
+ unsigned char data[FAKE_PAYLOAD_LEN];
mme_error_t ret;
- int i;
unsigned int size;
/*zero-out data */
- memset(data, 0x0, sizeof(mme_ctx_t));
+ memset(data, 0x0, sizeof(data));
+
+ /*zero-out buffer, we will redefine it */
+ memset(ctx->buffer, 0x0, sizeof(ctx->buffer));
+ /* reset head, tail */
+ ctx->head = HEAD;
+ ctx->tail = HEAD + FAKE_PAYLOAD_LEN;
+ /* set the fake payload into buffer */
+ memcpy(ctx->buffer + ctx->head, fake_payload, ctx->tail - ctx->head);
+ /*
+ * state of buffer :
+ *
+ * HEAD FAKE_PAYLOAD_LEN 1024
+ * |---------|=======================|--------------------------------------|
+ * head tail = HEAD + FAKE_PAYLOAD_LEN
+ */
+
+ size = FAKE_PAYLOAD_LEN;
size = sizeof(data);
//Check arguments
- ret = mme_pop(&ctx, data, &size);
+ ret = mme_pop(ctx, data, &size);
fail_if(ret != MME_SUCCESS, "mme_pop fail");
- for (i=0; i<DATA_SIZE; i++)
- {
- fail_if ( data[i] != i, "wrong data poped" );
- }
+ /* check if we correctly popped data that we previously put */
+ fail_if ( memcmp( data, fake_payload, sizeof(data) ) != 0, "wrong data popped" );
+
+ ret = mme_pop(ctx, data, &size);
+ fail_if(ret != MME_ERROR_ENOUGH, "wrong enough datat detection");
}
END_TEST
@@ -656,11 +763,9 @@ START_TEST (test_mme_send)
/* for dst_addr from chosen string */
memcpy(dst_addr, (void *)ether_aton(DST_ADDR_STR), 6);
-
/* create TUN/TAP iface */
create_tuntap();
-
- /* Get the hardware address of the TAP interface */
+ /* get the dest addr, it will pretend to be addr of our server thread */
memcpy(dst_addr, (void *)ether_aton(DST_ADDR_STR), 6);
/* form the send message context */
@@ -683,7 +788,7 @@ START_TEST (test_mme_send)
rcv_ctx->mmtype = mmtype + 1;
rcv_ctx->length = sizeof(rcv_buff);
rcv_ctx->head = HEAD;
- rcv_ctx->tail = HEAD + MSG_LEN;
+ rcv_ctx->tail = HEAD + FAKE_PAYLOAD_LEN; /* let's say we have some small datat here */
rcv_ctx->status = MME_STATUS_OK;
/* create a thread that will listen and send reply */
@@ -695,7 +800,27 @@ START_TEST (test_mme_send)
// Call the send/receive function
ret = mme_send (snd_ctx, MME_SEND_REQ_CNF, (unsigned char *)iface, dst_addr, rcv_ctx);
- fail_if(ret != MME_SUCCESS, "mme_pop fail");
+ fail_if(ret != MME_SUCCESS, "mme_send fail");
+
+ /* check if we have correctly received the payload that thread had send */
+ fail_if( memcmp(rcv_ctx->buffer + HEAD + FAKE_PAYLOAD_LEN, thr_ctx->buffer + HEAD, MSG_LEN) != 0,
+ "did not receive the same data that thread has sent");
+
+ ret = mme_send (NULL, MME_SEND_REQ_CNF, (unsigned char *)iface, dst_addr, rcv_ctx);
+ fail_if(ret != MME_ERROR_GEN, "mme_send NULL pointer protection fail");
+ ret = mme_send (snd_ctx, MME_SEND_REQ_CNF, (unsigned char *)NULL, dst_addr, rcv_ctx);
+ fail_if(ret != MME_ERROR_GEN, "mme_send NULL pointer protection fail");
+ ret = mme_send (snd_ctx, MME_SEND_REQ_CNF, (unsigned char *)iface, dst_addr, NULL);
+ fail_if(ret != MME_ERROR_GEN, "mme_send NULL pointer protection fail");
+ /* check for timeout */
+ /* reset rcv buff context */
+ memset(rcv_ctx->buffer, 0x0, sizeof(rcv_ctx->buffer));
+ rcv_ctx->head = HEAD;
+ rcv_ctx->tail = HEAD + FAKE_PAYLOAD_LEN; /* let's say we have some small datat here */
+
+ rcv_ctx->mmtype = mmtype + 100;
+ ret = mme_send (snd_ctx, MME_SEND_REQ_CNF, (unsigned char *)iface, dst_addr, rcv_ctx);
+ fail_if(ret != MME_ERROR_TIMEOUT, "mme_send timeout not detected");
//Wait thread ending
pthread_join(receiver, (void *)&ret);
@@ -709,6 +834,7 @@ END_TEST
mme_error_t listen_cb (mme_ctx_t *ctx, unsigned char *iface, unsigned char *source)
{
printf("Hello world!\n");
+ listen_var = 1;
return MME_SUCCESS;
}
@@ -759,12 +885,40 @@ START_TEST (test_mme_listen)
rcv_ctx->mmtype = mmtype + 1; /* server will prepare MME type CNF */
rcv_ctx->length = sizeof(rcv_buff);
rcv_ctx->head = HEAD;
- rcv_ctx->tail = HEAD + MSG_LEN;
+ rcv_ctx->tail = HEAD + FAKE_PAYLOAD_LEN;
rcv_ctx->status = MME_STATUS_OK;
// Call the send/receive function
ret = mme_listen (rcv_ctx, (unsigned char *)iface, dst_addr, listen_cb);
- fail_if(ret != MME_SUCCESS, "mme_pop fail");
+ fail_if(ret != MME_SUCCESS, "mme_listen fail");
+
+ /* check if we have correctly received the payload that thread had send */
+ fail_if( memcmp(rcv_ctx->buffer + HEAD + FAKE_PAYLOAD_LEN, thr_ctx->buffer + HEAD, MSG_LEN) != 0,
+ "did not receive the same data that thread has sent");
+
+ ret = mme_listen (rcv_ctx, (unsigned char *)NULL, dst_addr, listen_cb);
+ fail_if(ret != MME_ERROR_GEN, "mme_send NULL pointer protection fail");
+ ret = mme_listen (rcv_ctx, (unsigned char *)iface, NULL, listen_cb);
+ fail_if(ret != MME_ERROR_GEN, "mme_send NULL pointer protection fail");
+
+ /* reset rcv buff context */
+ memset(rcv_ctx->buffer, 0x0, sizeof(rcv_ctx->buffer));
+ rcv_ctx->head = HEAD;
+ rcv_ctx->tail = HEAD + FAKE_PAYLOAD_LEN; /* let's say we have some small datat here */
+ /* reset flag which notifies that callback fnc was called */
+ listen_var = 0;
+ ret = mme_listen (rcv_ctx, (unsigned char *)iface, dst_addr, NULL);
+ fail_if(ret != MME_SUCCESS || listen_var != 0, "listen without callback fnc fails");
+
+ /* check for timeout */
+ /* reset rcv buff context */
+ memset(rcv_ctx->buffer, 0x0, sizeof(rcv_ctx->buffer));
+ rcv_ctx->head = HEAD;
+ rcv_ctx->tail = HEAD + FAKE_PAYLOAD_LEN; /* let's say we have some small datat here */
+
+ rcv_ctx->mmtype = mmtype + 100;
+ ret = mme_listen (rcv_ctx, (unsigned char *)NULL, dst_addr, listen_cb);
+ fail_if(ret != MME_ERROR_TIMEOUT, "mme_listen timeout not detected");
//Wait thread ending
//pthread_join(sender, (void*)&ret);
@@ -772,7 +926,6 @@ START_TEST (test_mme_listen)
{
//printf("ERROR: Thread 'receiver' exited with code : %d\n", ret);
}
-
}
END_TEST