aboutsummaryrefslogtreecommitdiffstats
path: root/tests/gpg/t-thread-keylist-verify.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/gpg/t-thread-keylist-verify.c')
-rw-r--r--tests/gpg/t-thread-keylist-verify.c129
1 files changed, 129 insertions, 0 deletions
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;
+}