Back to index

cell-binutils  2.17cvs20070401
Defines | Functions
test-expandargv.c File Reference
#include "libiberty.h"
#include <stdio.h>
#include <errno.h>

Go to the source code of this file.

Defines

#define EXIT_SUCCESS   0
#define EXIT_FAILURE   1
#define FILENAME_PATTERN   "test-expandargv-%d.lst"
#define ARGV0   "test-expandargv"

Functions

static void fatal_error (void writeout_test(int, const char *, void writeout_test(int)
static void fatal_error (int line, const char *errmsg, int err)
void hook_char_replace (char *string, size_t len, char replacethis, char withthis)
void run_replaces (char *string)
void writeout_test (int test, const char *test_data)
void erase_test (int test)
int run_tests (const char **test_data)
int main (int argc, char **argv)

Define Documentation

#define ARGV0   "test-expandargv"
#define EXIT_FAILURE   1

Definition at line 49 of file test-expandargv.c.

#define EXIT_SUCCESS   0

Definition at line 45 of file test-expandargv.c.

#define FILENAME_PATTERN   "test-expandargv-%d.lst"

Function Documentation

void erase_test ( int  test)

Definition at line 188 of file test-expandargv.c.

{
  char filename[256]; 
  sprintf (filename, FILENAME_PATTERN, test);
  if (unlink (filename) != 0)
    fatal_error (__LINE__, "Failed to erase test file.", errno);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void fatal_error ( void writeout_test int,
const char *  ,
void writeout_test int 
) [static]

Definition at line 52 of file test-expandargv.c.

                          {
  /* Test 0 - Check for expansion with \r\n */
  "a\r\nb",   /* Test 0 data */
  ARGV0,
  "@test-expandargv-0.lst",
  0, /* End of argv[] before expansion */
  ARGV0,
  "a",
  "b",
  0, /* End of argv[] after expansion */

  /* Test 1 - Check for expansion with \n */
  "a\nb",     /* Test 1 data */
  ARGV0,
  "@test-expandargv-1.lst",
  0,
  ARGV0,
  "a",
  "b",
  0,

  /* Test 2 - Check for expansion with \0 */
  "a\bb",     /* Test 2 data */
  ARGV0,
  "@test-expandargv-2.lst",
  0,
  ARGV0,
  "a",
  0,

  /* Test 3 - Check for expansion with only \0 */
  "\b",              /* Test 3 data */
  ARGV0,
  "@test-expandargv-3.lst",
  0,
  ARGV0,
  0,

  0 /* Test done marker, don't remove. */
};

Here is the caller graph for this function:

static void fatal_error ( int  line,
const char *  errmsg,
int  err 
) [static]

Definition at line 118 of file test-expandargv.c.

{
  fprintf (stderr, "test-expandargv:%d: %s", line, errmsg);
  if (errno != 0)
    fprintf (stderr, ": %s", xstrerror (err));
  fprintf (stderr, "\n");
  exit (EXIT_FAILURE);
}

Here is the call graph for this function:

void hook_char_replace ( char *  string,
size_t  len,
char  replacethis,
char  withthis 
)

Definition at line 131 of file test-expandargv.c.

{
  int i = 0;
  for (i = 0; i < len; i++)
    if (string[i] == replacethis)
      string[i] = withthis;
}

Here is the caller graph for this function:

int main ( int  argc,
char **  argv 
)

Definition at line 276 of file test-expandargv.c.

{
  int fails;
  /* Repeat for all the tests:
     - Parse data array and write into file.
       - Run replace hooks before writing to file.
     - Parse data array and build argv before/after.
       - Run replace hooks on argv before/after
     - Run expandargv.
     - Compare output of expandargv argv to after argv.
       - If they compare the same then test passes
         else the test fails. 
     - Erase test file. */

  fails = run_tests (test_data);
  if (!fails)
    exit (EXIT_SUCCESS);
  else
    exit (EXIT_FAILURE);
}

Here is the call graph for this function:

void run_replaces ( char *  string)

Definition at line 145 of file test-expandargv.c.

{
  /* Store original string size */
  size_t len = strlen (string);
  hook_char_replace (string, len, '\b', '\0');
}

Here is the call graph for this function:

Here is the caller graph for this function:

int run_tests ( const char **  test_data)

Definition at line 203 of file test-expandargv.c.

{
  int argc_after, argc_before;
  char ** argv_before, ** argv_after;
  int i, j, k, fails, failed;

  i = j = fails = 0;
  /* Loop over all the tests */
  while (test_data[j])
    {
      /* Write test data */
      writeout_test (i, test_data[j++]);
      /* Copy argv before */
      argv_before = dupargv ((char **) &test_data[j]);

      /* Count argc before/after */
      argc_before = 0;
      argc_after = 0;
      while (test_data[j + argc_before])
        argc_before++;
      j += argc_before + 1; /* Skip null */
      while (test_data[j + argc_after])
        argc_after++;

      /* Copy argv after */
      argv_after = dupargv ((char **) &test_data[j]);

      /* Run all possible replaces */
      for (k = 0; k < argc_before; k++)
        run_replaces (argv_before[k]);
      for (k = 0; k < argc_after; k++)
        run_replaces (argv_after[k]);

      /* Run test: Expand arguments */
      expandargv (&argc_before, &argv_before);

      failed = 0;
      /* Compare size first */
      if (argc_before != argc_after)
        {
          printf ("FAIL: test-expandargv-%d. Number of arguments don't match.\n", i);
         failed++;
        }
      /* Compare each of the argv's ... */
      else
        for (k = 0; k < argc_after; k++)
          if (strncmp (argv_before[k], argv_after[k], strlen(argv_after[k])) != 0)
            {
              printf ("FAIL: test-expandargv-%d. Arguments don't match.\n", i);
              failed++;
            }

      if (!failed)
        printf ("PASS: test-expandargv-%d.\n", i);
      else
        fails++;

      freeargv (argv_before);
      freeargv (argv_after);
      /* Advance to next test */
      j += argc_after + 1;
      /* Erase test file */
      erase_test (i);
      i++;
    }
  return fails;
}

Here is the call graph for this function:

Here is the caller graph for this function:

void writeout_test ( int  test,
const char *  test_data 
)

Definition at line 156 of file test-expandargv.c.

{
  char filename[256];
  FILE *fd;
  size_t len;
  char * parse;

  /* Unique filename per test */
  sprintf (filename, FILENAME_PATTERN, test);
  fd = fopen (filename, "w");
  if (fd == NULL)
    fatal_error (__LINE__, "Failed to create test file.", errno);

  /* Generate RW copy of data for replaces */
  len = strlen (test_data);
  parse = malloc (sizeof (char) * (len + 1));
  if (parse == NULL)
    fatal_error (__LINE__, "Failed to malloc parse.", errno);
      
  memcpy (parse, test_data, sizeof (char) * len);
  /* Run all possible replaces */
  run_replaces (parse);

  fwrite (parse, len, sizeof (char), fd);
  free (parse);
  fclose (fd);
}

Here is the call graph for this function:

Here is the caller graph for this function: