Made AssertEvents work with @Rule

This commit is contained in:
Stian Thorgersen 2016-04-20 15:37:02 +02:00
parent 974906d37f
commit 890af8da52
5 changed files with 83 additions and 92 deletions

View file

@ -22,10 +22,10 @@ import org.hamcrest.Description;
import org.hamcrest.Matcher; import org.hamcrest.Matcher;
import org.hamcrest.TypeSafeMatcher; import org.hamcrest.TypeSafeMatcher;
import org.junit.Assert; import org.junit.Assert;
import org.junit.rules.TestRule;
import org.junit.runners.model.Statement;
import org.keycloak.OAuth2Constants; import org.keycloak.OAuth2Constants;
import org.keycloak.admin.client.resource.RealmResource;
import org.keycloak.authentication.authenticators.client.ClientIdAndSecretAuthenticator; import org.keycloak.authentication.authenticators.client.ClientIdAndSecretAuthenticator;
import org.keycloak.common.util.PemUtils;
import org.keycloak.events.Details; import org.keycloak.events.Details;
import org.keycloak.events.EventType; import org.keycloak.events.EventType;
import org.keycloak.representations.idm.ClientRepresentation; import org.keycloak.representations.idm.ClientRepresentation;
@ -33,11 +33,9 @@ import org.keycloak.representations.idm.EventRepresentation;
import org.keycloak.representations.idm.RealmRepresentation; import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.representations.idm.UserRepresentation; import org.keycloak.representations.idm.UserRepresentation;
import org.keycloak.representations.idm.UserSessionRepresentation; import org.keycloak.representations.idm.UserSessionRepresentation;
import org.keycloak.testsuite.client.resources.TestingResource;
import org.keycloak.util.TokenUtil; import org.keycloak.util.TokenUtil;
import javax.ws.rs.core.Response; import javax.ws.rs.core.Response;
import java.security.PublicKey;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -45,7 +43,7 @@ import java.util.Map;
/** /**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a> * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
*/ */
public class AssertEvents { public class AssertEvents implements TestRule {
public static final String DEFAULT_CLIENT_ID = "test-app"; public static final String DEFAULT_CLIENT_ID = "test-app";
public static final String DEFAULT_IP_ADDRESS = "127.0.0.1"; public static final String DEFAULT_IP_ADDRESS = "127.0.0.1";
@ -54,25 +52,22 @@ public class AssertEvents {
String defaultRedirectUri = "http://localhost:8180/auth/realms/master/app/auth"; String defaultRedirectUri = "http://localhost:8180/auth/realms/master/app/auth";
private RealmResource realmResource;
private TestingResource testingResource;
private RealmRepresentation realmRep;
private AbstractKeycloakTest context; private AbstractKeycloakTest context;
private PublicKey realmPublicKey;
public AssertEvents(AbstractKeycloakTest ctx) throws Exception { public AssertEvents(AbstractKeycloakTest ctx) {
context = ctx; context = ctx;
realmResource = context.adminClient.realms().realm(DEFAULT_REALM);
realmRep = realmResource.toRepresentation();
String pubKeyString = realmRep.getPublicKey();
realmPublicKey = PemUtils.decodePublicKey(pubKeyString);
UserRepresentation defaultUser = getUser(DEFAULT_USERNAME);
if (defaultUser == null) {
throw new RuntimeException("Default user does not exist: " + DEFAULT_USERNAME + ". Make sure to add it to your test realm.");
} }
testingResource = context.testingClient.testing();
@Override
public Statement apply(final Statement base, org.junit.runner.Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
base.evaluate();
// TODO Test should fail if there are leftover events
context.testingClient.testing().clearQueue();
}
};
} }
public EventRepresentation poll() { public EventRepresentation poll() {
@ -83,7 +78,7 @@ public class AssertEvents {
} }
public void clear() { public void clear() {
Response res = testingResource.clearQueue(); Response res = context.testingClient.testing().clearQueue();
try { try {
Assert.assertEquals("clear-event-queue success", res.getStatus(), 200); Assert.assertEquals("clear-event-queue success", res.getStatus(), 200);
} finally { } finally {
@ -166,7 +161,7 @@ public class AssertEvents {
public ExpectedEvent expect(EventType event) { public ExpectedEvent expect(EventType event) {
return new ExpectedEvent() return new ExpectedEvent()
.realm(realmRep.getId()) .realm(defaultRealmId())
.client(DEFAULT_CLIENT_ID) .client(DEFAULT_CLIENT_ID)
.user(defaultUserId()) .user(defaultUserId())
.ipAddress(DEFAULT_IP_ADDRESS) .ipAddress(DEFAULT_IP_ADDRESS)
@ -174,29 +169,24 @@ public class AssertEvents {
.event(event); .event(event);
} }
UserRepresentation getUser(String username) {
List<UserRepresentation> result = realmResource.users().search(username, null, null, null, 0, 1);
return result.size() > 0 ? result.get(0) : null;
}
public PublicKey getRealmPublicKey() {
return realmPublicKey;
}
public class ExpectedEvent { public class ExpectedEvent {
private EventRepresentation expected = new EventRepresentation(); private EventRepresentation expected = new EventRepresentation();
private Matcher<String> realmId;
private Matcher<String> userId; private Matcher<String> userId;
private Matcher<String> sessionId; private Matcher<String> sessionId;
private HashMap<String, Matcher<String>> details; private HashMap<String, Matcher<String>> details;
public ExpectedEvent realm(RealmRepresentation realm) { public ExpectedEvent realm(Matcher<String> realmId) {
expected.setRealmId(realm.getId()); this.realmId = realmId;
return this; return this;
} }
public ExpectedEvent realm(RealmRepresentation realm) {
return realm(CoreMatchers.equalTo(realm.getId()));
}
public ExpectedEvent realm(String realmId) { public ExpectedEvent realm(String realmId) {
expected.setRealmId(realmId); return realm(CoreMatchers.equalTo(realmId));
return this;
} }
public ExpectedEvent client(ClientRepresentation client) { public ExpectedEvent client(ClientRepresentation client) {
@ -283,7 +273,7 @@ public class AssertEvents {
expected.setType(expected.getType() + "_ERROR"); expected.setType(expected.getType() + "_ERROR");
} }
Assert.assertEquals(expected.getType(), actual.getType()); Assert.assertEquals(expected.getType(), actual.getType());
Assert.assertEquals(expected.getRealmId(), actual.getRealmId()); Assert.assertThat(actual.getRealmId(), realmId);
Assert.assertEquals(expected.getClientId(), actual.getClientId()); Assert.assertEquals(expected.getClientId(), actual.getClientId());
Assert.assertEquals(expected.getError(), actual.getError()); Assert.assertEquals(expected.getError(), actual.getError());
Assert.assertEquals(expected.getIpAddress(), actual.getIpAddress()); Assert.assertEquals(expected.getIpAddress(), actual.getIpAddress());
@ -333,6 +323,34 @@ public class AssertEvents {
}; };
} }
public Matcher<String> defaultRealmId() {
return new TypeSafeMatcher<String>() {
private String realmId;
@Override
protected boolean matchesSafely(String item) {
return item.equals(getRealmId());
}
@Override
public void describeTo(Description description) {
description.appendText(getRealmId());
}
private String getRealmId() {
if (realmId == null) {
RealmRepresentation realm = context.adminClient.realm(DEFAULT_REALM).toRepresentation();
if (realm == null) {
throw new RuntimeException("Default user does not exist: " + DEFAULT_USERNAME + ". Make sure to add it to your test realm.");
}
realmId = realm.getId();
}
return realmId;
}
};
}
public Matcher<String> defaultUserId() { public Matcher<String> defaultUserId() {
return new TypeSafeMatcher<String>() { return new TypeSafeMatcher<String>() {
private String userId; private String userId;
@ -361,7 +379,12 @@ public class AssertEvents {
}; };
} }
private UserRepresentation getUser(String username) {
List<UserRepresentation> users = context.adminClient.realm(DEFAULT_REALM).users().search(username, null, null, null, 0, 1);
return users.isEmpty() ? null : users.get(0);
}
private EventRepresentation fetchNextEvent() { private EventRepresentation fetchNextEvent() {
return testingResource.pollEvent(); return context.testingClient.testing().pollEvent();
} }
} }

View file

@ -41,6 +41,7 @@ import org.junit.After;
import org.junit.AfterClass; import org.junit.AfterClass;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.keycloak.adapters.HttpClientBuilder; import org.keycloak.adapters.HttpClientBuilder;
import org.keycloak.admin.client.resource.RealmResource; import org.keycloak.admin.client.resource.RealmResource;
@ -78,7 +79,8 @@ public abstract class AbstractKerberosAdapterTest extends AbstractServletsAdapte
protected static LDAPEmbeddedServer ldapEmbeddedServer; protected static LDAPEmbeddedServer ldapEmbeddedServer;
protected AssertEvents events; @Rule
public AssertEvents events = new AssertEvents(this);
@Page @Page
protected ChangePassword changePasswordPage; protected ChangePassword changePasswordPage;
@ -115,7 +117,6 @@ public abstract class AbstractKerberosAdapterTest extends AbstractServletsAdapte
String krb5ConfPath = LDAPTestConfiguration.getResource("test-krb5.conf"); String krb5ConfPath = LDAPTestConfiguration.getResource("test-krb5.conf");
log.info("Krb5.conf file location is: " + krb5ConfPath); log.info("Krb5.conf file location is: " + krb5ConfPath);
System.setProperty("java.security.krb5.conf", krb5ConfPath); System.setProperty("java.security.krb5.conf", krb5ConfPath);
events = new AssertEvents(this);
UserFederationProviderModel model = new UserFederationProviderModel(); UserFederationProviderModel model = new UserFederationProviderModel();
model.setConfig(ldapTestConfiguration.getLDAPConfig()); model.setConfig(ldapTestConfiguration.getLDAPConfig());
spnegoSchemeFactory = new KeycloakSPNegoSchemeFactory(getKerberosConfig(model)); spnegoSchemeFactory = new KeycloakSPNegoSchemeFactory(getKerberosConfig(model));

View file

@ -18,6 +18,7 @@
package org.keycloak.testsuite.admin; package org.keycloak.testsuite.admin;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.keycloak.Config; import org.keycloak.Config;
import org.keycloak.admin.client.resource.ClientResource; import org.keycloak.admin.client.resource.ClientResource;
@ -58,14 +59,14 @@ import java.util.Map;
*/ */
public class ImpersonationTest extends AbstractKeycloakTest { public class ImpersonationTest extends AbstractKeycloakTest {
private AssertEvents events; @Rule
public AssertEvents events = new AssertEvents(this);
private String impersonatedUserId; private String impersonatedUserId;
@Override @Override
public void beforeAbstractKeycloakTest() throws Exception { public void beforeAbstractKeycloakTest() throws Exception {
super.beforeAbstractKeycloakTest(); super.beforeAbstractKeycloakTest();
events = new AssertEvents(this);
} }
@Override @Override

View file

@ -18,8 +18,10 @@
package org.keycloak.testsuite.admin.group; package org.keycloak.testsuite.admin.group;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.keycloak.OAuth2Constants; import org.keycloak.OAuth2Constants;
import org.keycloak.RSATokenVerifier; import org.keycloak.RSATokenVerifier;
import org.keycloak.common.util.PemUtils;
import org.keycloak.events.Details; import org.keycloak.events.Details;
import org.keycloak.jose.jws.JWSInput; import org.keycloak.jose.jws.JWSInput;
import org.keycloak.jose.jws.crypto.RSAProvider; import org.keycloak.jose.jws.crypto.RSAProvider;
@ -31,6 +33,7 @@ import org.keycloak.testsuite.AbstractKeycloakTest;
import org.keycloak.testsuite.AssertEvents; import org.keycloak.testsuite.AssertEvents;
import org.keycloak.testsuite.arquillian.AuthServerTestEnricher; import org.keycloak.testsuite.arquillian.AuthServerTestEnricher;
import java.security.PublicKey;
import java.util.List; import java.util.List;
import static org.keycloak.testsuite.util.IOUtil.loadRealm; import static org.keycloak.testsuite.util.IOUtil.loadRealm;
@ -40,13 +43,8 @@ import static org.keycloak.testsuite.util.IOUtil.loadRealm;
*/ */
public abstract class AbstractGroupTest extends AbstractKeycloakTest { public abstract class AbstractGroupTest extends AbstractKeycloakTest {
AssertEvents events; @Rule
public AssertEvents events = new AssertEvents(this);
@Before
public void initAssertEvents() throws Exception {
events = new AssertEvents(this);
events.clear();
}
AccessToken login(String login, String clientId, String clientSecret, String userId) throws Exception { AccessToken login(String login, String clientId, String clientSecret, String userId) throws Exception {
@ -55,10 +53,12 @@ public abstract class AbstractGroupTest extends AbstractKeycloakTest {
String accessToken = tokenResponse.getToken(); String accessToken = tokenResponse.getToken();
String refreshToken = tokenResponse.getRefreshToken(); String refreshToken = tokenResponse.getRefreshToken();
AccessToken accessTokenRepresentation = RSATokenVerifier.verifyToken(accessToken, events.getRealmPublicKey(), AuthServerTestEnricher.getAuthServerContextRoot() + "/auth/realms/test"); PublicKey publicKey = PemUtils.decodePublicKey(adminClient.realm("test").toRepresentation().getPublicKey());
AccessToken accessTokenRepresentation = RSATokenVerifier.verifyToken(accessToken, publicKey, AuthServerTestEnricher.getAuthServerContextRoot() + "/auth/realms/test");
JWSInput jws = new JWSInput(refreshToken); JWSInput jws = new JWSInput(refreshToken);
if (!RSAProvider.verify(jws, events.getRealmPublicKey())) { if (!RSAProvider.verify(jws, publicKey)) {
throw new RuntimeException("Invalid refresh token"); throw new RuntimeException("Invalid refresh token");
} }
RefreshToken refreshTokenRepresentation = jws.readJsonContent(RefreshToken.class); RefreshToken refreshTokenRepresentation = jws.readJsonContent(RefreshToken.class);

View file

@ -18,13 +18,10 @@ package org.keycloak.testsuite.oauth;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList; import org.junit.Rule;
import java.util.List;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.keycloak.OAuth2Constants; import org.keycloak.OAuth2Constants;
import org.keycloak.common.util.Time; import org.keycloak.common.util.Time;
import org.keycloak.testsuite.util.KeycloakModelUtils;
import org.keycloak.representations.idm.ClientRepresentation; import org.keycloak.representations.idm.ClientRepresentation;
import org.keycloak.representations.idm.CredentialRepresentation; import org.keycloak.representations.idm.CredentialRepresentation;
import org.keycloak.representations.idm.EventRepresentation; import org.keycloak.representations.idm.EventRepresentation;
@ -33,13 +30,13 @@ import org.keycloak.representations.idm.UserRepresentation;
import org.keycloak.representations.oidc.TokenMetadataRepresentation; import org.keycloak.representations.oidc.TokenMetadataRepresentation;
import org.keycloak.testsuite.AssertEvents; import org.keycloak.testsuite.AssertEvents;
import org.keycloak.testsuite.TestRealmKeycloakTest; import org.keycloak.testsuite.TestRealmKeycloakTest;
import org.keycloak.testsuite.util.KeycloakModelUtils;
import org.keycloak.testsuite.util.OAuthClient.AccessTokenResponse; import org.keycloak.testsuite.util.OAuthClient.AccessTokenResponse;
//import org.adminClient.testsuite.pages.LoginPage;
//import org.adminClient.testsuite.rule.KeycloakRule;
//import org.adminClient.testsuite.rule.WebResource;
//import org.adminClient.testsuite.rule.WebRule;
import org.keycloak.util.JsonSerialization; import org.keycloak.util.JsonSerialization;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*; import static org.junit.Assert.*;
/** /**
@ -48,34 +45,8 @@ import static org.junit.Assert.*;
*/ */
public class TokenIntrospectionTest extends TestRealmKeycloakTest { public class TokenIntrospectionTest extends TestRealmKeycloakTest {
private AssertEvents events; @Rule
public AssertEvents events = new AssertEvents(this);
/* @ClassRule >>> now implemented in configureTestRealm()
public static KeycloakRule keycloakRule = new KeycloakRule(new KeycloakRule.KeycloakSetup() {
@Override
vvv "test" realm
public void config(RealmManager manager, RealmModel adminstrationRealm, RealmModel appRealm) {
vvv Done in TestRealmKeycloakTest vvv
appRealm.getClientByClientId("test-app").setDirectAccessGrantsEnabled(true);
ClientModel confApp = KeycloakModelUtils.createClient(appRealm, "confidential-cli");
confApp.setSecret("secret1");
new ClientManager(manager).enableServiceAccount(confApp);
ClientModel pubApp = KeycloakModelUtils.createClient(appRealm, "public-cli");
pubApp.setPublicClient(true);
{
UserModel user = manager.getSession().users().addUser(appRealm, KeycloakModelUtils.generateId(), "no-permissions", false, false);
user.updateCredential(UserCredentialModel.password("password"));
user.setEnabled(true);
RoleModel role = appRealm.getRole("user");
user.grantRole(role);
}
adminClient = Keycloak.getInstance("http://localhost:8081/auth", "master", "admin", "admin", Constants.ADMIN_CLI_CLIENT_ID);
}
}); */
@Override @Override
public void configureTestRealm(RealmRepresentation testRealm) { public void configureTestRealm(RealmRepresentation testRealm) {
@ -101,11 +72,6 @@ public class TokenIntrospectionTest extends TestRealmKeycloakTest {
testRealm.getUsers().add(user); testRealm.getUsers().add(user);
} }
@Before
public void setUpAssertEvents() throws Exception {
events = new AssertEvents(this);
}
@Test @Test
public void testConfidentialClientCredentialsBasicAuthentication() throws Exception { public void testConfidentialClientCredentialsBasicAuthentication() throws Exception {
oauth.doLogin("test-user@localhost", "password"); oauth.doLogin("test-user@localhost", "password");