Skip to content

Commit 3953892

Browse files
authored
test: GCP IAM policy APIs integ tests (#189)
1 parent 25b694b commit 3953892

File tree

14 files changed

+1140
-0
lines changed

14 files changed

+1140
-0
lines changed
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
package com.salesforce.multicloudj.iam.client;
2+
3+
import com.salesforce.multicloudj.common.util.common.TestsUtil;
4+
import com.salesforce.multicloudj.iam.driver.AbstractIam;
5+
import com.salesforce.multicloudj.iam.model.PolicyDocument;
6+
import com.salesforce.multicloudj.iam.model.Statement;
7+
import org.junit.jupiter.api.AfterAll;
8+
import org.junit.jupiter.api.AfterEach;
9+
import org.junit.jupiter.api.Assertions;
10+
import org.junit.jupiter.api.BeforeAll;
11+
import org.junit.jupiter.api.BeforeEach;
12+
import org.junit.jupiter.api.Test;
13+
import org.junit.jupiter.api.TestInstance;
14+
15+
import java.util.List;
16+
17+
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
18+
public abstract class AbstractIamIT {
19+
public interface Harness extends AutoCloseable {
20+
AbstractIam createIamDriver(boolean useValidCredentials);
21+
22+
String getIdentityName();
23+
24+
String getTenantId();
25+
26+
String getRegion();
27+
28+
String getProviderId();
29+
30+
int getPort();
31+
32+
List<String> getWiremockExtensions();
33+
34+
String getIamEndpoint();
35+
36+
default String getPolicyVersion() {
37+
return "";
38+
}
39+
40+
String getTestPolicyEffect();
41+
42+
List<String> getTestPolicyActions();
43+
44+
String getTestPolicyName();
45+
}
46+
47+
protected abstract Harness createHarness();
48+
49+
private Harness harness;
50+
51+
/**
52+
* Initializes the WireMock server before all tests.
53+
*/
54+
@BeforeAll
55+
public void initializeWireMockServer() {
56+
harness = createHarness();
57+
TestsUtil.startWireMockServer(
58+
"src/test/resources", harness.getPort(), harness.getWiremockExtensions().toArray(new String[0]));
59+
}
60+
61+
/**
62+
* Shuts down the WireMock server after all tests.
63+
*/
64+
@AfterAll
65+
public void shutdownWireMockServer() throws Exception {
66+
TestsUtil.stopWireMockServer();
67+
harness.close();
68+
}
69+
70+
/**
71+
* Initialize the harness and
72+
*/
73+
@BeforeEach
74+
public void setupTestEnvironment() {
75+
TestsUtil.startWireMockRecording(harness.getIamEndpoint());
76+
}
77+
78+
/**
79+
* Cleans up the test environment after each test.
80+
*/
81+
@AfterEach
82+
public void cleanupTestEnvironment() {
83+
TestsUtil.stopWireMockRecording();
84+
}
85+
86+
@Test
87+
public void testAttachInlinePolicy() {
88+
AbstractIam iam = harness.createIamDriver(true);
89+
IamClient iamClient = new IamClient(iam);
90+
91+
Statement.StatementBuilder statementBuilder = Statement.builder()
92+
.effect(harness.getTestPolicyEffect());
93+
for (String action : harness.getTestPolicyActions()) {
94+
statementBuilder.action(action);
95+
}
96+
97+
PolicyDocument policyDocument = PolicyDocument.builder()
98+
.version(harness.getPolicyVersion())
99+
.statement(statementBuilder.build())
100+
.build();
101+
102+
iamClient.attachInlinePolicy(
103+
policyDocument,
104+
harness.getTenantId(),
105+
harness.getRegion(),
106+
harness.getIdentityName()
107+
);
108+
}
109+
110+
@Test
111+
public void testGetInlinePolicyDetails() {
112+
AbstractIam iam = harness.createIamDriver(true);
113+
IamClient iamClient = new IamClient(iam);
114+
115+
PolicyDocument policyDocument = PolicyDocument.builder()
116+
.version(harness.getPolicyVersion())
117+
.statement(Statement.builder()
118+
.effect(harness.getTestPolicyEffect())
119+
.action(harness.getTestPolicyName())
120+
.build())
121+
.build();
122+
123+
iamClient.attachInlinePolicy(
124+
policyDocument,
125+
harness.getTenantId(),
126+
harness.getRegion(),
127+
harness.getIdentityName()
128+
);
129+
130+
String policyDetails = iamClient.getInlinePolicyDetails(
131+
harness.getIdentityName(),
132+
harness.getTestPolicyName(),
133+
harness.getTenantId(),
134+
harness.getRegion()
135+
);
136+
Assertions.assertNotNull(policyDetails, "Policy details shouldn't be null");
137+
Assertions.assertFalse(policyDetails.trim().isEmpty(), "Policy details shouldn't be empty");
138+
}
139+
140+
@Test
141+
public void testGetAttachedPolicies() {
142+
AbstractIam iam = harness.createIamDriver(true);
143+
IamClient iamClient = new IamClient(iam);
144+
145+
Statement.StatementBuilder statementBuilder = Statement.builder()
146+
.effect(harness.getTestPolicyEffect());
147+
for (String action : harness.getTestPolicyActions()) {
148+
statementBuilder.action(action);
149+
}
150+
151+
PolicyDocument policyDocument = PolicyDocument.builder()
152+
.version(harness.getPolicyVersion())
153+
.statement(statementBuilder.build())
154+
.build();
155+
156+
iamClient.attachInlinePolicy(
157+
policyDocument,
158+
harness.getTenantId(),
159+
harness.getRegion(),
160+
harness.getIdentityName()
161+
);
162+
163+
List<String> attachedPolicies = iamClient.getAttachedPolicies(
164+
harness.getIdentityName(),
165+
harness.getTenantId(),
166+
harness.getRegion()
167+
);
168+
Assertions.assertNotNull(attachedPolicies, "Attached policies list shouldn't be null");
169+
Assertions.assertFalse(attachedPolicies.isEmpty(), "Attached policies list shouldn't be empty");
170+
}
171+
172+
@Test
173+
public void testRemovePolicy() {
174+
AbstractIam iam = harness.createIamDriver(true);
175+
IamClient iamClient = new IamClient(iam);
176+
177+
PolicyDocument policyDocument = PolicyDocument.builder()
178+
.version(harness.getPolicyVersion())
179+
.statement(Statement.builder()
180+
.effect(harness.getTestPolicyEffect())
181+
.action(harness.getTestPolicyName())
182+
.build())
183+
.build();
184+
185+
iamClient.attachInlinePolicy(
186+
policyDocument,
187+
harness.getTenantId(),
188+
harness.getRegion(),
189+
harness.getIdentityName()
190+
);
191+
192+
iamClient.removePolicy(
193+
harness.getIdentityName(),
194+
harness.getTestPolicyName(),
195+
harness.getTenantId(),
196+
harness.getRegion()
197+
);
198+
}
199+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package com.salesforce.multicloudj.iam.gcp;
2+
3+
import com.google.api.gax.core.FixedCredentialsProvider;
4+
import com.google.api.gax.rpc.TransportChannelProvider;
5+
import com.google.auth.oauth2.GoogleCredentials;
6+
import com.google.cloud.iam.admin.v1.IAMClient;
7+
import com.google.cloud.iam.admin.v1.IAMSettings;
8+
import com.google.cloud.resourcemanager.v3.ProjectsClient;
9+
import com.google.cloud.resourcemanager.v3.ProjectsSettings;
10+
import com.salesforce.multicloudj.common.gcp.GcpConstants;
11+
import com.salesforce.multicloudj.common.gcp.util.MockGoogleCredentialsFactory;
12+
import com.salesforce.multicloudj.common.gcp.util.TestsUtilGcp;
13+
import com.salesforce.multicloudj.iam.client.AbstractIamIT;
14+
import com.salesforce.multicloudj.iam.driver.AbstractIam;
15+
import org.junit.jupiter.api.Assertions;
16+
17+
import java.io.IOException;
18+
import java.util.List;
19+
import java.util.concurrent.ThreadLocalRandom;
20+
21+
public class GcpIamIT extends AbstractIamIT {
22+
@Override
23+
protected Harness createHarness() {
24+
return new HarnessImpl();
25+
}
26+
27+
public static class HarnessImpl implements AbstractIamIT.Harness {
28+
ProjectsClient projectsClient;
29+
IAMClient iamClient;
30+
int port = ThreadLocalRandom.current().nextInt(1000, 10000);
31+
32+
@Override
33+
public AbstractIam createIamDriver(boolean useValidCredentials) {
34+
boolean isRecordingEnabled = System.getProperty("record") != null;
35+
TransportChannelProvider channelProvider = TestsUtilGcp.getTransportChannelProvider(port);
36+
ProjectsSettings.Builder projectsSettingsBuilder = ProjectsSettings.newBuilder()
37+
.setTransportChannelProvider(channelProvider);
38+
try {
39+
if (isRecordingEnabled && useValidCredentials) {
40+
projectsClient = ProjectsClient.create(projectsSettingsBuilder.build());
41+
IAMSettings.Builder iamSettingsBuilder = IAMSettings.newBuilder();
42+
iamClient = IAMClient.create(iamSettingsBuilder.build());
43+
return new GcpIam.Builder()
44+
.withProjectsClient(projectsClient)
45+
.withIamClient(iamClient)
46+
.build();
47+
} else {
48+
GoogleCredentials mockCreds = MockGoogleCredentialsFactory.createMockCredentials();
49+
projectsSettingsBuilder.setCredentialsProvider(FixedCredentialsProvider.create(mockCreds));
50+
projectsClient = ProjectsClient.create(projectsSettingsBuilder.build());
51+
IAMSettings.Builder iamSettingsBuilder = IAMSettings.newBuilder()
52+
.setCredentialsProvider(FixedCredentialsProvider.create(mockCreds));
53+
iamClient = IAMClient.create(iamSettingsBuilder.build());
54+
return new GcpIam.Builder()
55+
.withProjectsClient(projectsClient)
56+
.withIamClient(iamClient)
57+
.build();
58+
}
59+
} catch (IOException e) {
60+
Assertions.fail("Failed to create GCP clients", e);
61+
return null;
62+
}
63+
}
64+
65+
@Override
66+
public String getIdentityName() {
67+
return "serviceAccount:[email protected]";
68+
}
69+
70+
@Override
71+
public String getTenantId() {
72+
return "projects/substrate-sdk-gcp-poc1";
73+
}
74+
75+
@Override
76+
public String getRegion() {
77+
return "us-west1";
78+
}
79+
80+
@Override
81+
public String getProviderId() {
82+
return GcpConstants.PROVIDER_ID;
83+
}
84+
85+
@Override
86+
public int getPort() {
87+
return port;
88+
}
89+
90+
@Override
91+
public List<String> getWiremockExtensions() {
92+
return List.of("com.salesforce.multicloudj.iam.gcp.util.IamJsonResponseTransformer");
93+
}
94+
95+
@Override
96+
public String getIamEndpoint() {
97+
return "https://cloudresourcemanager.googleapis.com";
98+
}
99+
100+
101+
@Override
102+
public String getTestPolicyEffect() {
103+
return "Allow";
104+
}
105+
106+
@Override
107+
public List<String> getTestPolicyActions() {
108+
return List.of("roles/storage.objectViewer", "roles/storage.objectCreator");
109+
}
110+
111+
@Override
112+
public String getTestPolicyName() {
113+
return "roles/storage.objectViewer";
114+
}
115+
116+
@Override
117+
public void close() {
118+
if (projectsClient != null) {
119+
projectsClient.close();
120+
}
121+
if (iamClient != null) {
122+
iamClient.close();
123+
}
124+
}
125+
}
126+
127+
}
128+

0 commit comments

Comments
 (0)