Added workaround for KEYCLOAK-2560 to jpa-performance tests.
Optional delete/reimport realm phases.
This commit is contained in:
parent
f597f163f7
commit
52f3693747
2 changed files with 63 additions and 23 deletions
|
@ -1,15 +1,26 @@
|
||||||
# Keycloak JPA Performance Tests
|
# Keycloak JPA Performance Tests
|
||||||
|
|
||||||
|
## Test Phases
|
||||||
|
|
||||||
|
1. Create individual users
|
||||||
|
2. Delete realm **Optional**
|
||||||
|
3. Re-import realm **Optional**
|
||||||
|
4. Delete individual users
|
||||||
|
|
||||||
|
Phases 2 and 3 are activated by property `many.users.reimport=true|false`.
|
||||||
|
|
||||||
|
|
||||||
## How to run
|
## How to run
|
||||||
|
|
||||||
1. Build the Arquilian Base Testsuite module: `/testsuite/integration-arquillian/base`
|
1. Build the Arquilian Base Testsuite module: `/testsuite/integration-arquillian/base`
|
||||||
2. Run the test from this module using `mvn test` or `mvn clean test`.
|
2. Run the test from this module using `mvn test` or `mvn clean test`.
|
||||||
|
|
||||||
Optional parameters:
|
Optional parameters:
|
||||||
```
|
* `many.users.count` - Number of users to add/delete. Default: *10000*.
|
||||||
-Dmany.users.count=10000
|
* `many.users.batch` - Measurement batch size. Default: *1000*.
|
||||||
-Dmany.users.batch=1000
|
* `many.users.reimport` - Switch for phases 2 and 3. Default: *false*.
|
||||||
```
|
* `many.users.minTokenValidity` - Minimum validity of admin-client's access token. Default: *10000*. (ms)
|
||||||
|
|
||||||
|
|
||||||
### With MySQL
|
### With MySQL
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,9 @@ import org.keycloak.representations.idm.UserRepresentation;
|
||||||
import org.keycloak.testsuite.util.Timer;
|
import org.keycloak.testsuite.util.Timer;
|
||||||
import org.keycloak.representations.idm.RealmRepresentation;
|
import org.keycloak.representations.idm.RealmRepresentation;
|
||||||
import org.keycloak.util.JsonSerialization;
|
import org.keycloak.util.JsonSerialization;
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
import org.keycloak.admin.client.resource.RealmResource;
|
import org.keycloak.admin.client.resource.RealmResource;
|
||||||
import static org.keycloak.testsuite.util.IOUtil.PROJECT_BUILD_DIRECTORY;
|
import static org.keycloak.testsuite.util.IOUtil.PROJECT_BUILD_DIRECTORY;
|
||||||
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -25,6 +25,7 @@ public class ManyUsersTest extends AbstractUserTest {
|
||||||
|
|
||||||
private static final int COUNT = Integer.parseInt(System.getProperty("many.users.count", "10000"));
|
private static final int COUNT = Integer.parseInt(System.getProperty("many.users.count", "10000"));
|
||||||
private static final int BATCH = Integer.parseInt(System.getProperty("many.users.batch", "1000"));
|
private static final int BATCH = Integer.parseInt(System.getProperty("many.users.batch", "1000"));
|
||||||
|
private static final boolean REIMPORT = Boolean.parseBoolean(System.getProperty("many.users.reimport", "false"));
|
||||||
|
|
||||||
private static final String REALM = "realm_with_many_users";
|
private static final String REALM = "realm_with_many_users";
|
||||||
|
|
||||||
|
@ -33,6 +34,26 @@ public class ManyUsersTest extends AbstractUserTest {
|
||||||
private final Timer realmTimer = new Timer();
|
private final Timer realmTimer = new Timer();
|
||||||
private final Timer usersTimer = new Timer();
|
private final Timer usersTimer = new Timer();
|
||||||
|
|
||||||
|
private static final long MIN_TOKEN_VALIDITY = Long.parseLong(System.getProperty("many.users.minTokenValidity", "10000"));
|
||||||
|
long tokenExpirationTime = 0;
|
||||||
|
|
||||||
|
protected boolean tokenMinValidityExpired() {
|
||||||
|
return System.currentTimeMillis() >= tokenExpirationTime - MIN_TOKEN_VALIDITY;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void refreshToken() {
|
||||||
|
long requestTime = System.currentTimeMillis();
|
||||||
|
adminClient.tokenManager().refreshToken();
|
||||||
|
tokenExpirationTime = requestTime + adminClient.tokenManager().getAccessToken().getExpiresIn() * 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void refreshTokenIfMinValidityExpired() {
|
||||||
|
if (tokenMinValidityExpired()) {
|
||||||
|
log.info(String.format("Minimum access token validity (%s ms) expired --> refreshing", MIN_TOKEN_VALIDITY));
|
||||||
|
refreshToken();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected RealmResource realmResource() {
|
protected RealmResource realmResource() {
|
||||||
return realmsResouce().realm(REALM);
|
return realmsResouce().realm(REALM);
|
||||||
}
|
}
|
||||||
|
@ -48,6 +69,8 @@ public class ManyUsersTest extends AbstractUserTest {
|
||||||
RealmRepresentation realm = new RealmRepresentation();
|
RealmRepresentation realm = new RealmRepresentation();
|
||||||
realm.setRealm(REALM);
|
realm.setRealm(REALM);
|
||||||
realmsResouce().create(realm);
|
realmsResouce().create(realm);
|
||||||
|
|
||||||
|
refreshToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
@ -66,6 +89,7 @@ public class ManyUsersTest extends AbstractUserTest {
|
||||||
usersTimer.reset("create " + BATCH + " users");
|
usersTimer.reset("create " + BATCH + " users");
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (UserRepresentation user : users) {
|
for (UserRepresentation user : users) {
|
||||||
|
refreshTokenIfMinValidityExpired();
|
||||||
createUser(realmResource().users(), user);
|
createUser(realmResource().users(), user);
|
||||||
if (++i % BATCH == 0) {
|
if (++i % BATCH == 0) {
|
||||||
usersTimer.reset();
|
usersTimer.reset();
|
||||||
|
@ -77,32 +101,37 @@ public class ManyUsersTest extends AbstractUserTest {
|
||||||
log.info("Created users: " + i + " / " + users.size());
|
log.info("Created users: " + i + " / " + users.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
// SAVE REALM
|
if (REIMPORT) {
|
||||||
realmTimer.reset("save realm with " + users.size() + " users");
|
|
||||||
File realmFile = new File(PROJECT_BUILD_DIRECTORY, REALM + ".json");
|
// SAVE REALM
|
||||||
JsonSerialization.writeValueToStream(new BufferedOutputStream(new FileOutputStream(realmFile)), realm);
|
realmTimer.reset("save realm with " + users.size() + " users");
|
||||||
|
File realmFile = new File(PROJECT_BUILD_DIRECTORY, REALM + ".json");
|
||||||
|
JsonSerialization.writeValueToStream(new BufferedOutputStream(new FileOutputStream(realmFile)), realm);
|
||||||
|
|
||||||
|
// DELETE REALM
|
||||||
|
realmTimer.reset("delete realm with " + users.size() + " users");
|
||||||
|
realmResource().remove();
|
||||||
|
try {
|
||||||
|
realmResource().toRepresentation();
|
||||||
|
fail("realm not deleted");
|
||||||
|
} catch (Exception ex) {
|
||||||
|
log.debug("realm deleted");
|
||||||
|
}
|
||||||
|
|
||||||
|
// RE-IMPORT SAVED REALM
|
||||||
|
realmTimer.reset("re-import realm with " + realm.getUsers().size() + " users");
|
||||||
|
realmsResouce().create(realm);
|
||||||
|
realmTimer.reset("load " + realm.getUsers().size() + " users");
|
||||||
|
users = realmResource().users().search("", 0, Integer.MAX_VALUE);
|
||||||
|
|
||||||
// DELETE REALM
|
|
||||||
realmTimer.reset("delete realm with " + users.size() + " users");
|
|
||||||
realmResource().remove();
|
|
||||||
try {
|
|
||||||
realmResource().toRepresentation();
|
|
||||||
fail("realm not deleted");
|
|
||||||
} catch (Exception ex) {
|
|
||||||
log.debug("realm deleted");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// RE-IMPORT SAVED REALM
|
|
||||||
realmTimer.reset("re-import realm with " + realm.getUsers().size() + " users");
|
|
||||||
realmsResouce().create(realm);
|
|
||||||
realmTimer.reset("load " + realm.getUsers().size() + " users");
|
|
||||||
users = realmResource().users().search("", 0, Integer.MAX_VALUE);
|
|
||||||
|
|
||||||
// DELETE INDIVIDUAL USERS
|
// DELETE INDIVIDUAL USERS
|
||||||
realmTimer.reset("delete " + users.size() + " users");
|
realmTimer.reset("delete " + users.size() + " users");
|
||||||
usersTimer.reset("delete " + BATCH + " users", false);
|
usersTimer.reset("delete " + BATCH + " users", false);
|
||||||
i = 0;
|
i = 0;
|
||||||
for (UserRepresentation user : users) {
|
for (UserRepresentation user : users) {
|
||||||
|
refreshTokenIfMinValidityExpired();
|
||||||
realmResource().users().get(user.getId()).remove();
|
realmResource().users().get(user.getId()).remove();
|
||||||
if (++i % BATCH == 0) {
|
if (++i % BATCH == 0) {
|
||||||
usersTimer.reset();
|
usersTimer.reset();
|
||||||
|
|
Loading…
Reference in a new issue