Skip to content

Commit 49498ff

Browse files
committed
Enhanced test infrastructure
1 parent cb956ea commit 49498ff

File tree

4 files changed

+81
-49
lines changed

4 files changed

+81
-49
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package io.scalecube.security.environment;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.function.Supplier;
6+
import org.junit.jupiter.api.extension.BeforeAllCallback;
7+
import org.junit.jupiter.api.extension.ExtensionContext;
8+
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
9+
import org.junit.jupiter.api.extension.ParameterContext;
10+
import org.junit.jupiter.api.extension.ParameterResolutionException;
11+
import org.junit.jupiter.api.extension.ParameterResolver;
12+
13+
public class IntegrationEnvironmentFixture
14+
implements BeforeAllCallback, ExtensionContext.Store.CloseableResource, ParameterResolver {
15+
16+
private static final Map<Class<?>, Supplier<?>> PARAMETERS_TO_RESOLVE = new HashMap<>();
17+
18+
private static VaultEnvironment vaultEnvironment;
19+
20+
@Override
21+
public void beforeAll(ExtensionContext context) {
22+
context
23+
.getRoot()
24+
.getStore(Namespace.GLOBAL)
25+
.getOrComputeIfAbsent(
26+
this.getClass(),
27+
key -> {
28+
vaultEnvironment = VaultEnvironment.start();
29+
return this;
30+
});
31+
32+
PARAMETERS_TO_RESOLVE.put(VaultEnvironment.class, () -> vaultEnvironment);
33+
}
34+
35+
@Override
36+
public void close() {
37+
if (vaultEnvironment != null) {
38+
vaultEnvironment.close();
39+
}
40+
}
41+
42+
@Override
43+
public boolean supportsParameter(
44+
ParameterContext parameterContext, ExtensionContext extensionContext)
45+
throws ParameterResolutionException {
46+
Class<?> type = parameterContext.getParameter().getType();
47+
return PARAMETERS_TO_RESOLVE.keySet().stream().anyMatch(type::isAssignableFrom);
48+
}
49+
50+
@Override
51+
public Object resolveParameter(
52+
ParameterContext parameterContext, ExtensionContext extensionContext)
53+
throws ParameterResolutionException {
54+
Class<?> type = parameterContext.getParameter().getType();
55+
return PARAMETERS_TO_RESOLVE.get(type).get();
56+
}
57+
}

tests/src/test/java/io/scalecube/security/environment/VaultEnvironment.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,13 @@ public static Throwable getRootCause(Throwable throwable) {
211211
return throwable;
212212
}
213213

