Skip to content

Commit

Permalink
Add DSL for testing verification results
Browse files Browse the repository at this point in the history
  • Loading branch information
vanitasvitae committed Apr 26, 2023
1 parent bb2b4e0 commit aeda534
Show file tree
Hide file tree
Showing 8 changed files with 326 additions and 95 deletions.
39 changes: 37 additions & 2 deletions sop-java/src/test/java/sop/util/VerificationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import org.junit.jupiter.api.Test;
import sop.Verification;
import sop.enums.SignatureMode;
import sop.testsuite.assertions.VerificationAssert;

import java.util.Date;

Expand All @@ -21,12 +22,37 @@ public void limitedConstructorTest() {
String certFP = "4E2C78519512C2AE9A8BFE7EB3298EB2FBE5F51B";
Verification verification = new Verification(signDate, keyFP, certFP);
assertEquals("2022-11-07T15:01:24Z F9E6F53F7201C60A87064EAB0B27F2B0760A1209 4E2C78519512C2AE9A8BFE7EB3298EB2FBE5F51B", verification.toString());

VerificationAssert.assertThatVerification(verification)
.issuedBy(certFP)
.isBySigningKey(keyFP)
.isCreatedAt(signDate)
.hasMode(null)
.hasDescription(null);
}

@Test
public void limitedParsingTest() {
String string = "2022-11-07T15:01:24Z F9E6F53F7201C60A87064EAB0B27F2B0760A1209 4E2C78519512C2AE9A8BFE7EB3298EB2FBE5F51B";
Verification verification = Verification.fromString(string);
assertEquals(string, verification.toString());
VerificationAssert.assertThatVerification(verification)
.isCreatedAt(UTCUtil.parseUTCDate("2022-11-07T15:01:24Z"))
.issuedBy("F9E6F53F7201C60A87064EAB0B27F2B0760A1209", "4E2C78519512C2AE9A8BFE7EB3298EB2FBE5F51B")
.hasMode(null)
.hasDescription(null);
}

@Test
public void parsingWithModeTest() {
String string = "2022-11-07T15:01:24Z F9E6F53F7201C60A87064EAB0B27F2B0760A1209 4E2C78519512C2AE9A8BFE7EB3298EB2FBE5F51B mode:text";
Verification verification = Verification.fromString(string);
assertEquals(string, verification.toString());
VerificationAssert.assertThatVerification(verification)
.isCreatedAt(UTCUtil.parseUTCDate("2022-11-07T15:01:24Z"))
.issuedBy("F9E6F53F7201C60A87064EAB0B27F2B0760A1209", "4E2C78519512C2AE9A8BFE7EB3298EB2FBE5F51B")
.hasMode(SignatureMode.text)
.hasDescription(null);
}

@Test
Expand All @@ -37,9 +63,13 @@ public void extendedConstructorTest() {
SignatureMode mode = SignatureMode.binary;
String description = "certificate from dkg.asc";
Verification verification = new Verification(signDate, keyFP, certFP, mode, description);

assertEquals("2022-11-07T15:01:24Z F9E6F53F7201C60A87064EAB0B27F2B0760A1209 4E2C78519512C2AE9A8BFE7EB3298EB2FBE5F51B mode:binary certificate from dkg.asc", verification.toString());
assertEquals(SignatureMode.binary, verification.getSignatureMode());
assertEquals(description, verification.getDescription());
VerificationAssert.assertThatVerification(verification)
.isCreatedAt(signDate)
.issuedBy(keyFP, certFP)
.hasMode(SignatureMode.binary)
.hasDescription(description);
}

@Test
Expand All @@ -52,5 +82,10 @@ public void extendedParsingTest() {
string = "2022-11-07T15:01:24Z F9E6F53F7201C60A87064EAB0B27F2B0760A1209 4E2C78519512C2AE9A8BFE7EB3298EB2FBE5F51B certificate from dkg.asc";
verification = Verification.fromString(string);
assertEquals(string, verification.toString());
VerificationAssert.assertThatVerification(verification)
.isCreatedAt(UTCUtil.parseUTCDate("2022-11-07T15:01:24Z"))
.issuedBy("F9E6F53F7201C60A87064EAB0B27F2B0760A1209", "4E2C78519512C2AE9A8BFE7EB3298EB2FBE5F51B")
.hasMode(null)
.hasDescription("certificate from dkg.asc");
}
}
65 changes: 5 additions & 60 deletions sop-java/src/testFixtures/java/sop/testsuite/JUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,14 @@

package sop.testsuite;

import sop.Verification;
import sop.util.UTCUtil;

import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.fail;

