From 2b5e850ffba3c9e1e561ddccdb82a7a978c5954e Mon Sep 17 00:00:00 2001 From: Marko Strukelj Date: Fri, 21 Oct 2016 13:57:07 +0200 Subject: [PATCH 1/2] KEYCLOAK-3789 KcRegTests are failing on CI --- .../cli/commands/AbstractAuthOptionsCmd.java | 7 ++++--- .../cli/commands/AbstractGlobalOptionsCmd.java | 2 +- .../registration/cli/commands/ConfigCmd.java | 16 ++++++++++++---- .../cli/commands/ConfigCredentialsCmd.java | 5 ----- .../cli/commands/ConfigInitialTokenCmd.java | 5 ++--- .../cli/commands/ConfigRegistrationTokenCmd.java | 5 ++--- .../cli/commands/ConfigTruststoreCmd.java | 5 ++--- 7 files changed, 23 insertions(+), 22 deletions(-) diff --git a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/AbstractAuthOptionsCmd.java b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/AbstractAuthOptionsCmd.java index 8ad0430c2d..d088f0b88c 100644 --- a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/AbstractAuthOptionsCmd.java +++ b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/AbstractAuthOptionsCmd.java @@ -71,9 +71,9 @@ public abstract class AbstractAuthOptionsCmd extends AbstractGlobalOptionsCmd { @Option(shortName = 't', name = "token", description = "Initial / Registration access token to use)", hasValue = true) protected String token; - protected void init(AbstractAuthOptionsCmd parent) { + protected void initFromParent(AbstractAuthOptionsCmd parent) { - super.init(parent); + super.initFromParent(parent); noconfig = parent.noconfig; config = parent.config; @@ -159,7 +159,8 @@ public abstract class AbstractAuthOptionsCmd extends AbstractGlobalOptionsCmd { initConfigData(config); ConfigUtil.setupInMemoryHandler(config); - ConfigCredentialsCmd login = new ConfigCredentialsCmd(this); + ConfigCredentialsCmd login = new ConfigCredentialsCmd(); + login.initFromParent(this); login.init(config); login.process(commandInvocation); diff --git a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/AbstractGlobalOptionsCmd.java b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/AbstractGlobalOptionsCmd.java index 0183eee90f..d1b0db23ec 100644 --- a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/AbstractGlobalOptionsCmd.java +++ b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/AbstractGlobalOptionsCmd.java @@ -17,7 +17,7 @@ public abstract class AbstractGlobalOptionsCmd implements Command { @Option(name = "help", description = "Print command specific help", hasValue = false) protected boolean help; - protected void init(AbstractGlobalOptionsCmd parent) { + protected void initFromParent(AbstractGlobalOptionsCmd parent) { dumpTrace = parent.dumpTrace; help = parent.help; } diff --git a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigCmd.java b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigCmd.java index b4be107159..4fb5e3425c 100644 --- a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigCmd.java +++ b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigCmd.java @@ -53,16 +53,24 @@ public class ConfigCmd extends AbstractAuthOptionsCmd implements Command { String cmd = args.get(0); switch (cmd) { case "credentials": { - return new ConfigCredentialsCmd(this).execute(commandInvocation); + ConfigCredentialsCmd command = new ConfigCredentialsCmd(); + command.initFromParent(this); + return command.execute(commandInvocation); } case "truststore": { - return new ConfigTruststoreCmd(this).execute(commandInvocation); + ConfigTruststoreCmd command = new ConfigTruststoreCmd(); + command.initFromParent(this); + return command.execute(commandInvocation); } case "initial-token": { - return new ConfigInitialTokenCmd(this).execute(commandInvocation); + ConfigInitialTokenCmd command = new ConfigInitialTokenCmd(); + command.initFromParent(this); + return command.execute(commandInvocation); } case "registration-token": { - return new ConfigRegistrationTokenCmd(this).execute(commandInvocation); + ConfigRegistrationTokenCmd command = new ConfigRegistrationTokenCmd(); + command.initFromParent(this); + return command.execute(commandInvocation); } default: { if (printHelp()) { diff --git a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigCredentialsCmd.java b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigCredentialsCmd.java index 4cc050f702..20f7d88e9a 100644 --- a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigCredentialsCmd.java +++ b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigCredentialsCmd.java @@ -36,11 +36,6 @@ public class ConfigCredentialsCmd extends AbstractAuthOptionsCmd implements Comm private int sigLifetime = 600; - public ConfigCredentialsCmd() {} - - public ConfigCredentialsCmd(AbstractAuthOptionsCmd parent) { - init(parent); - } public void init(ConfigData configData) { if (server == null) { diff --git a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigInitialTokenCmd.java b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigInitialTokenCmd.java index 937787ef03..5610858f39 100644 --- a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigInitialTokenCmd.java +++ b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigInitialTokenCmd.java @@ -33,11 +33,10 @@ public class ConfigInitialTokenCmd extends AbstractAuthOptionsCmd implements Com private boolean delete; private boolean keepDomain; - public ConfigInitialTokenCmd() {} - public ConfigInitialTokenCmd(ConfigCmd parent) { + protected void initFromParent(ConfigCmd parent) { this.parent = parent; - init(parent); + super.initFromParent(parent); } @Override diff --git a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigRegistrationTokenCmd.java b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigRegistrationTokenCmd.java index 761affdfa6..af6b984aab 100644 --- a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigRegistrationTokenCmd.java +++ b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigRegistrationTokenCmd.java @@ -30,11 +30,10 @@ public class ConfigRegistrationTokenCmd extends AbstractAuthOptionsCmd implement private boolean delete; - public ConfigRegistrationTokenCmd() {} - public ConfigRegistrationTokenCmd(ConfigCmd parent) { + protected void initFromParent(ConfigCmd parent) { this.parent = parent; - init(parent); + super.initFromParent(parent); } @Override diff --git a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigTruststoreCmd.java b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigTruststoreCmd.java index 49d89759be..7ae668a941 100644 --- a/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigTruststoreCmd.java +++ b/integration/client-cli/client-registration-cli/src/main/java/org/keycloak/client/registration/cli/commands/ConfigTruststoreCmd.java @@ -30,11 +30,10 @@ public class ConfigTruststoreCmd extends AbstractAuthOptionsCmd implements Comma private boolean delete; - public ConfigTruststoreCmd() {} - public ConfigTruststoreCmd(ConfigCmd parent) { + protected void initFromParent(ConfigCmd parent) { this.parent = parent; - init(parent); + super.initFromParent(parent); } @Override From ab09b3d1aef0698d781197a0a42450dc40a21d29 Mon Sep 17 00:00:00 2001 From: Marko Strukelj Date: Wed, 26 Oct 2016 00:59:39 +0200 Subject: [PATCH 2/2] KEYCLOAK-3789 KcRegTests are failing on CI - Ignore occasional extra empty lines at end of stream --- .../cli/registration/AbstractCliTest.java | 36 ++++++++++++- .../cli/registration/KcRegCreateTest.java | 35 ++++-------- .../testsuite/cli/registration/KcRegTest.java | 53 ++++++++----------- .../cli/registration/KcRegUpdateTest.java | 28 ++++------ .../registration/KcRegUpdateTokenTest.java | 4 +- 5 files changed, 79 insertions(+), 77 deletions(-) diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/AbstractCliTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/AbstractCliTest.java index e44a3485fc..2f642ba92d 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/AbstractCliTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/AbstractCliTest.java @@ -527,10 +527,42 @@ public abstract class AbstractCliTest extends AbstractKeycloakTest { Assert.assertEquals("config file not modified", lastModified, lastModified2); } + void assertExitCodeAndStdOutSize(KcRegExec exe, int exitCode, int stdOutLineCount) { + assertExitCodeAndStreamSizes(exe, exitCode, stdOutLineCount, -1); + } + + void assertExitCodeAndStdErrSize(KcRegExec exe, int exitCode, int stdErrLineCount) { + assertExitCodeAndStreamSizes(exe, exitCode, -1, stdErrLineCount); + } + void assertExitCodeAndStreamSizes(KcRegExec exe, int exitCode, int stdOutLineCount, int stdErrLineCount) { Assert.assertEquals("exitCode == " + exitCode, exitCode, exe.exitCode()); - Assert.assertTrue("stdout output has " + stdOutLineCount + " lines", exe.stdoutLines().size() == stdOutLineCount); - Assert.assertTrue("stderr output has " + stdErrLineCount + " lines", exe.stderrLines().size() == stdErrLineCount); + if (stdOutLineCount != -1) { + try { + assertLineCount("stdout output", exe.stdoutLines(), stdOutLineCount); + } catch (Throwable e) { + throw new AssertionError("STDOUT: " + exe.stdoutString(), e); + } + } + if (stdErrLineCount != -1) { + try { + assertLineCount("stderr output", exe.stderrLines(), stdErrLineCount); + } catch (Throwable e) { + throw new AssertionError("STDERR: " + exe.stderrString(), e); + } + } + } + void assertLineCount(String label, List lines, int count) { + if (lines.size() == count) { + return; + } + // there is some kind of race condition in 'kcreg' that results in intermittent extra empty line + if (lines.size() == count + 1) { + if ("".equals(lines.get(lines.size()-1))) { + return; + } + } + Assert.assertTrue(label + " has " + lines.size() + " lines (expected: " + count + ")", lines.size() == count); } } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegCreateTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegCreateTest.java index 6b6cb276c5..5db5d86cd0 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegCreateTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegCreateTest.java @@ -32,13 +32,13 @@ public class KcRegCreateTest extends AbstractCliTest { KcRegExec exe = execute("config credentials -x --config '" + configFile.getName() + "' --server " + serverUrl + " --realm master --user admin --password admin"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); + assertExitCodeAndStreamSizes(exe, 0, 0, 1); // use initial token of another realm with server, and realm override String token = issueInitialAccessToken("test"); exe = execute("create --config '" + configFile.getName() + "' --server " + serverUrl + " --realm test -s clientId=my_first_client -t " + token); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); + assertExitCodeAndStreamSizes(exe, 0, 0, 1); } } @@ -57,7 +57,7 @@ public class KcRegCreateTest extends AbstractCliTest { KcRegExec exe = execute("config initial-token -x --config '" + configFile.getName() + "' --server " + serverUrl + " --realm " + realm + " " + token); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); + assertExitCodeAndStreamSizes(exe, 0, 0, 0); // check that current server, realm, and initial token are saved in the file ConfigData config = handler.loadConfig(); @@ -87,8 +87,7 @@ public class KcRegCreateTest extends AbstractCliTest { exe = execute("create --config '" + configFile.getName() + "' -o -f - < '" + tmpFile.getName() + "'"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr is empty", exe.stderrLines().isEmpty()); + assertExitCodeAndStdErrSize(exe, 0, 0); ClientRepresentation client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); Assert.assertNotNull("id", client.getId()); @@ -114,8 +113,7 @@ public class KcRegCreateTest extends AbstractCliTest { " -s 'name=My Client App II' -s protocol=keycloak-oidc -s 'webOrigins=[\"http://localhost:8980/myapp2\"]'" + " -s baseUrl=http://localhost:8980/myapp2 -s rootUrl=http://localhost:8980/myapp2"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr is empty", exe.stderrLines().isEmpty()); + assertExitCodeAndStdErrSize(exe, 0, 0); ClientRepresentation client2 = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); Assert.assertNotNull("id", client2.getId()); @@ -138,29 +136,22 @@ public class KcRegCreateTest extends AbstractCliTest { // check that using an invalid attribute key is not ignored exe = execute("create --config '" + configFile.getName() + "' -o -f '" + tmpFile.getName() + "' -s client_id=my_client3"); - Assert.assertEquals("exitCode == 1", 1, exe.exitCode()); - Assert.assertEquals("stderr has one line", 1, exe.stderrLines().size()); + assertExitCodeAndStreamSizes(exe, 1, 0, 1); Assert.assertEquals("Failed to set attribute 'client_id' on document type 'default'", exe.stderrLines().get(0)); } // simple create, output an id exe = execute("create --config '" + configFile.getName() + "' -i -s clientId=my_client3"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertEquals("stderr is empty", 0, exe.stderrLines().size()); - - Assert.assertEquals("stdout has 1 line", 1, exe.stdoutLines().size()); + assertExitCodeAndStreamSizes(exe, 0, 1, 0); Assert.assertEquals("only clientId returned", "my_client3", exe.stdoutLines().get(0)); // simple create, default output exe = execute("create --config '" + configFile.getName() + "' -s clientId=my_client4"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertEquals("stderr has 1 line", 1, exe.stderrLines().size()); + assertExitCodeAndStreamSizes(exe, 0, 0, 1); Assert.assertEquals("only clientId returned", "Registered new client with client_id 'my_client4'", exe.stderrLines().get(0)); - Assert.assertEquals("stdout is empty", 0, exe.stdoutLines().size()); - // create using oidc endpoint - autodetect format @@ -178,8 +169,7 @@ public class KcRegCreateTest extends AbstractCliTest { " -s 'redirect_uris=[\"http://localhost:8980/myapp5/*\"]' -s client_uri=http://localhost:8980/myapp5" + " -o -f - < '" + tmpFile.getName() + "'"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr is empty", exe.stderrLines().isEmpty()); + assertExitCodeAndStdErrSize(exe, 0, 0); OIDCClientRepresentation client = JsonSerialization.readValue(exe.stdout(), OIDCClientRepresentation.class); @@ -195,10 +185,8 @@ public class KcRegCreateTest extends AbstractCliTest { // try use incompatible endpoint override exe = execute("create --config '" + configFile.getName() + "' -e default -f '" + tmpFile.getName() + "'"); - Assert.assertEquals("exitCode == 1", 1, exe.exitCode()); - Assert.assertFalse("stderr not empty", exe.stderrLines().isEmpty()); + assertExitCodeAndStreamSizes(exe, 1, 0, 1); Assert.assertEquals("Error message", "Attribute 'redirect_uris' not supported on document type 'default'", exe.stderrLines().get(0)); - } @@ -208,8 +196,7 @@ public class KcRegCreateTest extends AbstractCliTest { exe = execute("create --config '" + configFile.getName() + "' -o -f - < '" + samlSpMetaFile.getAbsolutePath() + "'"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr is empty", exe.stderrLines().isEmpty()); + assertExitCodeAndStdErrSize(exe, 0, 0); ClientRepresentation client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); Assert.assertNotNull("id", client.getId()); diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegTest.java index ae80a94d34..f936d6fbf7 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegTest.java @@ -33,7 +33,7 @@ public class KcRegTest extends AbstractCliTest { */ KcRegExec exe = execute(""); - Assert.assertEquals("exitCode", 1, exe.exitCode()); + assertExitCodeAndStdErrSize(exe, 1, 0); List lines = exe.stdoutLines(); Assert.assertTrue("stdout output not empty", lines.size() > 0); @@ -41,8 +41,6 @@ public class KcRegTest extends AbstractCliTest { Assert.assertEquals("stdout one but last line", "Use '" + KcRegExec.CMD + " help ' for more information about a given command.", lines.get(lines.size() - 2)); Assert.assertEquals("stdout last line", "", lines.get(lines.size() - 1)); - lines = exe.stderrLines(); - Assert.assertTrue("stderr output empty", lines.size() == 0); /* * Test commands without arguments @@ -79,7 +77,7 @@ public class KcRegTest extends AbstractCliTest { Assert.assertEquals("error message", "CLIENT not specified", exe.stderrLines().get(0)); exe = execute("help"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); + assertExitCodeAndStdErrSize(exe, 0, 0); lines = exe.stdoutLines(); Assert.assertTrue("stdout output not empty", lines.size() > 0); Assert.assertEquals("stdout first line", "Keycloak Client Registration CLI", lines.get(0)); @@ -93,69 +91,57 @@ public class KcRegTest extends AbstractCliTest { * Test --help for all commands */ KcRegExec exe = execute("--help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Keycloak Client Registration CLI", exe.stdoutLines().get(0)); exe = execute("create --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + CMD + " create [ARGUMENTS]", exe.stdoutLines().get(0)); exe = execute("get --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + CMD + " get CLIENT [ARGUMENTS]", exe.stdoutLines().get(0)); exe = execute("update --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + CMD + " update CLIENT [ARGUMENTS]", exe.stdoutLines().get(0)); exe = execute("delete --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + CMD + " delete CLIENT [ARGUMENTS]", exe.stdoutLines().get(0)); exe = execute("attrs --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + CMD + " attrs [ATTRIBUTE] [ARGUMENTS]", exe.stdoutLines().get(0)); exe = execute("update-token --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + CMD + " update-token CLIENT [ARGUMENTS]", exe.stdoutLines().get(0)); exe = execute("config --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + OsUtil.CMD + " config SUB_COMMAND [ARGUMENTS]", exe.stdoutLines().get(0)); exe = execute("config credentials --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + CMD + " config credentials --server SERVER_URL --realm REALM [ARGUMENTS]", exe.stdoutLines().get(0)); exe = execute("config initial-token --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + CMD + " config initial-token --server SERVER --realm REALM [--delete | TOKEN] [ARGUMENTS]", exe.stdoutLines().get(0)); exe = execute("config registration-token --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + CMD + " config registration-token --server SERVER --realm REALM --client CLIENT [--delete | TOKEN] [ARGUMENTS]", exe.stdoutLines().get(0)); exe = execute("config truststore --help"); - Assert.assertEquals("exit code", 0, exe.exitCode()); - Assert.assertEquals("no stderr", 0, exe.stderrLines().size()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertEquals("stdout first line", "Usage: " + CMD + " config truststore [TRUSTSTORE | --delete] [--trustpass PASSWOD] [ARGUMENTS]", exe.stdoutLines().get(0)); @@ -379,7 +365,7 @@ public class KcRegTest extends AbstractCliTest { KcRegExec exe = execute("config credentials --server " + serverUrl + " --realm master --user admin --password admin --config '" + configFile.getName() + "'"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); + assertExitCodeAndStreamSizes(exe, 0, 0, 1); // remember the state of config file ConfigData config1 = handler.loadConfig(); @@ -389,7 +375,7 @@ public class KcRegTest extends AbstractCliTest { exe = execute("create --config '" + configFile.getName() + "' -s clientId=test-client -o"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); + assertExitCodeAndStdErrSize(exe, 0, 0); // check changes to config file ConfigData config2 = handler.loadConfig(); @@ -619,12 +605,17 @@ public class KcRegTest extends AbstractCliTest { KcRegExec exe = execute("create " + (useConfig ? ("--config '" + configFile.getAbsolutePath()) + "'" : "--no-config") + " --server " + serverUrl + " --realm " + realm + " -s clientId=test-client -o"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); + assertExitCodeAndStdErrSize(exe, 0, 0); ClientRepresentation client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); Assert.assertEquals("clientId", "test-client", client.getClientId()); Assert.assertNotNull("registrationAccessToken", client.getRegistrationAccessToken()); + + exe = execute("delete test-client " + (useConfig ? ("--config '" + configFile.getAbsolutePath()) + "'" : "--no-config") + + " --server " + serverUrl + " --realm " + realm + " -t " + client.getRegistrationAccessToken()); + + assertExitCodeAndStreamSizes(exe, 0, 0, 0); } } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegUpdateTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegUpdateTest.java index d21c1a3e62..65b70cc013 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegUpdateTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegUpdateTest.java @@ -35,7 +35,8 @@ public class KcRegUpdateTest extends AbstractCliTest { // create an object so we can update it KcRegExec exe = execute("create --config '" + configFile.getName() + "' -o -s clientId=my_client"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); + assertExitCodeAndStdErrSize(exe, 0, 0); + ClientRepresentation client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); Assert.assertEquals("enabled", true, client.isEnabled()); @@ -48,8 +49,7 @@ public class KcRegUpdateTest extends AbstractCliTest { exe = execute("update my_client --config '" + configFile.getName() + "' -o " + " -s enabled=false -s 'redirectUris=[\"http://localhost:8980/myapp/*\"]'"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr is empty", exe.stderrLines().isEmpty()); + assertExitCodeAndStdErrSize(exe, 0, 0); client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); Assert.assertEquals("enabled", false, client.isEnabled()); @@ -60,8 +60,7 @@ public class KcRegUpdateTest extends AbstractCliTest { // Another merge update - test deleting an attribute, deleting a list item and adding a list item exe = execute("update my_client --config '" + configFile.getName() + "' -o -d redirectUris -s webOrigins+=http://localhost:8980/myapp -s webOrigins+=http://localhost:8981/myapp -d webOrigins[0]"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr is empty", exe.stderrLines().isEmpty()); + assertExitCodeAndStdErrSize(exe, 0, 0); client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); @@ -76,8 +75,7 @@ public class KcRegUpdateTest extends AbstractCliTest { exe = execute("update my_client --config '" + configFile.getName() + "' -o -s 'protocolMappers[0].config.\"id.token.claim\"=false' " + "-s 'protocolMappers[4].config={\"single\": \"true\", \"attribute.nameformat\": \"Basic\", \"attribute.name\": \"Role\"}'"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr is empty", exe.stderrLines().isEmpty()); + assertExitCodeAndStdErrSize(exe, 0, 0); client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); Assert.assertEquals("protocolMapper[0].config.\"id.token.claim\"", "false", client.getProtocolMappers().get(0).getConfig().get("id.token.claim")); @@ -112,8 +110,7 @@ public class KcRegUpdateTest extends AbstractCliTest { .stdin(new ByteArrayInputStream("{ \"enabled\": false }".getBytes())) .execute(); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr has error", exe.stderrLines().isEmpty()); + assertExitCodeAndStdErrSize(exe, 0, 0); client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); // web origin is not sent to the server, thus it retains the current value @@ -130,8 +127,7 @@ public class KcRegUpdateTest extends AbstractCliTest { .stdin(new ByteArrayInputStream("{ \"webOrigins\": [\"http://localhost:8980/myapp\"] }".getBytes())) .execute(); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr has error", exe.stderrLines().isEmpty()); + assertExitCodeAndStdErrSize(exe, 0, 0); client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); Assert.assertEquals("webOrigins", Arrays.asList("http://localhost:8980/myapp"), client.getWebOrigins()); @@ -144,8 +140,7 @@ public class KcRegUpdateTest extends AbstractCliTest { exe = execute("config registration-token --config '" + configFile.getName() + "' --server " + serverUrl + " --realm " + realm + " --client my_client -d"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr is empty", exe.stderrLines().isEmpty()); + assertExitCodeAndStdErrSize(exe, 0, 0); Assert.assertNull("my_client registration token", handler.loadConfig().ensureRealmConfigData(serverUrl, realm).getClients().get("my_client")); @@ -154,17 +149,14 @@ public class KcRegUpdateTest extends AbstractCliTest { // test update without registration access token to produce 'unsafe' error exe = execute("update my_client --config '" + configFile.getName() + "' -o -s bearerOnly=true"); - Assert.assertEquals("exitCode == 1", 1, exe.exitCode()); - Assert.assertFalse("stderr is not empty", exe.stderrLines().isEmpty()); + assertExitCodeAndStreamSizes(exe, 1, 0, 1); Assert.assertEquals("error message", "No Registration Access Token found for client: my_client. Provide one or use --unsafe.", exe.stderrLines().get(0)); // test using unsafe to perform update exe = execute("update my_client --config '" + configFile.getName() + "' -o -s bearerOnly=true --unsafe"); - Assert.assertEquals("exitCode == 0", 0, exe.exitCode()); - Assert.assertTrue("stderr is empty", exe.stderrLines().isEmpty()); - + assertExitCodeAndStdErrSize(exe, 0, 0); } } } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegUpdateTokenTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegUpdateTokenTest.java index e2b4193bbc..b2aebf77c4 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegUpdateTokenTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/cli/registration/KcRegUpdateTokenTest.java @@ -13,7 +13,6 @@ import org.keycloak.util.JsonSerialization; import java.io.IOException; -import static org.keycloak.client.registration.cli.util.OsUtil.EOL; import static org.keycloak.testsuite.cli.KcRegExec.execute; /** @@ -59,7 +58,8 @@ public class KcRegUpdateTokenTest extends AbstractCliTest { // test that the token works exe = execute("get reg-cli-secret-direct --no-config --server " + serverUrl + " --realm test -t " + token); - Assert.assertEquals("exit code", 0, exe.exitCode()); + + assertExitCodeAndStdErrSize(exe, 0, 0); ClientRepresentation client = JsonSerialization.readValue(exe.stdout(), ClientRepresentation.class); Assert.assertEquals("client representation returned", "reg-cli-secret-direct", client.getClientId());