2003-09-14 Marcus Brinkmann <marcus@g10code.de>
authorMarcus Brinkmann <mb@g10code.com>
Sun, 14 Sep 2003 01:32:41 +0000 (01:32 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Sun, 14 Sep 2003 01:32:41 +0000 (01:32 +0000)
* gpg/t-thread1.c: New file.
* gpg/Makefile.am (TESTS): Add t-thread1.c.
(t_thread1_LDADD): New variable.
(LDADD): Remove GPG Error lib.
* gpgsm/Makefile.am (LDADD): Likewise.

tests/ChangeLog
tests/gpg/Makefile.am
tests/gpg/t-thread1.c [new file with mode: 0644]
tests/gpgsm/Makefile.am

index cf68e28..4a42e19 100644 (file)
@@ -1,5 +1,11 @@
 2003-09-14  Marcus Brinkmann  <marcus@g10code.de>
 
+       * gpg/t-thread1.c: New file.
+       * gpg/Makefile.am (TESTS): Add t-thread1.c.
+       (t_thread1_LDADD): New variable.
+       (LDADD): Remove GPG Error lib.
+       * gpgsm/Makefile.am (LDADD): Likewise.
+
        * gpg/t-import.c (main): Likewise.
        * gpg/t-keylist-sig.c (main): Likewise.
        * gpg/t-keylist.c (main): Likewise.
index 57f4852..82404c6 100644 (file)
@@ -28,7 +28,7 @@ noinst_HEADERS = t-support.h
 TESTS = t-encrypt t-encrypt-sym t-encrypt-sign t-sign t-signers        \
        t-decrypt t-verify t-decrypt-verify \
        t-export t-import t-trustlist t-eventloop t-edit \
-       t-keylist t-keylist-sig
+       t-keylist t-keylist-sig t-thread1
 
 CLEANFILES = secring.gpg pubring.gpg trustdb.gpg
 DISTCLEANFILES = pubring.gpg~ random_seed
@@ -39,7 +39,8 @@ EXTRA_DIST = mkdemodirs pubdemo.asc secdemo.asc cipher-1.asc cipher-2.asc \
 INCLUDES = -I$(top_srcdir)/gpgme
 
 AM_CPPFLAGS = @GPG_ERROR_CFLAGS@
-LDADD = ../../gpgme/libgpgme.la @GPG_ERROR_LIBS@
+LDADD = ../../gpgme/libgpgme.la
+t_thread1_LDADD = ../../gpgme/libgpgme-pthread.la
 
 # We don't run t-genkey in the test suite, because it takes too long
 noinst_PROGRAMS = $(TESTS) t-genkey
diff --git a/tests/gpg/t-thread1.c b/tests/gpg/t-thread1.c
new file mode 100644 (file)
index 0000000..5b765a5
--- /dev/null
@@ -0,0 +1,166 @@
+/* t-thread1.c - Regression test.
+   Copyright (C) 2000 Werner Koch (dd9jn)
+   Copyright (C) 2001, 2003 g10 Code GmbH
+
+   This file is part of GPGME.
+   GPGME is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   GPGME is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with GPGME; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include <gpgme.h>
+
+#include "t-support.h"
+
+#define ROUNDS 20
+
+\f
+void
+initialize_gpgme (void)
+{
+  static int gpgme_init;
+  static pthread_mutex_t gpgme_init_lock = PTHREAD_MUTEX_INITIALIZER;
+
+  pthread_mutex_lock (&gpgme_init_lock);
+  if (!gpgme_init)
+    {
+      init_gpgme (GPGME_PROTOCOL_OpenPGP);
+      gpgme_init = 1;
+    }
+  pthread_mutex_unlock (&gpgme_init_lock);
+}
+
+\f
+void *
+thread_one (void *name)
+{
+  int i;
+
+  initialize_gpgme ();
+
+  for (i = 0; i < ROUNDS; i++)
+    {
+      gpgme_ctx_t ctx;
+      gpgme_error_t err;
+      gpgme_data_t in, out;
+      gpgme_key_t key[3] = { NULL, NULL, NULL };
+      gpgme_encrypt_result_t result;
+
+      err = gpgme_new (&ctx);
+      fail_if_err (err);
+      gpgme_set_armor (ctx, 1);
+
+      err = gpgme_data_new_from_mem (&in, "Hallo Leute\n", 12, 0);
+      fail_if_err (err);
+
+      err = gpgme_data_new (&out);
+      fail_if_err (err);
+
+      err = gpgme_get_key (ctx, "A0FF4590BB6122EDEF6E3C542D727CC768697734",
+                          &key[0], 0);
+      fail_if_err (err);
+      err = gpgme_get_key (ctx, "D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2",
+                          &key[1], 0);
+      fail_if_err (err);
+      
+      err = gpgme_op_encrypt (ctx, key, GPGME_ENCRYPT_ALWAYS_TRUST, in, out);
+      fail_if_err (err);
+      result = gpgme_op_encrypt_result (ctx);
+      if (result->invalid_recipients)
+       {
+         fprintf (stderr, "Invalid recipient encountered: %s\n",
+                  result->invalid_recipients->fpr);
+         exit (1);
+       }
+      printf ("Encrypt %s %i\n", (char *) name, i);
+
+      gpgme_key_unref (key[0]);
+      gpgme_key_unref (key[1]);
+      gpgme_data_release (in);
+      gpgme_data_release (out);
+      gpgme_release (ctx);
+    }
+  return NULL;
+}
+
+
+void *
+thread_two (void *name)
+{
+  int i;
+  initialize_gpgme ();
+  const char *cipher_1_asc = make_filename ("cipher-1.asc");
+  char *agent_info;
+
+  agent_info = getenv("GPG_AGENT_INFO");
+
+  for (i = 0; i < ROUNDS; i++)
+    {
+      gpgme_ctx_t ctx;
+      gpgme_error_t err;
+      gpgme_data_t in, out;
+      gpgme_decrypt_result_t result;
+
+      init_gpgme (GPGME_PROTOCOL_OpenPGP);
+
+      err = gpgme_new (&ctx);
+      fail_if_err (err);
+
+      if (!(agent_info && strchr (agent_info, ':')))
+       gpgme_set_passphrase_cb (ctx, passphrase_cb, NULL);
+
+      err = gpgme_data_new_from_file (&in, cipher_1_asc, 1);
+      fail_if_err (err);
+
+      err = gpgme_data_new (&out);
+      fail_if_err (err);
+      
+      err = gpgme_op_decrypt (ctx, in, out);
+      fail_if_err (err);
+      result = gpgme_op_decrypt_result (ctx);
+      if (result->unsupported_algorithm)
+       {
+         fprintf (stderr, "%s:%i: unsupported algorithm: %s\n",
+                  __FILE__, __LINE__, result->unsupported_algorithm);
+         exit (1);
+       }
+      printf ("Decrypt %s %i\n", (char *) name, i);
+   
+      gpgme_data_release (in);
+      gpgme_data_release (out);
+      gpgme_release (ctx);
+    }
+  return NULL;
+}
+
+int 
+main (int argc, char *argv[])
+{
+  pthread_t tone;
+  pthread_t ttwo;
+
+  pthread_create (&tone, NULL, thread_one, "A");
+  pthread_create (&ttwo, NULL, thread_two, "A");
+
+  pthread_join (tone, NULL);
+  pthread_join (ttwo, NULL);
+
+  return 0;
+}
index 7b76bfb..604dc35 100644 (file)
@@ -32,7 +32,7 @@ EXTRA_DIST = cert_dfn_pca01.der cert_dfn_pca15.der cert_g10code_test1.der \
 INCLUDES = -I$(top_srcdir)/gpgme
 
 AM_CPPFLAGS = @GPG_ERROR_CFLAGS@
-LDADD = ../../gpgme/libgpgme.la @GPG_ERROR_LIBS@
+LDADD = ../../gpgme/libgpgme.la
 
 # We don't run t-genkey in the test suite, because it takes too long
 # and needs a working pinentry.