Changeset 868c6b8 for tests/utils_tests.h
- Timestamp:
- Dec 19, 2018, 6:16:29 PM (5 years ago)
- Branches:
- feature/constantq
- Children:
- dfe6ab6
- Parents:
- f87e191 (diff), fda3394 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tests/utils_tests.h
rf87e191 r868c6b8 5 5 #include <assert.h> 6 6 #include "config.h" 7 8 #ifdef HAVE_STRING_H 9 #include <string.h> 10 #endif 11 12 #ifdef HAVE_UNISTD_H 13 #include <unistd.h> // unlink, close 14 #endif 15 16 #ifdef HAVE_LIMITS_H 17 #include <limits.h> // PATH_MAX 18 #endif /* HAVE_LIMITS_H */ 19 #ifndef PATH_MAX 20 #define PATH_MAX 1024 21 #endif 22 23 #if defined(HAVE_WIN_HACKS) && !defined(__GNUC__) 24 #include <io.h> // _access 25 #endif 26 27 // This macro is used to pass a string to msvc compiler: since msvc's -D flag 28 // strips the quotes, we define the string without quotes and re-add them with 29 // this macro. 30 31 #define REDEFINESTRING(x) #x 32 #define DEFINEDSTRING(x) REDEFINESTRING(x) 33 34 #ifndef AUBIO_TESTS_SOURCE 35 #error "AUBIO_TESTS_SOURCE is not defined" 36 #endif 7 37 8 38 #ifdef HAVE_C99_VARARGS_MACROS … … 26 56 #endif 27 57 28 // are we on windows ? or are we using -std=c99 ? 29 #if defined(HAVE_WIN_HACKS) || defined(__STRICT_ANSI__) 30 // http://en.wikipedia.org/wiki/Linear_congruential_generator 31 // no srandom/random on win32 58 #if defined(HAVE_WIN_HACKS) 32 59 33 uint_t srandom_seed = 1029; 60 // use srand/rand on windows 61 #define srandom srand 62 #define random rand 34 63 35 void srandom(uint_t new_seed) { 36 srandom_seed = new_seed; 37 } 64 #elif defined(__STRICT_ANSI__) 38 65 39 uint_t random(void) { 40 srandom_seed = 1664525 * srandom_seed + 1013904223; 41 return srandom_seed; 42 } 66 // workaround to build with -std=c99 (for instance with older cygwin), 67 // assuming libbc is recent enough to supports these functions. 68 extern void srandom(unsigned); 69 extern int random(void); 70 extern char mkstemp(const char *pat); 71 43 72 #endif 44 73 … … 48 77 time_t now = time(0); 49 78 struct tm *tm_struct = localtime(&now); 50 int seed = tm_struct->tm_sec; 79 size_t **tm_address = (void*)&tm_struct; 80 int seed = tm_struct->tm_sec + (size_t)tm_address; 51 81 //PRINT_WRN("current seed: %d\n", seed); 52 srandom ( seed);82 srandom ((unsigned int)seed); 53 83 } 84 85 // create_temp_sink / close_temp_sink 86 #if defined(__GNUC__) // mkstemp 87 88 int check_source(char *source_path) 89 { 90 return access(source_path, R_OK); 91 } 92 93 int create_temp_sink(char *sink_path) 94 { 95 return mkstemp(sink_path); 96 } 97 98 int close_temp_sink(char *sink_path, int sink_fildes) 99 { 100 int err; 101 if ((err = close(sink_fildes)) != 0) return err; 102 if ((err = unlink(sink_path)) != 0) return err; 103 return err; 104 } 105 106 #elif defined(HAVE_WIN_HACKS) //&& !defined(__GNUC__) 107 // windows workaround, where mkstemp does not exist... 108 109 int check_source(char *source_path) 110 { 111 return _access(source_path, 04); 112 } 113 114 int create_temp_sink(char *templ) 115 { 116 int i = 0; 117 static const char letters[] = "abcdefg0123456789"; 118 int letters_len = strlen(letters); 119 int templ_len = strlen(templ); 120 if (templ_len == 0) return 0; 121 utils_init_random(); 122 for (i = 0; i < 6; i++) 123 { 124 templ[templ_len - i] = letters[rand() % letters_len]; 125 } 126 return 1; 127 } 128 129 int close_temp_sink(char* sink_path, int sink_fildes) { 130 // the file should be closed when not using mkstemp, no need to open it 131 if (sink_fildes == 0) return 1; 132 return _unlink(sink_path); 133 } 134 135 #else // windows workaround 136 // otherwise, we don't really know what to do yet 137 #error "mkstemp undefined, but not on windows. additional workaround required." 138 #endif 139 140 // pass progname / default 141 int run_on_default_source( int main(int, char**) ) 142 { 143 const int argc = 2; 144 int err = 0; 145 char** argv = (char**)calloc(argc, sizeof(char*)); 146 argv[0] = __FILE__; 147 argv[1] = DEFINEDSTRING(AUBIO_TESTS_SOURCE); 148 // check if the file can be read 149 if ( check_source(argv[1]) ) return 1; 150 err = main(argc, argv); 151 if (argv) free(argv); 152 return err; 153 } 154 155 int run_on_default_sink( int main(int, char**) ) 156 { 157 const int argc = 2; 158 int err = 0; 159 char** argv = (char**)calloc(argc, sizeof(char*)); 160 char sink_path[PATH_MAX] = "tmp_aubio_XXXXXX"; 161 int fd = create_temp_sink(sink_path); 162 if (!fd) return 1; 163 argv[0] = __FILE__; 164 argv[1] = sink_path; 165 err = main(argc, argv); 166 close_temp_sink(sink_path, fd); 167 if (argv) free(argv); 168 return err; 169 } 170 171 int run_on_default_source_and_sink( int main(int, char**) ) 172 { 173 const int argc = 3; 174 int err = 0; 175 char** argv = (char**)calloc(argc, sizeof(char*)); 176 char sink_path[PATH_MAX] = "tmp_aubio_XXXXXX"; 177 int fd = create_temp_sink(sink_path); 178 if (!fd) return 1; 179 argv[0] = __FILE__; 180 argv[1] = DEFINEDSTRING(AUBIO_TESTS_SOURCE); 181 argv[2] = sink_path; 182 // check if the file can be read 183 if ( check_source(argv[1]) ) return 1; 184 err = main(argc, argv); 185 close_temp_sink(sink_path, fd); 186 if (argv) free(argv); 187 return err; 188 }
Note: See TracChangeset
for help on using the changeset viewer.