1*a58d3d2aSXin Li /* Copyright (c) 2023 Amazon
2*a58d3d2aSXin Li Written by Michael Klingbeil */
3*a58d3d2aSXin Li /*
4*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
5*a58d3d2aSXin Li modification, are permitted provided that the following conditions
6*a58d3d2aSXin Li are met:
7*a58d3d2aSXin Li
8*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright
9*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer.
10*a58d3d2aSXin Li
11*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
12*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
13*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
14*a58d3d2aSXin Li
15*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*a58d3d2aSXin Li ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*a58d3d2aSXin Li LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18*a58d3d2aSXin Li A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19*a58d3d2aSXin Li OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20*a58d3d2aSXin Li EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21*a58d3d2aSXin Li PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22*a58d3d2aSXin Li PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23*a58d3d2aSXin Li LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24*a58d3d2aSXin Li NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*a58d3d2aSXin Li SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li */
27*a58d3d2aSXin Li
28*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
29*a58d3d2aSXin Li #include "config.h"
30*a58d3d2aSXin Li #endif
31*a58d3d2aSXin Li
32*a58d3d2aSXin Li #include <stdio.h>
33*a58d3d2aSXin Li #include <stdlib.h>
34*a58d3d2aSXin Li #include <string.h>
35*a58d3d2aSXin Li #include <time.h>
36*a58d3d2aSXin Li #ifndef _WIN32
37*a58d3d2aSXin Li #include <unistd.h>
38*a58d3d2aSXin Li #else
39*a58d3d2aSXin Li #include <process.h>
40*a58d3d2aSXin Li #define getpid _getpid
41*a58d3d2aSXin Li #endif
42*a58d3d2aSXin Li
43*a58d3d2aSXin Li /* including sources directly to test internal APIs */
44*a58d3d2aSXin Li #define CELT_C /* to make celt_assert work */
45*a58d3d2aSXin Li #include "opus.h"
46*a58d3d2aSXin Li #include "test_opus_common.h"
47*a58d3d2aSXin Li
48*a58d3d2aSXin Li
49*a58d3d2aSXin Li
50*a58d3d2aSXin Li #define NB_RANDOM_EXTENSIONS 10000000
51*a58d3d2aSXin Li #define MAX_EXTENSION_SIZE 200
52*a58d3d2aSXin Li #define MAX_NB_EXTENSIONS 100
53*a58d3d2aSXin Li
test_random_dred(void)54*a58d3d2aSXin Li void test_random_dred(void)
55*a58d3d2aSXin Li {
56*a58d3d2aSXin Li int error;
57*a58d3d2aSXin Li int i;
58*a58d3d2aSXin Li OpusDREDDecoder *dred_dec;
59*a58d3d2aSXin Li OpusDRED *dred;
60*a58d3d2aSXin Li dred_dec = opus_dred_decoder_create(&error);
61*a58d3d2aSXin Li expect_true(error == OPUS_OK, "opus_dred_decoder_create() failed");
62*a58d3d2aSXin Li dred = opus_dred_alloc(&error);
63*a58d3d2aSXin Li expect_true(error == OPUS_OK, "opus_dred_create() failed");
64*a58d3d2aSXin Li for (i=0;i<NB_RANDOM_EXTENSIONS;i++)
65*a58d3d2aSXin Li {
66*a58d3d2aSXin Li unsigned char payload[MAX_EXTENSION_SIZE];
67*a58d3d2aSXin Li int len;
68*a58d3d2aSXin Li int j;
69*a58d3d2aSXin Li int res1, res2;
70*a58d3d2aSXin Li int dred_end;
71*a58d3d2aSXin Li len = fast_rand()%(MAX_EXTENSION_SIZE+1);
72*a58d3d2aSXin Li for (j=0;j<len;j++)
73*a58d3d2aSXin Li payload[j] = fast_rand()&0xFF;
74*a58d3d2aSXin Li res1 = opus_dred_parse(dred_dec, dred, payload, len, 48000, 48000, &dred_end, fast_rand()&0x1);
75*a58d3d2aSXin Li if (res1 > 0)
76*a58d3d2aSXin Li {
77*a58d3d2aSXin Li res2 = opus_dred_process(dred_dec, dred, dred);
78*a58d3d2aSXin Li expect_true(res2 == OPUS_OK, "process should succeed if parse succeeds");
79*a58d3d2aSXin Li expect_true(res1 >= dred_end, "end before beginning");
80*a58d3d2aSXin Li }
81*a58d3d2aSXin Li }
82*a58d3d2aSXin Li opus_dred_free(dred);
83*a58d3d2aSXin Li opus_dred_decoder_destroy(dred_dec);
84*a58d3d2aSXin Li }
85*a58d3d2aSXin Li
main(int argc,char ** argv)86*a58d3d2aSXin Li int main(int argc, char **argv)
87*a58d3d2aSXin Li {
88*a58d3d2aSXin Li int env_used;
89*a58d3d2aSXin Li char *env_seed;
90*a58d3d2aSXin Li env_used=0;
91*a58d3d2aSXin Li env_seed=getenv("SEED");
92*a58d3d2aSXin Li if(argc>1)iseed=atoi(argv[1]);
93*a58d3d2aSXin Li else if(env_seed)
94*a58d3d2aSXin Li {
95*a58d3d2aSXin Li iseed=atoi(env_seed);
96*a58d3d2aSXin Li env_used=1;
97*a58d3d2aSXin Li }
98*a58d3d2aSXin Li else iseed=(opus_uint32)time(NULL)^(((opus_uint32)getpid()&65535)<<16);
99*a58d3d2aSXin Li Rw=Rz=iseed;
100*a58d3d2aSXin Li
101*a58d3d2aSXin Li fprintf(stderr,"Testing dred. Random seed: %u (%.4X)\n", iseed, fast_rand() % 65535);
102*a58d3d2aSXin Li if(env_used)fprintf(stderr," Random seed set from the environment (SEED=%s).\n", env_seed);
103*a58d3d2aSXin Li
104*a58d3d2aSXin Li test_random_dred();
105*a58d3d2aSXin Li fprintf(stderr,"Tests completed successfully.\n");
106*a58d3d2aSXin Li return 0;
107*a58d3d2aSXin Li }
108