This is an automated email from the ASF dual-hosted git repository.

adutra 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 839bc257 Integration tests: improve support for temporary folders 
(#987)
839bc257 is described below

commit 839bc2573fb8dfcde6fb537a27a664a8a0e35b00
Author: Alexandre Dutra <[email protected]>
AuthorDate: Tue Feb 25 12:01:13 2025 +0100

    Integration tests: improve support for temporary folders (#987)
    
    3 integration tests currently require a temporary folder for various 
purposes. The folders are generally hard-coded to some local filesystem 
location, which makes those tests impossible to execute against a remote 
Polaris instance.
    
    This PR aims at fixing this situation by leveraging a new optional 
environment variable that points to a location that is accessible by both the 
server and the client running the tests. This would typically be an S3 bucket, 
for example, but could also be a shared volume mounted on both machines at the 
same mount point. If this environment variable is not present, then local 
execution is assumed and a temporary directory managed by JUnit is used instead.
---
 integration-tests/build.gradle.kts                 |  1 +
 .../service/it/env/IntegrationTestsHelper.java     | 57 ++++++++++++++++++
 .../it/test/PolarisApplicationIntegrationTest.java | 44 +++++---------
 .../it/test/PolarisRestCatalogIntegrationTest.java | 34 ++++++-----
 .../it/test/PolarisSparkIntegrationTest.java       |  9 ++-
 .../service/it/env/IntegrationTestsHelperTest.java | 68 ++++++++++++++++++++++
 6 files changed, 170 insertions(+), 43 deletions(-)

diff --git a/integration-tests/build.gradle.kts 
b/integration-tests/build.gradle.kts
index 6a2f587e..47f6ab80 100644
--- a/integration-tests/build.gradle.kts
+++ b/integration-tests/build.gradle.kts
@@ -62,6 +62,7 @@ dependencies {
 
   implementation(platform(libs.junit.bom))
   implementation("org.junit.jupiter:junit-jupiter")
+  implementation("org.junit.jupiter:junit-jupiter-api")
   compileOnly("org.junit.jupiter:junit-jupiter-engine")
   implementation(libs.assertj.core)
   implementation(libs.mockito.core)
diff --git 
a/integration-tests/src/main/java/org/apache/polaris/service/it/env/IntegrationTestsHelper.java
 
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/IntegrationTestsHelper.java
new file mode 100644
index 00000000..7e2a8e41
--- /dev/null
+++ 
b/integration-tests/src/main/java/org/apache/polaris/service/it/env/IntegrationTestsHelper.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.polaris.service.it.env;
+
+import com.google.common.annotations.VisibleForTesting;
+import java.net.URI;
+import java.nio.file.Path;
+import java.util.function.Function;
+
+public final class IntegrationTestsHelper {
+
+  /**
+   * The environment variable that can be used to override the temporary 
directory used by the
+   * integration tests.
+   */
+  public static final String INTEGRATION_TEST_TEMP_DIR_ENV_VAR = 
"INTEGRATION_TEST_TEMP_DIR";
+
+  private IntegrationTestsHelper() {}
+
+  /**
+   * Get the temporary directory to use for integration tests.
+   *
+   * <p>If the environment variable {@link #INTEGRATION_TEST_TEMP_DIR_ENV_VAR} 
is set, it will be
+   * used as the temporary directory. Otherwise, the default local temporary 
directory will be used.
+   *
+   * <p>The environment variable should be a URI, e.g. {@code 
"file:///tmp/polaris"} or {@code
+   * "s3://bucket/polaris"}. If the URI does not have a scheme, it will be 
assumed to be a local
+   * file URI.
+   */
+  public static URI getTemporaryDirectory(Path defaultLocalDirectory) {
+    return getTemporaryDirectory(System::getenv, defaultLocalDirectory);
+  }
+
+  @VisibleForTesting
+  static URI getTemporaryDirectory(Function<String, String> getenv, Path 
defaultLocalDirectory) {
+    String envVar = getenv.apply(INTEGRATION_TEST_TEMP_DIR_ENV_VAR);
+    envVar = envVar != null ? envVar : defaultLocalDirectory.toString();
+    envVar = envVar.startsWith("/") ? "file://" + envVar : envVar;
+    return URI.create(envVar + "/").normalize();
+  }
+}
diff --git 
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisApplicationIntegrationTest.java
 
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisApplicationIntegrationTest.java
index 7a2961e4..48dbce05 100644
--- 
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisApplicationIntegrationTest.java
+++ 
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisApplicationIntegrationTest.java
@@ -29,13 +29,12 @@ import jakarta.ws.rs.client.Invocation;
 import jakarta.ws.rs.core.Response;
 import jakarta.ws.rs.core.Response.Status;
 import java.io.IOException;
-import java.nio.file.Files;
+import java.net.URI;
 import java.nio.file.Path;
 import java.time.Duration;
 import java.time.temporal.ChronoUnit;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.io.FileUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.iceberg.BaseTable;
 import org.apache.iceberg.PartitionData;
@@ -75,6 +74,7 @@ import org.apache.polaris.core.entity.CatalogEntity;
 import org.apache.polaris.core.entity.PolarisEntityConstants;
 import org.apache.polaris.service.it.env.ClientCredentials;
 import org.apache.polaris.service.it.env.ClientPrincipal;
+import org.apache.polaris.service.it.env.IntegrationTestsHelper;
 import org.apache.polaris.service.it.env.PolarisApiEndpoints;
 import org.apache.polaris.service.it.env.PolarisClient;
 import org.apache.polaris.service.it.env.RestApi;
@@ -87,6 +87,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.io.TempDir;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 
@@ -109,7 +110,6 @@ public class PolarisApplicationIntegrationTest {
 
   public static final String PRINCIPAL_ROLE_ALL = "PRINCIPAL_ROLE:ALL";
 
-  private static Path testDir;
   private static String realm;
 
   private static RestApi managementApi;
@@ -118,25 +118,22 @@ public class PolarisApplicationIntegrationTest {
   private static ClientCredentials clientCredentials;
   private static ClientPrincipal admin;
   private static String authToken;
+  private static URI baseLocation;
 
   private String principalRoleName;
   private String internalCatalogName;
 
   @BeforeAll
-  public static void setup(PolarisApiEndpoints apiEndpoints, ClientPrincipal 
adminCredentials)
-      throws IOException {
+  public static void setup(
+      PolarisApiEndpoints apiEndpoints, ClientPrincipal adminCredentials, 
@TempDir Path tempDir) {
     endpoints = apiEndpoints;
     client = polarisClient(endpoints);
     realm = endpoints.realmId();
     admin = adminCredentials;
     clientCredentials = adminCredentials.credentials();
     authToken = client.obtainToken(clientCredentials);
-
-    testDir = Path.of("build/test_data/iceberg/" + realm);
-    FileUtils.deleteQuietly(testDir.toFile());
-    Files.createDirectories(testDir);
-
     managementApi = client.managementApi(clientCredentials);
+    baseLocation = 
IntegrationTestsHelper.getTemporaryDirectory(tempDir).resolve(realm + "/");
   }
 
   @AfterAll
@@ -443,9 +440,9 @@ public class PolarisApplicationIntegrationTest {
         Catalog.TypeEnum.EXTERNAL,
         principalRoleName,
         FileStorageConfigInfo.builder(StorageConfigInfo.StorageTypeEnum.FILE)
-            .setAllowedLocations(List.of("file://" + 
testDir.toFile().getAbsolutePath()))
+            .setAllowedLocations(List.of(baseLocation.toString()))
             .build(),
-        "file://" + testDir.toFile().getAbsolutePath());
+        baseLocation.toString());
     try (RESTSessionCatalog sessionCatalog = newSessionCatalog(catalogName);
         HadoopFileIO fileIo = new HadoopFileIO(new Configuration())) {
       SessionCatalog.SessionContext sessionContext = 
SessionCatalog.SessionContext.createEmpty();
@@ -453,9 +450,7 @@ public class PolarisApplicationIntegrationTest {
       sessionCatalog.createNamespace(sessionContext, ns);
       TableIdentifier tableIdentifier = TableIdentifier.of(ns, "the_table");
       String location =
-          "file://"
-              + testDir.toFile().getAbsolutePath()
-              + "/testIcebergRegisterTableInExternalCatalog";
+          
baseLocation.resolve("testIcebergRegisterTableInExternalCatalog").toString();
       String metadataLocation = location + 
"/metadata/000001-494949494949494949.metadata.json";
 
       TableMetadata tableMetadata =
@@ -489,19 +484,16 @@ public class PolarisApplicationIntegrationTest {
         Catalog.TypeEnum.EXTERNAL,
         principalRoleName,
         FileStorageConfigInfo.builder(StorageConfigInfo.StorageTypeEnum.FILE)
-            .setAllowedLocations(List.of("file://" + 
testDir.toFile().getAbsolutePath()))
+            .setAllowedLocations(List.of(baseLocation.toString()))
             .build(),
-        "file://" + testDir.toFile().getAbsolutePath());
+        baseLocation.toString());
     try (RESTSessionCatalog sessionCatalog = newSessionCatalog(catalogName);
         HadoopFileIO fileIo = new HadoopFileIO(new Configuration())) {
       SessionCatalog.SessionContext sessionContext = 
SessionCatalog.SessionContext.createEmpty();
       Namespace ns = Namespace.of("db1");
       sessionCatalog.createNamespace(sessionContext, ns);
       TableIdentifier tableIdentifier = TableIdentifier.of(ns, "the_table");
-      String location =
-          "file://"
-              + testDir.toFile().getAbsolutePath()
-              + "/testIcebergUpdateTableInExternalCatalog";
+      String location = 
baseLocation.resolve("testIcebergUpdateTableInExternalCatalog").toString();
       String metadataLocation = location + 
"/metadata/000001-494949494949494949.metadata.json";
 
       Types.NestedField col1 = Types.NestedField.of(1, false, "col1", 
Types.StringType.get());
@@ -541,20 +533,16 @@ public class PolarisApplicationIntegrationTest {
         Catalog.TypeEnum.EXTERNAL,
         principalRoleName,
         FileStorageConfigInfo.builder(StorageConfigInfo.StorageTypeEnum.FILE)
-            .setAllowedLocations(List.of("file://" + 
testDir.toFile().getAbsolutePath()))
+            .setAllowedLocations(List.of(baseLocation.toString()))
             .build(),
-        "file://" + testDir.toFile().getAbsolutePath());
+        baseLocation.toString());
     try (RESTSessionCatalog sessionCatalog = newSessionCatalog(catalogName);
         HadoopFileIO fileIo = new HadoopFileIO(new Configuration())) {
       SessionCatalog.SessionContext sessionContext = 
SessionCatalog.SessionContext.createEmpty();
       Namespace ns = Namespace.of("db1");
       sessionCatalog.createNamespace(sessionContext, ns);
       TableIdentifier tableIdentifier = TableIdentifier.of(ns, "the_table");
-      String location =
-          "file://"
-              + testDir.toFile().getAbsolutePath()
-              + "/"
-              + "testIcebergDropTableInExternalCatalog";
+      String location = 
baseLocation.resolve("testIcebergDropTableInExternalCatalog").toString();
       String metadataLocation = location + 
"/metadata/000001-494949494949494949.metadata.json";
 
       TableMetadata tableMetadata =
diff --git 
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogIntegrationTest.java
 
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogIntegrationTest.java
index bc774c1c..505465d1 100644
--- 
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogIntegrationTest.java
+++ 
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogIntegrationTest.java
@@ -29,6 +29,8 @@ import jakarta.ws.rs.core.Response;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.reflect.Method;
+import java.net.URI;
+import java.nio.file.Path;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -79,6 +81,7 @@ import org.apache.polaris.core.entity.PolarisEntityConstants;
 import org.apache.polaris.service.it.env.CatalogApi;
 import org.apache.polaris.service.it.env.ClientCredentials;
 import org.apache.polaris.service.it.env.IcebergHelper;
+import org.apache.polaris.service.it.env.IntegrationTestsHelper;
 import org.apache.polaris.service.it.env.ManagementApi;
 import org.apache.polaris.service.it.env.PolarisApiEndpoints;
 import org.apache.polaris.service.it.env.PolarisClient;
@@ -92,6 +95,7 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInfo;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.io.TempDir;
 
 /**
  * Import the full core Iceberg catalog tests by hitting the REST service via 
the RESTCatalog
@@ -108,9 +112,9 @@ public class PolarisRestCatalogIntegrationTest extends 
CatalogTests<RESTCatalog>
   private static final String TEST_ROLE_ARN =
       Optional.ofNullable(System.getenv("INTEGRATION_TEST_ROLE_ARN"))
           .orElse("arn:aws:iam::123456789012:role/my-role");
-  private static final String S3_BUCKET_BASE =
-      Optional.ofNullable(System.getenv("INTEGRATION_TEST_S3_PATH"))
-          .orElse("file:///tmp/buckets/my-bucket");
+
+  private static URI s3BucketBase;
+  private static URI externalCatalogBase;
 
   protected static final String VIEW_QUERY = "select * from ns1.layer1_table";
   private static String principalRoleName;
@@ -125,7 +129,7 @@ public class PolarisRestCatalogIntegrationTest extends 
CatalogTests<RESTCatalog>
   private String currentCatalogName;
 
   private final String catalogBaseLocation =
-      S3_BUCKET_BASE + "/" + System.getenv("USER") + "/path/to/data";
+      s3BucketBase + "/" + System.getenv("USER") + "/path/to/data";
 
   private static final String[] DEFAULT_CATALOG_PROPERTIES = {
     "allow.unstructured.table.location", "true",
@@ -148,7 +152,8 @@ public class PolarisRestCatalogIntegrationTest extends 
CatalogTests<RESTCatalog>
   }
 
   @BeforeAll
-  static void setup(PolarisApiEndpoints apiEndpoints, ClientCredentials 
credentials) {
+  static void setup(
+      PolarisApiEndpoints apiEndpoints, ClientCredentials credentials, 
@TempDir Path tempDir) {
     adminCredentials = credentials;
     endpoints = apiEndpoints;
     client = polarisClient(endpoints);
@@ -157,6 +162,9 @@ public class PolarisRestCatalogIntegrationTest extends 
CatalogTests<RESTCatalog>
     principalRoleName = client.newEntityName("rest-admin");
     principalCredentials = 
managementApi.createPrincipalWithRole(principalName, principalRoleName);
     catalogApi = client.catalogApi(principalCredentials);
+    URI testRootUri = IntegrationTestsHelper.getTemporaryDirectory(tempDir);
+    s3BucketBase = testRootUri.resolve("my-bucket");
+    externalCatalogBase = testRootUri.resolve("external-catalog");
   }
 
   @AfterAll
@@ -192,7 +200,7 @@ public class PolarisRestCatalogIntegrationTest extends 
CatalogTests<RESTCatalog>
     for (int i = 0; i < properties.length; i += 2) {
       catalogPropsBuilder.addProperty(properties[i], properties[i + 1]);
     }
-    if (!S3_BUCKET_BASE.startsWith("file:/")) {
+    if (!s3BucketBase.getScheme().equals("file")) {
       catalogPropsBuilder.addProperty(
           CatalogEntity.REPLACE_NEW_LOCATION_PREFIX_WITH_CATALOG_DEFAULT_KEY, 
"file:");
     }
@@ -202,7 +210,7 @@ public class PolarisRestCatalogIntegrationTest extends 
CatalogTests<RESTCatalog>
             .setName(currentCatalogName)
             .setProperties(catalogPropsBuilder.build())
             .setStorageConfigInfo(
-                S3_BUCKET_BASE.startsWith("file:/")
+                s3BucketBase.getScheme().equals("file")
                     ? new FileStorageConfigInfo(
                         StorageConfigInfo.StorageTypeEnum.FILE, 
List.of("file://"))
                     : awsConfigModel)
@@ -541,12 +549,12 @@ public class PolarisRestCatalogIntegrationTest extends 
CatalogTests<RESTCatalog>
         TableMetadata.newTableMetadata(
             new Schema(List.of(Types.NestedField.of(1, false, "col1", new 
Types.StringType()))),
             PartitionSpec.unpartitioned(),
-            "file:///tmp/ns1/my_table",
+            externalCatalogBase + "/ns1/my_table",
             Map.of());
     try (ResolvingFileIO resolvingFileIO = new ResolvingFileIO()) {
       resolvingFileIO.initialize(Map.of());
       resolvingFileIO.setConf(new Configuration());
-      String fileLocation = 
"file:///tmp/ns1/my_table/metadata/v1.metadata.json";
+      String fileLocation = externalCatalogBase + 
"/ns1/my_table/metadata/v1.metadata.json";
       TableMetadataParser.write(tableMetadata, 
resolvingFileIO.newOutputFile(fileLocation));
       restCatalog.registerTable(TableIdentifier.of(ns1, "my_table"), 
fileLocation);
       try {
@@ -576,12 +584,12 @@ public class PolarisRestCatalogIntegrationTest extends 
CatalogTests<RESTCatalog>
         TableMetadata.newTableMetadata(
             new Schema(List.of(Types.NestedField.of(1, false, "col1", new 
Types.StringType()))),
             PartitionSpec.unpartitioned(),
-            "file:///tmp/ns1/my_table",
+            externalCatalogBase + "/ns1/my_table",
             Map.of());
     try (ResolvingFileIO resolvingFileIO = new ResolvingFileIO()) {
       resolvingFileIO.initialize(Map.of());
       resolvingFileIO.setConf(new Configuration());
-      String fileLocation = 
"file:///tmp/ns1/my_table/metadata/v1.metadata.json";
+      String fileLocation = externalCatalogBase + 
"/ns1/my_table/metadata/v1.metadata.json";
       TableMetadataParser.write(tableMetadata, 
resolvingFileIO.newOutputFile(fileLocation));
       restCatalog.registerTable(TableIdentifier.of(ns1, "my_table"), 
fileLocation);
       try {
@@ -610,12 +618,12 @@ public class PolarisRestCatalogIntegrationTest extends 
CatalogTests<RESTCatalog>
         TableMetadata.newTableMetadata(
             new Schema(List.of(Types.NestedField.of(1, false, "col1", new 
Types.StringType()))),
             PartitionSpec.unpartitioned(),
-            "file:///tmp/ns1/my_table",
+            externalCatalogBase + "/ns1/my_table",
             Map.of());
     try (ResolvingFileIO resolvingFileIO = new ResolvingFileIO()) {
       resolvingFileIO.initialize(Map.of());
       resolvingFileIO.setConf(new Configuration());
-      String fileLocation = 
"file:///tmp/ns1/my_table/metadata/v1.metadata.json";
+      String fileLocation = externalCatalogBase + 
"/ns1/my_table/metadata/v1.metadata.json";
       TableMetadataParser.write(tableMetadata, 
resolvingFileIO.newOutputFile(fileLocation));
       restCatalog.registerTable(TableIdentifier.of(ns1, "my_table"), 
fileLocation);
       try {
diff --git 
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisSparkIntegrationTest.java
 
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisSparkIntegrationTest.java
index e7fa2dce..3625c69e 100644
--- 
a/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisSparkIntegrationTest.java
+++ 
b/integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisSparkIntegrationTest.java
@@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableMap;
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.core.Response;
 import java.io.IOException;
+import java.net.URI;
 import java.nio.file.Path;
 import java.time.Instant;
 import java.util.List;
@@ -41,6 +42,7 @@ import org.apache.polaris.core.admin.model.PolarisCatalog;
 import org.apache.polaris.core.admin.model.StorageConfigInfo;
 import org.apache.polaris.service.it.env.CatalogApi;
 import org.apache.polaris.service.it.env.ClientCredentials;
+import org.apache.polaris.service.it.env.IntegrationTestsHelper;
 import org.apache.polaris.service.it.env.ManagementApi;
 import org.apache.polaris.service.it.env.PolarisApiEndpoints;
 import org.apache.polaris.service.it.env.PolarisClient;
@@ -82,7 +84,7 @@ public class PolarisSparkIntegrationTest {
   private String catalogName;
   private String externalCatalogName;
 
-  @TempDir public Path warehouseDir;
+  private URI warehouseDir;
 
   @BeforeAll
   public static void setup() throws IOException {
@@ -95,13 +97,16 @@ public class PolarisSparkIntegrationTest {
   }
 
   @BeforeEach
-  public void before(PolarisApiEndpoints apiEndpoints, ClientCredentials 
credentials) {
+  public void before(
+      PolarisApiEndpoints apiEndpoints, ClientCredentials credentials, 
@TempDir Path tempDir) {
     endpoints = apiEndpoints;
     client = polarisClient(endpoints);
     sparkToken = client.obtainToken(credentials);
     managementApi = client.managementApi(credentials);
     catalogApi = client.catalogApi(credentials);
 
+    warehouseDir = 
IntegrationTestsHelper.getTemporaryDirectory(tempDir).resolve("spark-warehouse");
+
     catalogName = client.newEntityName("spark_catalog");
     externalCatalogName = client.newEntityName("spark_ext_catalog");
 
diff --git 
a/integration-tests/src/test/java/org/apache/polaris/service/it/env/IntegrationTestsHelperTest.java
 
b/integration-tests/src/test/java/org/apache/polaris/service/it/env/IntegrationTestsHelperTest.java
new file mode 100644
index 00000000..ad65f759
--- /dev/null
+++ 
b/integration-tests/src/test/java/org/apache/polaris/service/it/env/IntegrationTestsHelperTest.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.polaris.service.it.env;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.net.URI;
+import java.nio.file.Path;
+import java.util.stream.Stream;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+class IntegrationTestsHelperTest {
+
+  @ParameterizedTest
+  @MethodSource
+  void getTemporaryDirectory(String envVar, Path local, URI expected) {
+    URI actual = IntegrationTestsHelper.getTemporaryDirectory(s -> envVar, 
local);
+    assertThat(actual).isEqualTo(expected);
+  }
+
+  static Stream<Arguments> getTemporaryDirectory() {
+    return Stream.of(
+        Arguments.of(null, Path.of("/tmp/polaris"), 
URI.create("file:///tmp/polaris/")),
+        Arguments.of(null, Path.of("/tmp/polaris/"), 
URI.create("file:///tmp/polaris/")),
+        Arguments.of(
+            "file:///tmp/polaris/from-env",
+            Path.of("/tmp/polaris/default"),
+            URI.create("file:///tmp/polaris/from-env/")),
+        Arguments.of(
+            "file:///tmp/polaris/from-env/",
+            Path.of("/tmp/polaris/default"),
+            URI.create("file:///tmp/polaris/from-env/")),
+        Arguments.of(
+            "/tmp/polaris/from-env",
+            Path.of("/tmp/polaris/default"),
+            URI.create("file:///tmp/polaris/from-env/")),
+        Arguments.of(
+            "/tmp/polaris/from-env/",
+            Path.of("/tmp/polaris/default"),
+            URI.create("file:///tmp/polaris/from-env/")),
+        Arguments.of(
+            "s3://bucket/polaris/from-env",
+            Path.of("/tmp/polaris/default"),
+            URI.create("s3://bucket/polaris/from-env/")),
+        Arguments.of(
+            "s3://bucket/polaris/from-env/",
+            Path.of("/tmp/polaris/default"),
+            URI.create("s3://bucket/polaris/from-env/")));
+  }
+}

Reply via email to