public class JUtils {
Expand Down Expand Up @@ -157,66 +156,12 @@ public static byte[] removeArmorHeaders(byte[] armor) {
return string.getBytes(StandardCharsets.UTF_8);
}

public static void assertSignedBy(List<Verification> verifications, String primaryFingerprint) {
for (Verification verification : verifications) {
if (verification.getSigningCertFingerprint().equals(primaryFingerprint)) {
return;
}
}

if (verifications.isEmpty()) {
fail("Verification list is empty.");
}

fail("Verification list does not contain verification by cert " + primaryFingerprint + ":\n" +
Arrays.toString(verifications.toArray(new Verification[0])));
public static void assertDateEquals(Date expected, Date actual) {
assertEquals(UTCUtil.formatUTCDate(expected), UTCUtil.formatUTCDate(actual));
}

public static void assertSignedBy(List<Verification> verifications, String signingFingerprint, String primaryFingerprint) {
for (Verification verification : verifications) {
if (verification.getSigningCertFingerprint().equals(primaryFingerprint) && verification.getSigningKeyFingerprint().equals(signingFingerprint)) {
return;
}
}

if (verifications.isEmpty()) {
fail("Verification list is empty.");
}

fail("Verification list does not contain verification by key " + signingFingerprint + " on cert " + primaryFingerprint + ":\n" +
Arrays.toString(verifications.toArray(new Verification[0])));
public static boolean dateEquals(Date expected, Date actual) {
return UTCUtil.formatUTCDate(expected).equals(UTCUtil.formatUTCDate(actual));
}

public static void assertSignedBy(List<Verification> verifications, String primaryFingerprint, Date signatureDate) {
for (Verification verification : verifications) {
if (verification.getSigningCertFingerprint().equals(primaryFingerprint) &&
verification.getCreationTime().equals(signatureDate)) {
return;
}
}

if (verifications.isEmpty()) {
fail("Verification list is empty.");
}

fail("Verification list does not contain verification by cert " + primaryFingerprint + " made at " + UTCUtil.formatUTCDate(signatureDate) + ":\n" +
Arrays.toString(verifications.toArray(new Verification[0])));
}

public static void assertSignedBy(List<Verification> verifications, String signingFingerprint, String primaryFingerprint, Date signatureDate) {
for (Verification verification : verifications) {
if (verification.getSigningCertFingerprint().equals(primaryFingerprint) &&
verification.getSigningKeyFingerprint().equals(signingFingerprint) &&
verification.getCreationTime().equals(signatureDate)) {
return;
}
}

if (verifications.isEmpty()) {
fail("Verification list is empty.");
}

fail("Verification list does not contain verification by key" + signingFingerprint + " on cert " + primaryFingerprint + " made at " + UTCUtil.formatUTCDate(signatureDate) + ":\n" +
Arrays.toString(verifications.toArray(new Verification[0])));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0

package sop.testsuite.assertions;

import sop.Verification;
import sop.enums.SignatureMode;
import sop.testsuite.JUtils;

import java.util.Date;

import static org.junit.jupiter.api.Assertions.assertEquals;

public final class VerificationAssert {

private final Verification verification;

public static VerificationAssert assertThatVerification(Verification verification) {
return new VerificationAssert(verification);
}

private VerificationAssert(Verification verification) {
this.verification = verification;
}

public VerificationAssert issuedBy(String signingKeyFingerprint, String primaryFingerprint) {
return isBySigningKey(signingKeyFingerprint)
.issuedBy(primaryFingerprint);
}

public VerificationAssert issuedBy(String primaryFingerprint) {
assertEquals(primaryFingerprint, verification.getSigningCertFingerprint());
return this;
}

public VerificationAssert isBySigningKey(String signingKeyFingerprint) {
assertEquals(signingKeyFingerprint, verification.getSigningKeyFingerprint());
return this;
}

public VerificationAssert isCreatedAt(Date creationDate) {
JUtils.assertDateEquals(creationDate, verification.getCreationTime());
return this;
}

public VerificationAssert hasDescription(String description) {
assertEquals(description, verification.getDescription());
return this;
}

public VerificationAssert hasDescriptionOrNull(String description) {
if (verification.getDescription() == null) {
return this;
}

return hasDescription(description);
}

public VerificationAssert hasMode(SignatureMode mode) {
assertEquals(mode, verification.getSignatureMode());
return this;
}

public VerificationAssert hasModeOrNull(SignatureMode mode) {
if (verification.getSignatureMode() == null) {
return this;
}
return hasMode(mode);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0

package sop.testsuite.assertions;

import sop.Verification;

import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;

public final class VerificationListAssert {

private final List<Verification> verificationList = new ArrayList<>();

private VerificationListAssert(List<Verification> verifications) {
this.verificationList.addAll(verifications);
}

public static VerificationListAssert assertThatVerificationList(List<Verification> verifications) {
return new VerificationListAssert(verifications);
}

public VerificationListAssert isEmpty() {
assertTrue(verificationList.isEmpty());
return this;
}

public VerificationListAssert isNotEmpty() {
assertFalse(verificationList.isEmpty());
return this;
}

public VerificationListAssert sizeEquals(int size) {
assertEquals(size, verificationList.size());
return this;
}

public VerificationAssert hasSingleItem() {
sizeEquals(1);
return VerificationAssert.assertThatVerification(verificationList.get(0));
}

public VerificationListAssert containsVerificationByCert(String primaryFingerprint) {
for (Verification verification : verificationList) {
if (primaryFingerprint.equals(verification.getSigningCertFingerprint())) {
return this;
}
}
fail("No verification was issued by certificate " + primaryFingerprint);
return this;
}

public VerificationListAssert containsVerificationBy(String signingKeyFingerprint, String primaryFingerprint) {
for (Verification verification : verificationList) {
if (primaryFingerprint.equals(verification.getSigningCertFingerprint()) &&
signingKeyFingerprint.equals(verification.getSigningKeyFingerprint())) {
return this;
}
}

fail("No verification was issued by key " + signingKeyFingerprint + " of cert " + primaryFingerprint);
return this;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0

/**
* DSL for assertions on SOP objects.
*/
package sop.testsuite.assertions;

0 comments on commit aeda534

Please sign in to comment.