Blame tests/t-data.c

Packit d7e8d0
/* t-data - Regression tests for the gpgme_data_t abstraction.
Packit Service 30b792
 * Copyright (C) 2001, 2004 g10 Code GmbH
Packit Service 30b792
 *
Packit Service 30b792
 * This file is part of GPGME.
Packit Service 30b792
 *
Packit Service 30b792
 * GPGME is free software; you can redistribute it and/or modify it
Packit Service 30b792
 * under the terms of the GNU Lesser General Public License as
Packit Service 30b792
 * published by the Free Software Foundation; either version 2.1 of
Packit Service 30b792
 * the License, or (at your option) any later version.
Packit Service 30b792
 *
Packit Service 30b792
 * GPGME is distributed in the hope that it will be useful, but
Packit Service 30b792
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 30b792
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 30b792
 * Lesser General Public License for more details.
Packit Service 30b792
 *
Packit Service 30b792
 * You should have received a copy of the GNU Lesser General Public
Packit Service 30b792
 * License along with this program; if not, see <https://gnu.org/licenses/>.
Packit Service 30b792
 * SPDX-License-Identifier: LGPL-2.1-or-later
Packit Service 30b792
 */
Packit d7e8d0
Packit d7e8d0
/* We need to include config.h so that we know whether we are building
Packit d7e8d0
   with large file system (LFS) support. */
Packit d7e8d0
#ifdef HAVE_CONFIG_H
Packit d7e8d0
#include <config.h>
Packit d7e8d0
#endif
Packit d7e8d0
Packit d7e8d0
#include <stddef.h>
Packit d7e8d0
#include <stdio.h>
Packit d7e8d0
#include <stdlib.h>
Packit d7e8d0
#include <string.h>
Packit d7e8d0
#include <errno.h>
Packit d7e8d0
Packit d7e8d0
#define PGM "t-data"
Packit d7e8d0
#include "run-support.h"
Packit d7e8d0
Packit d7e8d0
#undef fail_if_err
Packit d7e8d0
#define fail_if_err(a) do { if(a) {                                          \
Packit d7e8d0
                               fprintf (stderr, "%s:%d: (%i) gpgme_error_t " \
Packit d7e8d0
                                "%s\n", __FILE__, __LINE__, round,           \
Packit d7e8d0
                                gpgme_strerror(a));                          \
Packit d7e8d0
                                exit (1); }                                  \
Packit d7e8d0
                             } while(0)
Packit d7e8d0
Packit d7e8d0
typedef enum
Packit d7e8d0
  {
Packit d7e8d0
    TEST_INITIALIZER,
Packit d7e8d0
    TEST_INVALID_ARGUMENT,
Packit d7e8d0
    TEST_INOUT_NONE,
Packit d7e8d0
    TEST_INOUT_MEM_NO_COPY,
Packit d7e8d0
    TEST_INOUT_MEM_COPY,
Packit d7e8d0
    TEST_INOUT_MEM_FROM_FILE_COPY,
Packit d7e8d0
    TEST_INOUT_MEM_FROM_INEXISTANT_FILE,
Packit d7e8d0
    TEST_INOUT_MEM_FROM_FILE_NO_COPY,
Packit d7e8d0
    TEST_INOUT_MEM_FROM_FILE_PART_BY_NAME,
Packit d7e8d0
    TEST_INOUT_MEM_FROM_INEXISTANT_FILE_PART,
Packit d7e8d0
    TEST_INOUT_MEM_FROM_FILE_PART_BY_FP,
Packit d7e8d0
    TEST_END
Packit d7e8d0
  } round_t;
