Use #pragma GCC diagnostic push/pop only on gcc 4.6 and later.
[opus.git] / tests / test_opus_api.c
index 60ae296..a04c756 100644 (file)
@@ -49,7 +49,7 @@
 #include <stdlib.h>
 #include <stdint.h>
 #include <string.h>
-#include "../src/opus.h"
+#include "../include/opus.h"
 #include "test_opus_common.h"
 
 #ifdef VALGRIND
@@ -61,7 +61,7 @@
 #define VG_CHECK(x,y)
 #endif
 
-#ifdef __GLIBC__
+#if defined(__GLIBC__) && defined(HAVE___MALLOC_HOOK)
 #define MALLOC_FAIL
 #include "os_support.h"
 #include <malloc.h>
@@ -72,9 +72,8 @@ void *malloc_hook(__attribute__((unused)) size_t size,
 }
 #endif
 
-static char dash_head[54] = "  ---------------------------------------------------\n";
-static opus_int32 opus_rates[5] = {48000,24000,16000,12000,8000};
-static opus_int32 opus_apps[3] = {OPUS_APPLICATION_VOIP,
+static const opus_int32 opus_rates[5] = {48000,24000,16000,12000,8000};
+static const opus_int32 opus_apps[3] = {OPUS_APPLICATION_VOIP,
        OPUS_APPLICATION_AUDIO,OPUS_APPLICATION_RESTRICTED_LOWDELAY};
 
 opus_int32 test_dec_api(void)
@@ -95,7 +94,7 @@ opus_int32 test_dec_api(void)
    cfgs=0;
    /*First test invalid configurations which should fail*/
    fprintf(stdout,"\n  Decoder basic API tests\n");
-   fprintf(stdout,dash_head);
+   fprintf(stdout,"  ---------------------------------------------------\n");
    for(c=0;c<4;c++)
    {
       i=opus_decoder_get_size(c);
@@ -311,7 +310,7 @@ opus_int32 test_parse(void)
    short size[48];
    int payload_offset, ret;
    fprintf(stdout,"\n  Packet header parsing tests\n");
-   fprintf(stdout,dash_head);
+   fprintf(stdout,"  ---------------------------------------------------\n");
    memset(packet,0,sizeof(char)*1276);
    packet[0]=63<<2;
    if(opus_packet_parse(packet,1,&toc,frames,0,&payload_offset)!=OPUS_BAD_ARG)test_failed();
@@ -673,7 +672,7 @@ opus_int32 test_enc_api(void)
    cfgs=0;
    /*First test invalid configurations which should fail*/
    fprintf(stdout,"\n  Encoder basic API tests\n");
-   fprintf(stdout,dash_head);
+   fprintf(stdout,"  ---------------------------------------------------\n");
    for(c=0;c<4;c++)
    {
       i=opus_encoder_get_size(c);
@@ -816,6 +815,36 @@ opus_int32 test_enc_api(void)
    cfgs++;
    fprintf(stdout,"    OPUS_GET_BANDWIDTH .......................... OK.\n");
 
+   i=-2;
+   if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))==OPUS_OK)test_failed();
+   cfgs++;
+   i=OPUS_BANDWIDTH_FULLBAND+1;
+   if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))==OPUS_OK)test_failed();
+   cfgs++;
+   i=OPUS_BANDWIDTH_NARROWBAND;
+   if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))!=OPUS_OK)test_failed();
+   cfgs++;
+   i=OPUS_BANDWIDTH_FULLBAND;
+   if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))!=OPUS_OK)test_failed();
+   cfgs++;
+   i=OPUS_BANDWIDTH_WIDEBAND;
+   if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))!=OPUS_OK)test_failed();
+   cfgs++;
+   i=OPUS_BANDWIDTH_MEDIUMBAND;
+   if(opus_encoder_ctl(enc,OPUS_SET_MAX_BANDWIDTH(i))!=OPUS_OK)test_failed();
+   cfgs++;
+   fprintf(stdout,"    OPUS_SET_MAX_BANDWIDTH ...................... OK.\n");
+   /*We don't test if the bandwidth has actually changed.
+     because the change may be delayed until the encoder is advanced.*/
+   i=-12345;
+   VG_UNDEF(&i,sizeof(i));
+   err=opus_encoder_ctl(enc,OPUS_GET_MAX_BANDWIDTH(&i));
+   if(err!=OPUS_OK || (i!=OPUS_BANDWIDTH_NARROWBAND&&
+      i!=OPUS_BANDWIDTH_MEDIUMBAND&&i!=OPUS_BANDWIDTH_WIDEBAND&&
+      i!=OPUS_BANDWIDTH_FULLBAND))test_failed();
+   cfgs++;
+   fprintf(stdout,"    OPUS_GET_MAX_BANDWIDTH ...................... OK.\n");
+
    CHECK_SETGET(OPUS_SET_DTX(i),OPUS_GET_DTX(&i),-1,2,
      1,0,
      "    OPUS_SET_DTX ................................ OK.\n",
@@ -841,10 +870,11 @@ opus_int32 test_enc_api(void)
      "    OPUS_SET_VBR ................................ OK.\n",
      "    OPUS_GET_VBR ................................ OK.\n")
 
-   CHECK_SETGET(OPUS_SET_VOICE_RATIO(i),OPUS_GET_VOICE_RATIO(&i),-2,101,
+   /*CHECK_SETGET(OPUS_SET_VOICE_RATIO(i),OPUS_GET_VOICE_RATIO(&i),-2,101,
      0,50,
      "    OPUS_SET_VOICE_RATIO ........................ OK.\n",
      "    OPUS_GET_VOICE_RATIO ........................ OK.\n")
+   */
 
    CHECK_SETGET(OPUS_SET_VBR_CONSTRAINT(i),OPUS_GET_VBR_CONSTRAINT(&i),-1,2,
      1,0,
@@ -907,7 +937,7 @@ int test_repacketizer_api(void)
    unsigned char *po;
    cfgs=0;
    fprintf(stdout,"\n  Repacketizer tests\n");
-   fprintf(stdout,dash_head);
+   fprintf(stdout,"  ---------------------------------------------------\n");
 
    packet=malloc(max_out);
    if(packet==NULL)test_failed();
@@ -1130,6 +1160,17 @@ int test_repacketizer_api(void)
 }
 
 #ifdef MALLOC_FAIL
+/* GLIBC 2.14 declares __malloc_hook as deprecated, generating a warning
+ * under GCC. However, this is the cleanest way to test malloc failure
+ * handling in our codebase, and the lack of thread saftey isn't an
+ * issue here. We therefore disable the warning for this function.
+ */
+#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6
+/* Save the current warning settings */
+#pragma GCC diagnostic push
+#endif
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+
 typedef void *(*mhook)(size_t __size, __const __malloc_ptr_t);
 #endif
 
@@ -1145,7 +1186,7 @@ int test_malloc_fail(void)
    cfgs=0;
 #endif
    fprintf(stdout,"\n  malloc() failure tests\n");
-   fprintf(stdout,dash_head);
+   fprintf(stdout,"  ---------------------------------------------------\n");
 #ifdef MALLOC_FAIL
    orig_malloc=__malloc_hook;
    __malloc_hook=malloc_hook;
@@ -1215,6 +1256,13 @@ int test_malloc_fail(void)
 #endif
 }
 
+#ifdef MALLOC_FAIL
+#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 6
+/* Restore the previous warning settings */
+#pragma GCC diagnostic pop /* restore -Wdeprecated-declarations */
+#endif
+#endif
+
 int main(int _argc, char **_argv)
 {
    opus_int32 total;