From 64c829909bc5b73a7765272ad07cf6465762aeac Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Mon, 4 Jul 2016 07:23:44 +0200 Subject: NMT / DMS: User data facility support (required for SMS) --- src/test/test_dms.c | 262 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 src/test/test_dms.c (limited to 'src/test/test_dms.c') diff --git a/src/test/test_dms.c b/src/test/test_dms.c new file mode 100644 index 0000000..c773cfc --- /dev/null +++ b/src/test/test_dms.c @@ -0,0 +1,262 @@ +#include +#include +#include +#include +#include +#include +#include "../common/debug.h" +#include "../common/timer.h" +#include "../nmt/nmt.h" + +extern int dms_allow_loopback; + +static void assert(int condition, char *why) +{ + printf("%s = %s\n", why, (condition) ? "TRUE" : "FALSE"); + + if (!condition) { + printf("\n******************** FAILED ********************\n\n"); + exit(-1); + } +} + +void ok(void) +{ + printf("\n OK ;->\n\n"); + sleep(1); +} + +static const char testsequence[] = "This is a test for DMS protocol layer. It will test the handing of transfer window. Also it will test what happens, if frames get dropped."; +static const char *check_sequence; +int check_length; + +static const uint8_t test_null[][8] = { + { 0x01, 0x02, 0x02, 0x04, 0x05, 0x06, 0x07, 7 }, + { 0x01, 0x02, 0x02, 0x04, 0x05, 0x06, 0x00, 6 }, + { 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 5 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1 }, +}; + +static char current_bits[1024], ack_bits[77]; +int current_bit_count; + +void dms_receive(nmt_t *nmt, const uint8_t *data, int length, int eight_bits) +{ + printf("(getting %d digits from DMS layer)\n", length); + + assert(!memcmp((const char *)data, check_sequence, length), "Expecting received data to macht"); + + check_sequence += length; + check_length = length; +} + +void dms_all_sent(nmt_t *nmt) +{ +} + +/* receive bits from DMS */ +void fsk_render_frame(nmt_t *nmt, const char *frame, int length, int16_t *sample) +{ + printf("(getting %d bits from DMS layer)\n", length); + + memcpy(current_bits, frame, length); + current_bit_count = length; +} + +nmt_t *alloc_nmt(void) +{ + nmt_t *nmt; + + nmt = calloc(sizeof(*nmt), 1); + nmt->dms.frame_spl = calloc(1000000, 1); + nmt->samples_per_bit = 40; + + dms_reset(nmt); + + return nmt; +} + +void free_nmt(nmt_t *nmt) +{ + free(nmt->dms.frame_spl); + free(nmt); +} + +int main(void) +{ + nmt_t *nmt; + dms_t *dms; + int i, j; + int16_t sample = 0; + + debuglevel = DEBUG_DEBUG; + dms_allow_loopback = 1; + + nmt = alloc_nmt(); + dms = &nmt->dms; + + /* test if frame cycles until we send RAND */ + + check_sequence = testsequence; + dms_send(nmt, (uint8_t *)testsequence, strlen(testsequence) + 1, 1); + assert(dms->frame_valid && current_bit_count == 127, "Expecting frame in queue with 127 bits"); + assert(dms->state.n_s == 1, "Expecting next frame to have sequence number 1"); + + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + + assert(dms->frame_valid && current_bit_count == 127, "Expecting frame in queue with 127 bits"); + assert(dms->state.n_s == 0, "Expecting next frame to have sequence number 0 (cycles due to unacked RAND)"); + + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + + assert(dms->frame_valid && current_bit_count == 127, "Expecting frame in queue with 127 bits"); + assert(dms->state.n_s == 1, "Expecting next frame to have sequence number 1"); + + /* send back ID */ + + printf("Sending back ID\n"); + for (i = 0; i < current_bit_count; i++) + fsk_receive_bit_dms(nmt, current_bits[i] & 1, 1.0, 1.0); + + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + + assert(dms->frame_valid && current_bit_count == 77, "Expecting frame in queue with 77 bits"); + + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + + assert(dms->frame_valid && current_bit_count == 127, "Expecting frame in queue with 127 bits"); + assert(dms->state.n_s == 0, "Expecting next frame to have sequence number 0"); + + /* send back RAND */ + printf("Sending back RAND\n"); + for (i = 0; i < current_bit_count; i++) + fsk_receive_bit_dms(nmt, current_bits[i] & 1, 1.0, 1.0); + + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + + assert(dms->frame_valid && current_bit_count == 77, "Expecting frame in queue with 77 bits"); + memcpy(ack_bits, current_bits, 77); + + /* check if DT frame will be sent now */ + + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + + assert(dms->frame_valid && current_bit_count == 127, "Expecting frame in queue with 127 bits"); + assert(dms->state.n_s == 1, "Expecting next frame to have sequence number 1"); + + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + + assert(dms->frame_valid && current_bit_count == 127, "Expecting frame in queue with 127 bits"); + assert(dms->state.n_s == 2, "Expecting next frame to have sequence number 2"); + + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + + assert(dms->frame_valid && current_bit_count == 127, "Expecting frame in queue with 127 bits"); + assert(dms->state.n_s == 3, "Expecting next frame to have sequence number 3"); + + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + + assert(dms->frame_valid && current_bit_count == 127, "Expecting frame in queue with 127 bits"); + assert(dms->state.n_s == 0, "Expecting next frame to have sequence number 0"); + + /* send back ack bitss */ + printf("Sending back RR(2)\n"); + memcpy(current_bits, ack_bits, 77); + current_bit_count = 77; + for (i = 0; i < current_bit_count; i++) + fsk_receive_bit_dms(nmt, current_bits[i] & 1, 1.0, 1.0); + + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + + assert(dms->frame_valid && current_bit_count == 127, "Expecting frame in queue with 127 bits"); + assert(dms->state.n_s == 3, "Expecting next frame to have sequence number 0"); + + ok(); + + /* loopback frames */ + printf("pipe through all data\n"); + while (check_sequence[0]) { + printf("Sending back last received frame\n"); + for (i = 0; i < current_bit_count; i++) + fsk_receive_bit_dms(nmt, current_bits[i] & 1, 1.0, 1.0); + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + } + + ok(); + + debuglevel = DEBUG_INFO; + + /* test again with pseudo random packet dropps */ + srandom(0); + free_nmt(nmt); + nmt = alloc_nmt(); + dms = &nmt->dms; + + check_sequence = testsequence; + dms_send(nmt, (uint8_t *)testsequence, strlen(testsequence) + 1, 1); + + /* loopback frames */ + printf("pipe through all data\n"); + while (check_sequence[0]) { + if ((random() & 1)) { + printf("Sending back last received frame\n"); + for (i = 0; i < current_bit_count; i++) + fsk_receive_bit_dms(nmt, current_bits[i] & 1, 1.0, 1.0); + } + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + } + + ok(); + + free_nmt(nmt); + nmt = alloc_nmt(); + dms = &nmt->dms; + + /* test zero termination */ + for (j = 0; j < 4; j++) { + current_bit_count = 0; + printf("zero-termination test: %d bytes in frame\n", test_null[j][7]); + dms_send(nmt, test_null[j], test_null[j][7], 1); + check_sequence = (char *)test_null[j]; + + while (current_bit_count) { + printf("Sending back last received frame\n"); + for (i = 0; i < current_bit_count; i++) + fsk_receive_bit_dms(nmt, current_bits[i] & 1, 1.0, 1.0); + current_bit_count = 0; + printf("Pretend that frame has been sent\n"); + dms->frame_length = 0; + fsk_dms_frame(nmt, &sample, 1); + } + assert(check_length == test_null[j][7], "Expecting received length to match transmitted length"); + } + + ok(); + + return 0; +} + -- cgit v1.2.3