Packit d7e8d0
Packit d7e8d0
const char *text = "Just GNU it!\n";
Packit d7e8d0
const char *text2 = "Just GNU it!\nJust GNU it!\n";
Packit d7e8d0
Packit d7e8d0
int
Packit d7e8d0
read_cb (void *cb_value, char *buffer, size_t count, size_t *nread)
Packit d7e8d0
{
Packit d7e8d0
  static int off = 0;
Packit d7e8d0
  unsigned int amount = strlen (text) - off;
Packit d7e8d0
  /*  round_t round = *((round_t *) cb_value);  */
Packit d7e8d0
Packit d7e8d0
  (void)cb_value;
Packit d7e8d0
Packit d7e8d0
  if (!buffer && !count && !nread)
Packit d7e8d0
    {
Packit d7e8d0
      /* Rewind requested.  */
Packit d7e8d0
      off = 0;
Packit d7e8d0
      return 0;
Packit d7e8d0
    }
Packit d7e8d0
  if (! buffer || !nread)
Packit d7e8d0
    return -1;
Packit d7e8d0
  if (amount <= 0)
Packit d7e8d0
    {
Packit d7e8d0
      /* End of file.  */
Packit d7e8d0
      *nread = 0;
Packit d7e8d0
      return -1;
Packit d7e8d0
    }
Packit d7e8d0
  if (amount > count)
Packit d7e8d0
    amount = count;
Packit d7e8d0
  memcpy (buffer, text, amount);
Packit d7e8d0
  off += amount;
Packit d7e8d0
  *nread = amount;
Packit d7e8d0
  return 0;
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
void
Packit d7e8d0
read_once_test (round_t round, gpgme_data_t data)
Packit d7e8d0
{
Packit d7e8d0
  char buffer[1024];
Packit d7e8d0
  size_t read;
Packit d7e8d0
Packit d7e8d0
  read = gpgme_data_read (data, buffer, sizeof (buffer));
Packit d7e8d0
Packit d7e8d0
  if (read != strlen (text) || strncmp (buffer, text, strlen (text)))
Packit d7e8d0
    {
Packit d7e8d0
      fprintf (stderr, "%s:%d: (%i) gpgme_data_read returned wrong data\n",
Packit d7e8d0
	       __FILE__, __LINE__, round);
Packit d7e8d0
      exit (1);
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
  read = gpgme_data_read (data, buffer, sizeof (buffer));
Packit d7e8d0
  if (read)
Packit d7e8d0
    {
Packit d7e8d0
      fprintf (stderr, "%s:%d: (%i) gpgme_data_read did not signal EOF\n",
Packit d7e8d0
	       __FILE__, __LINE__, round);
Packit d7e8d0
      exit (1);
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
void
Packit d7e8d0
read_test (round_t round, gpgme_data_t data)
Packit d7e8d0
{
Packit d7e8d0
  char buffer[1024];
Packit d7e8d0
  size_t read;
Packit d7e8d0
Packit d7e8d0
  if (round == TEST_INOUT_NONE)
Packit d7e8d0
    {
Packit d7e8d0
      read = gpgme_data_read (data, buffer, sizeof (buffer));
Packit d7e8d0
      if (read > 0)
Packit d7e8d0
	{
Packit d7e8d0
	  fprintf (stderr, "%s:%d: (%i) gpgme_data_read succeeded unexpectedly\n",
Packit d7e8d0
		   __FILE__, __LINE__, round);
Packit d7e8d0
	  exit (1);
Packit d7e8d0
	}
Packit d7e8d0
      return;
Packit d7e8d0
    }
Packit d7e8d0
Packit d7e8d0
  read_once_test (round, data);
Packit d7e8d0
  gpgme_data_seek (data, 0, SEEK_SET);
Packit d7e8d0
  read_once_test (round, data);
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
void
Packit d7e8d0
write_test (round_t round, gpgme_data_t data)
Packit d7e8d0
{
Packit d7e8d0
  char buffer[1024];
Packit d7e8d0
  size_t amt;
Packit d7e8d0
Packit d7e8d0
  amt = gpgme_data_write (data, text, strlen (text));
Packit d7e8d0
  if (amt != strlen (text))
Packit d7e8d0
    fail_if_err (gpgme_error_from_errno (errno));
Packit d7e8d0
Packit d7e8d0
  gpgme_data_seek (data, 0, SEEK_SET);
Packit d7e8d0
Packit d7e8d0
  if (round == TEST_INOUT_NONE)
Packit d7e8d0
    read_once_test (round, data);
Packit d7e8d0
  else
Packit d7e8d0
    {
Packit d7e8d0
      amt = gpgme_data_read (data, buffer, sizeof (buffer));
Packit d7e8d0
Packit d7e8d0
      if (amt != strlen (text2) || strncmp (buffer, text2, strlen (text2)))
Packit d7e8d0
	{
Packit d7e8d0
	  fprintf (stderr, "%s:%d: (%i) gpgme_data_read returned wrong data\n",
Packit d7e8d0
		   __FILE__, __LINE__, round);
Packit d7e8d0
	  exit (1);
Packit d7e8d0
	}
Packit d7e8d0
Packit d7e8d0
      amt = gpgme_data_read (data, buffer, sizeof (buffer));
Packit d7e8d0
      if (amt)
Packit d7e8d0
	{
Packit d7e8d0
	  fprintf (stderr, "%s:%d: (%i) gpgme_data_read did not signal EOF\n",
Packit d7e8d0
		   __FILE__, __LINE__, round);
Packit d7e8d0
	  exit (1);
Packit d7e8d0
	}
Packit d7e8d0
    }
Packit d7e8d0
}
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
int
Packit d7e8d0
main (void)
Packit d7e8d0
{
Packit d7e8d0
  round_t round = TEST_INITIALIZER;
Packit d7e8d0
  char *text_filename = make_filename ("t-data-1.txt");
Packit d7e8d0
  char *longer_text_filename = make_filename ("t-data-2.txt");
Packit d7e8d0
  const char *missing_filename = "this-file-surely-does-not-exist";
Packit d7e8d0
  gpgme_error_t err = 0;
Packit d7e8d0
  gpgme_data_t data;
Packit d7e8d0
Packit d7e8d0
  init_gpgme_basic ();
Packit d7e8d0
Packit d7e8d0
  while (++round)
Packit d7e8d0
    {
Packit d7e8d0
      switch (round)
Packit d7e8d0
	{
Packit d7e8d0
	case TEST_INVALID_ARGUMENT:
Packit d7e8d0
	  err = gpgme_data_new (NULL);
Packit d7e8d0
	  if (!err)
Packit d7e8d0
	    {
Packit d7e8d0
	      fprintf (stderr, "%s:%d: gpgme_data_new on NULL pointer succeeded "
Packit d7e8d0
		       "unexpectedly\n", __FILE__, __LINE__);
Packit d7e8d0
	      exit (1);
Packit d7e8d0
	    }
Packit d7e8d0
	  continue;
Packit d7e8d0
	case TEST_INOUT_NONE:
Packit d7e8d0
	  err = gpgme_data_new (&data);
Packit d7e8d0
	  break;
Packit d7e8d0
	case TEST_INOUT_MEM_NO_COPY:
Packit d7e8d0
	  err = gpgme_data_new_from_mem (&data, text, strlen (text), 0);
Packit d7e8d0
	  break;
Packit d7e8d0
	case TEST_INOUT_MEM_COPY:
Packit d7e8d0
	  err = gpgme_data_new_from_mem (&data, text, strlen (text), 1);
Packit d7e8d0
	  break;
Packit d7e8d0
	case TEST_INOUT_MEM_FROM_FILE_COPY:
Packit d7e8d0
	  err = gpgme_data_new_from_file (&data, text_filename, 1);
Packit d7e8d0
	  break;
Packit d7e8d0
	case TEST_INOUT_MEM_FROM_INEXISTANT_FILE:
Packit d7e8d0
	  err = gpgme_data_new_from_file (&data, missing_filename, 1);
Packit d7e8d0
	  if (!err)
Packit d7e8d0
	    {
Packit d7e8d0
	      fprintf (stderr, "%s:%d: gpgme_data_new_from_file on inexistant "
Packit d7e8d0
		       "file succeeded unexpectedly\n", __FILE__, __LINE__);
Packit d7e8d0
	      exit (1);
Packit d7e8d0
	    }
Packit d7e8d0
	  continue;
Packit d7e8d0
	case TEST_INOUT_MEM_FROM_FILE_NO_COPY:
Packit d7e8d0
	  err = gpgme_data_new_from_file (&data, text_filename, 0);
Packit d7e8d0
	  /* This is not implemented yet.  */
Packit d7e8d0
	  if (gpgme_err_code (err) == GPG_ERR_NOT_IMPLEMENTED
Packit d7e8d0
	      || gpgme_err_code (err) == GPG_ERR_INV_VALUE)
Packit d7e8d0
	    continue;
Packit d7e8d0
	  break;
Packit d7e8d0
	case TEST_INOUT_MEM_FROM_FILE_PART_BY_NAME:
Packit d7e8d0
	  err = gpgme_data_new_from_filepart (&data, longer_text_filename, 0,
Packit d7e8d0
					      strlen (text), strlen (text));
Packit d7e8d0
	  break;
Packit d7e8d0
	case TEST_INOUT_MEM_FROM_INEXISTANT_FILE_PART:
Packit d7e8d0
	  err = gpgme_data_new_from_filepart (&data, missing_filename, 0,
Packit d7e8d0
					      strlen (text), strlen (text));
Packit d7e8d0
	  if (!err)
Packit d7e8d0
	    {
Packit d7e8d0
	      fprintf (stderr, "%s:%d: gpgme_data_new_from_file on inexistant "
Packit d7e8d0
		       "file succeeded unexpectedly\n", __FILE__, __LINE__);
Packit d7e8d0
	      exit (1);
Packit d7e8d0
	    }
Packit d7e8d0
	  continue;
Packit d7e8d0
	case TEST_INOUT_MEM_FROM_FILE_PART_BY_FP:
Packit d7e8d0
	  {
Packit d7e8d0
	    FILE *fp = fopen (longer_text_filename, "rb");
Packit d7e8d0
	    if (! fp)
Packit d7e8d0
	      {
Packit d7e8d0
		fprintf (stderr, "%s:%d: fopen: %s\n", __FILE__, __LINE__,
Packit d7e8d0
			 strerror (errno));
Packit d7e8d0
		exit (1);
Packit d7e8d0
	      }
Packit d7e8d0
	    err = gpgme_data_new_from_filepart (&data, 0, fp,
Packit d7e8d0
						strlen (text), strlen (text));
Packit d7e8d0
	  }
Packit d7e8d0
	  break;
Packit d7e8d0
	case TEST_END:
Packit d7e8d0
	  goto out;
Packit d7e8d0
	case TEST_INITIALIZER:
Packit d7e8d0
	  /* Shouldn't happen.  */
Packit d7e8d0
	  fprintf (stderr, "%s:%d: impossible condition\n", __FILE__, __LINE__);
Packit d7e8d0
	  exit (1);
Packit d7e8d0
	}
Packit d7e8d0
      fail_if_err (err);
Packit d7e8d0
Packit d7e8d0
      read_test (round, data);
Packit d7e8d0
      write_test (round, data);
Packit d7e8d0
      gpgme_data_release (data);
Packit d7e8d0
    }
Packit d7e8d0
 out:
Packit d7e8d0
  free (text_filename);
Packit d7e8d0
  free (longer_text_filename);
Packit d7e8d0
  return 0;
Packit d7e8d0
}