214+
public String newServiceToken() {
215+
String keyName = createIdentityKey(); // oidc/key
216+
String roleName = createIdentityRole(keyName); // oidc/role
217+
String clientToken = login(); // onboard entity with policy
218+
return generateIdentityToken(clientToken, roleName);
219+
}
220+
214221
@Override
215222
public void close() {
216223
vault.stop();

tests/src/test/java/io/scalecube/security/tokens/jwt/JsonwebtokenResolverTests.java

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,33 +12,20 @@
1212
import static org.mockito.Mockito.when;
1313

1414
import io.jsonwebtoken.Locator;
15+
import io.scalecube.security.environment.IntegrationEnvironmentFixture;
1516
import io.scalecube.security.environment.VaultEnvironment;
1617
import java.security.Key;
1718
import java.time.Duration;
1819
import java.util.concurrent.TimeUnit;
19-
import org.junit.jupiter.api.AfterAll;
20-
import org.junit.jupiter.api.BeforeAll;
2120
import org.junit.jupiter.api.Test;
21+
import org.junit.jupiter.api.extension.ExtendWith;
2222

23+
@ExtendWith(IntegrationEnvironmentFixture.class)
2324
public class JsonwebtokenResolverTests {
2425

25-
private static VaultEnvironment vaultEnvironment;
26-
27-
@BeforeAll
28-
static void beforeAll() {
29-
vaultEnvironment = VaultEnvironment.start();
30-
}
31-
32-
@AfterAll
33-
static void afterAll() {
34-
if (vaultEnvironment != null) {
35-
vaultEnvironment.close();
36-
}
37-
}
38-
3926
@Test
40-
void testResolveTokenSuccessfully() throws Exception {
41-
final var token = generateToken();
27+
void testResolveTokenSuccessfully(VaultEnvironment vaultEnvironment) throws Exception {
28+
final var token = vaultEnvironment.newServiceToken();
4229

4330
final var jwtToken =
4431
new JsonwebtokenResolver(
@@ -57,8 +44,8 @@ void testResolveTokenSuccessfully() throws Exception {
5744
}
5845

5946
@Test
60-
void testJwksKeyLocatorThrowsError() {
61-
final var token = generateToken();
47+
void testJwksKeyLocatorThrowsError(VaultEnvironment vaultEnvironment) {
48+
final var token = vaultEnvironment.newServiceToken();
6249

6350
Locator<Key> keyLocator = mock(Locator.class);
6451
when(keyLocator.locate(any())).thenThrow(new RuntimeException("Cannot get key"));
@@ -74,8 +61,8 @@ void testJwksKeyLocatorThrowsError() {
7461
}
7562

7663
@Test
77-
void testJwksKeyLocatorThrowsRetryableError() {
78-
final var token = generateToken();
64+
void testJwksKeyLocatorThrowsRetryableError(VaultEnvironment vaultEnvironment) {
65+
final var token = vaultEnvironment.newServiceToken();
7966

8067
Locator<Key> keyLocator = mock(Locator.class);
8168
when(keyLocator.locate(any())).thenThrow(new JwtUnavailableException("JWKS timeout"));
@@ -89,11 +76,4 @@ void testJwksKeyLocatorThrowsRetryableError() {
8976
assertThat(ex.getMessage(), startsWith("JWKS timeout"));
9077
}
9178
}
92-
93-
private static String generateToken() {
94-
String keyName = vaultEnvironment.createIdentityKey(); // oidc/key
95-
String roleName = vaultEnvironment.createIdentityRole(keyName); // oidc/role
96-
String clientToken = vaultEnvironment.login(); // onboard entity with policy
97-
return vaultEnvironment.generateIdentityToken(clientToken, roleName);
98-
}
9979
}

tests/src/test/java/io/scalecube/security/vault/VaultServiceTokenTests.java

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import static org.junit.jupiter.api.Assertions.fail;
1010
import static org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
1111

12+
import io.scalecube.security.environment.IntegrationEnvironmentFixture;
1213
import io.scalecube.security.environment.VaultEnvironment;
1314
import io.scalecube.security.tokens.jwt.JsonwebtokenResolver;
1415
import io.scalecube.security.tokens.jwt.JwksKeyLocator;
@@ -19,28 +20,15 @@
1920
import java.util.Map;
2021
import java.util.concurrent.ExecutionException;
2122
import java.util.concurrent.TimeUnit;
22-
import org.junit.jupiter.api.AfterAll;
23-
import org.junit.jupiter.api.BeforeAll;
2423
import org.junit.jupiter.api.Test;
24+
import org.junit.jupiter.api.extension.ExtendWith;
2525

26+
@ExtendWith(IntegrationEnvironmentFixture.class)
2627
public class VaultServiceTokenTests {
2728

28-
private static VaultEnvironment vaultEnvironment;
29-
30-
@BeforeAll
31-
static void beforeAll() {
32-
vaultEnvironment = VaultEnvironment.start();
33-
}
34-
35-
@AfterAll
36-
static void afterAll() {
37-
if (vaultEnvironment != null) {
38-
vaultEnvironment.close();
39-
}
40-
}
41-
4229
@Test
43-
void testGetServiceTokenUsingWrongCredentials() throws Exception {
30+
void testGetServiceTokenUsingWrongCredentials(VaultEnvironment vaultEnvironment)
31+
throws Exception {
4432
final var serviceTokenSupplier =
4533
new VaultServiceTokenSupplier.Builder()
4634
.vaultAddress(vaultEnvironment.vaultAddr())
@@ -60,7 +48,7 @@ void testGetServiceTokenUsingWrongCredentials() throws Exception {
6048
}
6149

6250
@Test
63-
void testGetNonExistingServiceToken() throws Exception {
51+
void testGetNonExistingServiceToken(VaultEnvironment vaultEnvironment) throws Exception {
6452
final var nonExistingServiceRole = "non-existing-role-" + System.currentTimeMillis();
6553

6654
final var serviceTokenSupplier =
@@ -82,7 +70,7 @@ void testGetNonExistingServiceToken() throws Exception {
8270
}
8371

8472
@Test
85-
void testGetServiceTokenByWrongServiceRole() throws Exception {
73+
void testGetServiceTokenByWrongServiceRole(VaultEnvironment vaultEnvironment) throws Exception {
8674
final var now = System.currentTimeMillis();
8775
final var serviceRole1 = "role1-" + now;
8876
final var serviceRole2 = "role2-" + now;
@@ -124,7 +112,7 @@ void testGetServiceTokenByWrongServiceRole() throws Exception {
124112
}
125113

126114
@Test
127-
void testGetServiceTokenSuccessfully() throws Exception {
115+
void testGetServiceTokenSuccessfully(VaultEnvironment vaultEnvironment) throws Exception {
128116
final var now = System.currentTimeMillis();
129117
final var serviceRole = "role-" + now;
130118
final var tags = Map.of("type", "ops", "ns", "develop");

0 commit comments

Comments
 (0)