mirror of
https://codeberg.org/PGPainless/sop-java.git
synced 2024-11-26 00:52:07 +01:00
Remove deprecated junit5-system-exit
Replaced with custom test DSL that avoids System.exit
This commit is contained in:
parent
cbbdd09472
commit
e39cc7f0ac
13 changed files with 550 additions and 215 deletions
|
@ -12,15 +12,12 @@ dependencies {
|
||||||
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
|
testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"
|
||||||
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
|
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
|
||||||
|
|
||||||
// Testing Exit Codes in JUnit
|
|
||||||
// https://todd.ginsberg.com/post/testing-system-exit/
|
|
||||||
testImplementation "com.ginsberg:junit5-system-exit:$junitSysExitVersion"
|
|
||||||
|
|
||||||
// Mocking Components
|
// Mocking Components
|
||||||
testImplementation "org.mockito:mockito-core:$mockitoVersion"
|
testImplementation "org.mockito:mockito-core:$mockitoVersion"
|
||||||
|
|
||||||
// SOP
|
// SOP
|
||||||
implementation(project(":sop-java"))
|
implementation(project(":sop-java"))
|
||||||
|
testImplementation(testFixtures(project(":sop-java")))
|
||||||
|
|
||||||
// CLI
|
// CLI
|
||||||
implementation "info.picocli:picocli:$picocliVersion"
|
implementation "info.picocli:picocli:$picocliVersion"
|
||||||
|
|
|
@ -6,12 +6,13 @@ package sop.cli.picocli;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertGenericError;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertUnsupportedSubcommand;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import sop.SOP;
|
import sop.SOP;
|
||||||
import sop.exception.SOPGPException;
|
import sop.exception.SOPGPException;
|
||||||
|
@ -34,20 +35,18 @@ import sop.operation.Version;
|
||||||
public class SOPTest {
|
public class SOPTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedSubcommand.EXIT_CODE)
|
|
||||||
public void assertExitOnInvalidSubcommand() {
|
public void assertExitOnInvalidSubcommand() {
|
||||||
SOP sop = mock(SOP.class);
|
SOP sop = mock(SOP.class);
|
||||||
SopCLI.setSopInstance(sop);
|
SopCLI.setSopInstance(sop);
|
||||||
|
|
||||||
SopCLI.main(new String[] {"invalid"});
|
assertUnsupportedSubcommand(() -> SopCLI.execute("invalid"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(1)
|
|
||||||
public void assertThrowsIfNoSOPBackendSet() {
|
public void assertThrowsIfNoSOPBackendSet() {
|
||||||
SopCLI.setSopInstance(null);
|
SopCLI.setSopInstance(null);
|
||||||
// At this point, no SOP backend is set, so an InvalidStateException triggers exit(1)
|
// At this point, no SOP backend is set, so an InvalidStateException triggers error code 1
|
||||||
SopCLI.main(new String[] {"armor"});
|
assertGenericError(() -> SopCLI.execute("armor"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -4,8 +4,6 @@
|
||||||
|
|
||||||
package sop.cli.picocli.commands;
|
package sop.cli.picocli.commands;
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import com.ginsberg.junit.exit.FailOnSystemExit;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import sop.Ready;
|
import sop.Ready;
|
||||||
|
@ -24,6 +22,8 @@ import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertBadData;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertSuccess;
|
||||||
|
|
||||||
public class ArmorCmdTest {
|
public class ArmorCmdTest {
|
||||||
|
|
||||||
|
@ -42,24 +42,22 @@ public class ArmorCmdTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void assertDataIsAlwaysCalled() throws SOPGPException.BadData, IOException {
|
public void assertDataIsAlwaysCalled() throws SOPGPException.BadData, IOException {
|
||||||
SopCLI.main(new String[] {"armor"});
|
assertSuccess(() -> SopCLI.execute("armor"));
|
||||||
verify(armor, times(1)).data((InputStream) any());
|
verify(armor, times(1)).data((InputStream) any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
|
||||||
public void ifBadDataExit41() throws SOPGPException.BadData, IOException {
|
public void ifBadDataExit41() throws SOPGPException.BadData, IOException {
|
||||||
when(armor.data((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(armor.data((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
|
|
||||||
SopCLI.main(new String[] {"armor"});
|
assertBadData(() -> SopCLI.execute("armor"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@FailOnSystemExit
|
|
||||||
public void ifNoErrorsNoExit() {
|
public void ifNoErrorsNoExit() {
|
||||||
when(sop.armor()).thenReturn(armor);
|
when(sop.armor()).thenReturn(armor);
|
||||||
|
|
||||||
SopCLI.main(new String[] {"armor"});
|
assertSuccess(() -> SopCLI.execute("armor"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Ready nopReady() {
|
private static Ready nopReady() {
|
||||||
|
|
|
@ -9,12 +9,13 @@ import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertBadData;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertSuccess;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import sop.Ready;
|
import sop.Ready;
|
||||||
|
@ -48,14 +49,13 @@ public class DearmorCmdTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void assertDataIsCalled() throws IOException, SOPGPException.BadData {
|
public void assertDataIsCalled() throws IOException, SOPGPException.BadData {
|
||||||
SopCLI.main(new String[] {"dearmor"});
|
assertSuccess(() -> SopCLI.execute("dearmor"));
|
||||||
verify(dearmor, times(1)).data((InputStream) any());
|
verify(dearmor, times(1)).data((InputStream) any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
|
||||||
public void assertBadDataCausesExit41() throws IOException, SOPGPException.BadData {
|
public void assertBadDataCausesExit41() throws IOException, SOPGPException.BadData {
|
||||||
when(dearmor.data((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException("invalid armor")));
|
when(dearmor.data((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException("invalid armor")));
|
||||||
SopCLI.main(new String[] {"dearmor"});
|
assertBadData(() -> SopCLI.execute("dearmor"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
package sop.cli.picocli.commands;
|
package sop.cli.picocli.commands;
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.mockito.ArgumentMatcher;
|
import org.mockito.ArgumentMatcher;
|
||||||
|
@ -42,6 +41,18 @@ import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertBadData;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertCannotDecrypt;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertGenericError;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertIncompleteVerification;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertKeyIsProtected;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertMissingArg;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertMissingInput;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertOutputExists;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertPasswordNotHumanReadable;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertSuccess;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertUnsupportedAsymmetricAlgo;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertUnsupportedOption;
|
||||||
|
|
||||||
public class DecryptCmdTest {
|
public class DecryptCmdTest {
|
||||||
|
|
||||||
|
@ -74,47 +85,47 @@ public class DecryptCmdTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingArg.EXIT_CODE)
|
|
||||||
public void missingArgumentsExceptionCausesExit19() throws SOPGPException.MissingArg, SOPGPException.BadData, SOPGPException.CannotDecrypt, IOException {
|
public void missingArgumentsExceptionCausesExit19() throws SOPGPException.MissingArg, SOPGPException.BadData, SOPGPException.CannotDecrypt, IOException {
|
||||||
when(decrypt.ciphertext((InputStream) any())).thenThrow(new SOPGPException.MissingArg("Missing arguments."));
|
when(decrypt.ciphertext((InputStream) any())).thenThrow(new SOPGPException.MissingArg("Missing arguments."));
|
||||||
SopCLI.main(new String[] {"decrypt"});
|
assertMissingArg(() -> SopCLI.execute("decrypt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
|
||||||
public void badDataExceptionCausesExit41() throws SOPGPException.MissingArg, SOPGPException.BadData, SOPGPException.CannotDecrypt, IOException {
|
public void badDataExceptionCausesExit41() throws SOPGPException.MissingArg, SOPGPException.BadData, SOPGPException.CannotDecrypt, IOException {
|
||||||
when(decrypt.ciphertext((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(decrypt.ciphertext((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
SopCLI.main(new String[] {"decrypt"});
|
assertBadData(() -> SopCLI.execute("decrypt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.PasswordNotHumanReadable.EXIT_CODE)
|
|
||||||
public void assertNotHumanReadablePasswordCausesExit31() throws SOPGPException.PasswordNotHumanReadable,
|
public void assertNotHumanReadablePasswordCausesExit31() throws SOPGPException.PasswordNotHumanReadable,
|
||||||
SOPGPException.UnsupportedOption, IOException {
|
SOPGPException.UnsupportedOption, IOException {
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("pretendThisIsNotReadable");
|
File passwordFile = TestFileUtil.writeTempStringFile("pretendThisIsNotReadable");
|
||||||
when(decrypt.withPassword(any())).thenThrow(new SOPGPException.PasswordNotHumanReadable());
|
when(decrypt.withPassword(any())).thenThrow(new SOPGPException.PasswordNotHumanReadable());
|
||||||
SopCLI.main(new String[] {"decrypt", "--with-password", passwordFile.getAbsolutePath()});
|
assertPasswordNotHumanReadable(() ->
|
||||||
|
SopCLI.execute("decrypt", "--with-password", passwordFile.getAbsolutePath())
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void assertWithPasswordPassesPasswordDown() throws SOPGPException.PasswordNotHumanReadable, SOPGPException.UnsupportedOption, IOException {
|
public void assertWithPasswordPassesPasswordDown() throws SOPGPException.PasswordNotHumanReadable, SOPGPException.UnsupportedOption, IOException {
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("orange");
|
File passwordFile = TestFileUtil.writeTempStringFile("orange");
|
||||||
SopCLI.main(new String[] {"decrypt", "--with-password", passwordFile.getAbsolutePath()});
|
assertSuccess(() -> SopCLI.execute("decrypt", "--with-password", passwordFile.getAbsolutePath()));
|
||||||
verify(decrypt, times(1)).withPassword("orange");
|
verify(decrypt, times(1)).withPassword("orange");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
|
||||||
public void assertUnsupportedWithPasswordCausesExit37() throws SOPGPException.PasswordNotHumanReadable, SOPGPException.UnsupportedOption, IOException {
|
public void assertUnsupportedWithPasswordCausesExit37() throws SOPGPException.PasswordNotHumanReadable, SOPGPException.UnsupportedOption, IOException {
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("swordfish");
|
File passwordFile = TestFileUtil.writeTempStringFile("swordfish");
|
||||||
when(decrypt.withPassword(any())).thenThrow(new SOPGPException.UnsupportedOption("Decrypting with password not supported."));
|
when(decrypt.withPassword(any())).thenThrow(new SOPGPException.UnsupportedOption("Decrypting with password not supported."));
|
||||||
SopCLI.main(new String[] {"decrypt", "--with-password", passwordFile.getAbsolutePath()});
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("decrypt", "--with-password", passwordFile.getAbsolutePath())
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void assertDefaultTimeRangesAreUsedIfNotOverwritten() throws SOPGPException.UnsupportedOption {
|
public void assertDefaultTimeRangesAreUsedIfNotOverwritten() throws SOPGPException.UnsupportedOption {
|
||||||
Date now = new Date();
|
Date now = new Date();
|
||||||
SopCLI.main(new String[] {"decrypt"});
|
assertSuccess(() -> SopCLI.execute("decrypt"));
|
||||||
verify(decrypt, times(1)).verifyNotBefore(AbstractSopCmd.BEGINNING_OF_TIME);
|
verify(decrypt, times(1)).verifyNotBefore(AbstractSopCmd.BEGINNING_OF_TIME);
|
||||||
verify(decrypt, times(1)).verifyNotAfter(
|
verify(decrypt, times(1)).verifyNotAfter(
|
||||||
ArgumentMatchers.argThat(argument -> {
|
ArgumentMatchers.argThat(argument -> {
|
||||||
|
@ -125,7 +136,8 @@ public class DecryptCmdTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void assertVerifyNotAfterAndBeforeDashResultsInMaxTimeRange() throws SOPGPException.UnsupportedOption {
|
public void assertVerifyNotAfterAndBeforeDashResultsInMaxTimeRange() throws SOPGPException.UnsupportedOption {
|
||||||
SopCLI.main(new String[] {"decrypt", "--verify-not-before", "-", "--verify-not-after", "-"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verify-not-before", "-", "--verify-not-after", "-"));
|
||||||
verify(decrypt, times(1)).verifyNotBefore(AbstractSopCmd.BEGINNING_OF_TIME);
|
verify(decrypt, times(1)).verifyNotBefore(AbstractSopCmd.BEGINNING_OF_TIME);
|
||||||
verify(decrypt, times(1)).verifyNotAfter(AbstractSopCmd.END_OF_TIME);
|
verify(decrypt, times(1)).verifyNotAfter(AbstractSopCmd.END_OF_TIME);
|
||||||
}
|
}
|
||||||
|
@ -138,54 +150,57 @@ public class DecryptCmdTest {
|
||||||
return Math.abs(now.getTime() - argument.getTime()) <= 1000;
|
return Math.abs(now.getTime() - argument.getTime()) <= 1000;
|
||||||
};
|
};
|
||||||
|
|
||||||
SopCLI.main(new String[] {"decrypt", "--verify-not-before", "now", "--verify-not-after", "now"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verify-not-before", "now", "--verify-not-after", "now"));
|
||||||
verify(decrypt, times(1)).verifyNotAfter(ArgumentMatchers.argThat(isMaxOneSecOff));
|
verify(decrypt, times(1)).verifyNotAfter(ArgumentMatchers.argThat(isMaxOneSecOff));
|
||||||
verify(decrypt, times(1)).verifyNotBefore(ArgumentMatchers.argThat(isMaxOneSecOff));
|
verify(decrypt, times(1)).verifyNotBefore(ArgumentMatchers.argThat(isMaxOneSecOff));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(1)
|
|
||||||
public void assertMalformedDateInNotBeforeCausesExit1() {
|
public void assertMalformedDateInNotBeforeCausesExit1() {
|
||||||
// ParserException causes exit(1)
|
// ParserException causes exit(1)
|
||||||
SopCLI.main(new String[] {"decrypt", "--verify-not-before", "invalid"});
|
assertGenericError(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verify-not-before", "invalid"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(1)
|
|
||||||
public void assertMalformedDateInNotAfterCausesExit1() {
|
public void assertMalformedDateInNotAfterCausesExit1() {
|
||||||
// ParserException causes exit(1)
|
// ParserException causes exit(1)
|
||||||
SopCLI.main(new String[] {"decrypt", "--verify-not-after", "invalid"});
|
assertGenericError(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verify-not-after", "invalid"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
|
||||||
public void assertUnsupportedNotAfterCausesExit37() throws SOPGPException.UnsupportedOption {
|
public void assertUnsupportedNotAfterCausesExit37() throws SOPGPException.UnsupportedOption {
|
||||||
when(decrypt.verifyNotAfter(any())).thenThrow(new SOPGPException.UnsupportedOption("Setting upper signature date boundary not supported."));
|
when(decrypt.verifyNotAfter(any())).thenThrow(
|
||||||
SopCLI.main(new String[] {"decrypt", "--verify-not-after", "now"});
|
new SOPGPException.UnsupportedOption("Setting upper signature date boundary not supported."));
|
||||||
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verify-not-after", "now"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
|
||||||
public void assertUnsupportedNotBeforeCausesExit37() throws SOPGPException.UnsupportedOption {
|
public void assertUnsupportedNotBeforeCausesExit37() throws SOPGPException.UnsupportedOption {
|
||||||
when(decrypt.verifyNotBefore(any())).thenThrow(new SOPGPException.UnsupportedOption("Setting lower signature date boundary not supported."));
|
when(decrypt.verifyNotBefore(any())).thenThrow(
|
||||||
SopCLI.main(new String[] {"decrypt", "--verify-not-before", "now"});
|
new SOPGPException.UnsupportedOption("Setting lower signature date boundary not supported."));
|
||||||
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verify-not-before", "now"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.OutputExists.EXIT_CODE)
|
|
||||||
public void assertExistingSessionKeyOutFileCausesExit59() throws IOException {
|
public void assertExistingSessionKeyOutFileCausesExit59() throws IOException {
|
||||||
File tempFile = File.createTempFile("existing-session-key-", ".tmp");
|
File tempFile = File.createTempFile("existing-session-key-", ".tmp");
|
||||||
tempFile.deleteOnExit();
|
tempFile.deleteOnExit();
|
||||||
SopCLI.main(new String[] {"decrypt", "--session-key-out", tempFile.getAbsolutePath()});
|
assertOutputExists(() ->
|
||||||
|
SopCLI.execute("decrypt", "--session-key-out", tempFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
|
||||||
public void assertWhenSessionKeyCannotBeExtractedExit37() throws IOException {
|
public void assertWhenSessionKeyCannotBeExtractedExit37() throws IOException {
|
||||||
Path tempDir = Files.createTempDirectory("session-key-out-dir");
|
Path tempDir = Files.createTempDirectory("session-key-out-dir");
|
||||||
File tempFile = new File(tempDir.toFile(), "session-key");
|
File tempFile = new File(tempDir.toFile(), "session-key");
|
||||||
tempFile.deleteOnExit();
|
tempFile.deleteOnExit();
|
||||||
SopCLI.main(new String[] {"decrypt", "--session-key-out", tempFile.getAbsolutePath()});
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("decrypt", "--session-key-out", tempFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -210,8 +225,10 @@ public class DecryptCmdTest {
|
||||||
File verificationsFile = new File(tempDir.toFile(), "verifications");
|
File verificationsFile = new File(tempDir.toFile(), "verifications");
|
||||||
File keyFile = new File(tempDir.toFile(), "key.asc");
|
File keyFile = new File(tempDir.toFile(), "key.asc");
|
||||||
keyFile.createNewFile();
|
keyFile.createNewFile();
|
||||||
SopCLI.main(new String[] {"decrypt", "--session-key-out", sessionKeyFile.getAbsolutePath(),
|
assertSuccess(() ->
|
||||||
"--verifications-out", verificationsFile.getAbsolutePath(), "--verify-with", keyFile.getAbsolutePath()});
|
SopCLI.execute("decrypt", "--session-key-out", sessionKeyFile.getAbsolutePath(),
|
||||||
|
"--verifications-out", verificationsFile.getAbsolutePath(), "--verify-with",
|
||||||
|
keyFile.getAbsolutePath()));
|
||||||
|
|
||||||
ByteArrayOutputStream bytesInFile = new ByteArrayOutputStream();
|
ByteArrayOutputStream bytesInFile = new ByteArrayOutputStream();
|
||||||
try (FileInputStream fileIn = new FileInputStream(sessionKeyFile)) {
|
try (FileInputStream fileIn = new FileInputStream(sessionKeyFile)) {
|
||||||
|
@ -241,10 +258,10 @@ public class DecryptCmdTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.CannotDecrypt.EXIT_CODE)
|
|
||||||
public void assertUnableToDecryptExceptionResultsInExit29() throws SOPGPException.CannotDecrypt, SOPGPException.MissingArg, SOPGPException.BadData, IOException {
|
public void assertUnableToDecryptExceptionResultsInExit29() throws SOPGPException.CannotDecrypt, SOPGPException.MissingArg, SOPGPException.BadData, IOException {
|
||||||
when(decrypt.ciphertext((InputStream) any())).thenThrow(new SOPGPException.CannotDecrypt());
|
when(decrypt.ciphertext((InputStream) any())).thenThrow(new SOPGPException.CannotDecrypt());
|
||||||
SopCLI.main(new String[] {"decrypt"});
|
assertCannotDecrypt(() ->
|
||||||
|
SopCLI.execute("decrypt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -258,30 +275,32 @@ public class DecryptCmdTest {
|
||||||
return new DecryptionResult(null, Collections.emptyList());
|
return new DecryptionResult(null, Collections.emptyList());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
SopCLI.main(new String[] {"decrypt", "--verify-with", tempFile.getAbsolutePath(), "--verifications-out", verifyOut.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verify-with", tempFile.getAbsolutePath(), "--verifications-out",
|
||||||
|
verifyOut.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
|
||||||
public void badDataInVerifyWithCausesExit41() throws IOException, SOPGPException.BadData {
|
public void badDataInVerifyWithCausesExit41() throws IOException, SOPGPException.BadData {
|
||||||
when(decrypt.verifyWithCert((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(decrypt.verifyWithCert((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
File tempFile = File.createTempFile("verify-with-", ".tmp");
|
File tempFile = File.createTempFile("verify-with-", ".tmp");
|
||||||
SopCLI.main(new String[] {"decrypt", "--verify-with", tempFile.getAbsolutePath()});
|
assertBadData(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verify-with", tempFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingInput.EXIT_CODE)
|
|
||||||
public void unexistentCertFileCausesExit61() {
|
public void unexistentCertFileCausesExit61() {
|
||||||
SopCLI.main(new String[] {"decrypt", "--verify-with", "invalid"});
|
assertMissingInput(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verify-with", "invalid"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.OutputExists.EXIT_CODE)
|
|
||||||
public void existingVerifyOutCausesExit59() throws IOException {
|
public void existingVerifyOutCausesExit59() throws IOException {
|
||||||
File certFile = File.createTempFile("existing-verify-out-cert", ".asc");
|
File certFile = File.createTempFile("existing-verify-out-cert", ".asc");
|
||||||
File existingVerifyOut = File.createTempFile("existing-verify-out", ".tmp");
|
File existingVerifyOut = File.createTempFile("existing-verify-out", ".tmp");
|
||||||
|
|
||||||
SopCLI.main(new String[] {"decrypt", "--verifications-out", existingVerifyOut.getAbsolutePath(), "--verify-with", certFile.getAbsolutePath()});
|
assertOutputExists(() -> SopCLI.execute("decrypt", "--verifications-out",
|
||||||
|
existingVerifyOut.getAbsolutePath(), "--verify-with", certFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -305,7 +324,9 @@ public class DecryptCmdTest {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
SopCLI.main(new String[] {"decrypt", "--verifications-out", verifyOut.getAbsolutePath(), "--verify-with", certFile.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verifications-out", verifyOut.getAbsolutePath(),
|
||||||
|
"--verify-with", certFile.getAbsolutePath()));
|
||||||
try (BufferedReader reader = new BufferedReader(new FileReader(verifyOut))) {
|
try (BufferedReader reader = new BufferedReader(new FileReader(verifyOut))) {
|
||||||
String line = reader.readLine();
|
String line = reader.readLine();
|
||||||
assertEquals("2021-07-11T20:58:23Z 1B66A707819A920925BC6777C3E0AFC0B2DFF862 C8CD564EBF8D7BBA90611D8D071773658BF6BF86", line);
|
assertEquals("2021-07-11T20:58:23Z 1B66A707819A920925BC6777C3E0AFC0B2DFF862 C8CD564EBF8D7BBA90611D8D071773658BF6BF86", line);
|
||||||
|
@ -320,66 +341,64 @@ public class DecryptCmdTest {
|
||||||
File sessionKeyFile1 = TestFileUtil.writeTempStringFile(key1.toString());
|
File sessionKeyFile1 = TestFileUtil.writeTempStringFile(key1.toString());
|
||||||
File sessionKeyFile2 = TestFileUtil.writeTempStringFile(key2.toString());
|
File sessionKeyFile2 = TestFileUtil.writeTempStringFile(key2.toString());
|
||||||
|
|
||||||
SopCLI.main(new String[] {"decrypt",
|
assertSuccess(() ->
|
||||||
"--with-session-key", sessionKeyFile1.getAbsolutePath(),
|
SopCLI.execute("decrypt",
|
||||||
"--with-session-key", sessionKeyFile2.getAbsolutePath()});
|
"--with-session-key", sessionKeyFile1.getAbsolutePath(),
|
||||||
|
"--with-session-key", sessionKeyFile2.getAbsolutePath()));
|
||||||
verify(decrypt).withSessionKey(key1);
|
verify(decrypt).withSessionKey(key1);
|
||||||
verify(decrypt).withSessionKey(key2);
|
verify(decrypt).withSessionKey(key2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(1)
|
|
||||||
public void assertMalformedSessionKeysResultInExit1() throws IOException {
|
public void assertMalformedSessionKeysResultInExit1() throws IOException {
|
||||||
File sessionKeyFile = TestFileUtil.writeTempStringFile("C7CBDAF42537776F12509B5168793C26B93294E5ABDFA73224FB0177123E9137");
|
File sessionKeyFile = TestFileUtil.writeTempStringFile("C7CBDAF42537776F12509B5168793C26B93294E5ABDFA73224FB0177123E9137");
|
||||||
SopCLI.main(new String[] {"decrypt",
|
assertGenericError(() ->
|
||||||
"--with-session-key", sessionKeyFile.getAbsolutePath()});
|
SopCLI.execute("decrypt",
|
||||||
|
"--with-session-key", sessionKeyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
|
||||||
public void assertBadDataInKeysResultsInExit41() throws SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.BadData, IOException {
|
public void assertBadDataInKeysResultsInExit41() throws SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.BadData, IOException {
|
||||||
when(decrypt.withKey((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(decrypt.withKey((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
File tempKeyFile = File.createTempFile("key-", ".tmp");
|
File tempKeyFile = File.createTempFile("key-", ".tmp");
|
||||||
SopCLI.main(new String[] {"decrypt", tempKeyFile.getAbsolutePath()});
|
assertBadData(() -> SopCLI.execute("decrypt", tempKeyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingInput.EXIT_CODE)
|
|
||||||
public void assertKeyFileNotFoundCausesExit61() {
|
public void assertKeyFileNotFoundCausesExit61() {
|
||||||
SopCLI.main(new String[] {"decrypt", "nonexistent-key"});
|
assertMissingInput(() -> SopCLI.execute("decrypt", "nonexistent-key"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.KeyIsProtected.EXIT_CODE)
|
|
||||||
public void assertProtectedKeyCausesExit67() throws IOException, SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.BadData {
|
public void assertProtectedKeyCausesExit67() throws IOException, SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.BadData {
|
||||||
when(decrypt.withKey((InputStream) any())).thenThrow(new SOPGPException.KeyIsProtected());
|
when(decrypt.withKey((InputStream) any())).thenThrow(new SOPGPException.KeyIsProtected());
|
||||||
File tempKeyFile = File.createTempFile("key-", ".tmp");
|
File tempKeyFile = File.createTempFile("key-", ".tmp");
|
||||||
SopCLI.main(new String[] {"decrypt", tempKeyFile.getAbsolutePath()});
|
assertKeyIsProtected(() -> SopCLI.execute("decrypt", tempKeyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedAsymmetricAlgo.EXIT_CODE)
|
|
||||||
public void assertUnsupportedAlgorithmExceptionCausesExit13() throws SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.BadData, IOException {
|
public void assertUnsupportedAlgorithmExceptionCausesExit13() throws SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.BadData, IOException {
|
||||||
when(decrypt.withKey((InputStream) any())).thenThrow(new SOPGPException.UnsupportedAsymmetricAlgo("Unsupported asymmetric algorithm.", new IOException()));
|
when(decrypt.withKey((InputStream) any())).thenThrow(new SOPGPException.UnsupportedAsymmetricAlgo("Unsupported asymmetric algorithm.", new IOException()));
|
||||||
File tempKeyFile = File.createTempFile("key-", ".tmp");
|
File tempKeyFile = File.createTempFile("key-", ".tmp");
|
||||||
SopCLI.main(new String[] {"decrypt", tempKeyFile.getAbsolutePath()});
|
assertUnsupportedAsymmetricAlgo(() ->
|
||||||
|
SopCLI.execute("decrypt", tempKeyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingInput.EXIT_CODE)
|
|
||||||
public void assertMissingPassphraseFileCausesExit61() {
|
public void assertMissingPassphraseFileCausesExit61() {
|
||||||
SopCLI.main(new String[] {"decrypt", "--with-password", "missing"});
|
assertMissingInput(() ->
|
||||||
|
SopCLI.execute("decrypt", "--with-password", "missing"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingInput.EXIT_CODE)
|
|
||||||
public void assertMissingSessionKeyFileCausesExit61() {
|
public void assertMissingSessionKeyFileCausesExit61() {
|
||||||
SopCLI.main(new String[] {"decrypt", "--with-session-key", "missing"});
|
assertMissingInput(() ->
|
||||||
|
SopCLI.execute("decrypt", "--with-session-key", "missing"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.IncompleteVerification.EXIT_CODE)
|
|
||||||
public void verifyOutWithoutVerifyWithCausesExit23() {
|
public void verifyOutWithoutVerifyWithCausesExit23() {
|
||||||
SopCLI.main(new String[] {"decrypt", "--verifications-out", "out.file"});
|
assertIncompleteVerification(() ->
|
||||||
|
SopCLI.execute("decrypt", "--verifications-out", "out.file"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
package sop.cli.picocli.commands;
|
package sop.cli.picocli.commands;
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
@ -28,6 +27,17 @@ import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertBadData;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertCertCannotEncrypt;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertGenericError;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertKeyCannotSign;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertKeyIsProtected;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertMissingArg;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertMissingInput;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertPasswordNotHumanReadable;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertSuccess;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertUnsupportedAsymmetricAlgo;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertUnsupportedOption;
|
||||||
|
|
||||||
public class EncryptCmdTest {
|
public class EncryptCmdTest {
|
||||||
|
|
||||||
|
@ -50,48 +60,50 @@ public class EncryptCmdTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingArg.EXIT_CODE)
|
public void missingBothPasswordAndCertFileCausesMissingArg() {
|
||||||
public void missingBothPasswordAndCertFileCauseExit19() {
|
assertMissingArg(() ->
|
||||||
SopCLI.main(new String[] {"encrypt", "--no-armor"});
|
SopCLI.execute("encrypt", "--no-armor"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
public void as_unsupportedEncryptAsCausesUnsupportedOption() throws SOPGPException.UnsupportedOption {
|
||||||
public void as_unsupportedEncryptAsCausesExit37() throws SOPGPException.UnsupportedOption {
|
|
||||||
when(encrypt.mode(any())).thenThrow(new SOPGPException.UnsupportedOption("Setting encryption mode not supported."));
|
when(encrypt.mode(any())).thenThrow(new SOPGPException.UnsupportedOption("Setting encryption mode not supported."));
|
||||||
|
|
||||||
SopCLI.main(new String[] {"encrypt", "--as", "Binary"});
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("encrypt", "--as", "Binary"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
public void as_invalidModeOptionCausesUnsupportedOption() {
|
||||||
public void as_invalidModeOptionCausesExit37() {
|
assertUnsupportedOption(() ->
|
||||||
SopCLI.main(new String[] {"encrypt", "--as", "invalid"});
|
SopCLI.execute("encrypt", "--as", "invalid"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void as_modeIsPassedDown() throws SOPGPException.UnsupportedOption, IOException {
|
public void as_modeIsPassedDown() throws SOPGPException.UnsupportedOption, IOException {
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("0rbit");
|
File passwordFile = TestFileUtil.writeTempStringFile("0rbit");
|
||||||
for (EncryptAs mode : EncryptAs.values()) {
|
for (EncryptAs mode : EncryptAs.values()) {
|
||||||
SopCLI.main(new String[] {"encrypt", "--as", mode.name(), "--with-password", passwordFile.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("encrypt", "--as", mode.name(),
|
||||||
|
"--with-password", passwordFile.getAbsolutePath()));
|
||||||
verify(encrypt, times(1)).mode(mode);
|
verify(encrypt, times(1)).mode(mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.PasswordNotHumanReadable.EXIT_CODE)
|
public void withPassword_notHumanReadablePasswordCausesPWNotHumanReadable() throws SOPGPException.PasswordNotHumanReadable, SOPGPException.UnsupportedOption, IOException {
|
||||||
public void withPassword_notHumanReadablePasswordCausesExit31() throws SOPGPException.PasswordNotHumanReadable, SOPGPException.UnsupportedOption, IOException {
|
|
||||||
when(encrypt.withPassword("pretendThisIsNotReadable")).thenThrow(new SOPGPException.PasswordNotHumanReadable());
|
when(encrypt.withPassword("pretendThisIsNotReadable")).thenThrow(new SOPGPException.PasswordNotHumanReadable());
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("pretendThisIsNotReadable");
|
File passwordFile = TestFileUtil.writeTempStringFile("pretendThisIsNotReadable");
|
||||||
SopCLI.main(new String[] {"encrypt", "--with-password", passwordFile.getAbsolutePath()});
|
assertPasswordNotHumanReadable(() ->
|
||||||
|
SopCLI.execute("encrypt", "--with-password", passwordFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
public void withPassword_unsupportedWithPasswordCausesUnsupportedOption() throws SOPGPException.PasswordNotHumanReadable, SOPGPException.UnsupportedOption, IOException {
|
||||||
public void withPassword_unsupportedWithPasswordCausesExit37() throws SOPGPException.PasswordNotHumanReadable, SOPGPException.UnsupportedOption, IOException {
|
|
||||||
when(encrypt.withPassword(any())).thenThrow(new SOPGPException.UnsupportedOption("Encrypting with password not supported."));
|
when(encrypt.withPassword(any())).thenThrow(new SOPGPException.UnsupportedOption("Encrypting with password not supported."));
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("orange");
|
File passwordFile = TestFileUtil.writeTempStringFile("orange");
|
||||||
SopCLI.main(new String[] {"encrypt", "--with-password", passwordFile.getAbsolutePath()});
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("encrypt", "--with-password", passwordFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -99,99 +111,107 @@ public class EncryptCmdTest {
|
||||||
File keyFile1 = File.createTempFile("sign-with-1-", ".asc");
|
File keyFile1 = File.createTempFile("sign-with-1-", ".asc");
|
||||||
File keyFile2 = File.createTempFile("sign-with-2-", ".asc");
|
File keyFile2 = File.createTempFile("sign-with-2-", ".asc");
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("password");
|
File passwordFile = TestFileUtil.writeTempStringFile("password");
|
||||||
SopCLI.main(new String[] {"encrypt", "--with-password", passwordFile.getAbsolutePath(), "--sign-with", keyFile1.getAbsolutePath(), "--sign-with", keyFile2.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("encrypt", "--with-password", passwordFile.getAbsolutePath(),
|
||||||
|
"--sign-with", keyFile1.getAbsolutePath(),
|
||||||
|
"--sign-with", keyFile2.getAbsolutePath()));
|
||||||
verify(encrypt, times(2)).signWith((InputStream) any());
|
verify(encrypt, times(2)).signWith((InputStream) any());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingInput.EXIT_CODE)
|
public void signWith_nonExistentKeyFileCausesMissingInput() {
|
||||||
public void signWith_nonExistentKeyFileCausesExit61() {
|
assertMissingInput(() ->
|
||||||
SopCLI.main(new String[] {"encrypt", "--with-password", "admin", "--sign-with", "nonExistent.asc"});
|
SopCLI.execute("encrypt", "--with-password", "admin", "--sign-with", "nonExistent.asc"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.KeyIsProtected.EXIT_CODE)
|
public void signWith_keyIsProtectedCausesKeyIsProtected() throws SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.KeyCannotSign, SOPGPException.BadData, IOException {
|
||||||
public void signWith_keyIsProtectedCausesExit67() throws SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.KeyCannotSign, SOPGPException.BadData, IOException {
|
|
||||||
when(encrypt.signWith((InputStream) any())).thenThrow(new SOPGPException.KeyIsProtected());
|
when(encrypt.signWith((InputStream) any())).thenThrow(new SOPGPException.KeyIsProtected());
|
||||||
File keyFile = File.createTempFile("sign-with", ".asc");
|
File keyFile = File.createTempFile("sign-with", ".asc");
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("starship");
|
File passwordFile = TestFileUtil.writeTempStringFile("starship");
|
||||||
SopCLI.main(new String[] {"encrypt", "--sign-with", keyFile.getAbsolutePath(), "--with-password", passwordFile.getAbsolutePath()});
|
assertKeyIsProtected(() ->
|
||||||
|
SopCLI.execute("encrypt", "--sign-with", keyFile.getAbsolutePath(),
|
||||||
|
"--with-password", passwordFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedAsymmetricAlgo.EXIT_CODE)
|
public void signWith_unsupportedAsymmetricAlgoCausesUnsupportedAsymAlgo() throws SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.KeyCannotSign, SOPGPException.BadData, IOException {
|
||||||
public void signWith_unsupportedAsymmetricAlgoCausesExit13() throws SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.KeyCannotSign, SOPGPException.BadData, IOException {
|
|
||||||
when(encrypt.signWith((InputStream) any())).thenThrow(new SOPGPException.UnsupportedAsymmetricAlgo("Unsupported asymmetric algorithm.", new Exception()));
|
when(encrypt.signWith((InputStream) any())).thenThrow(new SOPGPException.UnsupportedAsymmetricAlgo("Unsupported asymmetric algorithm.", new Exception()));
|
||||||
File keyFile = File.createTempFile("sign-with", ".asc");
|
File keyFile = File.createTempFile("sign-with", ".asc");
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("123456");
|
File passwordFile = TestFileUtil.writeTempStringFile("123456");
|
||||||
SopCLI.main(new String[] {"encrypt", "--with-password", passwordFile.getAbsolutePath(), "--sign-with", keyFile.getAbsolutePath()});
|
assertUnsupportedAsymmetricAlgo(() ->
|
||||||
|
SopCLI.execute("encrypt", "--with-password", passwordFile.getAbsolutePath(),
|
||||||
|
"--sign-with", keyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.KeyCannotSign.EXIT_CODE)
|
public void signWith_certCannotSignCausesKeyCannotSign() throws IOException, SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.KeyCannotSign, SOPGPException.BadData {
|
||||||
public void signWith_certCannotSignCausesExit79() throws IOException, SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.KeyCannotSign, SOPGPException.BadData {
|
|
||||||
when(encrypt.signWith((InputStream) any())).thenThrow(new SOPGPException.KeyCannotSign());
|
when(encrypt.signWith((InputStream) any())).thenThrow(new SOPGPException.KeyCannotSign());
|
||||||
File keyFile = File.createTempFile("sign-with", ".asc");
|
File keyFile = File.createTempFile("sign-with", ".asc");
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("dragon");
|
File passwordFile = TestFileUtil.writeTempStringFile("dragon");
|
||||||
SopCLI.main(new String[] {"encrypt", "--with-password", passwordFile.getAbsolutePath(), "--sign-with", keyFile.getAbsolutePath()});
|
assertKeyCannotSign(() ->
|
||||||
|
SopCLI.execute("encrypt", "--with-password", passwordFile.getAbsolutePath(),
|
||||||
|
"--sign-with", keyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
public void signWith_badDataCausesBadData() throws SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.KeyCannotSign, SOPGPException.BadData, IOException {
|
||||||
public void signWith_badDataCausesExit41() throws SOPGPException.KeyIsProtected, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.KeyCannotSign, SOPGPException.BadData, IOException {
|
|
||||||
when(encrypt.signWith((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(encrypt.signWith((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
File keyFile = File.createTempFile("sign-with", ".asc");
|
File keyFile = File.createTempFile("sign-with", ".asc");
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("orange");
|
File passwordFile = TestFileUtil.writeTempStringFile("orange");
|
||||||
SopCLI.main(new String[] {"encrypt", "--with-password", passwordFile.getAbsolutePath(), "--sign-with", keyFile.getAbsolutePath()});
|
assertBadData(() ->
|
||||||
|
SopCLI.execute("encrypt", "--with-password", passwordFile.getAbsolutePath(),
|
||||||
|
"--sign-with", keyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingInput.EXIT_CODE)
|
public void cert_nonExistentCertFileCausesMissingInput() {
|
||||||
public void cert_nonExistentCertFileCausesExit61() {
|
assertMissingInput(() ->
|
||||||
SopCLI.main(new String[] {"encrypt", "invalid.asc"});
|
SopCLI.execute("encrypt", "invalid.asc"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedAsymmetricAlgo.EXIT_CODE)
|
public void cert_unsupportedAsymmetricAlgorithmCausesUnsupportedAsymAlg() throws IOException, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.CertCannotEncrypt, SOPGPException.BadData {
|
||||||
public void cert_unsupportedAsymmetricAlgorithmCausesExit13() throws IOException, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.CertCannotEncrypt, SOPGPException.BadData {
|
|
||||||
when(encrypt.withCert((InputStream) any())).thenThrow(new SOPGPException.UnsupportedAsymmetricAlgo("Unsupported asymmetric algorithm.", new Exception()));
|
when(encrypt.withCert((InputStream) any())).thenThrow(new SOPGPException.UnsupportedAsymmetricAlgo("Unsupported asymmetric algorithm.", new Exception()));
|
||||||
File certFile = File.createTempFile("cert", ".asc");
|
File certFile = File.createTempFile("cert", ".asc");
|
||||||
SopCLI.main(new String[] {"encrypt", certFile.getAbsolutePath()});
|
assertUnsupportedAsymmetricAlgo(() ->
|
||||||
|
SopCLI.execute("encrypt", certFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.CertCannotEncrypt.EXIT_CODE)
|
public void cert_certCannotEncryptCausesCertCannotEncrypt() throws IOException, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.CertCannotEncrypt, SOPGPException.BadData {
|
||||||
public void cert_certCannotEncryptCausesExit17() throws IOException, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.CertCannotEncrypt, SOPGPException.BadData {
|
|
||||||
when(encrypt.withCert((InputStream) any())).thenThrow(new SOPGPException.CertCannotEncrypt("Certificate cannot encrypt.", new Exception()));
|
when(encrypt.withCert((InputStream) any())).thenThrow(new SOPGPException.CertCannotEncrypt("Certificate cannot encrypt.", new Exception()));
|
||||||
File certFile = File.createTempFile("cert", ".asc");
|
File certFile = File.createTempFile("cert", ".asc");
|
||||||
SopCLI.main(new String[] {"encrypt", certFile.getAbsolutePath()});
|
assertCertCannotEncrypt(() ->
|
||||||
|
SopCLI.execute("encrypt", certFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
public void cert_badDataCausesBadData() throws IOException, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.CertCannotEncrypt, SOPGPException.BadData {
|
||||||
public void cert_badDataCausesExit41() throws IOException, SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.CertCannotEncrypt, SOPGPException.BadData {
|
|
||||||
when(encrypt.withCert((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(encrypt.withCert((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
File certFile = File.createTempFile("cert", ".asc");
|
File certFile = File.createTempFile("cert", ".asc");
|
||||||
SopCLI.main(new String[] {"encrypt", certFile.getAbsolutePath()});
|
assertBadData(() ->
|
||||||
|
SopCLI.execute("encrypt", certFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noArmor_notCalledByDefault() throws IOException {
|
public void noArmor_notCalledByDefault() throws IOException {
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("clownfish");
|
File passwordFile = TestFileUtil.writeTempStringFile("clownfish");
|
||||||
SopCLI.main(new String[] {"encrypt", "--with-password", passwordFile.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("encrypt", "--with-password", passwordFile.getAbsolutePath()));
|
||||||
verify(encrypt, never()).noArmor();
|
verify(encrypt, never()).noArmor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noArmor_callGetsPassedDown() throws IOException {
|
public void noArmor_callGetsPassedDown() throws IOException {
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("monkey");
|
File passwordFile = TestFileUtil.writeTempStringFile("monkey");
|
||||||
SopCLI.main(new String[] {"encrypt", "--with-password", passwordFile.getAbsolutePath(), "--no-armor"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("encrypt", "--with-password", passwordFile.getAbsolutePath(), "--no-armor"));
|
||||||
verify(encrypt, times(1)).noArmor();
|
verify(encrypt, times(1)).noArmor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(1)
|
public void writeTo_ioExceptionCausesGenericError() throws IOException {
|
||||||
public void writeTo_ioExceptionCausesExit1() throws IOException {
|
|
||||||
when(encrypt.plaintext((InputStream) any())).thenReturn(new ReadyWithResult<EncryptionResult>() {
|
when(encrypt.plaintext((InputStream) any())).thenReturn(new ReadyWithResult<EncryptionResult>() {
|
||||||
@Override
|
@Override
|
||||||
public EncryptionResult writeTo(@NotNull OutputStream outputStream) throws IOException, SOPGPException {
|
public EncryptionResult writeTo(@NotNull OutputStream outputStream) throws IOException, SOPGPException {
|
||||||
|
@ -199,6 +219,7 @@ public class EncryptCmdTest {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
File passwordFile = TestFileUtil.writeTempStringFile("wildcat");
|
File passwordFile = TestFileUtil.writeTempStringFile("wildcat");
|
||||||
SopCLI.main(new String[] {"encrypt", "--with-password", passwordFile.getAbsolutePath()});
|
assertGenericError(() ->
|
||||||
|
SopCLI.execute("encrypt", "--with-password", passwordFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,12 +10,14 @@ import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertBadData;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertGenericError;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertSuccess;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import sop.Ready;
|
import sop.Ready;
|
||||||
|
@ -45,32 +47,34 @@ public class ExtractCertCmdTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noArmor_notCalledByDefault() {
|
public void noArmor_notCalledByDefault() {
|
||||||
SopCLI.main(new String[] {"extract-cert"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("extract-cert"));
|
||||||
verify(extractCert, never()).noArmor();
|
verify(extractCert, never()).noArmor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noArmor_passedDown() {
|
public void noArmor_passedDown() {
|
||||||
SopCLI.main(new String[] {"extract-cert", "--no-armor"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("extract-cert", "--no-armor"));
|
||||||
verify(extractCert, times(1)).noArmor();
|
verify(extractCert, times(1)).noArmor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(1)
|
public void key_ioExceptionCausesGenericError() throws IOException, SOPGPException.BadData {
|
||||||
public void key_ioExceptionCausesExit1() throws IOException, SOPGPException.BadData {
|
|
||||||
when(extractCert.key((InputStream) any())).thenReturn(new Ready() {
|
when(extractCert.key((InputStream) any())).thenReturn(new Ready() {
|
||||||
@Override
|
@Override
|
||||||
public void writeTo(OutputStream outputStream) throws IOException {
|
public void writeTo(OutputStream outputStream) throws IOException {
|
||||||
throw new IOException();
|
throw new IOException();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
SopCLI.main(new String[] {"extract-cert"});
|
assertGenericError(() ->
|
||||||
|
SopCLI.execute("extract-cert"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
public void key_badDataCausesBadData() throws IOException, SOPGPException.BadData {
|
||||||
public void key_badDataCausesExit41() throws IOException, SOPGPException.BadData {
|
|
||||||
when(extractCert.key((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(extractCert.key((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
SopCLI.main(new String[] {"extract-cert"});
|
assertBadData(() ->
|
||||||
|
SopCLI.execute("extract-cert"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,11 +10,14 @@ import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertGenericError;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertMissingArg;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertSuccess;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertUnsupportedAsymmetricAlgo;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.mockito.InOrder;
|
import org.mockito.InOrder;
|
||||||
|
@ -47,19 +50,22 @@ public class GenerateKeyCmdTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noArmor_notCalledByDefault() {
|
public void noArmor_notCalledByDefault() {
|
||||||
SopCLI.main(new String[] {"generate-key", "Alice"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("generate-key", "Alice"));
|
||||||
verify(generateKey, never()).noArmor();
|
verify(generateKey, never()).noArmor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noArmor_passedDown() {
|
public void noArmor_passedDown() {
|
||||||
SopCLI.main(new String[] {"generate-key", "--no-armor", "Alice"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("generate-key", "--no-armor", "Alice"));
|
||||||
verify(generateKey, times(1)).noArmor();
|
verify(generateKey, times(1)).noArmor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void userId_multipleUserIdsPassedDownInProperOrder() {
|
public void userId_multipleUserIdsPassedDownInProperOrder() {
|
||||||
SopCLI.main(new String[] {"generate-key", "Alice <alice@pgpainless.org>", "Bob <bob@pgpainless.org>"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("generate-key", "Alice <alice@pgpainless.org>", "Bob <bob@pgpainless.org>"));
|
||||||
|
|
||||||
InOrder inOrder = Mockito.inOrder(generateKey);
|
InOrder inOrder = Mockito.inOrder(generateKey);
|
||||||
inOrder.verify(generateKey).userId("Alice <alice@pgpainless.org>");
|
inOrder.verify(generateKey).userId("Alice <alice@pgpainless.org>");
|
||||||
|
@ -69,30 +75,32 @@ public class GenerateKeyCmdTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingArg.EXIT_CODE)
|
|
||||||
public void missingArgumentCausesExit19() throws SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.MissingArg, IOException {
|
public void missingArgumentCausesExit19() throws SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.MissingArg, IOException {
|
||||||
// TODO: RFC4880-bis and the current Stateless OpenPGP CLI spec allow keys to have no user-ids,
|
// TODO: RFC4880-bis and the current Stateless OpenPGP CLI spec allow keys to have no user-ids,
|
||||||
// so we might want to change this test in the future.
|
// so we might want to change this test in the future.
|
||||||
when(generateKey.generate()).thenThrow(new SOPGPException.MissingArg("Missing user-id."));
|
when(generateKey.generate()).thenThrow(new SOPGPException.MissingArg("Missing user-id."));
|
||||||
SopCLI.main(new String[] {"generate-key"});
|
assertMissingArg(() ->
|
||||||
|
SopCLI.execute("generate-key"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedAsymmetricAlgo.EXIT_CODE)
|
|
||||||
public void unsupportedAsymmetricAlgorithmCausesExit13() throws SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.MissingArg, IOException {
|
public void unsupportedAsymmetricAlgorithmCausesExit13() throws SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.MissingArg, IOException {
|
||||||
when(generateKey.generate()).thenThrow(new SOPGPException.UnsupportedAsymmetricAlgo("Unsupported asymmetric algorithm.", new Exception()));
|
when(generateKey.generate()).thenThrow(new SOPGPException.UnsupportedAsymmetricAlgo("Unsupported asymmetric algorithm.", new Exception()));
|
||||||
SopCLI.main(new String[] {"generate-key", "Alice"});
|
assertUnsupportedAsymmetricAlgo(() ->
|
||||||
|
SopCLI.execute("generate-key", "Alice"));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(1)
|
public void ioExceptionCausesGenericError() throws SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.MissingArg, IOException {
|
||||||
public void ioExceptionCausesExit1() throws SOPGPException.UnsupportedAsymmetricAlgo, SOPGPException.MissingArg, IOException {
|
|
||||||
when(generateKey.generate()).thenReturn(new Ready() {
|
when(generateKey.generate()).thenReturn(new Ready() {
|
||||||
@Override
|
@Override
|
||||||
public void writeTo(OutputStream outputStream) throws IOException {
|
public void writeTo(OutputStream outputStream) throws IOException {
|
||||||
throw new IOException();
|
throw new IOException();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
SopCLI.main(new String[] {"generate-key", "Alice"});
|
|
||||||
|
assertGenericError(() ->
|
||||||
|
SopCLI.execute("generate-key", "Alice"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
|
|
||||||
package sop.cli.picocli.commands;
|
package sop.cli.picocli.commands;
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import sop.ReadyWithResult;
|
import sop.ReadyWithResult;
|
||||||
|
@ -26,6 +25,8 @@ import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertMissingArg;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertSuccess;
|
||||||
|
|
||||||
public class InlineDetachCmdTest {
|
public class InlineDetachCmdTest {
|
||||||
|
|
||||||
|
@ -41,9 +42,9 @@ public class InlineDetachCmdTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingArg.EXIT_CODE)
|
public void testMissingSignaturesOutResultsInMissingArg() {
|
||||||
public void testMissingSignaturesOutResultsInExit19() {
|
assertMissingArg(() ->
|
||||||
SopCLI.main(new String[] {"inline-detach"});
|
SopCLI.execute("inline-detach"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -67,7 +68,8 @@ public class InlineDetachCmdTest {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
SopCLI.main(new String[] {"inline-detach", "--signatures-out", tempFile.getAbsolutePath(), "--no-armor"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("inline-detach", "--signatures-out", tempFile.getAbsolutePath(), "--no-armor"));
|
||||||
verify(inlineDetach, times(1)).noArmor();
|
verify(inlineDetach, times(1)).noArmor();
|
||||||
verify(inlineDetach, times(1)).message((InputStream) any());
|
verify(inlineDetach, times(1)).message((InputStream) any());
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,13 +10,20 @@ import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertBadData;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertExpectedText;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertGenericError;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertKeyIsProtected;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertMissingArg;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertMissingInput;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertSuccess;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertUnsupportedOption;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import sop.ReadyWithResult;
|
import sop.ReadyWithResult;
|
||||||
|
@ -54,70 +61,77 @@ public class SignCmdTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void as_optionsAreCaseInsensitive() {
|
public void as_optionsAreCaseInsensitive() {
|
||||||
SopCLI.main(new String[] {"sign", "--as", "Binary", keyFile.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
SopCLI.main(new String[] {"sign", "--as", "binary", keyFile.getAbsolutePath()});
|
SopCLI.execute("sign", "--as", "Binary", keyFile.getAbsolutePath()));
|
||||||
SopCLI.main(new String[] {"sign", "--as", "BINARY", keyFile.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("sign", "--as", "binary", keyFile.getAbsolutePath()));
|
||||||
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("sign", "--as", "BINARY", keyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
|
||||||
public void as_invalidOptionCausesExit37() {
|
public void as_invalidOptionCausesExit37() {
|
||||||
SopCLI.main(new String[] {"sign", "--as", "Invalid", keyFile.getAbsolutePath()});
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("sign", "--as", "Invalid", keyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
|
||||||
public void as_unsupportedOptionCausesExit37() throws SOPGPException.UnsupportedOption {
|
public void as_unsupportedOptionCausesExit37() throws SOPGPException.UnsupportedOption {
|
||||||
when(detachedSign.mode(any())).thenThrow(new SOPGPException.UnsupportedOption("Setting signing mode not supported."));
|
when(detachedSign.mode(any())).thenThrow(new SOPGPException.UnsupportedOption("Setting signing mode not supported."));
|
||||||
SopCLI.main(new String[] {"sign", "--as", "binary", keyFile.getAbsolutePath()});
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("sign", "--as", "binary", keyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingInput.EXIT_CODE)
|
|
||||||
public void key_nonExistentKeyFileCausesExit61() {
|
public void key_nonExistentKeyFileCausesExit61() {
|
||||||
SopCLI.main(new String[] {"sign", "invalid.asc"});
|
assertMissingInput(() ->
|
||||||
|
SopCLI.execute("sign", "invalid.asc"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.KeyIsProtected.EXIT_CODE)
|
|
||||||
public void key_keyIsProtectedCausesExit67() throws SOPGPException.KeyIsProtected, IOException, SOPGPException.BadData {
|
public void key_keyIsProtectedCausesExit67() throws SOPGPException.KeyIsProtected, IOException, SOPGPException.BadData {
|
||||||
when(detachedSign.key((InputStream) any())).thenThrow(new SOPGPException.KeyIsProtected());
|
when(detachedSign.key((InputStream) any())).thenThrow(new SOPGPException.KeyIsProtected());
|
||||||
SopCLI.main(new String[] {"sign", keyFile.getAbsolutePath()});
|
assertKeyIsProtected(() ->
|
||||||
|
SopCLI.execute("sign", keyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
|
||||||
public void key_badDataCausesExit41() throws SOPGPException.KeyIsProtected, IOException, SOPGPException.BadData {
|
public void key_badDataCausesExit41() throws SOPGPException.KeyIsProtected, IOException, SOPGPException.BadData {
|
||||||
when(detachedSign.key((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(detachedSign.key((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
SopCLI.main(new String[] {"sign", keyFile.getAbsolutePath()});
|
assertBadData(() ->
|
||||||
|
SopCLI.execute("sign", keyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingArg.EXIT_CODE)
|
|
||||||
public void key_missingKeyFileCausesExit19() {
|
public void key_missingKeyFileCausesExit19() {
|
||||||
SopCLI.main(new String[] {"sign"});
|
assertMissingArg(() ->
|
||||||
|
SopCLI.execute("sign"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noArmor_notCalledByDefault() {
|
public void noArmor_notCalledByDefault() {
|
||||||
SopCLI.main(new String[] {"sign", keyFile.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("sign", keyFile.getAbsolutePath()));
|
||||||
verify(detachedSign, never()).noArmor();
|
verify(detachedSign, never()).noArmor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noArmor_passedDown() {
|
public void noArmor_passedDown() {
|
||||||
SopCLI.main(new String[] {"sign", "--no-armor", keyFile.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("sign", "--no-armor", keyFile.getAbsolutePath()));
|
||||||
verify(detachedSign, times(1)).noArmor();
|
verify(detachedSign, times(1)).noArmor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void withKeyPassword_passedDown() {
|
public void withKeyPassword_passedDown() {
|
||||||
SopCLI.main(new String[] {"sign", "--with-key-password", passFile.getAbsolutePath(), keyFile.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("sign",
|
||||||
|
"--with-key-password", passFile.getAbsolutePath(),
|
||||||
|
keyFile.getAbsolutePath()));
|
||||||
verify(detachedSign, times(1)).withKeyPassword("sw0rdf1sh");
|
verify(detachedSign, times(1)).withKeyPassword("sw0rdf1sh");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(1)
|
|
||||||
public void data_ioExceptionCausesExit1() throws IOException, SOPGPException.ExpectedText {
|
public void data_ioExceptionCausesExit1() throws IOException, SOPGPException.ExpectedText {
|
||||||
when(detachedSign.data((InputStream) any())).thenReturn(new ReadyWithResult<SigningResult>() {
|
when(detachedSign.data((InputStream) any())).thenReturn(new ReadyWithResult<SigningResult>() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -125,13 +139,14 @@ public class SignCmdTest {
|
||||||
throw new IOException();
|
throw new IOException();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
SopCLI.main(new String[] {"sign", keyFile.getAbsolutePath()});
|
assertGenericError(() ->
|
||||||
|
SopCLI.execute("sign", keyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.ExpectedText.EXIT_CODE)
|
|
||||||
public void data_expectedTextExceptionCausesExit53() throws IOException, SOPGPException.ExpectedText {
|
public void data_expectedTextExceptionCausesExit53() throws IOException, SOPGPException.ExpectedText {
|
||||||
when(detachedSign.data((InputStream) any())).thenThrow(new SOPGPException.ExpectedText());
|
when(detachedSign.data((InputStream) any())).thenThrow(new SOPGPException.ExpectedText());
|
||||||
SopCLI.main(new String[] {"sign", keyFile.getAbsolutePath()});
|
assertExpectedText(() ->
|
||||||
|
SopCLI.execute("sign", keyFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,11 @@ import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertBadData;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertMissingInput;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertNoSignature;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertSuccess;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertUnsupportedOption;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -21,7 +26,6 @@ import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import org.junit.jupiter.api.AfterEach;
|
import org.junit.jupiter.api.AfterEach;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
@ -76,60 +80,75 @@ public class VerifyCmdTest {
|
||||||
@Test
|
@Test
|
||||||
public void notAfter_passedDown() throws SOPGPException.UnsupportedOption, ParseException {
|
public void notAfter_passedDown() throws SOPGPException.UnsupportedOption, ParseException {
|
||||||
Date date = UTCUtil.parseUTCDate("2019-10-29T18:36:45Z");
|
Date date = UTCUtil.parseUTCDate("2019-10-29T18:36:45Z");
|
||||||
SopCLI.main(new String[] {"verify", "--not-after", "2019-10-29T18:36:45Z", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("verify", "--not-after", "2019-10-29T18:36:45Z",
|
||||||
|
signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
verify(detachedVerify, times(1)).notAfter(date);
|
verify(detachedVerify, times(1)).notAfter(date);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void notAfter_now() throws SOPGPException.UnsupportedOption {
|
public void notAfter_now() throws SOPGPException.UnsupportedOption {
|
||||||
Date now = new Date();
|
Date now = new Date();
|
||||||
SopCLI.main(new String[] {"verify", "--not-after", "now", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("verify", "--not-after", "now",
|
||||||
|
signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
verify(detachedVerify, times(1)).notAfter(dateMatcher(now));
|
verify(detachedVerify, times(1)).notAfter(dateMatcher(now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void notAfter_dashCountsAsEndOfTime() throws SOPGPException.UnsupportedOption {
|
public void notAfter_dashCountsAsEndOfTime() throws SOPGPException.UnsupportedOption {
|
||||||
SopCLI.main(new String[] {"verify", "--not-after", "-", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("verify", "--not-after", "-",
|
||||||
|
signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
verify(detachedVerify, times(1)).notAfter(AbstractSopCmd.END_OF_TIME);
|
verify(detachedVerify, times(1)).notAfter(AbstractSopCmd.END_OF_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
|
||||||
public void notAfter_unsupportedOptionCausesExit37() throws SOPGPException.UnsupportedOption {
|
public void notAfter_unsupportedOptionCausesExit37() throws SOPGPException.UnsupportedOption {
|
||||||
when(detachedVerify.notAfter(any())).thenThrow(new SOPGPException.UnsupportedOption("Setting upper signature date boundary not supported."));
|
when(detachedVerify.notAfter(any())).thenThrow(new SOPGPException.UnsupportedOption("Setting upper signature date boundary not supported."));
|
||||||
SopCLI.main(new String[] {"verify", "--not-after", "2019-10-29T18:36:45Z", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("verify", "--not-after", "2019-10-29T18:36:45Z",
|
||||||
|
signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void notBefore_passedDown() throws SOPGPException.UnsupportedOption, ParseException {
|
public void notBefore_passedDown() throws SOPGPException.UnsupportedOption, ParseException {
|
||||||
Date date = UTCUtil.parseUTCDate("2019-10-29T18:36:45Z");
|
Date date = UTCUtil.parseUTCDate("2019-10-29T18:36:45Z");
|
||||||
SopCLI.main(new String[] {"verify", "--not-before", "2019-10-29T18:36:45Z", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("verify", "--not-before", "2019-10-29T18:36:45Z",
|
||||||
|
signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
verify(detachedVerify, times(1)).notBefore(date);
|
verify(detachedVerify, times(1)).notBefore(date);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void notBefore_now() throws SOPGPException.UnsupportedOption {
|
public void notBefore_now() throws SOPGPException.UnsupportedOption {
|
||||||
Date now = new Date();
|
Date now = new Date();
|
||||||
SopCLI.main(new String[] {"verify", "--not-before", "now", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("verify", "--not-before", "now",
|
||||||
|
signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
verify(detachedVerify, times(1)).notBefore(dateMatcher(now));
|
verify(detachedVerify, times(1)).notBefore(dateMatcher(now));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void notBefore_dashCountsAsBeginningOfTime() throws SOPGPException.UnsupportedOption {
|
public void notBefore_dashCountsAsBeginningOfTime() throws SOPGPException.UnsupportedOption {
|
||||||
SopCLI.main(new String[] {"verify", "--not-before", "-", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("verify", "--not-before", "-",
|
||||||
|
signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
verify(detachedVerify, times(1)).notBefore(AbstractSopCmd.BEGINNING_OF_TIME);
|
verify(detachedVerify, times(1)).notBefore(AbstractSopCmd.BEGINNING_OF_TIME);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
|
||||||
public void notBefore_unsupportedOptionCausesExit37() throws SOPGPException.UnsupportedOption {
|
public void notBefore_unsupportedOptionCausesExit37() throws SOPGPException.UnsupportedOption {
|
||||||
when(detachedVerify.notBefore(any())).thenThrow(new SOPGPException.UnsupportedOption("Setting lower signature date boundary not supported."));
|
when(detachedVerify.notBefore(any())).thenThrow(new SOPGPException.UnsupportedOption("Setting lower signature date boundary not supported."));
|
||||||
SopCLI.main(new String[] {"verify", "--not-before", "2019-10-29T18:36:45Z", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("verify", "--not-before", "2019-10-29T18:36:45Z",
|
||||||
|
signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void notBeforeAndNotAfterAreCalledWithDefaultValues() throws SOPGPException.UnsupportedOption {
|
public void notBeforeAndNotAfterAreCalledWithDefaultValues() throws SOPGPException.UnsupportedOption {
|
||||||
SopCLI.main(new String[] {"verify", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("verify", signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
verify(detachedVerify, times(1)).notAfter(dateMatcher(new Date()));
|
verify(detachedVerify, times(1)).notAfter(dateMatcher(new Date()));
|
||||||
verify(detachedVerify, times(1)).notBefore(AbstractSopCmd.BEGINNING_OF_TIME);
|
verify(detachedVerify, times(1)).notBefore(AbstractSopCmd.BEGINNING_OF_TIME);
|
||||||
}
|
}
|
||||||
|
@ -139,43 +158,43 @@ public class VerifyCmdTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingInput.EXIT_CODE)
|
|
||||||
public void cert_fileNotFoundCausesExit61() {
|
public void cert_fileNotFoundCausesExit61() {
|
||||||
SopCLI.main(new String[] {"verify", signature.getAbsolutePath(), "invalid.asc"});
|
assertMissingInput(() ->
|
||||||
|
SopCLI.execute("verify", signature.getAbsolutePath(), "invalid.asc"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
|
||||||
public void cert_badDataCausesExit41() throws SOPGPException.BadData, IOException {
|
public void cert_badDataCausesExit41() throws SOPGPException.BadData, IOException {
|
||||||
when(detachedVerify.cert((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(detachedVerify.cert((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
SopCLI.main(new String[] {"verify", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertBadData(() ->
|
||||||
|
SopCLI.execute("verify", signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.MissingInput.EXIT_CODE)
|
|
||||||
public void signature_fileNotFoundCausesExit61() {
|
public void signature_fileNotFoundCausesExit61() {
|
||||||
SopCLI.main(new String[] {"verify", "invalid.sig", cert.getAbsolutePath()});
|
assertMissingInput(() ->
|
||||||
|
SopCLI.execute("verify", "invalid.sig", cert.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
|
||||||
public void signature_badDataCausesExit41() throws SOPGPException.BadData, IOException {
|
public void signature_badDataCausesExit41() throws SOPGPException.BadData, IOException {
|
||||||
when(detachedVerify.signatures((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(detachedVerify.signatures((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
SopCLI.main(new String[] {"verify", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertBadData(() ->
|
||||||
|
SopCLI.execute("verify", signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.NoSignature.EXIT_CODE)
|
|
||||||
public void data_noSignaturesCausesExit3() throws SOPGPException.NoSignature, IOException, SOPGPException.BadData {
|
public void data_noSignaturesCausesExit3() throws SOPGPException.NoSignature, IOException, SOPGPException.BadData {
|
||||||
when(detachedVerify.data((InputStream) any())).thenThrow(new SOPGPException.NoSignature());
|
when(detachedVerify.data((InputStream) any())).thenThrow(new SOPGPException.NoSignature());
|
||||||
SopCLI.main(new String[] {"verify", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertNoSignature(() ->
|
||||||
|
SopCLI.execute("verify", signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.BadData.EXIT_CODE)
|
|
||||||
public void data_badDataCausesExit41() throws SOPGPException.NoSignature, IOException, SOPGPException.BadData {
|
public void data_badDataCausesExit41() throws SOPGPException.NoSignature, IOException, SOPGPException.BadData {
|
||||||
when(detachedVerify.data((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
when(detachedVerify.data((InputStream) any())).thenThrow(new SOPGPException.BadData(new IOException()));
|
||||||
SopCLI.main(new String[] {"verify", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertBadData(() ->
|
||||||
|
SopCLI.execute("verify", signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -192,7 +211,8 @@ public class VerifyCmdTest {
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
System.setOut(new PrintStream(out));
|
System.setOut(new PrintStream(out));
|
||||||
|
|
||||||
SopCLI.main(new String[] {"verify", signature.getAbsolutePath(), cert.getAbsolutePath()});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("verify", signature.getAbsolutePath(), cert.getAbsolutePath()));
|
||||||
|
|
||||||
System.setOut(originalSout);
|
System.setOut(originalSout);
|
||||||
|
|
||||||
|
|
|
@ -4,19 +4,19 @@
|
||||||
|
|
||||||
package sop.cli.picocli.commands;
|
package sop.cli.picocli.commands;
|
||||||
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
import static org.mockito.Mockito.times;
|
|
||||||
import static org.mockito.Mockito.verify;
|
|
||||||
import static org.mockito.Mockito.when;
|
|
||||||
|
|
||||||
import com.ginsberg.junit.exit.ExpectSystemExitWithStatus;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import sop.SOP;
|
import sop.SOP;
|
||||||
import sop.cli.picocli.SopCLI;
|
import sop.cli.picocli.SopCLI;
|
||||||
import sop.exception.SOPGPException;
|
|
||||||
import sop.operation.Version;
|
import sop.operation.Version;
|
||||||
|
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertSuccess;
|
||||||
|
import static sop.testsuite.assertions.SopExecutionAssertions.assertUnsupportedOption;
|
||||||
|
|
||||||
public class VersionCmdTest {
|
public class VersionCmdTest {
|
||||||
|
|
||||||
private Version version;
|
private Version version;
|
||||||
|
@ -29,6 +29,8 @@ public class VersionCmdTest {
|
||||||
when(version.getVersion()).thenReturn("1.0");
|
when(version.getVersion()).thenReturn("1.0");
|
||||||
when(version.getExtendedVersion()).thenReturn("MockSop Extended Version Information");
|
when(version.getExtendedVersion()).thenReturn("MockSop Extended Version Information");
|
||||||
when(version.getBackendVersion()).thenReturn("Foo");
|
when(version.getBackendVersion()).thenReturn("Foo");
|
||||||
|
when(version.getSopSpecVersion()).thenReturn("draft-dkg-openpgp-stateless-cli-XX");
|
||||||
|
when(version.getSopVVersion()).thenReturn("1.0");
|
||||||
when(sop.version()).thenReturn(version);
|
when(sop.version()).thenReturn(version);
|
||||||
|
|
||||||
SopCLI.setSopInstance(sop);
|
SopCLI.setSopInstance(sop);
|
||||||
|
@ -36,26 +38,41 @@ public class VersionCmdTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void assertVersionCommandWorks() {
|
public void assertVersionCommandWorks() {
|
||||||
SopCLI.main(new String[] {"version"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("version"));
|
||||||
verify(version, times(1)).getVersion();
|
verify(version, times(1)).getVersion();
|
||||||
verify(version, times(1)).getName();
|
verify(version, times(1)).getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void assertExtendedVersionCommandWorks() {
|
public void assertExtendedVersionCommandWorks() {
|
||||||
SopCLI.main(new String[] {"version", "--extended"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("version", "--extended"));
|
||||||
verify(version, times(1)).getExtendedVersion();
|
verify(version, times(1)).getExtendedVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void assertBackendVersionCommandWorks() {
|
public void assertBackendVersionCommandWorks() {
|
||||||
SopCLI.main(new String[] {"version", "--backend"});
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("version", "--backend"));
|
||||||
verify(version, times(1)).getBackendVersion();
|
verify(version, times(1)).getBackendVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ExpectSystemExitWithStatus(SOPGPException.UnsupportedOption.EXIT_CODE)
|
public void assertSpecVersionCommandWorks() {
|
||||||
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("version", "--sop-spec"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void assertSOPVVersionCommandWorks() {
|
||||||
|
assertSuccess(() ->
|
||||||
|
SopCLI.execute("version", "--sopv"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void assertInvalidOptionResultsInExit37() {
|
public void assertInvalidOptionResultsInExit37() {
|
||||||
SopCLI.main(new String[] {"version", "--invalid"});
|
assertUnsupportedOption(() ->
|
||||||
|
SopCLI.execute("version", "--invalid"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,235 @@
|
||||||
|
// SPDX-FileCopyrightText: 2024 Paul Schaub <vanitasvitae@fsfe.org>
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
package sop.testsuite.assertions;
|
||||||
|
|
||||||
|
import sop.exception.SOPGPException;
|
||||||
|
|
||||||
|
import java.util.function.IntSupplier;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DSL for testing the return values of SOP method calls.
|
||||||
|
*/
|
||||||
|
public class SopExecutionAssertions {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns 0.
|
||||||
|
*
|
||||||
|
* @param function function to execute
|
||||||
|
*/
|
||||||
|
public static void assertSuccess(IntSupplier function) {
|
||||||
|
assertEquals(0, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns a generic error with error code 1.
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertGenericError(IntSupplier function) {
|
||||||
|
assertEquals(1, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns a non-zero error code.
|
||||||
|
*
|
||||||
|
* @param function function to execute
|
||||||
|
*/
|
||||||
|
public static void assertAnyError(IntSupplier function) {
|
||||||
|
assertNotEquals(0, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 3
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.NoSignature}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertNoSignature(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.NoSignature.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 13
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.UnsupportedAsymmetricAlgo}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertUnsupportedAsymmetricAlgo(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.UnsupportedAsymmetricAlgo.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 17
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.CertCannotEncrypt}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertCertCannotEncrypt(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.CertCannotEncrypt.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 19
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.MissingArg}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertMissingArg(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.MissingArg.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 23
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.IncompleteVerification}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertIncompleteVerification(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.IncompleteVerification.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 29
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.CannotDecrypt}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertCannotDecrypt(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.CannotDecrypt.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 31
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.PasswordNotHumanReadable}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertPasswordNotHumanReadable(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.PasswordNotHumanReadable.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 37
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.UnsupportedOption}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertUnsupportedOption(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.UnsupportedOption.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 41
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.BadData}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertBadData(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.BadData.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 53
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.ExpectedText}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertExpectedText(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.ExpectedText.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 59
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.OutputExists}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertOutputExists(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.OutputExists.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 61
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.MissingInput}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertMissingInput(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.MissingInput.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 67
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.KeyIsProtected}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertKeyIsProtected(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.KeyIsProtected.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 69
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.UnsupportedSubcommand}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertUnsupportedSubcommand(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.UnsupportedSubcommand.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 71
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.UnsupportedSpecialPrefix}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertUnsupportedSpecialPrefix(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.UnsupportedSpecialPrefix.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 73
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.AmbiguousInput}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertAmbiguousInput(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.AmbiguousInput.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 79
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.KeyCannotSign}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertKeyCannotSign(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.KeyCannotSign.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 83
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.IncompatibleOptions}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertIncompatibleOptions(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.IncompatibleOptions.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Assert that the execution of the given function returns error code 89
|
||||||
|
* (which corresponds to {@link sop.exception.SOPGPException.UnsupportedProfile}).
|
||||||
|
*
|
||||||
|
* @param function function to execute.
|
||||||
|
*/
|
||||||
|
public static void assertUnsupportedProfile(IntSupplier function) {
|
||||||
|
assertEquals(SOPGPException.UnsupportedProfile.EXIT_CODE, function.getAsInt());
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue