diff spandsp-0.0.6pre17/tests/t38_core_tests.c @ 4:26cd8f1ef0b1

import spandsp-0.0.6pre17
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 15:50:58 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spandsp-0.0.6pre17/tests/t38_core_tests.c	Fri Jun 25 15:50:58 2010 +0200
@@ -0,0 +1,303 @@
+/*
+ * SpanDSP - a series of DSP components for telephony
+ *
+ * t38_core_tests.c - Tests for the T.38 FoIP core module.
+ *
+ * Written by Steve Underwood <steveu@coppice.org>
+ *
+ * Copyright (C) 2007 Steve Underwood
+ *
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id: t38_core_tests.c,v 1.16 2009/07/14 13:54:22 steveu Exp $
+ */
+
+/*! \file */
+
+/*! \page t38_core_tests_page T.38 core tests
+\section t38_core_tests_page_sec_1 What does it do?
+These tests exercise the T.38 core ASN.1 processing code.
+*/
+
+#if defined(HAVE_CONFIG_H)
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
+//#if defined(WITH_SPANDSP_INTERNALS)
+#define SPANDSP_EXPOSE_INTERNAL_STRUCTURES
+//#endif
+
+#include "spandsp.h"
+
+#define MAX_FIELDS      42
+#define MAX_FIELD_LEN   8192
+
+int t38_version;
+int succeeded = TRUE;
+int ok_indicator_packets;
+int bad_indicator_packets;
+int ok_data_packets;
+int bad_data_packets;
+int missing_packets;
+
+int current_indicator;
+int current_data_type;
+int current_field_type;
+int skip;
+
+uint8_t field_body[MAX_FIELDS][MAX_FIELD_LEN];
+int field_len[MAX_FIELDS];
+
+static int rx_missing_handler(t38_core_state_t *s, void *user_data, int rx_seq_no, int expected_seq_no)
+{
+    missing_packets++;
+    //printf("Hit missing\n");
+    return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+static int rx_indicator_handler(t38_core_state_t *s, void *user_data, int indicator)
+{
+    if (indicator == current_indicator)
+        ok_indicator_packets++;
+    else
+        bad_indicator_packets++;
+    //printf("Hit indicator %d\n", indicator);
+    return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+static int rx_data_handler(t38_core_state_t *s, void *user_data, int data_type, int field_type, const uint8_t *buf, int len)
+{
+    if (--skip >= 0)
+    {
+        if (data_type == current_data_type  &&  field_type == current_field_type)
+            ok_data_packets++;
+        else
+            bad_data_packets++;
+    }
+    else
+    {
+        if (data_type == current_data_type  &&  field_type == T38_FIELD_T4_NON_ECM_SIG_END)
+            ok_data_packets++;
+        else
+            bad_data_packets++;
+    }
+    //printf("Hit data %d, field %d\n", data_type, field_type);
+    return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+static int tx_packet_handler(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count)
+{
+    t38_core_state_t *t;
+    static int seq_no = 0;
+    
+    t = (t38_core_state_t *) user_data;
+    span_log(&s->logging, SPAN_LOG_FLOW, "Send seq %d, len %d, count %d\n", s->tx_seq_no, len, count);
+    if (t38_core_rx_ifp_packet(t, buf, len, seq_no) < 0)
+        succeeded = FALSE;
+    seq_no++;
+    return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+static int encode_decode_tests(t38_core_state_t *a, t38_core_state_t *b)
+{
+    t38_data_field_t field[MAX_FIELDS];
+    int i;
+    int j;
+    
+    ok_indicator_packets = 0;
+    bad_indicator_packets = 0;
+    ok_data_packets = 0;
+    bad_data_packets = 0;
+    missing_packets = 0;
+
+    /* Try all the indicator types */
+    for (i = 0;  i < 100;  i++)
+    {
+        current_indicator = i;
+        if (t38_core_send_indicator(a, i) < 0)
+            break;
+    }
+
+    /* Try all the data types, as single field messages with no data */
+    for (i = 0;  i < 100;  i++)
+    {
+        for (j = 0;  j < 100;  j++)
+        {
+            current_data_type = i;
+            current_field_type = j;
+            skip = 99;
+            if (t38_core_send_data(a, i, j, (uint8_t *) "", 0, T38_PACKET_CATEGORY_CONTROL_DATA) < 0)
+                break;
+        }
+        if (j == 0)
+            break;
+    }
+
+    /* Try all the data types and field types, as single field messages with data */
+    for (i = 0;  i < 100;  i++)
+    {
+        for (j = 0;  j < 100;  j++)
+        {
+            current_data_type = i;
+            current_field_type = j;
+            skip = 99;
+            if (t38_core_send_data(a, i, j, (uint8_t *) "ABCD", 4, T38_PACKET_CATEGORY_CONTROL_DATA) < 0)
+                break;
+        }
+        if (j == 0)
+            break;
+    }
+
+    /* Try all the data types and field types, as multi-field messages */
+    for (i = 0;  i < 100;  i++)
+    {
+        for (j = 0;  j < 100;  j++)
+        {
+            current_data_type = i;
+            current_field_type = j;
+            skip = 1;
+
+            field_len[0] = 444;
+            field_len[1] = 333;
+
+            field[0].field_type = j;
+            field[0].field = field_body[0];
+            field[0].field_len = field_len[0];
+            field[1].field_type = T38_FIELD_T4_NON_ECM_SIG_END;
+            field[1].field = field_body[1];
+            field[1].field_len = field_len[1];
+            if (t38_core_send_data_multi_field(a, i, field, 2, T38_PACKET_CATEGORY_CONTROL_DATA) < 0)
+                break;
+        }
+        if (j == 0)
+            break;
+    }
+    printf("Indicator packets: OK = %d, bad = %d\n", ok_indicator_packets, bad_indicator_packets);
+    printf("Data packets: OK = %d, bad = %d\n", ok_data_packets, bad_data_packets);
+    printf("Missing packets = %d\n", missing_packets);
+    if (t38_version == 0)
+    {
+        if (ok_indicator_packets != 16  ||  bad_indicator_packets != 0)
+        {
+            printf("Tests failed\n");
+            return -1;
+        }
+        if (ok_data_packets != 288  ||  bad_data_packets != 0)
+        {
+            printf("Tests failed\n");
+            return -1;
+        }
+    }
+    else
+    {
+        if (ok_indicator_packets != 23  ||  bad_indicator_packets != 0)
+        {
+            printf("Tests failed\n");
+            return -1;
+        }
+        if (ok_data_packets != 720  ||  bad_data_packets != 0)
+        {
+            printf("Tests failed\n");
+            return -1;
+        }
+    }
+    if (missing_packets > 0)
+    {
+        printf("Tests failed\n");
+        return -1;
+    }
+    return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+static int attack_tests(t38_core_state_t *s)
+{
+    return 0;
+}
+/*- End of function --------------------------------------------------------*/
+
+int main(int argc, char *argv[])
+{
+    t38_core_state_t t38_core_a;
+    t38_core_state_t t38_core_b;
+
+    for (t38_version = 0;  t38_version < 2;  t38_version++)
+    {
+        printf("Using T.38 version %d\n", t38_version);
+
+        if (t38_core_init(&t38_core_a,
+                          rx_indicator_handler,
+                          rx_data_handler,
+                          rx_missing_handler,
+                          &t38_core_b,
+                          tx_packet_handler,
+                          &t38_core_b) == NULL)
+        {
+            fprintf(stderr, "Cannot start the T.38 core\n");
+            exit(2);
+        }
+        if (t38_core_init(&t38_core_b,
+                          rx_indicator_handler,
+                          rx_data_handler,
+                          rx_missing_handler,
+                          &t38_core_a,
+                          tx_packet_handler,
+                          &t38_core_a) == NULL)
+        {
+            fprintf(stderr, "Cannot start the T.38 core\n");
+            exit(2);
+        }
+
+        t38_set_t38_version(&t38_core_a, t38_version);
+        t38_set_t38_version(&t38_core_b, t38_version);
+
+        span_log_set_level(&t38_core_a.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG);
+        span_log_set_tag(&t38_core_a.logging, "T.38-A");
+        span_log_set_level(&t38_core_b.logging, SPAN_LOG_DEBUG | SPAN_LOG_SHOW_TAG);
+        span_log_set_tag(&t38_core_b.logging, "T.38-B");
+
+        if (encode_decode_tests(&t38_core_a, &t38_core_b))
+        {
+            printf("Encode/decode tests failed\n");
+            exit(2);
+        }
+        if (attack_tests(&t38_core_a))
+        {
+            printf("Attack tests failed\n");
+            exit(2);
+        }
+    }
+    if (!succeeded)
+    {
+        printf("Tests failed\n");
+        exit(2);
+    }
+    printf("Tests passed\n");
+    return  0;
+}
+/*- End of function --------------------------------------------------------*/
+/*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.