and added files
[bcm963xx.git] / userapps / opensource / libosip2 / src / test / torture_rfc3264.c
diff --git a/userapps/opensource/libosip2/src/test/torture_rfc3264.c b/userapps/opensource/libosip2/src/test/torture_rfc3264.c
new file mode 100755 (executable)
index 0000000..c82606b
--- /dev/null
@@ -0,0 +1,349 @@
+/*
+  The oSIP library implements the Session Initiation Protocol (SIP -rfc3261-)
+  Copyright (C) 2001,2002,2003  Aymeric MOIZARD jack@atosc.org
+  
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+  
+  This library 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
+  Lesser General Public License for more details.
+  
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <osipparser2/osip_rfc3264.h>
+#include <osipparser2/osip_port.h>
+
+#define AUDIO_CODEC 0x01
+#define VIDEO_CODEC 0x02
+#define T38_CODEC   0x04
+#define APP_CODEC   0x08
+
+int test_add_codec(struct osip_rfc3264 *cnf, int codec_type,
+                  int payload, char *attribute);
+sdp_message_t *get_test_remote_message(int index, FILE *torture_file, int verbose);
+
+int test_add_codec(struct osip_rfc3264 *cnf, int codec_type,
+                  int payload, char *attribute)
+{
+  sdp_media_t *med;
+  sdp_attribute_t *attr;
+  char *tmp;
+  int i;
+  if (payload>127) return -1;
+  if (attribute==NULL || strlen(attribute)==0) return -1;
+
+  i = sdp_media_init(&med);
+  if (i!=0) goto error;
+  
+  tmp = malloc(4);
+  snprintf(tmp, 3, "%i", payload);
+  med->m_proto = strdup("RTP/AVP");
+  osip_list_add(med->m_payloads, tmp, -1);
+
+  i = sdp_attribute_init (&attr);
+  if (i != 0)
+    return -1;
+  attr->a_att_field = strdup("rtpmap");
+  attr->a_att_value = strdup(attribute);
+  osip_list_add (med->a_attributes, attr, -1);
+
+
+  switch(codec_type)
+    {
+    case AUDIO_CODEC:
+      med->m_media = strdup("audio");
+      osip_rfc3264_add_audio_media(cnf, med, -1);
+      break;
+    case VIDEO_CODEC:
+      med->m_media = strdup("video");
+      osip_rfc3264_add_video_media(cnf, med, -1);
+      break;
+    }
+
+  return 0;
+
+ error:
+  return -1;
+}
+
+sdp_message_t *get_test_remote_message(int index, FILE *torture_file, int verbose)
+{
+  sdp_message_t *remote_sdp;
+  char *msg;
+  char *tmpmsg;
+  char *tmp;
+  char *marker;
+  int i;
+
+  i = 0;
+  tmp = (char *) osip_malloc (500);
+  marker = fgets (tmp, 500, torture_file);     /* lines are under 500 */
+  while (marker != NULL && i < index)
+    {
+      if (0 == strncmp (tmp, "|", 1))
+       i++;
+      marker = fgets (tmp, 500, torture_file);
+    }
+
+  msg = (char *) osip_malloc (10000);  /* msg are under 10000 */
+  tmpmsg = msg;
+
+  if (marker == NULL)
+    {
+      fprintf (stderr,
+              "Error! The message's number you specified does not exist\n");
+      osip_free (msg);
+      return NULL;                     /* end of file detected! */
+    }
+  /* this part reads an entire message, separator is "|" */
+  /* (it is unlinkely that it will appear in messages!) */
+  while (marker != NULL && strncmp (tmp, "|", 1))
+    {
+      osip_strncpy (tmpmsg, tmp, strlen (tmp));
+      tmpmsg = tmpmsg + strlen (tmp);
+      marker = fgets (tmp, 500, torture_file);
+    }
+
+  if (verbose)
+      fprintf (stdout, "%s\n", msg);
+
+  i = sdp_message_init(&remote_sdp);
+  if (i!=0) return NULL;
+  
+  i = sdp_message_parse(remote_sdp, msg);
+  if (i!=0) return NULL;
+  
+  return remote_sdp;
+}
+
+int main(int argc, char **argv)
+{
+  struct osip_rfc3264 *cnf;
+  int i;
+  int verbose = 0;             /* 0: verbose, 1 (or nothing: not verbose) */
+  FILE *torture_file;
+
+  if (argc > 3)
+    {
+      if (0 == strncmp (argv[3], "-v", 2))
+       verbose = 1;
+      if (0 == strcmp (argv[3], "-vv"))
+       verbose = 2;
+    }
+
+  fprintf (stdout, "test %i : ============================ \n", atoi(argv[2]));
+
+  torture_file = fopen (argv[1], "r");
+  if (torture_file == NULL)
+    {
+      fprintf (stderr,
+              "Failed to open \"torture_sdps\" file.\nUsage: %s torture_file [-v]\n",
+              argv[0]);
+      fprintf (stdout, "test %s : ============================ FAILED\n", argv[2]);
+      exit (1);
+    }
+
+
+
+
+
+
+  i = osip_rfc3264_init(&cnf);
+  if (i!=0)
+    {
+      fprintf(stderr, "Cannot Initialize Negotiator feature.\n");
+      osip_rfc3264_free(cnf);
+      fclose (torture_file);
+      fprintf (stdout, "test %s : ============================ FAILED\n", argv[2]);
+      return -1;
+    }
+
+  test_add_codec(cnf, AUDIO_CODEC, 0,  "0 PCMU/8000");
+  test_add_codec(cnf, AUDIO_CODEC, 8,  "8 PCMA/8000");
+  test_add_codec(cnf, AUDIO_CODEC, 18, "18 G729/8000");
+
+  test_add_codec(cnf, VIDEO_CODEC, 97, "97 XXX/11111");
+  test_add_codec(cnf, VIDEO_CODEC, 31, "31 H261/90000");
+
+#if 0
+  osip_rfc3264_del_video_media(cnf, 0);
+  osip_rfc3264_del_audio_media(cnf, 1);
+  osip_rfc3264_del_audio_media(cnf, 2);
+
+  test_add_codec(cnf, AUDIO_CODEC, 8,  "0 PCMA/8000");
+  test_add_codec(cnf, AUDIO_CODEC, 18, "18 G729/8000");
+#endif
+
+  if (verbose==2)
+    __osip_rfc3264_print_codecs(cnf);
+
+  {
+    sdp_message_t *remote_sdp;
+    sdp_media_t *audio_tab[10];
+    sdp_media_t *video_tab[10];
+    sdp_media_t *t38_tab[10];
+    sdp_media_t *app_tab[10];
+    int res_audio = 0;
+    int res_video = 0;
+    int res_t38   = 0;
+    int res_app   = 0;
+
+    char str_local_sdp[8192];
+    sdp_message_t *local_sdp;
+    int mline;
+    char *tmp = NULL;
+
+    remote_sdp = get_test_remote_message(atoi(argv[2]), torture_file, verbose);
+    if (!remote_sdp)
+      {
+       fprintf(stderr, "Cannot Get remote SDP message for testing.\n");
+       osip_rfc3264_free(cnf);
+       fclose (torture_file);
+       fprintf (stdout, "test %s : ============================ FAILED\n", argv[2]);
+       return -1;
+      }
+
+    i=osip_rfc3264_prepare_answer(cnf, remote_sdp, str_local_sdp, 8192);
+    if (i!=0)
+      {
+       fprintf(stderr, "Cannot Prepare local SDP answer from offer.\n");
+       osip_rfc3264_free(cnf);
+       fclose (torture_file);
+       fprintf (stdout, "test %s : ============================ FAILED\n", argv[2]);
+       return -1;
+      }
+    sdp_message_init(&local_sdp);
+    i=sdp_message_parse(local_sdp, str_local_sdp);
+    if (i!=0)
+      {
+       fprintf(stderr, "Cannot Parse uncomplete SDP answer from offer.\n");
+       sdp_message_free(local_sdp);
+       osip_rfc3264_free(cnf);
+       fclose (torture_file);
+       fprintf (stdout, "test %s : ============================ FAILED\n", argv[2]);
+       return -1;
+      }
+
+    mline=0;
+    while (0==osip_rfc3264_match(cnf, remote_sdp,
+                                audio_tab, video_tab, t38_tab, app_tab, mline))
+      {
+       int pos;
+
+       if (audio_tab[0]==NULL && video_tab[0]==NULL && t38_tab[0]==NULL && app_tab[0]==NULL)
+         {
+           if (verbose)
+             fprintf(stdout, "The remote SDP does not match any local payloads.\n");
+         }
+       else
+         {
+           for (pos=0;audio_tab[pos]!=NULL;pos++)
+             {
+               int pos2 = 0;
+               sdp_media_t *med = audio_tab[pos];
+               char *str = (char *) osip_list_get (med->m_payloads, 0);
+               if (verbose==2)
+                 fprintf(stdout, "\tm=%s %s %s %s\n",
+                         med->m_media,
+                         med->m_port,
+                         med->m_proto,
+                         str);
+               while (!osip_list_eol (med->a_attributes, pos2))
+                 {
+                   sdp_attribute_t *attr =
+                     (sdp_attribute_t *) osip_list_get (med->a_attributes, pos2);
+                   if (verbose==2)
+                     fprintf(stdout, "\ta=%s:%s\n",
+                             attr->a_att_field,
+                             attr->a_att_value);
+                   pos2++;
+                 }
+               if (verbose==2)
+                 fprintf(stdout, "\n");
+
+               i=osip_rfc3264_complete_answer(cnf, remote_sdp, local_sdp, audio_tab[pos], mline);
+               if (i!=0)
+                 {
+                   if (verbose)
+                     fprintf(stdout, "Error Adding support for codec in answer?\n");
+                 }
+               else
+                 {
+                   if (verbose==2)
+                     fprintf(stdout, "support for codec added in answer:\n");
+                 }
+             }
+           
+           for (pos=0;video_tab[pos]!=NULL;pos++)
+             {
+               int pos2 = 0;
+               sdp_media_t *med = video_tab[pos];
+               char *str = (char *) osip_list_get (med->m_payloads, 0);
+               if (verbose==2)
+                 fprintf(stdout, "\tm=%s %s %s %s\n",
+                         med->m_media,
+                         med->m_port,
+                         med->m_proto,
+                         str);
+               while (!osip_list_eol (med->a_attributes, pos2))
+                 {
+                   sdp_attribute_t *attr =
+                     (sdp_attribute_t *) osip_list_get (med->a_attributes, pos2);
+                   if (verbose==2)
+                     fprintf(stdout, "\ta=%s:%s\n",
+                             attr->a_att_field,
+                             attr->a_att_value);
+                   pos2++;
+                 }
+               if (verbose==2)
+                 fprintf(stdout, "\n");
+
+               i=osip_rfc3264_complete_answer(cnf, remote_sdp, local_sdp, video_tab[pos], mline);
+               if (i!=0)
+                 {
+                   if (verbose)
+                     fprintf(stdout, "Error Adding support for codec in answer?\n");
+                 }
+               else
+                 {
+                   if (verbose==2)
+                     fprintf(stdout, "support for codec added in answer:\n");
+                 }
+             }     
+         }
+
+       mline++;
+      }
+
+    if (verbose)
+      fprintf(stdout, "Result in answer:\n");
+    sdp_message_to_str(local_sdp, &tmp);
+    if (tmp!=NULL)
+      {
+       if (verbose)
+         fprintf(stdout, "\n%s\n", tmp);
+       free(tmp);
+      }
+    else
+      {
+       if (verbose)
+         fprintf(stdout, "ERROR\n"); 
+      }
+  }
+
+  osip_rfc3264_free(cnf);
+  fclose (torture_file);
+  fprintf (stdout, "test %s : ============================ OK\n", argv[2]);
+  return 0;
+}