diff --git a/examples/fuse/demorealm.json b/examples/fuse/demorealm.json index 9a4fba9fe5..1f609e60f2 100644 --- a/examples/fuse/demorealm.json +++ b/examples/fuse/demorealm.json @@ -282,5 +282,13 @@ "client": "hawtio-client", "roles": [ "viewer", "jmxAdmin" ] } - ] + ], + "clientScopeMappings": { + "account": [ + { + "client": "hawtio-client", + "roles": [ "view-profile", "manage-account" ] + } + ] + } } diff --git a/testsuite/integration-arquillian/HOW-TO-RUN.md b/testsuite/integration-arquillian/HOW-TO-RUN.md index 149a66e2c1..803acbdd02 100644 --- a/testsuite/integration-arquillian/HOW-TO-RUN.md +++ b/testsuite/integration-arquillian/HOW-TO-RUN.md @@ -109,14 +109,14 @@ Assumed you downloaded `jboss-fuse-karaf-6.3.0.redhat-229.zip` # Prepare Fuse server - mvn -f testsuite/integration-arquillian/servers \ + mvn -f testsuite/integration-arquillian/servers/pom.xml \ clean install \ -Pauth-server-wildfly \ -Papp-server-fuse63 \ -Dfuse63.version=6.3.0.redhat-229 \ -Dapp.server.karaf.update.config=true \ -Dmaven.local.settings=$HOME/.m2/settings.xml \ - -Drepositories=,http://download.eng.bos.redhat.com/brewroot/repos/sso-7.1-build/latest/maven/ \ + -Drepositories=,http://REPO-SERVER/brewroot/repos/sso-7.1-build/latest/maven/ \ -Dmaven.repo.local=$HOME/.m2/repository # Run the Fuse adapter tests @@ -127,6 +127,42 @@ Assumed you downloaded `jboss-fuse-karaf-6.3.0.redhat-229.zip` -Dfuse63.version=6.3.0.redhat-229 +### JBoss Fuse 7.0 + +1) Download JBoss Fuse 7.0 to your filesystem. It can be downloaded from http://origin-repository.jboss.org/nexus/content/groups/m2-proxy/org/jboss/fuse/fuse-karaf +Assumed you downloaded `fuse-karaf-7.0.0.fuse-000202.zip` + +2) Install to your local maven repository and change the properties according to your env (This step can be likely avoided if you somehow configure your local maven settings to point directly to Fuse repo): + + + mvn install:install-file \ + -DgroupId=org.jboss.fuse \ + -DartifactId=fuse-karaf \ + -Dversion=7.0.0.fuse-000202 \ + -Dpackaging=zip \ + -Dfile=/mydownloads/fuse-karaf-7.0.0.fuse-000202.zip + + +3) Prepare Fuse and run the tests (change props according to your environment, versions etc): + + + # Prepare Fuse server + mvn -f testsuite/integration-arquillian/servers/pom.xml \ + clean install \ + -Papp-server-fuse70 \ + -Dfuse70.version=7.0.0.fuse-000202 \ + -Dapp.server.karaf.update.config=true \ + -Dmaven.local.settings=$HOME/.m2/settings.xml \ + -Drepositories=,http://REPO-SERVER/brewroot/repos/sso-7.1-build/latest/maven/ \ + -Dmaven.repo.local=$HOME/.m2/repository + + # Run the Fuse adapter tests + mvn -f testsuite/integration-arquillian/tests/other/adapters/karaf/fuse70/pom.xml \ + clean test \ + -Dbrowser=phantomjs \ + -Papp-server-fuse70 + + ### EAP6 with Hawtio 1) Download JBoss EAP 6.4.0.GA zip diff --git a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/install-features.cli b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/install-features.cli index e71a92b645..cc8b0cfeba 100644 --- a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/install-features.cli +++ b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/install-features.cli @@ -1,3 +1,7 @@ feature:repo-add mvn:org.keycloak/keycloak-osgi-features/${project.version}/xml/features feature:repo-add mvn:org.keycloak.example.demo/keycloak-fuse-example-features/${project.version}/xml/features + +feature:install pax-http-undertow + +feature:install keycloak-jaas keycloak-pax-http-undertow feature:install keycloak-fuse-7.0-example diff --git a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-bearer.json b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-bearer.json new file mode 100644 index 0000000000..b7f6b9ea90 --- /dev/null +++ b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-bearer.json @@ -0,0 +1,9 @@ +{ + "realm" : "demo", + "resource" : "jaas", + "bearer-only" : true, + "auth-server-url" : "http://localhost:8080/auth", + "ssl-required" : "external", + "use-resource-role-mappings": false, + "principal-attribute": "preferred_username" +} diff --git a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-direct-access.json b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-direct-access.json index 1b3ce639e7..bc741a9c81 100644 --- a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-direct-access.json +++ b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-direct-access.json @@ -1,9 +1,9 @@ { - "realm": "demo", - "resource": "ssh-jmx-admin-client", - "ssl-required" : "external", - "auth-server-url" : "http://localhost:8080/auth", - "credentials": { - "secret": "password" - } + "realm" : "demo", + "resource" : "ssh-jmx-admin-client", + "auth-server-url" : "http://localhost:8080/auth", + "ssl-required" : "external", + "credentials": { + "secret": "password" + } } diff --git a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-hawtio-client.json b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-hawtio-client.json index c28051d85a..97fb5c9747 100644 --- a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-hawtio-client.json +++ b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-hawtio-client.json @@ -1,7 +1,7 @@ { "realm" : "demo", - "resource" : "hawtio-client", - "auth-server-url" : "http://localhost:8080/auth", + "clientId" : "hawtio-client", + "url" : "http://localhost:8080/auth", "ssl-required" : "external", "public-client" : true } diff --git a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-hawtio.json b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-hawtio.json index b7f6b9ea90..bc741a9c81 100644 --- a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-hawtio.json +++ b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/keycloak-hawtio.json @@ -1,9 +1,9 @@ { "realm" : "demo", - "resource" : "jaas", - "bearer-only" : true, + "resource" : "ssh-jmx-admin-client", "auth-server-url" : "http://localhost:8080/auth", "ssl-required" : "external", - "use-resource-role-mappings": false, - "principal-attribute": "preferred_username" + "credentials": { + "secret": "password" + } } diff --git a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/update-config-auth.cli b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/update-config-auth.cli index b3f63c2090..7e38734522 100644 --- a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/update-config-auth.cli +++ b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/update-config-auth.cli @@ -1,8 +1,9 @@ config:edit org.apache.karaf.shell config:property-set sshRealm keycloak config:update -system:property -p hawtio.roles admin,user + system:property -p hawtio.keycloakEnabled true system:property -p hawtio.realm keycloak -system:property -p hawtio.keycloakClientConfig file://\$\{karaf.base\}/etc/keycloak-hawtio-client.json +system:property -p hawtio.keycloakClientConfig file://\${karaf.base}/etc/keycloak-hawtio-client.json +system:property -p hawtio.keycloakServerConfig file://\${karaf.base}/etc/keycloak-bearer.json system:property -p hawtio.rolePrincipalClasses org.keycloak.adapters.jaas.RolePrincipal,org.apache.karaf.jaas.boot.principal.RolePrincipal diff --git a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/update-config.cli b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/update-config.cli index 6c272c6f0d..b1e19c0f6d 100644 --- a/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/update-config.cli +++ b/testsuite/integration-arquillian/servers/app-server/karaf/fuse70/src/main/resources/update-config.cli @@ -3,6 +3,11 @@ config:property-set org.ops4j.pax.url.mvn.localRepository ${maven.repo.local} config:property-set org.ops4j.pax.url.mvn.settings ${maven.local.settings} config:property-append org.ops4j.pax.url.mvn.repositories ${repositories} config:update + +config:edit org.ops4j.pax.web +config:property-set org.ops4j.pax.web.config.file '${karaf.etc}/undertow.xml' +config:update + config:edit jmx.acl.org.apache.karaf.security.jmx config:property-append list* viewer config:property-append set* jmxAdmin diff --git a/testsuite/integration-arquillian/servers/app-server/karaf/pom.xml b/testsuite/integration-arquillian/servers/app-server/karaf/pom.xml index 4abfc82201..be2b3f741f 100644 --- a/testsuite/integration-arquillian/servers/app-server/karaf/pom.xml +++ b/testsuite/integration-arquillian/servers/app-server/karaf/pom.xml @@ -138,6 +138,7 @@ src/main/resources users.properties + keycloak-bearer.json keycloak-direct-access.json keycloak-hawtio-client.json keycloak-hawtio.json diff --git a/testsuite/integration-arquillian/servers/util/src/main/java/org/keycloak/testsuite/utils/undertow/SimpleWebXmlParser.java b/testsuite/integration-arquillian/servers/util/src/main/java/org/keycloak/testsuite/utils/undertow/SimpleWebXmlParser.java index 424bcaf992..eeef21905c 100644 --- a/testsuite/integration-arquillian/servers/util/src/main/java/org/keycloak/testsuite/utils/undertow/SimpleWebXmlParser.java +++ b/testsuite/integration-arquillian/servers/util/src/main/java/org/keycloak/testsuite/utils/undertow/SimpleWebXmlParser.java @@ -68,13 +68,17 @@ class SimpleWebXmlParser { List servlets = document.getElementsByTagName("servlet"); for (ElementWrapper servlet : servlets) { String servletName = servlet.getElementByTagName("servlet-name").getText(); - String servletClass = servlet.getElementByTagName("servlet-class").getText(); + ElementWrapper servletClassEw = servlet.getElementByTagName("servlet-class"); + String servletClass = servletClassEw == null ? servletName : servletClassEw.getText(); + ElementWrapper loadOnStartupEw = servlet.getElementByTagName("load-on-startup"); + Integer loadOnStartup = loadOnStartupEw == null ? null : Integer.valueOf(loadOnStartupEw.getText()); Class servletClazz = (Class) Class.forName(servletClass); ServletInfo undertowServlet = new ServletInfo(servletName, servletClazz); if (servletMappings.containsKey(servletName)) { undertowServlet.addMapping(servletMappings.get(servletName)); + undertowServlet.setLoadOnStartup(loadOnStartup); di.addServlet(undertowServlet); } else { log.warnf("Missing servlet-mapping for '%s'", servletName); diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/adapter/page/Hawtio2Page.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/adapter/page/Hawtio2Page.java new file mode 100644 index 0000000000..257c85f623 --- /dev/null +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/adapter/page/Hawtio2Page.java @@ -0,0 +1,41 @@ +package org.keycloak.testsuite.adapter.page; + +import org.keycloak.testsuite.page.AbstractPage; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; + +import javax.ws.rs.core.UriBuilder; + +import static org.keycloak.testsuite.util.WaitUtils.waitUntilElement; + +/** + * @author mhajas + */ +public class Hawtio2Page extends AbstractPage { + + public String getUrl() { + if (Boolean.parseBoolean(System.getProperty("app.server.ssl.required"))) { + return "https://localhost:" + System.getProperty("app.server.https.port", "8543") + "/hawtio"; + } + return "http://localhost:" + System.getProperty("app.server.http.port", "8180") + "/hawtio"; + } + + @Override + public UriBuilder createUriBuilder() { + return UriBuilder.fromUri(getUrl()); + } + + @FindBy(xpath = "//a[@id ='userDropdownMenu']") + private WebElement dropDownMenu; + + @FindBy(xpath = "//a[@ng-click='userDetails.logout()']") + private WebElement logoutButton; + + public void logout() { + waitUntilElement(dropDownMenu).is().visible(); + dropDownMenu.click(); + waitUntilElement(logoutButton).is().visible(); + logoutButton.click(); + } +} diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/DeploymentArchiveProcessor.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/DeploymentArchiveProcessor.java index 38e03ce81c..9c34b52e91 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/DeploymentArchiveProcessor.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/DeploymentArchiveProcessor.java @@ -350,5 +350,5 @@ public class DeploymentArchiveProcessor implements ApplicationArchiveProcessor { return null; } - + } diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/karaf/CustomKarafContainer.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/karaf/CustomKarafContainer.java index 0b612d0cf2..2fa802d2df 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/karaf/CustomKarafContainer.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/arquillian/karaf/CustomKarafContainer.java @@ -148,7 +148,7 @@ public class CustomKarafContainer // Get the MBeanServerConnection try { - mbeanServer = getMBeanServerConnection(30, TimeUnit.SECONDS); + mbeanServer = getMBeanServerConnection(60, TimeUnit.SECONDS); } catch (Exception ex) { destroyKarafProcess(); throw new LifecycleException("Cannot obtain MBean server connection", ex); diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/IOUtil.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/IOUtil.java index 97ac662e85..cdabb893cc 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/IOUtil.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/util/IOUtil.java @@ -127,7 +127,7 @@ public class IOUtil { } Node node = nodes.item(0).getAttributes().getNamedItem(attributeName); - if (node == null) { + if (node == null || node.getTextContent() == null) { log.warn("Not able to find attribute " + attributeName + " within element: " + tagName); return; } diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/example/AbstractFuseAdminAdapterTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/example/AbstractFuseAdminAdapterTest.java index 6328c5db0f..c0924ff3e3 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/example/AbstractFuseAdminAdapterTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/example/AbstractFuseAdminAdapterTest.java @@ -31,7 +31,6 @@ import javax.management.remote.JMXServiceURL; import org.apache.sshd.client.SshClient; import org.apache.sshd.client.channel.ClientChannel; -import org.apache.sshd.client.channel.ClientChannelEvent; import org.apache.sshd.client.future.ConnectFuture; import org.apache.sshd.client.session.ClientSession; import org.apache.sshd.client.session.ClientSession.ClientSessionEvent; @@ -41,6 +40,14 @@ import org.junit.Test; import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.testsuite.adapter.AbstractExampleAdapterTest; import org.keycloak.testsuite.adapter.page.HawtioPage; +import org.apache.sshd.client.channel.ChannelExec; +import org.apache.sshd.client.channel.ClientChannel.Streaming; +import org.apache.sshd.client.channel.ClientChannelEvent; +import org.hamcrest.Matchers; +import static org.hamcrest.Matchers.anyOf; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; public abstract class AbstractFuseAdminAdapterTest extends AbstractExampleAdapterTest { @@ -49,11 +56,7 @@ public abstract class AbstractFuseAdminAdapterTest extends AbstractExampleAdapte private SshClient client; - private ClientChannel channel; - - private ClientSession session; - - enum Result { OK, NOT_FOUND, NO_CREDENTIALS, NO_ROLES }; + protected enum Result { OK, NOT_FOUND, NO_CREDENTIALS, NO_ROLES }; @Override public void addAdapterTestRealms(List testRealms) { @@ -70,6 +73,7 @@ public abstract class AbstractFuseAdminAdapterTest extends AbstractExampleAdapte @Test public void hawtioLoginTest() throws Exception { + // Note that this does works only in Fuse 6 with Hawtio 1 since Fuse 7 contains Hawtio 2, and is thus overriden in Fuse 7 test classes hawtioPage.navigateTo(); testRealmLoginPage.form().login("user", "invalid-password"); assertCurrentUrlDoesntStartWith(hawtioPage); @@ -84,14 +88,15 @@ public abstract class AbstractFuseAdminAdapterTest extends AbstractExampleAdapte hawtioPage.navigateTo(); testRealmLoginPage.form().login("mary", "password"); - assertTrue(!driver.getPageSource().contains("welcome")); + assertThat(driver.getPageSource(), not(containsString("welcome"))); } @Test public void sshLoginTest() throws Exception { - assertCommand("mary", "password", "shell:date", Result.NOT_FOUND); + // Note that this does not work for Fuse 7 since the error codes have changed, and is thus overriden for Fuse 7 test classes + assertCommand("mary", "password", "shell:date", Result.NO_CREDENTIALS); assertCommand("john", "password", "shell:info", Result.NO_CREDENTIALS); assertCommand("john", "password", "shell:date", Result.OK); assertCommand("root", "password", "shell:info", Result.OK); @@ -121,47 +126,58 @@ public abstract class AbstractFuseAdminAdapterTest extends AbstractExampleAdapte setJMXAuthentication("karaf", "admin"); } - private String assertCommand(String user, String password, String command, Result result) throws Exception, IOException { + protected String assertCommand(String user, String password, String command, Result result) throws Exception, IOException { if (!command.endsWith("\n")) command += "\n"; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - OutputStream pipe = openSshChannel(user, password, out, out); - pipe.write(command.getBytes()); - pipe.flush(); - - closeSshChannel(pipe); - String output = new String(out.toByteArray()); + String output = getCommandOutput(user, password, command); switch(result) { case OK: - Assert.assertFalse("Should not contain 'Insufficient credentials' or 'Command not found': " + output, - output.contains("Insufficient credentials") || output.contains("Command not found")); + Assert.assertThat(output, + not(anyOf(containsString("Insufficient credentials"), Matchers.containsString("Command not found")))); break; case NOT_FOUND: - Assert.assertTrue("Should contain 'Command not found': " + output, - output.contains("Command not found")); + Assert.assertThat(output, + containsString("Command not found")); break; case NO_CREDENTIALS: - Assert.assertTrue("Should contain 'Insufficient credentials': " + output, - output.contains("Insufficient credentials")); + Assert.assertThat(output, + containsString("Insufficient credentials")); break; case NO_ROLES: - Assert.assertTrue("Should contain 'Current user has no associated roles': " + output, - output.contains("Current user has no associated roles")); + Assert.assertThat(output, + containsString("Current user has no associated roles")); break; default: Assert.fail("Unexpected enum value: " + result); } + return output; } - private OutputStream openSshChannel(String username, String password, OutputStream ... outputs) throws Exception { + protected String getCommandOutput(String user, String password, String command) throws Exception, IOException { + if (!command.endsWith("\n")) + command += "\n"; + + try (ClientSession session = openSshChannel(user, password); + ChannelExec channel = session.createExecChannel(command); + ByteArrayOutputStream out = new ByteArrayOutputStream()) { + channel.setOut(out); + channel.setErr(out); + channel.open(); + channel.waitFor(EnumSet.of(ClientChannelEvent.CLOSED, ClientChannelEvent.EOF), 0); + + return new String(out.toByteArray()); + } + } + + protected ClientSession openSshChannel(String username, String password) throws Exception { client = SshClient.setUpDefaultClient(); client.start(); ConnectFuture future = client.connect(username, "localhost", 8101); future.await(); - session = future.getSession(); + ClientSession session = future.getSession(); Set ret = EnumSet.of(ClientSessionEvent.WAIT_AUTH); while (ret.contains(ClientSessionEvent.WAIT_AUTH)) { @@ -172,48 +188,15 @@ public abstract class AbstractFuseAdminAdapterTest extends AbstractExampleAdapte if (ret.contains(ClientSessionEvent.CLOSED)) { throw new Exception("Could not open SSH channel"); } - channel = session.createChannel("shell"); - PipedOutputStream pipe = new PipedOutputStream(); - channel.setIn(new PipedInputStream(pipe)); - OutputStream out; - if (outputs.length >= 1) { - out = outputs[0]; - } else { - out = new ByteArrayOutputStream(); - } - channel.setOut(out); - - OutputStream err; - if (outputs.length >= 2) { - err = outputs[1]; - } else { - err = new ByteArrayOutputStream(); - } - channel.setErr(err); - channel.open(); - - return pipe; + return session; } - - private void setJMXAuthentication(String realm, String password) throws Exception { + + protected void setJMXAuthentication(String realm, String password) throws Exception { assertCommand("admin", "password", "config:edit org.apache.karaf.management; config:propset jmxRealm " + realm + "; config:update", Result.OK); getMBeanServerConnection(10000, TimeUnit.MILLISECONDS, "admin", password); } - private void closeSshChannel(OutputStream pipe) throws IOException { - pipe.write("logout\n".getBytes()); - pipe.flush(); - - channel.waitFor(EnumSet.of(ClientChannelEvent.CLOSED), TimeUnit.SECONDS.toMillis(15L)); - session.close(true); - client.stop(); - - client = null; - channel = null; - session = null; - } - private Object assertJmxInvoke(boolean expectSuccess, MBeanServerConnection connection, ObjectName mbean, String method, Object[] params, String[] signature) throws InstanceNotFoundException, MBeanException, ReflectionException, IOException { try { diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/example/AbstractFuseExampleAdapterTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/example/AbstractFuseExampleAdapterTest.java index d41b063dbb..41afa051c8 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/example/AbstractFuseExampleAdapterTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/adapter/example/AbstractFuseExampleAdapterTest.java @@ -27,16 +27,19 @@ import org.keycloak.testsuite.adapter.page.fuse.CustomerPortalFuseExample; import org.keycloak.testsuite.adapter.page.fuse.ProductPortalFuseExample; import org.keycloak.testsuite.auth.page.account.Account; +import org.keycloak.testsuite.util.WaitUtils; import java.io.File; import java.util.List; +import org.hamcrest.Matchers; +import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.keycloak.testsuite.auth.page.AuthRealm.DEMO; import static org.keycloak.testsuite.util.IOUtil.loadRealm; import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlStartsWith; import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlStartsWithLoginUrlOf; -import static org.keycloak.testsuite.util.WaitUtils.pause; /** * @@ -111,30 +114,36 @@ public abstract class AbstractFuseExampleAdapterTest extends AbstractExampleAdap assertCurrentUrlStartsWith(customerPortal); customerPortal.clickAdminInterfaceLink(); + WaitUtils.waitForPageToLoad(); assertCurrentUrlStartsWithLoginUrlOf(testRealmPage); testRealmLoginPage.form().login("admin", "password"); assertCurrentUrlStartsWith(adminInterface); - assertTrue(driver.getPageSource().contains("Hello admin!")); - assertTrue(driver.getPageSource().contains("This second sentence is returned from a Camel RestDSL endpoint")); + assertThat(driver.getPageSource(), containsString("Hello admin!")); + assertThat(driver.getPageSource(), containsString("This second sentence is returned from a Camel RestDSL endpoint")); customerListing.navigateTo(); + WaitUtils.waitForPageToLoad(); customerListing.clickLogOut(); - pause(500); - assertCurrentUrlStartsWith(customerPortal); + WaitUtils.waitForPageToLoad(); + WaitUtils.pause(2500); customerPortal.navigateTo();//needed for phantomjs + WaitUtils.waitForPageToLoad(); customerPortal.clickAdminInterfaceLink(); + WaitUtils.waitForPageToLoad(); assertCurrentUrlStartsWithLoginUrlOf(testRealmPage); testRealmLoginPage.form().login("bburke@redhat.com", "password"); assertCurrentUrlStartsWith(adminInterface); - assertTrue(driver.getPageSource().contains("Status code is 403")); + assertThat(driver.getPageSource(), containsString("Status code is 403")); } @Test public void testProductPortal() { productPortal.navigateTo(); + WaitUtils.waitForPageToLoad(); + assertCurrentUrlStartsWithLoginUrlOf(testRealmPage); testRealmLoginPage.form().login("bburke@redhat.com", "password"); @@ -145,6 +154,7 @@ public abstract class AbstractFuseExampleAdapterTest extends AbstractExampleAdap assertTrue(productPortal.getProduct2SecuredText().contains("Product received: id=2")); productPortal.clickLogOutLink(); + WaitUtils.waitForPageToLoad(); assertCurrentUrlStartsWithLoginUrlOf(testRealmPage); } diff --git a/testsuite/integration-arquillian/tests/other/adapters/karaf/common/xslt/arquillian.xsl b/testsuite/integration-arquillian/tests/other/adapters/karaf/common/xslt/arquillian.xsl index 9c1b6ebb9e..e1df46cde1 100644 --- a/testsuite/integration-arquillian/tests/other/adapters/karaf/common/xslt/arquillian.xsl +++ b/testsuite/integration-arquillian/tests/other/adapters/karaf/common/xslt/arquillian.xsl @@ -37,6 +37,7 @@ ${app.server.home} ${app.server.java.home} + ${app.server.karaf.jvm.debug.args} ${adapter.test.props} service:jmx:rmi://127.0.0.1:44444/jndi/rmi://127.0.0.1:1099/karaf-root diff --git a/testsuite/integration-arquillian/tests/other/adapters/karaf/fuse70/src/test/java/org/keycloak/testsuite/adapter/example/Fuse70AdminAdapterTest.java b/testsuite/integration-arquillian/tests/other/adapters/karaf/fuse70/src/test/java/org/keycloak/testsuite/adapter/example/Fuse70AdminAdapterTest.java index 07e66b280a..65cd262bd9 100644 --- a/testsuite/integration-arquillian/tests/other/adapters/karaf/fuse70/src/test/java/org/keycloak/testsuite/adapter/example/Fuse70AdminAdapterTest.java +++ b/testsuite/integration-arquillian/tests/other/adapters/karaf/fuse70/src/test/java/org/keycloak/testsuite/adapter/example/Fuse70AdminAdapterTest.java @@ -17,9 +17,79 @@ package org.keycloak.testsuite.adapter.example; +import org.keycloak.testsuite.adapter.page.Hawtio2Page; import org.keycloak.testsuite.arquillian.annotation.AppServerContainer; +import org.keycloak.testsuite.util.WaitUtils; +import java.util.Arrays; +import java.util.List; +import org.hamcrest.Matchers; +import org.jboss.arquillian.graphene.page.Page; +import org.junit.Test; +import org.openqa.selenium.By; +import static org.junit.Assert.assertThat; +import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlDoesntStartWith; +import static org.keycloak.testsuite.util.URLAssert.assertCurrentUrlStartsWith; @AppServerContainer("app-server-fuse70") public class Fuse70AdminAdapterTest extends AbstractFuseAdminAdapterTest { + @Page + protected Hawtio2Page hawtioPage; + + @Test + @Override + public void hawtioLoginTest() throws Exception { + hawtioPage.navigateTo(); + WaitUtils.waitForPageToLoad(); + + testRealmLoginPage.form().login("user", "invalid-password"); + assertCurrentUrlDoesntStartWith(hawtioPage); + + testRealmLoginPage.form().login("invalid-user", "password"); + assertCurrentUrlDoesntStartWith(hawtioPage); + + testRealmLoginPage.form().login("root", "password"); + assertCurrentUrlStartsWith(hawtioPage.toString(), hawtioPage.getDriver()); + WaitUtils.waitForPageToLoad(); + WaitUtils.waitUntilElement(By.linkText("Camel")); + hawtioPage.logout(); + WaitUtils.waitForPageToLoad(); + + assertCurrentUrlStartsWith(testRealmLoginPage); + + hawtioPage.navigateTo(); + WaitUtils.waitForPageToLoad(); + + testRealmLoginPage.form().login("mary", "password"); + assertCurrentUrlStartsWith(hawtioPage.toString(), hawtioPage.getDriver()); + WaitUtils.waitForPageToLoad(); + WaitUtils.waitUntilElementIsNotPresent(By.linkText("Camel")); + } + + @Test + @Override + public void sshLoginTest() throws Exception { + assertCommand("mary", "password", "shell:date", Result.NOT_FOUND); + assertCommand("john", "password", "shell:info", Result.NOT_FOUND); + assertCommand("john", "password", "shell:date", Result.OK); + assertRoles("root", + "ssh", + "jmxAdmin", + "admin", + "manager", + "viewer", + "Administrator", + "Auditor", + "Deployer", + "Maintainer", + "Operator", + "SuperUser" + ); + } + + private void assertRoles(String username, String... expectedRoles) throws Exception { + final String commandOutput = getCommandOutput(username, "password", "jaas:whoami -r --no-format"); + final List parsedOutput = Arrays.asList(commandOutput.split("\\n+")); + assertThat(parsedOutput, Matchers.containsInAnyOrder(expectedRoles)); + } } diff --git a/testsuite/integration-arquillian/tests/other/adapters/karaf/pom.xml b/testsuite/integration-arquillian/tests/other/adapters/karaf/pom.xml index 2a64e862ac..544487bb80 100644 --- a/testsuite/integration-arquillian/tests/other/adapters/karaf/pom.xml +++ b/testsuite/integration-arquillian/tests/other/adapters/karaf/pom.xml @@ -43,6 +43,7 @@ 8181 + -agentlib:jdwp=transport=dt_socket,server=y,suspend=${app.server.debug.suspend},address=${app.server.host}:${app.server.debug.port} @@ -53,6 +54,7 @@ src + diff --git a/testsuite/integration-arquillian/tests/other/adapters/pom.xml b/testsuite/integration-arquillian/tests/other/adapters/pom.xml index f077f24db1..b8f695d8bd 100644 --- a/testsuite/integration-arquillian/tests/other/adapters/pom.xml +++ b/testsuite/integration-arquillian/tests/other/adapters/pom.xml @@ -215,6 +215,7 @@ ${app.server.startup.timeout} ${app.server.memory.settings} ${app.server.jboss.jvm.debug.args} + ${app.server.karaf.jvm.debug.args} ${app.server.reverse-proxy.port.offset}