Ignore:
Timestamp:
Dec 19, 2018, 6:16:29 PM (5 years ago)
Author:
Paul Brossier <piem@piem.org>
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.
Message:

Merge branch 'master' into feature/constantq

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tests/utils_tests.h

    rf87e191 r868c6b8  
    55#include <assert.h>
    66#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
    737
    838#ifdef HAVE_C99_VARARGS_MACROS
     
    2656#endif
    2757
    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)
    3259
    33 uint_t srandom_seed = 1029;
     60// use srand/rand on windows
     61#define srandom srand
     62#define random rand
    3463
    35 void srandom(uint_t new_seed) {
    36     srandom_seed = new_seed;
    37 }
     64#elif defined(__STRICT_ANSI__)
    3865
    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.
     68extern void srandom(unsigned);
     69extern int random(void);
     70extern char mkstemp(const char *pat);
     71
    4372#endif
    4473
     
    4877  time_t now = time(0);
    4978  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;
    5181  //PRINT_WRN("current seed: %d\n", seed);
    52   srandom (seed);
     82  srandom ((unsigned int)seed);
    5383}
     84
     85// create_temp_sink / close_temp_sink
     86#if defined(__GNUC__) // mkstemp
     87
     88int check_source(char *source_path)
     89{
     90  return access(source_path, R_OK);
     91}
     92
     93int create_temp_sink(char *sink_path)
     94{
     95  return mkstemp(sink_path);
     96}
     97
     98int 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
     109int check_source(char *source_path)
     110{
     111  return _access(source_path, 04);
     112}
     113
     114int 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
     129int 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
     141int 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
     155int 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
     171int 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.