aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorAndre Heinecke <[email protected]>2016-11-08 14:32:14 +0000
committerAndre Heinecke <[email protected]>2016-11-10 12:33:13 +0000
commit09b64554328445e99a8cc78fc34ea49c2ea2e7f9 (patch)
treef5d68498f7b5b099a62486c45ce5aa23ee6445d3 /tests
parentpython: Require at least GPGME 1.7 for out-of-tree builds. (diff)
downloadgpgme-09b64554328445e99a8cc78fc34ea49c2ea2e7f9.tar.gz
gpgme-09b64554328445e99a8cc78fc34ea49c2ea2e7f9.zip
core: Use gpgrt locking for thread safeness
* configure.ac: Require libgpg-error 1.17. No longer check for pthread. * doc/gpgme.texi: Document removed neccessity for thread safe gpgme flavours. * src/sema.h (DEFINE_GLOBAL_LOCK), (DEFINE_STATIC_LOCK, INIT_LOCK, DECLARE_LOCK) (DESTROY_LOCK, LOCK, UNLOCK): Change to gpgrt equivalents. * src/posix-sema.c, src/w32-sema.c: Removed. * src/Makefile.am: Remove libpthread and Update accordingly. * src/ath.c, src/ath.h (ath_mutex_init) (ath_mutex_destroy, ath_mutex_lock, ath_mutex_unlock): Removed. * src/ath.h (ATH_MUTEX_INITIALIZER): Removed. * src/version.c (do_subsystem_inits): sema_subsystem_init is no longer required. * tests/gpg/Makefile.am: Add new threading tests. (t_thread1_LDADD, t_cancel_LDADD): Use just gpgme. * tests/gpg/t-thread-keylist-verify.c, tests/gpg/t-thread-keylist.c: New. * src/gpgme-config.in: Use -lgpgme for thread-model pthread. -- Using gpgrt locks instead of pthread locks removes the neccessity to link pthread directly to gpgme and have a different, thread safe flavor of gpgme. Now gpgme is thread-safe if the conditions mentioned in the doc are met. As the cpp bindings linked against libgpgme and not libgpgme-pthread this fixes threading problems with them. libgpgme-pthread is removed but gpgme-config still supports --thread=pthread for compatibility with find scripts.
Diffstat (limited to 'tests')
-rw-r--r--tests/gpg/Makefile.am9
-rw-r--r--tests/gpg/t-thread-keylist-verify.c129
-rw-r--r--tests/gpg/t-thread-keylist.c76
3 files changed, 211 insertions, 3 deletions
diff --git a/tests/gpg/Makefile.am b/tests/gpg/Makefile.am
index 2538f631..dd33b0a2 100644
--- a/tests/gpg/Makefile.am
+++ b/tests/gpg/Makefile.am
@@ -38,7 +38,8 @@ c_tests = \
t-encrypt t-encrypt-sym t-encrypt-sign t-sign t-signers \
t-decrypt t-verify t-decrypt-verify t-sig-notation t-export \
t-import t-trustlist t-edit t-keylist t-keylist-sig t-wait \
- t-encrypt-large t-file-name t-gpgconf t-encrypt-mixed $(tests_unix)
+ t-encrypt-large t-file-name t-gpgconf t-encrypt-mixed $(tests_unix) \
+ t-thread-keylist t-thread-keylist-verify
TESTS = initial.test $(c_tests) final.test
@@ -61,8 +62,10 @@ EXTRA_DIST = initial.test final.test \
AM_CPPFLAGS = -I$(top_builddir)/src @GPG_ERROR_CFLAGS@
AM_LDFLAGS = -no-install
LDADD = ../../src/libgpgme.la
-t_thread1_LDADD = ../../src/libgpgme-pthread.la -lpthread
-t_cancel_LDADD = ../../src/libgpgme-pthread.la -lpthread
+t_thread1_LDADD = ../../src/libgpgme.la -lpthread
+t_thread_keylist_LDADD = ../../src/libgpgme.la -lpthread
+t_thread_keylist_verify_LDADD = ../../src/libgpgme.la -lpthread
+t_cancel_LDADD = ../../src/libgpgme.la -lpthread
# We don't run t-genkey and t-cancel in the test suite, because it
# takes too long
diff --git a/tests/gpg/t-thread-keylist-verify.c b/tests/gpg/t-thread-keylist-verify.c
new file mode 100644
index 00000000..55af88a1
--- /dev/null
+++ b/tests/gpg/t-thread-keylist-verify.c
@@ -0,0 +1,129 @@
+/* t-thread-verify.c - Regression test.
+ Copyright (C) 2015 Intevation 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 Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gpgme.h>
+
+#include <pthread.h>
+
+#include "t-support.h"
+
+#define THREAD_COUNT 500
+
+static const char test_text1[] = "Just GNU it!\n";
+static const char test_sig1[] =
+"-----BEGIN PGP SIGNATURE-----\n"
+"\n"
+"iN0EABECAJ0FAjoS+i9FFIAAAAAAAwA5YmFyw7bDpMO8w58gZGFzIHdhcmVuIFVt\n"
+"bGF1dGUgdW5kIGpldHp0IGVpbiBwcm96ZW50JS1aZWljaGVuNRSAAAAAAAgAJGZv\n"
+"b2Jhci4xdGhpcyBpcyBhIG5vdGF0aW9uIGRhdGEgd2l0aCAyIGxpbmVzGhpodHRw\n"
+"Oi8vd3d3Lmd1Lm9yZy9wb2xpY3kvAAoJEC1yfMdoaXc0JBIAoIiLlUsvpMDOyGEc\n"
+"dADGKXF/Hcb+AKCJWPphZCphduxSvrzH0hgzHdeQaA==\n"
+"=nts1\n"
+"-----END PGP SIGNATURE-----\n";
+
+void *
+start_keylist (void *arg)
+{
+ gpgme_error_t err;
+ gpgme_ctx_t ctx;
+ gpgme_key_t key;
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+
+ err = gpgme_op_keylist_start (ctx, NULL, 0);
+ fail_if_err (err);
+
+ while (!(err = gpgme_op_keylist_next (ctx, &key)));
+
+ return NULL;
+}
+
+void *
+start_verify (void *arg)
+{
+ gpgme_ctx_t ctx;
+ gpgme_error_t err;
+ gpgme_data_t sig, text;
+ gpgme_verify_result_t result;
+ gpgme_signature_t signature;
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+
+ /* Checking a valid message. */
+ err = gpgme_data_new_from_mem (&text, test_text1, strlen (test_text1), 0);
+ fail_if_err (err);
+ err = gpgme_data_new_from_mem (&sig, test_sig1, strlen (test_sig1), 0);
+ fail_if_err (err);
+ err = gpgme_op_verify (ctx, sig, text, NULL);
+ fail_if_err (err);
+ result = gpgme_op_verify_result (ctx);
+
+ signature = result->signatures;
+
+ if (strcmp (signature->fpr, "A0FF4590BB6122EDEF6E3C542D727CC768697734"))
+ {
+ fprintf (stderr, "%s:%i: Unexpected fingerprint: %s\n",
+ __FILE__, __LINE__, signature->fpr);
+ exit (1);
+ }
+ if (gpgme_err_code (signature->status) != GPG_ERR_NO_ERROR)
+ {
+ fprintf (stderr, "%s:%i: Unexpected signature status: %s\n",
+ __FILE__, __LINE__, gpgme_strerror (signature->status));
+ exit (1);
+ }
+ return NULL;
+}
+
+int
+main (int argc, char *argv[])
+{
+ int i;
+ pthread_t verify_threads[THREAD_COUNT];
+ pthread_t keylist_threads[THREAD_COUNT];
+ init_gpgme (GPGME_PROTOCOL_OpenPGP);
+
+ for (i = 0; i < THREAD_COUNT; i++)
+ {
+ if (pthread_create(&verify_threads[i], NULL, start_verify, NULL) ||
+ pthread_create(&keylist_threads[i], NULL, start_keylist, NULL))
+ {
+ fprintf(stderr, "%s:%i: failed to create threads \n",
+ __FILE__, __LINE__);
+ exit(1);
+ }
+ }
+ for (i = 0; i < THREAD_COUNT; i++)
+ {
+ pthread_join (verify_threads[i], NULL);
+ pthread_join (keylist_threads[i], NULL);
+ }
+ return 0;
+}
diff --git a/tests/gpg/t-thread-keylist.c b/tests/gpg/t-thread-keylist.c
new file mode 100644
index 00000000..14f7718b
--- /dev/null
+++ b/tests/gpg/t-thread-keylist.c
@@ -0,0 +1,76 @@
+/* t-thread-verify.c - Regression test.
+ Copyright (C) 2015 Intevation 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 Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <gpgme.h>
+
+#include <pthread.h>
+
+#include "t-support.h"
+
+#define THREAD_COUNT 500
+
+void *
+start_keylist (void *arg)
+{
+ gpgme_error_t err;
+ gpgme_ctx_t ctx;
+ gpgme_key_t key;
+
+ err = gpgme_new (&ctx);
+ fail_if_err (err);
+
+ err = gpgme_op_keylist_start (ctx, NULL, 0);
+ fail_if_err (err);
+
+ while (!(err = gpgme_op_keylist_next (ctx, &key)));
+
+ return NULL;
+}
+
+int
+main (int argc, char *argv[])
+{
+ int i;
+ pthread_t keylist_threads[THREAD_COUNT];
+ init_gpgme (GPGME_PROTOCOL_OpenPGP);
+
+ for (i = 0; i < THREAD_COUNT; i++)
+ {
+ if (pthread_create(&keylist_threads[i], NULL, start_keylist, NULL))
+ {
+ fprintf(stderr, "%s:%i: failed to create threads \n",
+ __FILE__, __LINE__);
+ exit(1);
+ }
+ }
+ for (i = 0; i < THREAD_COUNT; i++)
+ {
+ pthread_join (keylist_threads[i], NULL);
+ }
+ return 0;
+}