• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* See COPYING.txt for the full license governing this code. */
2 /**
3  * \file variator_random.c
4  *
5  * Source file for the variator that tests the SUT with random variations to the
6  * input parameters.
7  */
8 
9 #include <time.h>
10 #include <SDL_test.h>
11 #include "SDL_visualtest_random_variator.h"
12 
13 int
SDLVisualTest_InitRandomVariator(SDLVisualTest_RandomVariator * variator,SDLVisualTest_SUTConfig * config,Uint64 seed)14 SDLVisualTest_InitRandomVariator(SDLVisualTest_RandomVariator* variator,
15                                  SDLVisualTest_SUTConfig* config, Uint64 seed)
16 {
17     if(!variator)
18     {
19         SDLTest_LogError("variator argument cannot be NULL");
20         return 0;
21     }
22     if(!config)
23     {
24         SDLTest_LogError("config argument cannot be NULL");
25         return 0;
26     }
27 
28     if(seed)
29         SDLTest_FuzzerInit(seed);
30     else
31         SDLTest_FuzzerInit(time(NULL));
32 
33     variator->config = *config;
34 
35     if(!SDLVisualTest_InitVariation(&variator->variation, &variator->config))
36     {
37         SDLTest_LogError("SDLVisualTest_InitVariation() failed");
38         return 0;
39     }
40 
41     return 1;
42 }
43 
44 char*
SDLVisualTest_GetNextRandomVariation(SDLVisualTest_RandomVariator * variator)45 SDLVisualTest_GetNextRandomVariation(SDLVisualTest_RandomVariator* variator)
46 {
47     SDLVisualTest_SUTOptionValue* vars;
48     SDLVisualTest_SUTOption* options;
49     int i;
50     if(!variator)
51     {
52         SDLTest_LogError("variator argument cannot be NULL");
53         return NULL;
54     }
55 
56     /* to save typing */
57     vars = variator->variation.vars;
58     options = variator->config.options;
59 
60     /* generate a random variation */
61     for(i = 0; i < variator->variation.num_vars; i++)
62     {
63         switch(options[i].type)
64         {
65             case SDL_SUT_OPTIONTYPE_BOOL:
66                 vars[i].bool_value = SDLTest_RandomIntegerInRange(0, 1) ? SDL_FALSE :
67                                                                           SDL_TRUE;
68             break;
69 
70             case SDL_SUT_OPTIONTYPE_ENUM:
71             {
72                 int emx = 0;
73                 while(options[i].data.enum_values[emx])
74                     emx++;
75                 vars[i].enumerated.index = SDLTest_RandomIntegerInRange(0, emx - 1);
76             }
77             break;
78 
79             case SDL_SUT_OPTIONTYPE_INT:
80                 vars[i].integer.value = SDLTest_RandomIntegerInRange(
81                                         options[i].data.range.min,
82                                         options[i].data.range.max);
83             break;
84 
85             case SDL_SUT_OPTIONTYPE_STRING:
86                 // String values are left unchanged
87             break;
88         }
89     }
90 
91     /* convert variation to an arguments string */
92     if(!SDLVisualTest_MakeStrFromVariation(&variator->variation, &variator->config,
93                                            variator->buffer, MAX_SUT_ARGS_LEN))
94     {
95         SDLTest_LogError("SDLVisualTest_MakeStrFromVariation() failed");
96         return NULL;
97     }
98 
99     return variator->buffer;
100 }
101 
SDLVisualTest_FreeRandomVariator(SDLVisualTest_RandomVariator * variator)102 void SDLVisualTest_FreeRandomVariator(SDLVisualTest_RandomVariator* variator)
103 {
104     if(!variator)
105     {
106         SDLTest_LogError("variator argument cannot be NULL");
107         return;
108     }
109     SDL_free(variator->variation.vars);
110     variator->variation.vars = NULL;
111 }