This is an automated email from the ASF dual-hosted git repository.
yufei pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new d8c8920ea Improve test coverage for invalid inputs in Policy APIs
(#1665)
d8c8920ea is described below
commit d8c8920ea62ff916a8c4c5d910ad6308b6f6d409
Author: William Hyun <[email protected]>
AuthorDate: Tue May 27 15:02:07 2025 -0700
Improve test coverage for invalid inputs in Policy APIs (#1665)
---
.../test/PolarisPolicyServiceIntegrationTest.java | 254 +++++++++++++++++++++
1 file changed, 254 insertions(+)
diff --git
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java
index c610f13ff..c836ffdab 100644
---
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java
+++
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisPolicyServiceIntegrationTest.java
@@ -73,10 +73,13 @@ import org.apache.polaris.service.it.env.PolarisClient;
import org.apache.polaris.service.it.env.PolicyApi;
import org.apache.polaris.service.it.ext.PolarisIntegrationTestExtension;
import org.apache.polaris.service.types.ApplicablePolicy;
+import org.apache.polaris.service.types.AttachPolicyRequest;
import org.apache.polaris.service.types.CreatePolicyRequest;
+import org.apache.polaris.service.types.DetachPolicyRequest;
import org.apache.polaris.service.types.Policy;
import org.apache.polaris.service.types.PolicyAttachmentTarget;
import org.apache.polaris.service.types.PolicyIdentifier;
+import org.apache.polaris.service.types.UpdatePolicyRequest;
import org.assertj.core.api.Assertions;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.AfterAll;
@@ -107,6 +110,13 @@ public class PolarisPolicyServiceIntegrationTest {
private static final PolicyIdentifier NS1_P3 = new PolicyIdentifier(NS1,
"P3");
private static final TableIdentifier NS2_T1 = TableIdentifier.of(NS2, "T1");
+ private static final String NS1_NAME = RESTUtil.encodeNamespace(NS1);
+ private static final String INVALID_NAMESPACE = "INVALID_NAMESPACE";
+ private static final String INVALID_POLICY = "INVALID_POLICY";
+ private static final String INVALID_TABLE = "INVALID_TABLE";
+ private static final String INVALID_NAMESPACE_MSG =
+ "Namespace does not exist: " + INVALID_NAMESPACE;
+
private static URI s3BucketBase;
private static String principalRoleName;
private static ClientCredentials adminCredentials;
@@ -333,6 +343,141 @@ public class PolarisPolicyServiceIntegrationTest {
}
}
+ @Test
+ public void testCreatePolicyWithNonExistingNamespace() {
+ CreatePolicyRequest request =
+ CreatePolicyRequest.builder()
+ .setType(PredefinedPolicyTypes.DATA_COMPACTION.getName())
+ .setName(currentCatalogName)
+ .setDescription("test policy")
+ .setContent(EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT)
+ .build();
+ try (Response res =
+ policyApi
+ .request(
+ "polaris/v1/{cat}/namespaces/{ns}/policies",
+ Map.of("cat", currentCatalogName, "ns", INVALID_NAMESPACE))
+ .post(Entity.json(request))) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+
Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG);
+ }
+ }
+
+ @Test
+ public void testAttachPolicyToNonExistingNamespace() {
+ restCatalog.createNamespace(NS1);
+ policyApi.createPolicy(
+ currentCatalogName,
+ NS1_P1,
+ PredefinedPolicyTypes.DATA_COMPACTION,
+ EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT,
+ "test policy");
+
+ Namespace invalidNamespace = Namespace.of(INVALID_NAMESPACE);
+ var invalidTarget =
+ new PolicyAttachmentTarget(
+ PolicyAttachmentTarget.TypeEnum.NAMESPACE,
List.of(invalidNamespace.levels()));
+
+ AttachPolicyRequest request =
+
AttachPolicyRequest.builder().setTarget(invalidTarget).setParameters(Map.of()).build();
+ try (Response res =
+ policyApi
+ .request(
+
"polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings",
+ Map.of("cat", currentCatalogName, "ns", NS1_NAME,
"policy-name", NS1_P1.getName()))
+ .put(Entity.json(request))) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+
Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG);
+ }
+ policyApi.dropPolicy(currentCatalogName, NS1_P1);
+ }
+
+ @Test
+ public void testAttachPolicyToNonExistingTable() {
+ restCatalog.createNamespace(NS1);
+ policyApi.createPolicy(
+ currentCatalogName,
+ NS1_P1,
+ PredefinedPolicyTypes.DATA_COMPACTION,
+ EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT,
+ "test policy");
+ TableIdentifier invalidTable = TableIdentifier.of(NS1, INVALID_TABLE);
+ var invalidTarget =
+ new PolicyAttachmentTarget(
+ PolicyAttachmentTarget.TypeEnum.TABLE_LIKE,
+ List.of(invalidTable.toString().split("\\.")));
+
+ AttachPolicyRequest request =
+
AttachPolicyRequest.builder().setTarget(invalidTarget).setParameters(Map.of()).build();
+ try (Response res =
+ policyApi
+ .request(
+
"polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings",
+ Map.of("cat", currentCatalogName, "ns", NS1_NAME,
"policy-name", NS1_P1.getName()))
+ .put(Entity.json(request))) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+ Assertions.assertThat(res.readEntity(String.class))
+ .contains("Table or view does not exist: " + NS1_NAME + "." +
INVALID_TABLE);
+ }
+ policyApi.dropPolicy(currentCatalogName, NS1_P1);
+ }
+
+ @Test
+ public void testDetachPolicyFromNonExistingNamespace() {
+ restCatalog.createNamespace(NS1);
+ policyApi.createPolicy(
+ currentCatalogName,
+ NS1_P1,
+ PredefinedPolicyTypes.DATA_COMPACTION,
+ EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT,
+ "test policy");
+ Namespace invalidNamespace = Namespace.of(INVALID_NAMESPACE);
+ var invalidTarget =
+ new PolicyAttachmentTarget(
+ PolicyAttachmentTarget.TypeEnum.NAMESPACE,
List.of(invalidNamespace.levels()));
+
+ DetachPolicyRequest request =
DetachPolicyRequest.builder().setTarget(invalidTarget).build();
+ try (Response res =
+ policyApi
+ .request(
+
"polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings",
+ Map.of("cat", currentCatalogName, "ns", NS1_NAME,
"policy-name", NS1_P1.getName()))
+ .post(Entity.json(request))) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+
Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG);
+ }
+ policyApi.dropPolicy(currentCatalogName, NS1_P1);
+ }
+
+ @Test
+ public void testDetachPolicyFromNonExistingTable() {
+ restCatalog.createNamespace(NS1);
+ policyApi.createPolicy(
+ currentCatalogName,
+ NS1_P1,
+ PredefinedPolicyTypes.DATA_COMPACTION,
+ EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT,
+ "test policy");
+ TableIdentifier invalidTable = TableIdentifier.of(NS1, INVALID_TABLE);
+ var invalidTarget =
+ new PolicyAttachmentTarget(
+ PolicyAttachmentTarget.TypeEnum.TABLE_LIKE,
+ List.of(invalidTable.toString().split("\\.")));
+
+ DetachPolicyRequest request =
DetachPolicyRequest.builder().setTarget(invalidTarget).build();
+ try (Response res =
+ policyApi
+ .request(
+
"polaris/v1/{cat}/namespaces/{ns}/policies/{policy-name}/mappings",
+ Map.of("cat", currentCatalogName, "ns", NS1_NAME,
"policy-name", NS1_P1.getName()))
+ .post(Entity.json(request))) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+ Assertions.assertThat(res.readEntity(String.class))
+ .contains("Table or view does not exist: " + NS1_NAME + "." +
INVALID_TABLE);
+ }
+ policyApi.dropPolicy(currentCatalogName, NS1_P1);
+ }
+
@Test
public void testDropPolicy() {
restCatalog.createNamespace(NS1);
@@ -359,6 +504,24 @@ public class PolarisPolicyServiceIntegrationTest {
.hasSize(0);
}
+ @Test
+ public void testDropNonExistingPolicy() {
+ restCatalog.createNamespace(NS1);
+ try (Response res =
+ policyApi
+ .request(
+ "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}",
+ Map.of("cat", currentCatalogName, "ns", NS1_NAME, "policy",
INVALID_POLICY))
+ .delete()) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+ Assertions.assertThat(res.readEntity(String.class))
+ .contains(
+ "Policy does not exist: class PolicyIdentifier",
+ "namespace: " + NS1_NAME,
+ "name: " + INVALID_POLICY);
+ }
+ }
+
@Test
public void testUpdatePolicy() {
restCatalog.createNamespace(NS1);
@@ -387,6 +550,29 @@ public class PolarisPolicyServiceIntegrationTest {
policyApi.dropPolicy(currentCatalogName, NS1_P1);
}
+ @Test
+ public void testUpdateNonExistingPolicy() {
+ restCatalog.createNamespace(NS1);
+ UpdatePolicyRequest request =
+ UpdatePolicyRequest.builder()
+ .setContent("{\"enable\":false}")
+ .setDescription("updated test policy")
+ .build();
+ try (Response res =
+ policyApi
+ .request(
+ "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}",
+ Map.of("cat", currentCatalogName, "ns", NS1_NAME, "policy",
INVALID_POLICY))
+ .put(Entity.json(request))) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+ Assertions.assertThat(res.readEntity(String.class))
+ .contains(
+ "Policy does not exist: class PolicyIdentifier",
+ "namespace: " + NS1_NAME,
+ "name: " + INVALID_POLICY);
+ }
+ }
+
@Test
public void testListPolicies() {
restCatalog.createNamespace(NS1);
@@ -417,6 +603,74 @@ public class PolarisPolicyServiceIntegrationTest {
policyApi.dropPolicy(currentCatalogName, NS1_P2);
}
+ @Test
+ public void testListPoliciesOnNonExistingNamespace() {
+ try (Response res =
+ policyApi
+ .request(
+ "polaris/v1/{cat}/namespaces/{ns}/policies",
+ Map.of("cat", currentCatalogName, "ns", INVALID_NAMESPACE))
+ .get()) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+
Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG);
+ }
+ }
+
+ @Test
+ public void testGetApplicablePoliciesOnNonExistingNamespace() {
+ try (Response res =
+ policyApi
+ .request(
+ "polaris/v1/{cat}/applicable-policies",
+ Map.of("cat", currentCatalogName),
+ Map.of("namespace", INVALID_NAMESPACE))
+ .get()) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+
Assertions.assertThat(res.readEntity(String.class)).contains(INVALID_NAMESPACE_MSG);
+ }
+ }
+
+ @Test
+ public void testGetApplicablePoliciesOnNonExistingTable() {
+ restCatalog.createNamespace(NS1);
+ policyApi.createPolicy(
+ currentCatalogName,
+ NS1_P1,
+ PredefinedPolicyTypes.DATA_COMPACTION,
+ EXAMPLE_TABLE_MAINTENANCE_POLICY_CONTENT,
+ "test policy");
+ try (Response res =
+ policyApi
+ .request(
+ "polaris/v1/{cat}/applicable-policies",
+ Map.of("cat", currentCatalogName),
+ Map.of("namespace", NS1_NAME, "target-name", INVALID_TABLE))
+ .get()) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+ Assertions.assertThat(res.readEntity(String.class))
+ .contains("Table does not exist: " + NS1_NAME + "." + INVALID_TABLE);
+ }
+ policyApi.dropPolicy(currentCatalogName, NS1_P1);
+ }
+
+ @Test
+ public void testLoadNonExistingPolicy() {
+ restCatalog.createNamespace(NS1);
+ try (Response res =
+ policyApi
+ .request(
+ "polaris/v1/{cat}/namespaces/{ns}/policies/{policy}",
+ Map.of("cat", currentCatalogName, "ns", NS1_NAME, "policy",
INVALID_POLICY))
+ .get()) {
+
Assertions.assertThat(res.getStatus()).isEqualTo(Response.Status.NOT_FOUND.getStatusCode());
+ Assertions.assertThat(res.readEntity(String.class))
+ .contains(
+ "Policy does not exist: class PolicyIdentifier",
+ "namespace: " + NS1_NAME,
+ "name: " + INVALID_POLICY);
+ }
+ }
+
@Test
public void testPolicyMapping() {
restCatalog.createNamespace(NS1);