cpp: Add first manual tests
authorAndre Heinecke <aheinecke@intevation.de>
Tue, 9 Oct 2018 09:24:18 +0000 (11:24 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Tue, 9 Oct 2018 09:24:18 +0000 (11:24 +0200)
* lang/cpp/Makefile.am: Add tests subdir.
* lang/cpp/tests/Makefile.am: New.
* lang/cpp/tests/README,
lang/cpp/tests/run-getkey.cpp,
lang/cpp/tests/run-keylist.cpp: New.
* configure.ac: Configure tests makefile.

--
The autotests for c++ live in lang/qt/tests these
tests are more for manual experiments to validate some
functionality.

configure.ac
lang/cpp/Makefile.am
lang/cpp/tests/Makefile.am [new file with mode: 0644]
lang/cpp/tests/README [new file with mode: 0644]
lang/cpp/tests/run-getkey.cpp [new file with mode: 0644]
lang/cpp/tests/run-keylist.cpp [new file with mode: 0644]

index 315b39a..0d90e2b 100644 (file)
@@ -896,6 +896,7 @@ AC_CONFIG_FILES(Makefile src/Makefile
                 src/gpgme.h)
 AC_CONFIG_FILES(src/gpgme-config, chmod +x src/gpgme-config)
 AC_CONFIG_FILES(lang/cpp/Makefile lang/cpp/src/Makefile)
+AC_CONFIG_FILES(lang/cpp/tests/Makefile)
 AC_CONFIG_FILES(lang/cpp/src/GpgmeppConfig-w32.cmake.in)
 AC_CONFIG_FILES(lang/cpp/src/GpgmeppConfig.cmake.in)
 AC_CONFIG_FILES(lang/cpp/src/GpgmeppConfigVersion.cmake)
index 026ca00..acfa0f9 100644 (file)
@@ -19,6 +19,6 @@
 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 # 02111-1307, USA
 
-SUBDIRS = src
+SUBDIRS = src tests
 
 EXTRA_DIST = README
diff --git a/lang/cpp/tests/Makefile.am b/lang/cpp/tests/Makefile.am
new file mode 100644 (file)
index 0000000..2b6e8fb
--- /dev/null
@@ -0,0 +1,35 @@
+# Makefile.am - Makefile for GPGME Cpp tests.
+# Copyright (C) 2018 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, see <http://www.gnu.org/licenses/>.
+
+## Process this file with automake to produce Makefile.in
+
+AM_LDFLAGS = -no-install
+
+LDADD = ../../cpp/src/libgpgmepp.la \
+        ../../../src/libgpgme.la @GPG_ERROR_LIBS@ \
+        -lstdc++
+
+AM_CPPFLAGS = -I$(top_srcdir)/lang/cpp/src -I$(top_builddir)/src \
+              @GPG_ERROR_CFLAGS@ @GPG_ERROR_CFLAGS@ \
+              @LIBASSUAN_CFLAGS@ -DBUILDING_GPGMEPP \
+              -DTOP_SRCDIR="$(top_srcdir)"
+
+run_getkey_SOURCES = run-getkey.cpp
+run_keylist_SOURCES = run-keylist.cpp
+
+noinst_PROGRAMS = run-getkey run-keylist
diff --git a/lang/cpp/tests/README b/lang/cpp/tests/README
new file mode 100644 (file)
index 0000000..ac74ab0
--- /dev/null
@@ -0,0 +1,4 @@
+Tests for the C++ bindings.
+
+Most autotests for the C++ bindings use the QTest framework
+and live in lang/qt/tests.
diff --git a/lang/cpp/tests/run-getkey.cpp b/lang/cpp/tests/run-getkey.cpp
new file mode 100644 (file)
index 0000000..35b15eb
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+    run-getkey.cpp
+
+    This file is part of GpgMEpp's test suite.
+    Copyright (c) 2018 Intevation GmbH
+
+    QGpgME is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License,
+    version 2, as published by the Free Software Foundation.
+
+    QGpgME 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 this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+    In addition, as a special exception, the copyright holders give
+    permission to link the code of this program with any edition of
+    the Qt library by Trolltech AS, Norway (or with modified versions
+    of Qt that use the same license as Qt), and distribute linked
+    combinations including the two.  You must obey the GNU General
+    Public License in all respects for all of the code used other than
+    Qt.  If you modify this file, you may extend this exception to
+    your version of the file, but you are not obligated to do so.  If
+    you do not wish to do so, delete this exception statement from
+    your version.
+*/
+
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include "context.h"
+#include "key.h"
+
+#include <memory>
+#include <sstream>
+#include <iostream>
+
+using namespace GpgME;
+
+static int
+show_usage (int ex)
+{
+  fputs ("usage: run-getkey [options] [keyIdOrFingerprint]\n\n"
+         "Options:\n"
+         "  --verbose        run in verbose mode\n"
+         "  --openpgp        use the OpenPGP protocol (default)\n"
+         "  --cms            use the CMS protocol\n"
+         "  --secret         list only secret keys\n"
+         "  --with-secret    list pubkeys with secret info filled\n"
+         "  --local          use GPGME_KEYLIST_MODE_LOCAL\n"
+         "  --extern         use GPGME_KEYLIST_MODE_EXTERN\n"
+         "  --sigs           use GPGME_KEYLIST_MODE_SIGS\n"
+         "  --tofu           use GPGME_KEYLIST_MODE_TOFU\n"
+         "  --sig-notations  use GPGME_KEYLIST_MODE_SIG_NOTATIONS\n"
+         "  --ephemeral      use GPGME_KEYLIST_MODE_EPHEMERAL\n"
+         "  --validate       use GPGME_KEYLIST_MODE_VALIDATE\n"
+         "  --locate         use GPGME_KEYLIST_MODE_LOCATE\n"
+         , stderr);
+  exit (ex);
+}
+
+int
+main (int argc, char **argv)
+{
+    int last_argc = -1;
+    Protocol protocol = OpenPGP;
+    unsigned int mode = 0;
+    bool only_secret = false;
+
+    if (argc) {
+        argc--; argv++;
+    }
+
+    while (argc && last_argc != argc ) {
+        last_argc = argc;
+        if (!strcmp (*argv, "--")) {
+            argc--; argv++;
+            break;
+        } else if (!strcmp (*argv, "--help")) {
+            show_usage (0);
+        } else if (!strcmp (*argv, "--openpgp")) {
+            protocol = OpenPGP;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--cms")) {
+            protocol = CMS;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--secret")) {
+            only_secret = true;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--local")) {
+            mode |= KeyListMode::Local;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--extern")) {
+            mode |= KeyListMode::Extern;
+            argc--; argv++;
+        }else if (!strcmp (*argv, "--tofu")) {
+            mode |= KeyListMode::WithTofu;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--sigs")) {
+            mode |= KeyListMode::Signatures;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--sig-notations")) {
+            mode |= KeyListMode::SignatureNotations;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--ephemeral")) {
+            mode |= KeyListMode::Ephemeral;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--validate")) {
+            mode |= KeyListMode::Validate;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--locate")) {
+            argc--; argv++;
+            mode |= KeyListMode::Locate;
+        } else if (!strncmp (*argv, "--", 2)) {
+            show_usage (1);
+        }
+    }
+
+    if (argc != 1) {
+        show_usage (1);
+    }
+
+    GpgME::initializeLibrary();
+    auto ctx = std::unique_ptr<Context> (Context::createForProtocol(protocol));
+    if (!ctx) {
+        std::cerr << "Failed to get Context";
+        return -1;
+    }
+    ctx->setKeyListMode (mode);
+    Error err;
+    const GpgME::Key key = ctx->key (*argv, err, only_secret);
+    std::stringstream ss;
+
+    ss << "Key " << key << " Err: " << err.asString() << "\n";
+
+    std::cout << ss.str();
+
+    return 0;
+}
diff --git a/lang/cpp/tests/run-keylist.cpp b/lang/cpp/tests/run-keylist.cpp
new file mode 100644 (file)
index 0000000..5457739
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+    run-keylist.cpp
+
+    This file is part of GpgMEpp's test suite.
+    Copyright (c) 2018 Intevation GmbH
+
+    QGpgME is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License,
+    version 2, as published by the Free Software Foundation.
+
+    QGpgME 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 this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+    In addition, as a special exception, the copyright holders give
+    permission to link the code of this program with any edition of
+    the Qt library by Trolltech AS, Norway (or with modified versions
+    of Qt that use the same license as Qt), and distribute linked
+    combinations including the two.  You must obey the GNU General
+    Public License in all respects for all of the code used other than
+    Qt.  If you modify this file, you may extend this exception to
+    your version of the file, but you are not obligated to do so.  If
+    you do not wish to do so, delete this exception statement from
+    your version.
+*/
+
+#ifdef HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include "context.h"
+#include "key.h"
+#include "keylistresult.h"
+
+#include <memory>
+#include <sstream>
+#include <iostream>
+
+using namespace GpgME;
+
+static int
+show_usage (int ex)
+{
+  fputs ("usage: run-keylist [options] [pattern]\n\n"
+         "Options:\n"
+         "  --verbose        run in verbose mode\n"
+         "  --openpgp        use the OpenPGP protocol (default)\n"
+         "  --cms            use the CMS protocol\n"
+         "  --secret         list only secret keys\n"
+         "  --with-secret    list pubkeys with secret info filled\n"
+         "  --local          use GPGME_KEYLIST_MODE_LOCAL\n"
+         "  --extern         use GPGME_KEYLIST_MODE_EXTERN\n"
+         "  --sigs           use GPGME_KEYLIST_MODE_SIGS\n"
+         "  --tofu           use GPGME_KEYLIST_MODE_TOFU\n"
+         "  --sig-notations  use GPGME_KEYLIST_MODE_SIG_NOTATIONS\n"
+         "  --ephemeral      use GPGME_KEYLIST_MODE_EPHEMERAL\n"
+         "  --validate       use GPGME_KEYLIST_MODE_VALIDATE\n"
+         "  --locate         use GPGME_KEYLIST_MODE_LOCATE\n"
+         , stderr);
+  exit (ex);
+}
+
+int
+main (int argc, char **argv)
+{
+    int last_argc = -1;
+    Protocol protocol = OpenPGP;
+    unsigned int mode = 0;
+    bool only_secret = false;
+
+    if (argc) {
+        argc--; argv++;
+    }
+
+    while (argc && last_argc != argc ) {
+        last_argc = argc;
+        if (!strcmp (*argv, "--")) {
+            argc--; argv++;
+            break;
+        } else if (!strcmp (*argv, "--help")) {
+            show_usage (0);
+        } else if (!strcmp (*argv, "--openpgp")) {
+            protocol = OpenPGP;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--cms")) {
+            protocol = CMS;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--secret")) {
+            only_secret = true;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--local")) {
+            mode |= KeyListMode::Local;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--extern")) {
+            mode |= KeyListMode::Extern;
+            argc--; argv++;
+        }else if (!strcmp (*argv, "--tofu")) {
+            mode |= KeyListMode::WithTofu;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--sigs")) {
+            mode |= KeyListMode::Signatures;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--sig-notations")) {
+            mode |= KeyListMode::SignatureNotations;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--ephemeral")) {
+            mode |= KeyListMode::Ephemeral;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--validate")) {
+            mode |= KeyListMode::Validate;
+            argc--; argv++;
+        } else if (!strcmp (*argv, "--locate")) {
+            argc--; argv++;
+            mode |= KeyListMode::Locate;
+        } else if (!strncmp (*argv, "--", 2)) {
+            show_usage (1);
+        }
+    }
+
+    if (argc > 1) {
+        show_usage (1);
+    }
+
+    GpgME::initializeLibrary();
+    auto ctx = std::unique_ptr<Context> (Context::createForProtocol(protocol));
+    if (!ctx) {
+        std::cerr << "Failed to get Context";
+        return -1;
+    }
+    ctx->setKeyListMode (mode);
+    Error err = ctx->startKeyListing (*argv, only_secret);
+    if (err) {
+        std::cout << "Error: " << err.asString() << "\n";
+        return -1;
+    }
+    GpgME::Key key;
+    std::stringstream ss;
+    do {
+        key = ctx->nextKey(err);
+        ss << key << "\n\n";
+    } while (!err && !key.isNull());
+
+    std::cout << ss.str();
+
+    return 0;
+}