diff --git a/lang/python/tests/Makefile.am b/lang/python/tests/Makefile.am index 50c78e35..87fb8d1f 100644 --- a/lang/python/tests/Makefile.am +++ b/lang/python/tests/Makefile.am @@ -16,7 +16,67 @@ # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, see . +GPG = gpg +GPG_AGENT = gpg-agent +export GNUPGHOME := $(abs_builddir) +export GPG_AGENT_INFO := + +test_srcdir = $(top_srcdir)/tests/gpg + TESTS_ENVIRONMENT = GNUPGHOME=$(abs_builddir) \ + LC_ALL=C GPG_AGENT_INFO= \ + top_srcdir=$(top_srcdir) \ PYTHONPATH=`echo $(abs_builddir)/../build/lib.*` -TESTS = t-wrapper.py t-data.py +py_tests = t-wrapper.py \ + t-data.py \ + t-encrypt.py \ + t-decrypt.py + +TESTS = $(top_srcdir)/tests/gpg/initial.test \ + $(py_tests) \ + $(top_srcdir)/tests/gpg/final.test + +CLEANFILES = secring.gpg pubring.gpg pubring.kbx trustdb.gpg dirmngr.conf \ + gpg-agent.conf pubring.kbx~ gpg.conf pubring.gpg~ \ + random_seed .gpg-v21-migrated pubring-stamp + +private_keys = \ + $(test_srcdir)/13CD0F3BDF24BE53FE192D62F18737256FF6E4FD \ + $(test_srcdir)/76F7E2B35832976B50A27A282D9B87E44577EB66 \ + $(test_srcdir)/A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD \ + $(test_srcdir)/13CBE3758AFE42B5E5E2AE4CED27AFA455E3F87F \ + $(test_srcdir)/7A030357C0F253A5BBCD282FFC4E521B37558F5C + +clean-local: + -$(top_srcdir)/tests/start-stop-agent --stop + -rm -fR -- private-keys-v1.d openpgp-revocs.d S.gpg-agent sshcontrol + +check-local: ./gpg.conf ./gpg-agent.conf ./pubring-stamp \ + ./private-keys-v1.d/gpg-sample.stamp + +# To guarantee that check-local is run before any tests we +# add this dependency: +$(top_srcdir)/tests/gpg/initial.test: check-local + +./private-keys-v1.d/gpg-sample.stamp: $(private_keys) + test -d ./private-keys-v1.d || mkdir ./private-keys-v1.d + for k in $(private_keys); do \ + cp $$k private-keys-v1.d/`basename $$k`.key; \ + done + echo x > ./private-keys-v1.d/gpg-sample.stamp + +./pubring-stamp: $(test_srcdir)/pubdemo.asc + $(GPG) --no-permission-warning \ + --import $(test_srcdir)/pubdemo.asc + -$(GPG) --no-permission-warning \ + --import $(test_srcdir)/secdemo.asc + touch ./pubring-stamp + +./gpg.conf: +# This is required for t-sig-notations. + echo no-force-v3-sigs > ./gpg.conf + +./gpg-agent.conf: +# This is required for gpg2, which does not support command fd. + echo pinentry-program $(abs_top_srcdir)/tests/gpg/pinentry > ./gpg-agent.conf diff --git a/lang/python/tests/support.py b/lang/python/tests/support.py new file mode 100644 index 00000000..36b3c888 --- /dev/null +++ b/lang/python/tests/support.py @@ -0,0 +1,26 @@ +# Copyright (C) 2016 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 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 . + +import os +from pyme import core + +def make_filename(name): + return os.path.join(os.environ['top_srcdir'], 'tests', 'gpg', name) + +def init_gpgme(proto): + core.check_version() + core.engine_check_version(proto) diff --git a/lang/python/tests/t-decrypt.py b/lang/python/tests/t-decrypt.py new file mode 100755 index 00000000..da62ba42 --- /dev/null +++ b/lang/python/tests/t-decrypt.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python3 + +# Copyright (C) 2016 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 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 . + +import sys +import os +from pyme import core, constants +import support + +support.init_gpgme(constants.PROTOCOL_OpenPGP) +c = core.Context() + +source = core.Data(file=support.make_filename("cipher-1.asc")) +sink = core.Data() + +c.op_decrypt(source, sink) +result = c.op_decrypt_result() +assert not result.unsupported_algorithm, \ + "Unsupported algorithm: {}".format(result.unsupported_algorithm) + +sink.seek(0, os.SEEK_SET) +sys.stdout.buffer.write(sink.read()) diff --git a/lang/python/tests/t-encrypt.py b/lang/python/tests/t-encrypt.py new file mode 100755 index 00000000..3bed752b --- /dev/null +++ b/lang/python/tests/t-encrypt.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 + +# Copyright (C) 2016 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 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 . + +import sys +import os +from pyme import core, constants +import support + +support.init_gpgme(constants.PROTOCOL_OpenPGP) +c = core.Context() +c.set_armor(True) + +source = core.Data("Hallo Leute\n") +sink = core.Data() + +keys = [] +keys.append(c.get_key("A0FF4590BB6122EDEF6E3C542D727CC768697734", False)) +keys.append(c.get_key("D695676BDCEDCC2CDD6152BCFE180B1DA9E3B0B2", False)) + +c.op_encrypt(keys, constants.ENCRYPT_ALWAYS_TRUST, source, sink) +result = c.op_encrypt_result() +assert not result.invalid_recipients, \ + "Invalid recipient encountered: {}".format(result.invalid_recipients.fpr) + +sink.seek(0, os.SEEK_SET) +sys.stdout.buffer.write(sink.read())