~rjarry/aerc

b65f5649c853badcf8dad6b7be06cafed0ed70c0 — Robin Jarry 16 days ago 43a79ac
gpg: make tests more robust

Skip the tests if gpg is not installed.
Avoid interference with the global ~/.gnupg.
Automatically delete GNUPGHOME at the end of tests.

Signed-off-by: Robin Jarry <robin@jarry.cc>
Acked-by: Tim Culverhouse <tim@timculverhouse.com>
4 files changed, 31 insertions(+), 24 deletions(-)

M Makefile
M lib/crypto/gpg/gpg_test.go
M lib/crypto/gpg/reader_test.go
M lib/crypto/gpg/writer_test.go
M Makefile => Makefile +4 -0
@@ 58,6 58,10 @@ checkfmt:
		exit 1; \
	fi

.PHONY: tests
tests:
	$(GO) test $(GOFLAGS) -v ./...

.PHONY: debug
debug: aerc.debug
	@echo 'Run `./aerc.debug` and use this command in another terminal to attach a debugger:'

M lib/crypto/gpg/gpg_test.go => lib/crypto/gpg/gpg_test.go +13 -16
@@ 2,9 2,8 @@ package gpg

import (
	"bytes"
	"fmt"
	"io"
	"log"
	"os"
	"os/exec"
	"strings"
	"testing"


@@ 12,22 11,20 @@ import (
	"git.sr.ht/~rjarry/aerc/models"
)

func TestHasGpg(t *testing.T) {
	gpgmail := new(Mail)
	hasGpg := gpgmail.Init(new(log.Logger))

	if hasGpg != nil {
		t.Errorf("System does not have GPG")
func initGPGtest(t *testing.T) {
	if _, err := exec.LookPath("gpg"); err != nil {
		t.Skipf("%s", err)
	}
}

func CleanUp() {
	cmd := exec.Command("gpg", "--batch", "--yes", "--delete-secret-and-public-keys", testKeyId)
	err := cmd.Run()
	if err != nil {
		fmt.Println("Test cleanup failed: you may need to delete the test keys from your GPG keyring")
		return
	// temp dir is automatically deleted by the test runtime
	dir := t.TempDir()
	// t.Setenv is only available since go 1.17
	if err := os.Setenv("GNUPGHOME", dir); err != nil {
		t.Fatalf("failed to set GNUPGHOME: %s", err)
	}
	t.Cleanup(func() {
		os.Unsetenv("GNUPGHOME")
	})
	t.Logf("using GNUPGHOME = %s", dir)
}

func toCRLF(s string) string {

M lib/crypto/gpg/reader_test.go => lib/crypto/gpg/reader_test.go +10 -6
@@ 21,6 21,8 @@ func importPublicKey() {
}

func TestReader_encryptedSignedPGPMIME(t *testing.T) {
	initGPGtest(t)

	var expect = models.MessageDetails{
		IsEncrypted:        true,
		IsSigned:           true,


@@ 41,11 43,11 @@ func TestReader_encryptedSignedPGPMIME(t *testing.T) {
	}

	deepEqual(t, r.MessageDetails, &expect)

	t.Cleanup(CleanUp)
}

func TestReader_signedPGPMIME(t *testing.T) {
	initGPGtest(t)

	var expect = models.MessageDetails{
		IsEncrypted:        false,
		IsSigned:           true,


@@ 67,11 69,11 @@ func TestReader_signedPGPMIME(t *testing.T) {
	}

	deepEqual(t, r.MessageDetails, &expect)

	t.Cleanup(CleanUp)
}

func TestReader_encryptedSignedEncapsulatedPGPMIME(t *testing.T) {
	initGPGtest(t)

	var expect = models.MessageDetails{
		IsEncrypted:        true,
		IsSigned:           true,


@@ 100,6 102,8 @@ func TestReader_encryptedSignedEncapsulatedPGPMIME(t *testing.T) {
	}
}
func TestReader_signedPGPMIMEInvalid(t *testing.T) {
	initGPGtest(t)

	var expect = models.MessageDetails{
		IsEncrypted:        false,
		IsSigned:           true,


@@ 120,11 124,11 @@ func TestReader_signedPGPMIMEInvalid(t *testing.T) {
		t.Fatalf("pgpmail.Read() = %v", err)
	}
	deepEqual(t, r.MessageDetails, &expect)

	t.Cleanup(CleanUp)
}

func TestReader_plaintext(t *testing.T) {
	initGPGtest(t)

	sr := strings.NewReader(testPlaintext)
	r, err := Read(sr)
	if err != nil {

M lib/crypto/gpg/writer_test.go => lib/crypto/gpg/writer_test.go +4 -2
@@ 16,6 16,8 @@ func init() {
}

func TestEncrypt(t *testing.T) {
	initGPGtest(t)

	importPublicKey()
	importSecretKey()
	var h textproto.Header


@@ 55,11 57,11 @@ func TestEncrypt(t *testing.T) {
	if s := body.String(); s != wantEncrypted {
		t.Errorf("Encrypt() = \n%v\n but want \n%v", s, wantEncrypted)
	}

	t.Cleanup(CleanUp)
}

func TestSign(t *testing.T) {
	initGPGtest(t)

	importPublicKey()
	importSecretKey()
	var h textproto.Header