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

github-bot pushed a commit to branch gh-pages
in repository https://gitbox.apache.org/repos/asf/iceberg-rust.git


The following commit(s) were added to refs/heads/gh-pages by this push:
     new 2c2dd039a deploy: 946a28fa3714ec4425fb31e295020b2c4ae2d06b
2c2dd039a is described below

commit 2c2dd039a349abd2b5eba2a5232dca370ada10bb
Author: liurenjie1024 <[email protected]>
AuthorDate: Wed Jan 28 00:23:10 2026 +0000

    deploy: 946a28fa3714ec4425fb31e295020b2c4ae2d06b
---
 api/iceberg_integration_tests/all.html             |   2 +-
 .../fn.get_test_fixture.html                       |   3 +
 .../fn.set_test_fixture.html                       |   4 +-
 api/iceberg_integration_tests/index.html           |   6 +-
 api/iceberg_integration_tests/sidebar-items.js     |   2 +-
 ...tFixture.html => struct.GlobalTestFixture.html} |   9 +-
 .../struct.TestFixture.html                        |   6 +-
 api/iceberg_test_utils/all.html                    |   2 +-
 .../common/constant.DEFAULT_GCS_PORT.html          |  11 ++
 .../common/constant.DEFAULT_GLUE_PORT.html         |  11 ++
 .../common/constant.DEFAULT_HMS_PORT.html          |  11 ++
 .../common/constant.DEFAULT_MINIO_PORT.html        |  11 ++
 .../common/constant.DEFAULT_REST_CATALOG_PORT.html |  11 ++
 .../common/constant.ENV_GCS_ENDPOINT.html          |  11 ++
 .../common/constant.ENV_GLUE_ENDPOINT.html         |  11 ++
 .../common/constant.ENV_HMS_ENDPOINT.html          |  11 ++
 .../common/constant.ENV_MINIO_ENDPOINT.html        |  11 ++
 .../common/constant.ENV_REST_CATALOG_ENDPOINT.html |  11 ++
 .../common/fn.cleanup_namespace.html               |  11 ++
 .../common/fn.get_gcs_endpoint.html                |  11 ++
 .../common/fn.get_glue_endpoint.html               |  11 ++
 .../common/fn.get_hms_endpoint.html                |  11 ++
 .../common/fn.get_minio_endpoint.html              |  11 ++
 .../common/fn.get_rest_catalog_endpoint.html       |  11 ++
 .../constant.DEFAULT_GCS_PORT.html                 |   1 +
 .../constant.DEFAULT_GLUE_PORT.html                |   1 +
 .../constant.DEFAULT_HMS_PORT.html                 |   1 +
 .../constant.DEFAULT_MINIO_PORT.html               |   1 +
 .../constant.DEFAULT_REST_CATALOG_PORT.html        |   1 +
 .../constant.ENV_GCS_ENDPOINT.html                 |   1 +
 .../constant.ENV_GLUE_ENDPOINT.html                |   1 +
 .../constant.ENV_HMS_ENDPOINT.html                 |   1 +
 .../constant.ENV_MINIO_ENDPOINT.html               |   1 +
 .../constant.ENV_REST_CATALOG_ENDPOINT.html        |   1 +
 .../docker/struct.DockerCompose.html               |  34 +++++-
 api/iceberg_test_utils/fn.cleanup_namespace.html   |   3 +
 api/iceberg_test_utils/fn.get_gcs_endpoint.html    |   3 +
 api/iceberg_test_utils/fn.get_glue_endpoint.html   |   3 +
 api/iceberg_test_utils/fn.get_hms_endpoint.html    |   3 +
 api/iceberg_test_utils/fn.get_minio_endpoint.html  |   3 +
 .../fn.get_rest_catalog_endpoint.html              |   3 +
 api/iceberg_test_utils/fn.normalize_test_name.html |   2 +-
 api/iceberg_test_utils/fn.set_up.html              |   2 +-
 api/iceberg_test_utils/index.html                  |  11 +-
 .../macro.normalize_test_name_with_parts!.html     |  11 ++
 .../macro.normalize_test_name_with_parts.html      |  12 ++
 api/iceberg_test_utils/sidebar-items.js            |   2 +-
 api/search-index.js                                |   4 +-
 .../iceberg_integration_tests-desc-0-.js           |   2 +-
 .../iceberg_test_utils-desc-0-.js                  |   2 +-
 api/src/iceberg_integration_tests/lib.rs.html      | 132 ++++++++++++++-------
 api/src/iceberg_test_utils/lib.rs.html             |  99 ++++++++++++++--
 api/trait.impl/core/marker/trait.Freeze.js         |   4 +-
 api/trait.impl/core/marker/trait.Send.js           |   4 +-
 api/trait.impl/core/marker/trait.Sync.js           |   4 +-
 api/trait.impl/core/marker/trait.Unpin.js          |   4 +-
 api/trait.impl/core/marker/trait.UnsafeUnpin.js    |   4 +-
 .../core/panic/unwind_safe/trait.RefUnwindSafe.js  |   4 +-
 .../core/panic/unwind_safe/trait.UnwindSafe.js     |   4 +-
 59 files changed, 486 insertions(+), 93 deletions(-)

diff --git a/api/iceberg_integration_tests/all.html 
b/api/iceberg_integration_tests/all.html
index b091dcd86..836b271df 100644
--- a/api/iceberg_integration_tests/all.html
+++ b/api/iceberg_integration_tests/all.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="List of 
all items in this crate"><title>List of all items in this 
crate</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Mediu
 [...]
\ No newline at end of file
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="List of 
all items in this crate"><title>List of all items in this 
crate</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Mediu
 [...]
\ No newline at end of file
diff --git a/api/iceberg_integration_tests/fn.get_test_fixture.html 
b/api/iceberg_integration_tests/fn.get_test_fixture.html
new file mode 100644
index 000000000..973103080
--- /dev/null
+++ b/api/iceberg_integration_tests/fn.get_test_fixture.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Returns a 
reference to the global test fixture. This fixture assumes Docker containers 
are started externally."><title>get_test_fixture in iceberg_integration_tests - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regu
 [...]
+This fixture assumes Docker containers are started externally.</p>
+</div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_integration_tests/fn.set_test_fixture.html 
b/api/iceberg_integration_tests/fn.set_test_fixture.html
index dbbf99df1..cc1337469 100644
--- a/api/iceberg_integration_tests/fn.set_test_fixture.html
+++ b/api/iceberg_integration_tests/fn.set_test_fixture.html
@@ -1 +1,3 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `set_test_fixture` fn in crate 
`iceberg_integration_tests`."><title>set_test_fixture in 
iceberg_integration_tests - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.wof
 [...]
\ No newline at end of file
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Legacy 
function to create a test fixture with Docker container management. Deprecated: 
prefer using `get_test_fixture()` with externally managed 
containers."><title>set_test_fixture in iceberg_integration_tests - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.ins 
[...]
+Deprecated: prefer using <code>get_test_fixture()</code> with externally 
managed containers.</p>
+</div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_integration_tests/index.html 
b/api/iceberg_integration_tests/index.html
index 7e3ca3970..1ec0b534a 100644
--- a/api/iceberg_integration_tests/index.html
+++ b/api/iceberg_integration_tests/index.html
@@ -1 +1,5 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `iceberg_integration_tests` 
crate."><title>iceberg_integration_tests - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Re
 [...]
\ No newline at end of file
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `iceberg_integration_tests` 
crate."><title>iceberg_integration_tests - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Re
 [...]
+This assumes Docker containers are started externally (e.g., via <code>make 
docker-up</code>).</dd><dt><a class="struct" href="struct.TestFixture.html" 
title="struct 
iceberg_integration_tests::TestFixture">Test<wbr>Fixture</a></dt><dd>Test 
fixture that manages Docker containers.
+This is kept for backward compatibility but deprecated in favor of 
GlobalTestFixture.</dd></dl><h2 id="functions" 
class="section-header">Functions<a href="#functions" 
class="anchor">§</a></h2><dl class="item-table"><dt><a class="fn" 
href="fn.get_test_fixture.html" title="fn 
iceberg_integration_tests::get_test_fixture">get_<wbr>test_<wbr>fixture</a></dt><dd>Returns
 a reference to the global test fixture.
+This fixture assumes Docker containers are started externally.</dd><dt><a 
class="fn" href="fn.set_test_fixture.html" title="fn 
iceberg_integration_tests::set_test_fixture">set_<wbr>test_<wbr>fixture</a></dt><dd>Legacy
 function to create a test fixture with Docker container management.
+Deprecated: prefer using <code>get_test_fixture()</code> with externally 
managed containers.</dd></dl></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_integration_tests/sidebar-items.js 
b/api/iceberg_integration_tests/sidebar-items.js
index fa2b3de38..c83ae21da 100644
--- a/api/iceberg_integration_tests/sidebar-items.js
+++ b/api/iceberg_integration_tests/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = {"fn":["set_test_fixture"],"struct":["TestFixture"]};
\ No newline at end of file
+window.SIDEBAR_ITEMS = 
{"fn":["get_test_fixture","set_test_fixture"],"struct":["GlobalTestFixture","TestFixture"]};
\ No newline at end of file
diff --git a/api/iceberg_integration_tests/struct.TestFixture.html 
b/api/iceberg_integration_tests/struct.GlobalTestFixture.html
similarity index 72%
copy from api/iceberg_integration_tests/struct.TestFixture.html
copy to api/iceberg_integration_tests/struct.GlobalTestFixture.html
index d6bc13f00..9e1d9fc3c 100644
--- a/api/iceberg_integration_tests/struct.TestFixture.html
+++ b/api/iceberg_integration_tests/struct.GlobalTestFixture.html
@@ -1,7 +1,10 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `TestFixture` struct in crate 
`iceberg_integration_tests`."><title>TestFixture in iceberg_integration_tests - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,Fir
 [...]
-    pub _docker_compose: <a class="struct" 
href="../iceberg_test_utils/docker/struct.DockerCompose.html" title="struct 
iceberg_test_utils::docker::DockerCompose">DockerCompose</a>,
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Global 
test fixture that uses environment-based configuration. This assumes Docker 
containers are started externally (e.g., via `make 
docker-up`)."><title>GlobalTestFixture in iceberg_integration_tests - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjace
 [...]
     pub catalog_config: <a class="struct" 
href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html";
 title="struct std::collections::hash::map::HashMap">HashMap</a>&lt;<a 
class="struct" 
href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html"; 
title="struct alloc::string::String">String</a>, <a class="struct" 
href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html"; 
title="struct alloc::string::String">String</a>&gt;,
-}</code></pre><h2 id="fields" class="fields section-header">Fields<a 
href="#fields" class="anchor">§</a></h2><span id="structfield._docker_compose" 
class="structfield section-header"><a href="#structfield._docker_compose" 
class="anchor field">§</a><code>_docker_compose: <a class="struct" 
href="../iceberg_test_utils/docker/struct.DockerCompose.html" title="struct 
iceberg_test_utils::docker::DockerCompose">DockerCompose</a></code></span><span 
id="structfield.catalog_config" class="structfi [...]
+}</code></pre><details class="toggle top-doc" open><summary 
class="hideme"><span>Expand description</span></summary><div 
class="docblock"><p>Global test fixture that uses environment-based 
configuration.
+This assumes Docker containers are started externally (e.g., via <code>make 
docker-up</code>).</p>
+</div></details><h2 id="fields" class="fields section-header">Fields<a 
href="#fields" class="anchor">§</a></h2><span id="structfield.catalog_config" 
class="structfield section-header"><a href="#structfield.catalog_config" 
class="anchor field">§</a><code>catalog_config: <a class="struct" 
href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html";
 title="struct std::collections::hash::map::HashMap">HashMap</a>&lt;<a 
class="struct" href="https://doc.rust-lang.org/n [...]
+Uses default localhost endpoints if environment variables are not set.</p>
+</div></details></div></details></div><h2 id="synthetic-implementations" 
class="section-header">Auto Trait Implementations<a 
href="#synthetic-implementations" class="anchor">§</a></h2><div 
id="synthetic-implementations-list"><section 
id="impl-Freeze-for-GlobalTestFixture" class="impl"><a 
href="#impl-Freeze-for-GlobalTestFixture" class="anchor">§</a><h3 
class="code-header">impl <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html"; 
title="trait core::marke [...]
     T: 'static + ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.type_id" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#139";>Source</a><a 
href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href 
[...]
     T: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html"; title="trait 
core::any::Any">Any</a>,</div></h3></section></summary><div 
class="impl-items"><section id="method.as_any" class="method trait-impl"><a 
href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a 
class="fn">as_any</a>(&amp;self) -&gt; &amp;(dyn <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html"; title="trait 
core::any::Any">Any</a> + 'static)</h4 [...]
     T: ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.borrow" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211";>Source</a><a
 href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a 
href="https:/ [...]
diff --git a/api/iceberg_integration_tests/struct.TestFixture.html 
b/api/iceberg_integration_tests/struct.TestFixture.html
index d6bc13f00..861b9a056 100644
--- a/api/iceberg_integration_tests/struct.TestFixture.html
+++ b/api/iceberg_integration_tests/struct.TestFixture.html
@@ -1,7 +1,9 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `TestFixture` struct in crate 
`iceberg_integration_tests`."><title>TestFixture in iceberg_integration_tests - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,Fir
 [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Test 
fixture that manages Docker containers. This is kept for backward compatibility 
but deprecated in favor of GlobalTestFixture."><title>TestFixture in 
iceberg_integration_tests - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","So
 [...]
     pub _docker_compose: <a class="struct" 
href="../iceberg_test_utils/docker/struct.DockerCompose.html" title="struct 
iceberg_test_utils::docker::DockerCompose">DockerCompose</a>,
     pub catalog_config: <a class="struct" 
href="https://doc.rust-lang.org/nightly/std/collections/hash/map/struct.HashMap.html";
 title="struct std::collections::hash::map::HashMap">HashMap</a>&lt;<a 
class="struct" 
href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html"; 
title="struct alloc::string::String">String</a>, <a class="struct" 
href="https://doc.rust-lang.org/nightly/alloc/string/struct.String.html"; 
title="struct alloc::string::String">String</a>&gt;,
-}</code></pre><h2 id="fields" class="fields section-header">Fields<a 
href="#fields" class="anchor">§</a></h2><span id="structfield._docker_compose" 
class="structfield section-header"><a href="#structfield._docker_compose" 
class="anchor field">§</a><code>_docker_compose: <a class="struct" 
href="../iceberg_test_utils/docker/struct.DockerCompose.html" title="struct 
iceberg_test_utils::docker::DockerCompose">DockerCompose</a></code></span><span 
id="structfield.catalog_config" class="structfi [...]
+}</code></pre><details class="toggle top-doc" open><summary 
class="hideme"><span>Expand description</span></summary><div 
class="docblock"><p>Test fixture that manages Docker containers.
+This is kept for backward compatibility but deprecated in favor of 
GlobalTestFixture.</p>
+</div></details><h2 id="fields" class="fields section-header">Fields<a 
href="#fields" class="anchor">§</a></h2><span id="structfield._docker_compose" 
class="structfield section-header"><a href="#structfield._docker_compose" 
class="anchor field">§</a><code>_docker_compose: <a class="struct" 
href="../iceberg_test_utils/docker/struct.DockerCompose.html" title="struct 
iceberg_test_utils::docker::DockerCompose">DockerCompose</a></code></span><span 
id="structfield.catalog_config" class="struct [...]
     T: 'static + ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.type_id" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#139";>Source</a><a 
href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href 
[...]
     T: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html"; title="trait 
core::any::Any">Any</a>,</div></h3></section></summary><div 
class="impl-items"><section id="method.as_any" class="method trait-impl"><a 
href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a 
class="fn">as_any</a>(&amp;self) -&gt; &amp;(dyn <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html"; title="trait 
core::any::Any">Any</a> + 'static)</h4 [...]
     T: ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.borrow" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211";>Source</a><a
 href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a 
href="https:/ [...]
diff --git a/api/iceberg_test_utils/all.html b/api/iceberg_test_utils/all.html
index 3084e9cac..7e6204ffb 100644
--- a/api/iceberg_test_utils/all.html
+++ b/api/iceberg_test_utils/all.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="List of 
all items in this crate"><title>List of all items in this 
crate</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Mediu
 [...]
\ No newline at end of file
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="List of 
all items in this crate"><title>List of all items in this 
crate</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-Mediu
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/constant.DEFAULT_GCS_PORT.html 
b/api/iceberg_test_utils/common/constant.DEFAULT_GCS_PORT.html
new file mode 100644
index 000000000..62b1cbe61
--- /dev/null
+++ b/api/iceberg_test_utils/common/constant.DEFAULT_GCS_PORT.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/constant.DEFAULT_GCS_PORT.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/constant.DEFAULT_GCS_PORT.html">../../iceberg_test_utils/constant.DEFAULT_GCS_PORT.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/constant.DEFAULT_GCS_PORT.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/constant.DEFAULT_GLUE_PORT.html 
b/api/iceberg_test_utils/common/constant.DEFAULT_GLUE_PORT.html
new file mode 100644
index 000000000..21453a0cf
--- /dev/null
+++ b/api/iceberg_test_utils/common/constant.DEFAULT_GLUE_PORT.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/constant.DEFAULT_GLUE_PORT.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/constant.DEFAULT_GLUE_PORT.html">../../iceberg_test_utils/constant.DEFAULT_GLUE_PORT.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/constant.DEFAULT_GLUE_PORT.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/constant.DEFAULT_HMS_PORT.html 
b/api/iceberg_test_utils/common/constant.DEFAULT_HMS_PORT.html
new file mode 100644
index 000000000..c50e4b169
--- /dev/null
+++ b/api/iceberg_test_utils/common/constant.DEFAULT_HMS_PORT.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/constant.DEFAULT_HMS_PORT.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/constant.DEFAULT_HMS_PORT.html">../../iceberg_test_utils/constant.DEFAULT_HMS_PORT.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/constant.DEFAULT_HMS_PORT.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/constant.DEFAULT_MINIO_PORT.html 
b/api/iceberg_test_utils/common/constant.DEFAULT_MINIO_PORT.html
new file mode 100644
index 000000000..38b2cb8da
--- /dev/null
+++ b/api/iceberg_test_utils/common/constant.DEFAULT_MINIO_PORT.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/constant.DEFAULT_MINIO_PORT.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/constant.DEFAULT_MINIO_PORT.html">../../iceberg_test_utils/constant.DEFAULT_MINIO_PORT.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/constant.DEFAULT_MINIO_PORT.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git 
a/api/iceberg_test_utils/common/constant.DEFAULT_REST_CATALOG_PORT.html 
b/api/iceberg_test_utils/common/constant.DEFAULT_REST_CATALOG_PORT.html
new file mode 100644
index 000000000..ea90680be
--- /dev/null
+++ b/api/iceberg_test_utils/common/constant.DEFAULT_REST_CATALOG_PORT.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/constant.DEFAULT_REST_CATALOG_PORT.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/constant.DEFAULT_REST_CATALOG_PORT.html">../../iceberg_test_utils/constant.DEFAULT_REST_CATALOG_PORT.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/constant.DEFAULT_REST_CATALOG_PORT.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/constant.ENV_GCS_ENDPOINT.html 
b/api/iceberg_test_utils/common/constant.ENV_GCS_ENDPOINT.html
new file mode 100644
index 000000000..2a6a168a7
--- /dev/null
+++ b/api/iceberg_test_utils/common/constant.ENV_GCS_ENDPOINT.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/constant.ENV_GCS_ENDPOINT.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/constant.ENV_GCS_ENDPOINT.html">../../iceberg_test_utils/constant.ENV_GCS_ENDPOINT.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/constant.ENV_GCS_ENDPOINT.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/constant.ENV_GLUE_ENDPOINT.html 
b/api/iceberg_test_utils/common/constant.ENV_GLUE_ENDPOINT.html
new file mode 100644
index 000000000..2aa57f8a7
--- /dev/null
+++ b/api/iceberg_test_utils/common/constant.ENV_GLUE_ENDPOINT.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/constant.ENV_GLUE_ENDPOINT.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/constant.ENV_GLUE_ENDPOINT.html">../../iceberg_test_utils/constant.ENV_GLUE_ENDPOINT.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/constant.ENV_GLUE_ENDPOINT.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/constant.ENV_HMS_ENDPOINT.html 
b/api/iceberg_test_utils/common/constant.ENV_HMS_ENDPOINT.html
new file mode 100644
index 000000000..b6aaecb23
--- /dev/null
+++ b/api/iceberg_test_utils/common/constant.ENV_HMS_ENDPOINT.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/constant.ENV_HMS_ENDPOINT.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/constant.ENV_HMS_ENDPOINT.html">../../iceberg_test_utils/constant.ENV_HMS_ENDPOINT.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/constant.ENV_HMS_ENDPOINT.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/constant.ENV_MINIO_ENDPOINT.html 
b/api/iceberg_test_utils/common/constant.ENV_MINIO_ENDPOINT.html
new file mode 100644
index 000000000..73a3810c7
--- /dev/null
+++ b/api/iceberg_test_utils/common/constant.ENV_MINIO_ENDPOINT.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/constant.ENV_MINIO_ENDPOINT.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/constant.ENV_MINIO_ENDPOINT.html">../../iceberg_test_utils/constant.ENV_MINIO_ENDPOINT.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/constant.ENV_MINIO_ENDPOINT.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git 
a/api/iceberg_test_utils/common/constant.ENV_REST_CATALOG_ENDPOINT.html 
b/api/iceberg_test_utils/common/constant.ENV_REST_CATALOG_ENDPOINT.html
new file mode 100644
index 000000000..70e9118f4
--- /dev/null
+++ b/api/iceberg_test_utils/common/constant.ENV_REST_CATALOG_ENDPOINT.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/constant.ENV_REST_CATALOG_ENDPOINT.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/constant.ENV_REST_CATALOG_ENDPOINT.html">../../iceberg_test_utils/constant.ENV_REST_CATALOG_ENDPOINT.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/constant.ENV_REST_CATALOG_ENDPOINT.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/fn.cleanup_namespace.html 
b/api/iceberg_test_utils/common/fn.cleanup_namespace.html
new file mode 100644
index 000000000..0f862ef9d
--- /dev/null
+++ b/api/iceberg_test_utils/common/fn.cleanup_namespace.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/fn.cleanup_namespace.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/fn.cleanup_namespace.html">../../iceberg_test_utils/fn.cleanup_namespace.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/fn.cleanup_namespace.html" + 
location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/fn.get_gcs_endpoint.html 
b/api/iceberg_test_utils/common/fn.get_gcs_endpoint.html
new file mode 100644
index 000000000..debfced95
--- /dev/null
+++ b/api/iceberg_test_utils/common/fn.get_gcs_endpoint.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/fn.get_gcs_endpoint.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/fn.get_gcs_endpoint.html">../../iceberg_test_utils/fn.get_gcs_endpoint.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/fn.get_gcs_endpoint.html" + 
location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/fn.get_glue_endpoint.html 
b/api/iceberg_test_utils/common/fn.get_glue_endpoint.html
new file mode 100644
index 000000000..b36805be2
--- /dev/null
+++ b/api/iceberg_test_utils/common/fn.get_glue_endpoint.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/fn.get_glue_endpoint.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/fn.get_glue_endpoint.html">../../iceberg_test_utils/fn.get_glue_endpoint.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/fn.get_glue_endpoint.html" + 
location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/fn.get_hms_endpoint.html 
b/api/iceberg_test_utils/common/fn.get_hms_endpoint.html
new file mode 100644
index 000000000..05497d4d9
--- /dev/null
+++ b/api/iceberg_test_utils/common/fn.get_hms_endpoint.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/fn.get_hms_endpoint.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/fn.get_hms_endpoint.html">../../iceberg_test_utils/fn.get_hms_endpoint.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/fn.get_hms_endpoint.html" + 
location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/fn.get_minio_endpoint.html 
b/api/iceberg_test_utils/common/fn.get_minio_endpoint.html
new file mode 100644
index 000000000..5c9c0bd6b
--- /dev/null
+++ b/api/iceberg_test_utils/common/fn.get_minio_endpoint.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/fn.get_minio_endpoint.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/fn.get_minio_endpoint.html">../../iceberg_test_utils/fn.get_minio_endpoint.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/fn.get_minio_endpoint.html" 
+ location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/common/fn.get_rest_catalog_endpoint.html 
b/api/iceberg_test_utils/common/fn.get_rest_catalog_endpoint.html
new file mode 100644
index 000000000..888b49102
--- /dev/null
+++ b/api/iceberg_test_utils/common/fn.get_rest_catalog_endpoint.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=../../iceberg_test_utils/fn.get_rest_catalog_endpoint.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="../../iceberg_test_utils/fn.get_rest_catalog_endpoint.html">../../iceberg_test_utils/fn.get_rest_catalog_endpoint.html</a>...</p>
+    
<script>location.replace("../../iceberg_test_utils/fn.get_rest_catalog_endpoint.html"
 + location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/constant.DEFAULT_GCS_PORT.html 
b/api/iceberg_test_utils/constant.DEFAULT_GCS_PORT.html
new file mode 100644
index 000000000..715576258
--- /dev/null
+++ b/api/iceberg_test_utils/constant.DEFAULT_GCS_PORT.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `DEFAULT_GCS_PORT` constant in crate 
`iceberg_test_utils`."><title>DEFAULT_GCS_PORT in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraS
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/constant.DEFAULT_GLUE_PORT.html 
b/api/iceberg_test_utils/constant.DEFAULT_GLUE_PORT.html
new file mode 100644
index 000000000..10b8e1293
--- /dev/null
+++ b/api/iceberg_test_utils/constant.DEFAULT_GLUE_PORT.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `DEFAULT_GLUE_PORT` constant in crate 
`iceberg_test_utils`."><title>DEFAULT_GLUE_PORT in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,Fir
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/constant.DEFAULT_HMS_PORT.html 
b/api/iceberg_test_utils/constant.DEFAULT_HMS_PORT.html
new file mode 100644
index 000000000..9498f7d18
--- /dev/null
+++ b/api/iceberg_test_utils/constant.DEFAULT_HMS_PORT.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `DEFAULT_HMS_PORT` constant in crate 
`iceberg_test_utils`."><title>DEFAULT_HMS_PORT in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraS
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/constant.DEFAULT_MINIO_PORT.html 
b/api/iceberg_test_utils/constant.DEFAULT_MINIO_PORT.html
new file mode 100644
index 000000000..e13b509c7
--- /dev/null
+++ b/api/iceberg_test_utils/constant.DEFAULT_MINIO_PORT.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `DEFAULT_MINIO_PORT` constant in crate 
`iceberg_test_utils`."><title>DEFAULT_MINIO_PORT in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,F
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/constant.DEFAULT_REST_CATALOG_PORT.html 
b/api/iceberg_test_utils/constant.DEFAULT_REST_CATALOG_PORT.html
new file mode 100644
index 000000000..93fbb3d3f
--- /dev/null
+++ b/api/iceberg_test_utils/constant.DEFAULT_REST_CATALOG_PORT.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `DEFAULT_REST_CATALOG_PORT` constant in crate 
`iceberg_test_utils`."><title>DEFAULT_REST_CATALOG_PORT in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/constant.ENV_GCS_ENDPOINT.html 
b/api/iceberg_test_utils/constant.ENV_GCS_ENDPOINT.html
new file mode 100644
index 000000000..3a3bb0305
--- /dev/null
+++ b/api/iceberg_test_utils/constant.ENV_GCS_ENDPOINT.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `ENV_GCS_ENDPOINT` constant in crate 
`iceberg_test_utils`."><title>ENV_GCS_ENDPOINT in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraS
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/constant.ENV_GLUE_ENDPOINT.html 
b/api/iceberg_test_utils/constant.ENV_GLUE_ENDPOINT.html
new file mode 100644
index 000000000..4a0d55dcc
--- /dev/null
+++ b/api/iceberg_test_utils/constant.ENV_GLUE_ENDPOINT.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `ENV_GLUE_ENDPOINT` constant in crate 
`iceberg_test_utils`."><title>ENV_GLUE_ENDPOINT in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,Fir
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/constant.ENV_HMS_ENDPOINT.html 
b/api/iceberg_test_utils/constant.ENV_HMS_ENDPOINT.html
new file mode 100644
index 000000000..f2a1a3376
--- /dev/null
+++ b/api/iceberg_test_utils/constant.ENV_HMS_ENDPOINT.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `ENV_HMS_ENDPOINT` constant in crate 
`iceberg_test_utils`."><title>ENV_HMS_ENDPOINT in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraS
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/constant.ENV_MINIO_ENDPOINT.html 
b/api/iceberg_test_utils/constant.ENV_MINIO_ENDPOINT.html
new file mode 100644
index 000000000..4dc753f77
--- /dev/null
+++ b/api/iceberg_test_utils/constant.ENV_MINIO_ENDPOINT.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `ENV_MINIO_ENDPOINT` constant in crate 
`iceberg_test_utils`."><title>ENV_MINIO_ENDPOINT in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,F
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/constant.ENV_REST_CATALOG_ENDPOINT.html 
b/api/iceberg_test_utils/constant.ENV_REST_CATALOG_ENDPOINT.html
new file mode 100644
index 000000000..b931e5dc8
--- /dev/null
+++ b/api/iceberg_test_utils/constant.ENV_REST_CATALOG_ENDPOINT.html
@@ -0,0 +1 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `ENV_REST_CATALOG_ENDPOINT` constant in crate 
`iceberg_test_utils`."><title>ENV_REST_CATALOG_ENDPOINT in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/docker/struct.DockerCompose.html 
b/api/iceberg_test_utils/docker/struct.DockerCompose.html
index 2ba06537e..0acea0f58 100644
--- a/api/iceberg_test_utils/docker/struct.DockerCompose.html
+++ b/api/iceberg_test_utils/docker/struct.DockerCompose.html
@@ -1,21 +1,43 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="A utility 
to manage the lifecycle of `docker compose`."><title>DockerCompose in 
iceberg_test_utils::docker - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,Fira
 [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="A utility 
to manage the lifecycle of `docker compose`."><title>DockerCompose in 
iceberg_test_utils::docker - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,Fira
 [...]
 <p>It will start <code>docker compose</code> when calling the <code>run</code> 
method and will be stopped via <a 
href="https://doc.rust-lang.org/nightly/core/ops/drop/trait.Drop.html"; 
title="trait core::ops::drop::Drop"><code>Drop</code></a>.</p>
 </div></details><h2 id="implementations" 
class="section-header">Implementations<a href="#implementations" 
class="anchor">§</a></h2><div id="implementations-list"><details class="toggle 
implementors-toggle" open><summary><section id="impl-DockerCompose" 
class="impl"><a class="src rightside" 
href="../../src/iceberg_test_utils/docker.rs.html#34-159">Source</a><a 
href="#impl-DockerCompose" class="anchor">§</a><h3 class="code-header">impl <a 
class="struct" href="struct.DockerCompose.html" tit [...]
     project_name: impl <a class="trait" 
href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html"; 
title="trait alloc::string::ToString">ToString</a>,
     docker_compose_dir: impl <a class="trait" 
href="https://doc.rust-lang.org/nightly/alloc/string/trait.ToString.html"; 
title="trait alloc::string::ToString">ToString</a>,
 ) -&gt; Self</h4></section><section id="method.project_name" class="method"><a 
class="src rightside" 
href="../../src/iceberg_test_utils/docker.rs.html#42-44">Source</a><h4 
class="code-header">pub fn <a href="#method.project_name" 
class="fn">project_name</a>(&amp;self) -&gt; &amp;<a class="primitive" 
href="https://doc.rust-lang.org/nightly/std/primitive.str.html";>str</a></h4></section><section
 id="method.up" class="method"><a class="src rightside" 
href="../../src/iceberg_test_utils/docker [...]
-    T: 'static + ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.type_id" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#139";>Source</a><a 
href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href 
[...]
+    T: 'static + ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.type_id" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/any.rs.html#139";>Source</a><a 
href="#method.type_id" class="anchor">§</a><h4 class="code-header">fn <a href 
[...]
+    T: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html"; title="trait 
core::any::Any">Any</a>,</div></h3></section></summary><div 
class="impl-items"><section id="method.as_any" class="method trait-impl"><a 
href="#method.as_any" class="anchor">§</a><h4 class="code-header">fn <a 
class="fn">as_any</a>(&amp;self) -&gt; &amp;(dyn <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/any/trait.Any.html"; title="trait 
core::any::Any">Any</a> + 'static)</h4 [...]
     T: ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.borrow" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#211";>Source</a><a
 href="#method.borrow" class="anchor">§</a><h4 class="code-header">fn <a 
href="https:/ [...]
-    T: ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.borrow_mut" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#218";>Source</a><a
 href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a 
href= [...]
+    T: ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.borrow_mut" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/borrow.rs.html#218";>Source</a><a
 href="#method.borrow_mut" class="anchor">§</a><h4 class="code-header">fn <a 
href= [...]
+    T: AsAny + ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.is" class="method trait-impl"><a href="#method.is" 
class="anchor">§</a><h4 class="code-header">fn <a 
class="fn">is</a>&lt;T&gt;(&amp;self) -&gt; <a class="primitive" 
href="https://doc.rust-lang.org/nightly/std/primitiv [...]
+    T: AsAny,</div></h4></section></summary><div class='docblock'>Returns 
<code>true</code> if the boxed type is the same as <code>T</code>. <a>Read 
more</a></div></details><details class="toggle method-toggle" 
open><summary><section id="method.downcast_ref" class="method trait-impl"><a 
href="#method.downcast_ref" class="anchor">§</a><h4 class="code-header">fn <a 
class="fn">downcast_ref</a>&lt;T&gt;(&amp;self) -&gt; <a class="enum" 
href="https://doc.rust-lang.org/nightly/core/option/enum [...]
+    T: AsAny,</div></h4></section></summary><div class='docblock'>Forward to 
the method defined on the type <code>Any</code>.</div></details><details 
class="toggle method-toggle" open><summary><section id="method.downcast_mut" 
class="method trait-impl"><a href="#method.downcast_mut" 
class="anchor">§</a><h4 class="code-header">fn <a 
class="fn">downcast_mut</a>&lt;T&gt;(&amp;mut self) -&gt; <a class="enum" 
href="https://doc.rust-lang.org/nightly/core/option/enum.Option.html"; 
title="enum co [...]
+    T: AsAny,</div></h4></section></summary><div class='docblock'>Forward to 
the method defined on the type 
<code>Any</code>.</div></details></div></details><details class="toggle 
implementors-toggle"><summary><section id="impl-From%3CT%3E-for-T" 
class="impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#774";>Source</a><a
 href="#impl-From%3CT%3E-for-T" class="anchor">§</a><h3 
class="code-header">impl&lt;T&gt; <a class="trait" href="https:// [...]
 </div></details></div></details><details class="toggle 
implementors-toggle"><summary><section id="impl-Instrument-for-T" 
class="impl"><a href="#impl-Instrument-for-T" class="anchor">§</a><h3 
class="code-header">impl&lt;T&gt; Instrument for T</h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.instrument" class="method trait-impl"><a href="#method.instrument" 
class="anchor">§</a><h4 class="code-header">fn <a class="fn">in [...]
 <code>Instrumented</code> wrapper. <a>Read more</a></div></details><details 
class="toggle method-toggle" open><summary><section id="method.in_current_span" 
class="method trait-impl"><a href="#method.in_current_span" 
class="anchor">§</a><h4 class="code-header">fn <a 
class="fn">in_current_span</a>(self) -&gt; 
Instrumented&lt;Self&gt;</h4></section></summary><div 
class='docblock'>Instruments this type with the <a 
href="super::Span::current()">current</a> <a href="crate::Span"><code>Span</co 
[...]
 <code>Instrumented</code> wrapper. <a>Read 
more</a></div></details></div></details><details class="toggle 
implementors-toggle"><summary><section id="impl-Into%3CU%3E-for-T" 
class="impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#757-759";>Source</a><a
 href="#impl-Into%3CU%3E-for-T" class="anchor">§</a><h3 
class="code-header">impl&lt;T, U&gt; <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html"; 
title="trai [...]
     U: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html"; 
title="trait 
core::convert::From">From</a>&lt;T&gt;,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.into" class="method trait-impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#767";>Source</a><a
 href="#method.into" class="anchor">§</a><h4 class="code-header">fn <a href= 
[...]
 <p>That is, this conversion is whatever the implementation of
 <code><a href="https://doc.rust-lang.org/nightly/core/convert/trait.From.html"; 
title="trait core::convert::From">From</a>&lt;T&gt; for U</code> chooses to 
do.</p>
-</div></details></div></details><details class="toggle 
implementors-toggle"><summary><section id="impl-TryFrom%3CU%3E-for-T" 
class="impl"><a class="src rightside" 
href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#813-815";>Source</a><a
 href="#impl-TryFrom%3CU%3E-for-T" class="anchor">§</a><h3 
class="code-header">impl&lt;T, U&gt; <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html"; 
title="trait core::convert::TryFrom">TryFrom</a>&lt;U [...]
+</div></details></div></details><details class="toggle 
implementors-toggle"><summary><section id="impl-IntoEither-for-T" 
class="impl"><a class="src rightside" 
href="https://docs.rs/either/1/src/either/into_either.rs.html#64";>Source</a><a 
href="#impl-IntoEither-for-T" class="anchor">§</a><h3 
class="code-header">impl&lt;T&gt; <a class="trait" 
href="https://docs.rs/either/1/either/into_either/trait.IntoEither.html"; 
title="trait either::into_either::IntoEither">IntoEither</a> for T</h3></sec 
[...]
+if <code>into_left</code> is <code>true</code>.
+Converts <code>self</code> into a <a 
href="https://docs.rs/either/1/either/enum.Either.html#variant.Right"; 
title="variant either::Either::Right"><code>Right</code></a> variant of <a 
href="https://docs.rs/either/1/either/enum.Either.html"; title="enum 
either::Either"><code>Either&lt;Self, Self&gt;</code></a>
+otherwise. <a 
href="https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either";>Read
 more</a></div></details><details class="toggle method-toggle" 
open><summary><section id="method.into_either_with" class="method 
trait-impl"><a class="src rightside" 
href="https://docs.rs/either/1/src/either/into_either.rs.html#55-57";>Source</a><a
 href="#method.into_either_with" class="anchor">§</a><h4 class="code-header">fn 
<a href="https://docs.rs/either/1/either/into_either/tr [...]
+    F: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/ops/function/trait.FnOnce.html"; 
title="trait core::ops::function::FnOnce">FnOnce</a>(&amp;Self) -&gt; <a 
class="primitive" 
href="https://doc.rust-lang.org/nightly/std/primitive.bool.html";>bool</a>,</div></h4></section></summary><div
 class='docblock'>Converts <code>self</code> into a <a 
href="https://docs.rs/either/1/either/enum.Either.html#variant.Left"; 
title="variant either::Either::Left"><code>Left</code></a> variant  [...]
+if <code>into_left(&amp;self)</code> returns <code>true</code>.
+Converts <code>self</code> into a <a 
href="https://docs.rs/either/1/either/enum.Either.html#variant.Right"; 
title="variant either::Either::Right"><code>Right</code></a> variant of <a 
href="https://docs.rs/either/1/either/enum.Either.html"; title="enum 
either::Either"><code>Either&lt;Self, Self&gt;</code></a>
+otherwise. <a 
href="https://docs.rs/either/1/either/into_either/trait.IntoEither.html#method.into_either_with";>Read
 more</a></div></details></div></details><details class="toggle 
implementors-toggle"><summary><section id="impl-Pointable-for-T" 
class="impl"><a href="#impl-Pointable-for-T" class="anchor">§</a><h3 
class="code-header">impl&lt;T&gt; Pointable for T</h3></section></summary><div 
class="impl-items"><details class="toggle" open><summary><section 
id="associatedconstant.ALIGN" clas [...]
+    T: ?<a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sized.html"; 
title="trait core::marker::Sized">Sized</a>,</div></h3></section></summary><div 
class="impl-items"><details class="toggle method-toggle" open><summary><section 
id="method.and" class="method trait-impl"><a href="#method.and" 
class="anchor">§</a><h4 class="code-header">fn <a class="fn">and</a>&lt;P, B, 
E&gt;(self, other: P) -&gt; And&lt;T, P&gt;<div class="where">where
+    T: Policy&lt;B, E&gt;,
+    P: Policy&lt;B, E&gt;,</div></h4></section></summary><div 
class='docblock'>Create a new <code>Policy</code> that returns 
[<code>Action::Follow</code>] only if <code>self</code> and <code>other</code> 
return
+<code>Action::Follow</code>. <a>Read more</a></div></details><details 
class="toggle method-toggle" open><summary><section id="method.or" 
class="method trait-impl"><a href="#method.or" class="anchor">§</a><h4 
class="code-header">fn <a class="fn">or</a>&lt;P, B, E&gt;(self, other: P) 
-&gt; Or&lt;T, P&gt;<div class="where">where
+    T: Policy&lt;B, E&gt;,
+    P: Policy&lt;B, E&gt;,</div></h4></section></summary><div 
class='docblock'>Create a new <code>Policy</code> that returns 
[<code>Action::Follow</code>] if either <code>self</code> or <code>other</code> 
returns
+<code>Action::Follow</code>. <a>Read 
more</a></div></details></div></details><details class="toggle 
implementors-toggle"><summary><section id="impl-Same-for-T" class="impl"><a 
class="src rightside" 
href="https://docs.rs/typenum/1.19.0/src/typenum/type_operators.rs.html#34";>Source</a><a
 href="#impl-Same-for-T" class="anchor">§</a><h3 
class="code-header">impl&lt;T&gt; <a class="trait" 
href="https://docs.rs/typenum/1.19.0/typenum/type_operators/trait.Same.html"; 
title="trait typenum::type_op [...]
     U: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html"; 
title="trait 
core::convert::Into">Into</a>&lt;T&gt;,</div></h3></section></summary><div 
class="impl-items"><details class="toggle" open><summary><section 
id="associatedtype.Error-1" class="associatedtype trait-impl"><a class="src 
rightside" 
href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#817";>Source</a><a
 href="#associatedtype.Error-1" class="anchor">§</a><h4 class="code-hea [...]
-    U: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html"; 
title="trait 
core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</div></h3></section></summary><div
 class="impl-items"><details class="toggle" open><summary><section 
id="associatedtype.Error" class="associatedtype trait-impl"><a class="src 
rightside" 
href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#802";>Source</a><a
 href="#associatedtype.Error" class="anchor">§</a><h4 class="cod [...]
+    U: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/convert/trait.TryFrom.html"; 
title="trait 
core::convert::TryFrom">TryFrom</a>&lt;T&gt;,</div></h3></section></summary><div
 class="impl-items"><details class="toggle" open><summary><section 
id="associatedtype.Error" class="associatedtype trait-impl"><a class="src 
rightside" 
href="https://doc.rust-lang.org/nightly/src/core/convert/mod.rs.html#802";>Source</a><a
 href="#associatedtype.Error" class="anchor">§</a><h4 class="cod [...]
+    V: MultiLane&lt;T&gt;,</div></h3></section></summary><div 
class="impl-items"><section id="method.vzip" class="method trait-impl"><a 
href="#method.vzip" class="anchor">§</a><h4 class="code-header">fn <a 
class="fn">vzip</a>(self) -&gt; V</h4></section></div></details><details 
class="toggle implementors-toggle"><summary><section 
id="impl-WithSubscriber-for-T" class="impl"><a 
href="#impl-WithSubscriber-for-T" class="anchor">§</a><h3 
class="code-header">impl&lt;T&gt; WithSubscriber for T< [...]
     S: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/convert/trait.Into.html"; 
title="trait 
core::convert::Into">Into</a>&lt;Dispatch&gt;,</div></h4></section></summary><div
 class='docblock'>Attaches the provided <a 
href="super::Subscriber"><code>Subscriber</code></a> to this type, returning a
 [<code>WithDispatch</code>] wrapper. <a>Read more</a></div></details><details 
class="toggle method-toggle" open><summary><section 
id="method.with_current_subscriber" class="method trait-impl"><a 
href="#method.with_current_subscriber" class="anchor">§</a><h4 
class="code-header">fn <a class="fn">with_current_subscriber</a>(self) -&gt; 
WithDispatch&lt;Self&gt;</h4></section></summary><div class='docblock'>Attaches 
the current <a href="dispatcher#setting-the-default-subscriber">default</a> < 
[...]
-[<code>WithDispatch</code>] wrapper. <a>Read 
more</a></div></details></div></details></div></section></div></main></body></html>
\ No newline at end of file
+[<code>WithDispatch</code>] wrapper. <a>Read 
more</a></div></details></div></details><section id="impl-Allocation-for-T" 
class="impl"><a href="#impl-Allocation-for-T" class="anchor">§</a><h3 
class="code-header">impl&lt;T&gt; Allocation for T<div class="where">where
+    T: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html";
 title="trait core::panic::unwind_safe::RefUnwindSafe">RefUnwindSafe</a> + <a 
class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html"; 
title="trait core::marker::Send">Send</a> + <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html"; 
title="trait core::marker::Sync">Sync</a>,</div></h3></section><section 
id="impl-MaybeSen [...]
+    T: <a class="trait" 
href="https://doc.rust-lang.org/nightly/core/marker/trait.Send.html"; 
title="trait 
core::marker::Send">Send</a>,</div></h3></section></div></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/fn.cleanup_namespace.html 
b/api/iceberg_test_utils/fn.cleanup_namespace.html
new file mode 100644
index 000000000..f89e81875
--- /dev/null
+++ b/api/iceberg_test_utils/fn.cleanup_namespace.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Helper to 
clean up a namespace and its tables before a test runs. This handles the case 
where previous test runs left data in the persistent 
database."><title>cleanup_namespace in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentH
 [...]
+This handles the case where previous test runs left data in the persistent 
database.</p>
+</div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/fn.get_gcs_endpoint.html 
b/api/iceberg_test_utils/fn.get_gcs_endpoint.html
new file mode 100644
index 000000000..3c5bbabe7
--- /dev/null
+++ b/api/iceberg_test_utils/fn.get_gcs_endpoint.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Returns 
the GCS (fake-gcs-server) endpoint. Checks ICEBERG_TEST_GCS_ENDPOINT env var, 
otherwise returns localhost default."><title>get_gcs_endpoint in 
iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4
 [...]
+Checks ICEBERG_TEST_GCS_ENDPOINT env var, otherwise returns localhost 
default.</p>
+</div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/fn.get_glue_endpoint.html 
b/api/iceberg_test_utils/fn.get_glue_endpoint.html
new file mode 100644
index 000000000..fb6c6fbcb
--- /dev/null
+++ b/api/iceberg_test_utils/fn.get_glue_endpoint.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Returns 
the Glue (Moto mock) endpoint. Checks ICEBERG_TEST_GLUE_ENDPOINT env var, 
otherwise returns localhost default."><title>get_glue_endpoint in 
iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Re
 [...]
+Checks ICEBERG_TEST_GLUE_ENDPOINT env var, otherwise returns localhost 
default.</p>
+</div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/fn.get_hms_endpoint.html 
b/api/iceberg_test_utils/fn.get_hms_endpoint.html
new file mode 100644
index 000000000..4a2174b0d
--- /dev/null
+++ b/api/iceberg_test_utils/fn.get_hms_endpoint.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Returns 
the HMS (Hive Metastore) endpoint. Checks ICEBERG_TEST_HMS_ENDPOINT env var, 
otherwise returns localhost default."><title>get_hms_endpoint in 
iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-
 [...]
+Checks ICEBERG_TEST_HMS_ENDPOINT env var, otherwise returns localhost 
default.</p>
+</div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/fn.get_minio_endpoint.html 
b/api/iceberg_test_utils/fn.get_minio_endpoint.html
new file mode 100644
index 000000000..5b99b09ab
--- /dev/null
+++ b/api/iceberg_test_utils/fn.get_minio_endpoint.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Returns 
the MinIO S3-compatible endpoint. Checks ICEBERG_TEST_MINIO_ENDPOINT env var, 
otherwise returns localhost default."><title>get_minio_endpoint in 
iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSeri
 [...]
+Checks ICEBERG_TEST_MINIO_ENDPOINT env var, otherwise returns localhost 
default.</p>
+</div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/fn.get_rest_catalog_endpoint.html 
b/api/iceberg_test_utils/fn.get_rest_catalog_endpoint.html
new file mode 100644
index 000000000..048f2eaa7
--- /dev/null
+++ b/api/iceberg_test_utils/fn.get_rest_catalog_endpoint.html
@@ -0,0 +1,3 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Returns 
the REST catalog endpoint. Checks ICEBERG_TEST_REST_ENDPOINT env var, otherwise 
returns localhost default."><title>get_rest_catalog_endpoint in 
iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif
 [...]
+Checks ICEBERG_TEST_REST_ENDPOINT env var, otherwise returns localhost 
default.</p>
+</div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/fn.normalize_test_name.html 
b/api/iceberg_test_utils/fn.normalize_test_name.html
index 6113a6f08..b4ee6ffcd 100644
--- a/api/iceberg_test_utils/fn.normalize_test_name.html
+++ b/api/iceberg_test_utils/fn.normalize_test_name.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `normalize_test_name` fn in crate 
`iceberg_test_utils`."><title>normalize_test_name in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraS
 [...]
\ No newline at end of file
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `normalize_test_name` fn in crate 
`iceberg_test_utils`."><title>normalize_test_name in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraS
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/fn.set_up.html 
b/api/iceberg_test_utils/fn.set_up.html
index 3ba3044e2..814ea18ce 100644
--- a/api/iceberg_test_utils/fn.set_up.html
+++ b/api/iceberg_test_utils/fn.set_up.html
@@ -1 +1 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `set_up` fn in crate 
`iceberg_test_utils`."><title>set_up in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,
 [...]
\ No newline at end of file
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="API 
documentation for the Rust `set_up` fn in crate 
`iceberg_test_utils`."><title>set_up in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,
 [...]
\ No newline at end of file
diff --git a/api/iceberg_test_utils/index.html 
b/api/iceberg_test_utils/index.html
index ae589176a..220d7626d 100644
--- a/api/iceberg_test_utils/index.html
+++ b/api/iceberg_test_utils/index.html
@@ -1,3 +1,10 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="This crate 
contains common utilities for testing."><title>iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,Fi
 [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="This crate 
contains common utilities for testing."><title>iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,Fi
 [...]
 <p>It’s not intended for use outside of <code>iceberg-rust</code>.</p>
-</div></details><h2 id="modules" class="section-header">Modules<a 
href="#modules" class="anchor">§</a></h2><dl class="item-table"><dt><a 
class="mod" href="docker/index.html" title="mod 
iceberg_test_utils::docker">docker</a></dt></dl><h2 id="functions" 
class="section-header">Functions<a href="#functions" 
class="anchor">§</a></h2><dl class="item-table"><dt><a class="fn" 
href="fn.normalize_test_name.html" title="fn 
iceberg_test_utils::normalize_test_name">normalize_<wbr>test_<wbr>name</a></ 
[...]
\ No newline at end of file
+</div></details><h2 id="modules" class="section-header">Modules<a 
href="#modules" class="anchor">§</a></h2><dl class="item-table"><dt><a 
class="mod" href="docker/index.html" title="mod 
iceberg_test_utils::docker">docker</a></dt></dl><h2 id="macros" 
class="section-header">Macros<a href="#macros" class="anchor">§</a></h2><dl 
class="item-table"><dt><a class="macro" 
href="macro.normalize_test_name_with_parts.html" title="macro 
iceberg_test_utils::normalize_test_name_with_parts">normalize_<wb [...]
+Takes one or more string parts and joins them with the module 
path.</dd></dl><h2 id="constants" class="section-header">Constants<a 
href="#constants" class="anchor">§</a></h2><dl class="item-table"><dt><a 
class="constant" href="constant.DEFAULT_GCS_PORT.html" title="constant 
iceberg_test_utils::DEFAULT_GCS_PORT">DEFAULT_<wbr>GCS_<wbr>PORT</a></dt><dt><a 
class="constant" href="constant.DEFAULT_GLUE_PORT.html" title="constant 
iceberg_test_utils::DEFAULT_GLUE_PORT">DEFAULT_<wbr>GLUE_<wbr>POR [...]
+This handles the case where previous test runs left data in the persistent 
database.</dd><dt><a class="fn" href="fn.get_gcs_endpoint.html" title="fn 
iceberg_test_utils::get_gcs_endpoint">get_<wbr>gcs_<wbr>endpoint</a></dt><dd>Returns
 the GCS (fake-gcs-server) endpoint.
+Checks ICEBERG_TEST_GCS_ENDPOINT env var, otherwise returns localhost 
default.</dd><dt><a class="fn" href="fn.get_glue_endpoint.html" title="fn 
iceberg_test_utils::get_glue_endpoint">get_<wbr>glue_<wbr>endpoint</a></dt><dd>Returns
 the Glue (Moto mock) endpoint.
+Checks ICEBERG_TEST_GLUE_ENDPOINT env var, otherwise returns localhost 
default.</dd><dt><a class="fn" href="fn.get_hms_endpoint.html" title="fn 
iceberg_test_utils::get_hms_endpoint">get_<wbr>hms_<wbr>endpoint</a></dt><dd>Returns
 the HMS (Hive Metastore) endpoint.
+Checks ICEBERG_TEST_HMS_ENDPOINT env var, otherwise returns localhost 
default.</dd><dt><a class="fn" href="fn.get_minio_endpoint.html" title="fn 
iceberg_test_utils::get_minio_endpoint">get_<wbr>minio_<wbr>endpoint</a></dt><dd>Returns
 the MinIO S3-compatible endpoint.
+Checks ICEBERG_TEST_MINIO_ENDPOINT env var, otherwise returns localhost 
default.</dd><dt><a class="fn" href="fn.get_rest_catalog_endpoint.html" 
title="fn 
iceberg_test_utils::get_rest_catalog_endpoint">get_<wbr>rest_<wbr>catalog_<wbr>endpoint</a></dt><dd>Returns
 the REST catalog endpoint.
+Checks ICEBERG_TEST_REST_ENDPOINT env var, otherwise returns localhost 
default.</dd><dt><a class="fn" href="fn.normalize_test_name.html" title="fn 
iceberg_test_utils::normalize_test_name">normalize_<wbr>test_<wbr>name</a></dt><dt><a
 class="fn" href="fn.set_up.html" title="fn 
iceberg_test_utils::set_up">set_up</a></dt></dl></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/macro.normalize_test_name_with_parts!.html 
b/api/iceberg_test_utils/macro.normalize_test_name_with_parts!.html
new file mode 100644
index 000000000..3da4a91fa
--- /dev/null
+++ b/api/iceberg_test_utils/macro.normalize_test_name_with_parts!.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta http-equiv="refresh" 
content="0;URL=macro.normalize_test_name_with_parts.html">
+    <title>Redirection</title>
+</head>
+<body>
+    <p>Redirecting to <a 
href="macro.normalize_test_name_with_parts.html">macro.normalize_test_name_with_parts.html</a>...</p>
+    <script>location.replace("macro.normalize_test_name_with_parts.html" + 
location.search + location.hash);</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/macro.normalize_test_name_with_parts.html 
b/api/iceberg_test_utils/macro.normalize_test_name_with_parts.html
new file mode 100644
index 000000000..f95e81f4c
--- /dev/null
+++ b/api/iceberg_test_utils/macro.normalize_test_name_with_parts.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Macro to 
generate a normalized test name with module path prefix. Takes one or more 
string parts and joins them with the module 
path."><title>normalize_test_name_with_parts in iceberg_test_utils - 
Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML(
 [...]
+    ($($part:expr),+) =&gt; { ... };
+}</code></pre><details class="toggle top-doc" open><summary 
class="hideme"><span>Expand description</span></summary><div 
class="docblock"><p>Macro to generate a normalized test name with module path 
prefix.
+Takes one or more string parts and joins them with the module path.</p>
+<p>Example:</p>
+
+<div class="example-wrap ignore"><a href="#" class="tooltip" title="This 
example is not tested">ⓘ</a><pre class="rust rust-example-rendered"><code><span 
class="comment">// Returns something like "rest_catalog_test__test_create_table"
+</span><span class="kw">let </span>name = <span 
class="macro">normalize_test_name_with_parts!</span>(<span 
class="string">"test_create_table"</span>);
+
+<span class="comment">// Returns something like "rest_catalog_test__apple__ios"
+</span><span class="kw">let </span>name = <span 
class="macro">normalize_test_name_with_parts!</span>(<span 
class="string">"apple"</span>, <span 
class="string">"ios"</span>);</code></pre></div>
+</div></details></section></div></main></body></html>
\ No newline at end of file
diff --git a/api/iceberg_test_utils/sidebar-items.js 
b/api/iceberg_test_utils/sidebar-items.js
index bba4820e0..7e802fcb8 100644
--- a/api/iceberg_test_utils/sidebar-items.js
+++ b/api/iceberg_test_utils/sidebar-items.js
@@ -1 +1 @@
-window.SIDEBAR_ITEMS = 
{"fn":["normalize_test_name","set_up"],"mod":["docker"]};
\ No newline at end of file
+window.SIDEBAR_ITEMS = 
{"constant":["DEFAULT_GCS_PORT","DEFAULT_GLUE_PORT","DEFAULT_HMS_PORT","DEFAULT_MINIO_PORT","DEFAULT_REST_CATALOG_PORT","ENV_GCS_ENDPOINT","ENV_GLUE_ENDPOINT","ENV_HMS_ENDPOINT","ENV_MINIO_ENDPOINT","ENV_REST_CATALOG_ENDPOINT"],"fn":["cleanup_namespace","get_gcs_endpoint","get_glue_endpoint","get_hms_endpoint","get_minio_endpoint","get_rest_catalog_endpoint","normalize_test_name","set_up"],"macro":["normalize_test_name_with_parts"],"mod":["docker"]};
\ No newline at end of file
diff --git a/api/search-index.js b/api/search-index.js
index 3bde61b67..4a4e5d473 100644
--- a/api/search-index.js
+++ b/api/search-index.js
@@ -1,4 +1,4 @@
-var searchIndex = new 
Map(JSON.parse('[["iceberg",{"t":"PPPPPPPPPRKKPPPPPPFGPPPFFFPFPPPPPPPPPPPPPPIPPPPPPPPPPPPFFFPGGPPPPFGNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNQNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNCNMNMNMMNOOCNCNNOOONOMNNNNNNNNNNNNNNNNNNNNNNONOOCMNMNONCOONNNNNONCOCMNNNCNNNNNNNNNNNNNNCCNNNN
 [...]
+var searchIndex = new 
Map(JSON.parse('[["iceberg",{"t":"PPPPPPPPPRKKPPPPPPFGPPPFFFPFPPPPPPPPPPPPPPIPPPPPPPPPPPPFFFPGGPPPPFGNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNMNQNNNNNNNNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNNNNNONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMNNNNNNNNNNNNNNNNNNCNNNNNNNNNNNNNNCNMNMNMMNOOCNCNNOOONOMNNNNNNNNNNNNNNNNNNNNNNONOOCMNMNONCOONNNNNONCOCMNNNCNNNNNNNNNNNNNNCCNNNN
 [...]
 if (typeof exports !== 'undefined') exports.searchIndex = searchIndex;
 else if (window.initSearch) window.initSearch(searchIndex);
-//{"start":39,"fragment_lengths":[174425,1613,3561,3754,1767,14876,3455,4231,8611,1325,2013,3747,1093]}
\ No newline at end of file
+//{"start":39,"fragment_lengths":[174425,1613,3561,3754,1767,14876,3455,4231,8611,1556,2013,3747,2331]}
\ No newline at end of file
diff --git 
a/api/search.desc/iceberg_integration_tests/iceberg_integration_tests-desc-0-.js
 
b/api/search.desc/iceberg_integration_tests/iceberg_integration_tests-desc-0-.js
index 3f37a3faf..97ca11ffd 100644
--- 
a/api/search.desc/iceberg_integration_tests/iceberg_integration_tests-desc-0-.js
+++ 
b/api/search.desc/iceberg_integration_tests/iceberg_integration_tests-desc-0-.js
@@ -1 +1 @@
-searchState.loadedDescShard("iceberg_integration_tests", 0, "Returns the 
argument unchanged.\nCalls <code>U::from(self)</code>.")
\ No newline at end of file
+searchState.loadedDescShard("iceberg_integration_tests", 0, "Global test 
fixture that uses environment-based …\nTest fixture that manages Docker 
containers. This is kept …\nReturns the argument unchanged.\nReturns the 
argument unchanged.\nCreates a new GlobalTestFixture from environment 
variables.\nReturns a reference to the global test fixture. This …\nCalls 
<code>U::from(self)</code>.\nCalls <code>U::from(self)</code>.\nLegacy function 
to create a test fixture with Docker …")
\ No newline at end of file
diff --git a/api/search.desc/iceberg_test_utils/iceberg_test_utils-desc-0-.js 
b/api/search.desc/iceberg_test_utils/iceberg_test_utils-desc-0-.js
index d8457aea5..120f7a782 100644
--- a/api/search.desc/iceberg_test_utils/iceberg_test_utils-desc-0-.js
+++ b/api/search.desc/iceberg_test_utils/iceberg_test_utils-desc-0-.js
@@ -1 +1 @@
-searchState.loadedDescShard("iceberg_test_utils", 0, "This crate contains 
common utilities for testing.\nA utility to manage the lifecycle of 
<code>docker compose</code>.\nReturns the argument unchanged.\nCalls 
<code>U::from(self)</code>.")
\ No newline at end of file
+searchState.loadedDescShard("iceberg_test_utils", 0, "This crate contains 
common utilities for testing.\nHelper to clean up a namespace and its tables 
before a …\nReturns the GCS (fake-gcs-server) endpoint. Checks …\nReturns the 
Glue (Moto mock) endpoint. Checks …\nReturns the HMS (Hive Metastore) endpoint. 
Checks …\nReturns the MinIO S3-compatible endpoint. Checks …\nReturns the REST 
catalog endpoint. Checks …\nMacro to generate a normalized test name with 
module path …\nMacro to genera [...]
\ No newline at end of file
diff --git a/api/src/iceberg_integration_tests/lib.rs.html 
b/api/src/iceberg_integration_tests/lib.rs.html
index c758e9e06..41658f17b 100644
--- a/api/src/iceberg_integration_tests/lib.rs.html
+++ b/api/src/iceberg_integration_tests/lib.rs.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Source of 
the Rust file `crates/integration_tests/src/lib.rs`."><title>lib.rs - 
source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2
 [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Source of 
the Rust file `crates/integration_tests/src/lib.rs`."><title>lib.rs - 
source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2
 [...]
 <a href=#2 id=2 data-nosnippet>2</a>// or more contributor license agreements. 
 See the NOTICE file
 <a href=#3 id=3 data-nosnippet>3</a>// distributed with this work for 
additional information
 <a href=#4 id=4 data-nosnippet>4</a>// regarding copyright ownership.  The ASF 
licenses this file
@@ -16,49 +16,91 @@
 <a href=#16 id=16 data-nosnippet>16</a>// under the License.
 <a href=#17 id=17 data-nosnippet>17</a>
 <a href=#18 id=18 data-nosnippet>18</a></span><span class="kw">use 
</span>std::collections::HashMap;
-<a href=#19 id=19 data-nosnippet>19</a>
-<a href=#20 id=20 data-nosnippet>20</a><span class="kw">use 
</span>iceberg::io::{S3_ACCESS_KEY_ID, S3_ENDPOINT, S3_REGION, 
S3_SECRET_ACCESS_KEY};
-<a href=#21 id=21 data-nosnippet>21</a><span class="kw">use 
</span>iceberg_catalog_rest::REST_CATALOG_PROP_URI;
-<a href=#22 id=22 data-nosnippet>22</a><span class="kw">use 
</span>iceberg_test_utils::docker::DockerCompose;
-<a href=#23 id=23 data-nosnippet>23</a><span class="kw">use 
</span>iceberg_test_utils::{normalize_test_name, set_up};
-<a href=#24 id=24 data-nosnippet>24</a>
-<a href=#25 id=25 data-nosnippet>25</a><span class="kw">const 
</span>REST_CATALOG_PORT: u16 = <span class="number">8181</span>;
-<a href=#26 id=26 data-nosnippet>26</a>
-<a href=#27 id=27 data-nosnippet>27</a><span class="kw">pub struct 
</span>TestFixture {
-<a href=#28 id=28 data-nosnippet>28</a>    <span class="kw">pub 
</span>_docker_compose: DockerCompose,
-<a href=#29 id=29 data-nosnippet>29</a>    <span class="kw">pub 
</span>catalog_config: HashMap&lt;String, String&gt;,
-<a href=#30 id=30 data-nosnippet>30</a>}
-<a href=#31 id=31 data-nosnippet>31</a>
-<a href=#32 id=32 data-nosnippet>32</a><span class="kw">pub fn 
</span>set_test_fixture(func: <span class="kw-2">&amp;</span>str) -&gt; 
TestFixture {
-<a href=#33 id=33 data-nosnippet>33</a>    set_up();
-<a href=#34 id=34 data-nosnippet>34</a>    <span class="kw">let 
</span>docker_compose = DockerCompose::new(
-<a href=#35 id=35 data-nosnippet>35</a>        normalize_test_name(<span 
class="macro">format!</span>(<span class="string">"{}_{func}"</span>, <span 
class="macro">module_path!</span>())),
-<a href=#36 id=36 data-nosnippet>36</a>        <span 
class="macro">format!</span>(<span class="string">"{}/testdata"</span>, <span 
class="macro">env!</span>(<span class="string">"CARGO_MANIFEST_DIR"</span>)),
-<a href=#37 id=37 data-nosnippet>37</a>    );
-<a href=#38 id=38 data-nosnippet>38</a>
-<a href=#39 id=39 data-nosnippet>39</a>    <span class="comment">// Stop any 
containers from previous runs and start new ones
-<a href=#40 id=40 data-nosnippet>40</a>    </span>docker_compose.down();
-<a href=#41 id=41 data-nosnippet>41</a>    docker_compose.up();
+<a href=#19 id=19 data-nosnippet>19</a><span class="kw">use 
</span>std::sync::OnceLock;
+<a href=#20 id=20 data-nosnippet>20</a>
+<a href=#21 id=21 data-nosnippet>21</a><span class="kw">use 
</span>iceberg::io::{S3_ACCESS_KEY_ID, S3_ENDPOINT, S3_REGION, 
S3_SECRET_ACCESS_KEY};
+<a href=#22 id=22 data-nosnippet>22</a><span class="kw">use 
</span>iceberg_catalog_rest::REST_CATALOG_PROP_URI;
+<a href=#23 id=23 data-nosnippet>23</a><span class="kw">use 
</span>iceberg_test_utils::docker::DockerCompose;
+<a href=#24 id=24 data-nosnippet>24</a><span class="kw">use 
</span>iceberg_test_utils::{
+<a href=#25 id=25 data-nosnippet>25</a>    get_minio_endpoint, 
get_rest_catalog_endpoint, normalize_test_name, set_up,
+<a href=#26 id=26 data-nosnippet>26</a>};
+<a href=#27 id=27 data-nosnippet>27</a>
+<a href=#28 id=28 data-nosnippet>28</a><span class="kw">const 
</span>REST_CATALOG_PORT: u16 = <span class="number">8181</span>;
+<a href=#29 id=29 data-nosnippet>29</a>
+<a href=#30 id=30 data-nosnippet>30</a><span class="doccomment">/// Test 
fixture that manages Docker containers.
+<a href=#31 id=31 data-nosnippet>31</a>/// This is kept for backward 
compatibility but deprecated in favor of GlobalTestFixture.
+<a href=#32 id=32 data-nosnippet>32</a></span><span class="kw">pub struct 
</span>TestFixture {
+<a href=#33 id=33 data-nosnippet>33</a>    <span class="kw">pub 
</span>_docker_compose: DockerCompose,
+<a href=#34 id=34 data-nosnippet>34</a>    <span class="kw">pub 
</span>catalog_config: HashMap&lt;String, String&gt;,
+<a href=#35 id=35 data-nosnippet>35</a>}
+<a href=#36 id=36 data-nosnippet>36</a>
+<a href=#37 id=37 data-nosnippet>37</a><span class="doccomment">/// Global 
test fixture that uses environment-based configuration.
+<a href=#38 id=38 data-nosnippet>38</a>/// This assumes Docker containers are 
started externally (e.g., via `make docker-up`).
+<a href=#39 id=39 data-nosnippet>39</a></span><span class="kw">pub struct 
</span>GlobalTestFixture {
+<a href=#40 id=40 data-nosnippet>40</a>    <span class="kw">pub 
</span>catalog_config: HashMap&lt;String, String&gt;,
+<a href=#41 id=41 data-nosnippet>41</a>}
 <a href=#42 id=42 data-nosnippet>42</a>
-<a href=#43 id=43 data-nosnippet>43</a>    <span class="kw">let 
</span>rest_catalog_ip = docker_compose.get_container_ip(<span 
class="string">"rest"</span>);
-<a href=#44 id=44 data-nosnippet>44</a>    <span class="kw">let 
</span>minio_ip = docker_compose.get_container_ip(<span 
class="string">"minio"</span>);
-<a href=#45 id=45 data-nosnippet>45</a>
-<a href=#46 id=46 data-nosnippet>46</a>    <span class="kw">let 
</span>catalog_config = HashMap::from([
-<a href=#47 id=47 data-nosnippet>47</a>        (
-<a href=#48 id=48 data-nosnippet>48</a>            
REST_CATALOG_PROP_URI.to_string(),
-<a href=#49 id=49 data-nosnippet>49</a>            <span 
class="macro">format!</span>(<span 
class="string">"http://{rest_catalog_ip}:{REST_CATALOG_PORT}";</span>),
-<a href=#50 id=50 data-nosnippet>50</a>        ),
-<a href=#51 id=51 data-nosnippet>51</a>        (
-<a href=#52 id=52 data-nosnippet>52</a>            S3_ENDPOINT.to_string(),
-<a href=#53 id=53 data-nosnippet>53</a>            <span 
class="macro">format!</span>(<span class="string">"http://{}:{}";</span>, 
minio_ip, <span class="number">9000</span>),
-<a href=#54 id=54 data-nosnippet>54</a>        ),
-<a href=#55 id=55 data-nosnippet>55</a>        (S3_ACCESS_KEY_ID.to_string(), 
<span class="string">"admin"</span>.to_string()),
-<a href=#56 id=56 data-nosnippet>56</a>        
(S3_SECRET_ACCESS_KEY.to_string(), <span 
class="string">"password"</span>.to_string()),
-<a href=#57 id=57 data-nosnippet>57</a>        (S3_REGION.to_string(), <span 
class="string">"us-east-1"</span>.to_string()),
-<a href=#58 id=58 data-nosnippet>58</a>    ]);
-<a href=#59 id=59 data-nosnippet>59</a>
-<a href=#60 id=60 data-nosnippet>60</a>    TestFixture {
-<a href=#61 id=61 data-nosnippet>61</a>        _docker_compose: docker_compose,
-<a href=#62 id=62 data-nosnippet>62</a>        catalog_config,
+<a href=#43 id=43 data-nosnippet>43</a><span class="kw">static 
</span>GLOBAL_FIXTURE: OnceLock&lt;GlobalTestFixture&gt; = OnceLock::new();
+<a href=#44 id=44 data-nosnippet>44</a>
+<a href=#45 id=45 data-nosnippet>45</a><span class="kw">impl 
</span>GlobalTestFixture {
+<a href=#46 id=46 data-nosnippet>46</a>    <span class="doccomment">/// 
Creates a new GlobalTestFixture from environment variables.
+<a href=#47 id=47 data-nosnippet>47</a>    /// Uses default localhost 
endpoints if environment variables are not set.
+<a href=#48 id=48 data-nosnippet>48</a>    </span><span class="kw">pub fn 
</span>from_env() -&gt; <span class="self">Self </span>{
+<a href=#49 id=49 data-nosnippet>49</a>        set_up();
+<a href=#50 id=50 data-nosnippet>50</a>
+<a href=#51 id=51 data-nosnippet>51</a>        <span class="kw">let 
</span>rest_endpoint = get_rest_catalog_endpoint();
+<a href=#52 id=52 data-nosnippet>52</a>        <span class="kw">let 
</span>minio_endpoint = get_minio_endpoint();
+<a href=#53 id=53 data-nosnippet>53</a>
+<a href=#54 id=54 data-nosnippet>54</a>        <span class="kw">let 
</span>catalog_config = HashMap::from([
+<a href=#55 id=55 data-nosnippet>55</a>            
(REST_CATALOG_PROP_URI.to_string(), rest_endpoint),
+<a href=#56 id=56 data-nosnippet>56</a>            (S3_ENDPOINT.to_string(), 
minio_endpoint),
+<a href=#57 id=57 data-nosnippet>57</a>            
(S3_ACCESS_KEY_ID.to_string(), <span class="string">"admin"</span>.to_string()),
+<a href=#58 id=58 data-nosnippet>58</a>            
(S3_SECRET_ACCESS_KEY.to_string(), <span 
class="string">"password"</span>.to_string()),
+<a href=#59 id=59 data-nosnippet>59</a>            (S3_REGION.to_string(), 
<span class="string">"us-east-1"</span>.to_string()),
+<a href=#60 id=60 data-nosnippet>60</a>        ]);
+<a href=#61 id=61 data-nosnippet>61</a>
+<a href=#62 id=62 data-nosnippet>62</a>        GlobalTestFixture { 
catalog_config }
 <a href=#63 id=63 data-nosnippet>63</a>    }
-<a href=#64 id=64 
data-nosnippet>64</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file
+<a href=#64 id=64 data-nosnippet>64</a>}
+<a href=#65 id=65 data-nosnippet>65</a>
+<a href=#66 id=66 data-nosnippet>66</a><span class="doccomment">/// Returns a 
reference to the global test fixture.
+<a href=#67 id=67 data-nosnippet>67</a>/// This fixture assumes Docker 
containers are started externally.
+<a href=#68 id=68 data-nosnippet>68</a></span><span class="kw">pub fn 
</span>get_test_fixture() -&gt; <span class="kw-2">&amp;</span><span 
class="lifetime">'static </span>GlobalTestFixture {
+<a href=#69 id=69 data-nosnippet>69</a>    
GLOBAL_FIXTURE.get_or_init(GlobalTestFixture::from_env)
+<a href=#70 id=70 data-nosnippet>70</a>}
+<a href=#71 id=71 data-nosnippet>71</a>
+<a href=#72 id=72 data-nosnippet>72</a><span class="doccomment">/// Legacy 
function to create a test fixture with Docker container management.
+<a href=#73 id=73 data-nosnippet>73</a>/// Deprecated: prefer using 
`get_test_fixture()` with externally managed containers.
+<a href=#74 id=74 data-nosnippet>74</a></span><span class="kw">pub fn 
</span>set_test_fixture(func: <span class="kw-2">&amp;</span>str) -&gt; 
TestFixture {
+<a href=#75 id=75 data-nosnippet>75</a>    set_up();
+<a href=#76 id=76 data-nosnippet>76</a>    <span class="kw">let 
</span>docker_compose = DockerCompose::new(
+<a href=#77 id=77 data-nosnippet>77</a>        normalize_test_name(<span 
class="macro">format!</span>(<span class="string">"{}_{func}"</span>, <span 
class="macro">module_path!</span>())),
+<a href=#78 id=78 data-nosnippet>78</a>        <span 
class="macro">format!</span>(<span class="string">"{}/testdata"</span>, <span 
class="macro">env!</span>(<span class="string">"CARGO_MANIFEST_DIR"</span>)),
+<a href=#79 id=79 data-nosnippet>79</a>    );
+<a href=#80 id=80 data-nosnippet>80</a>
+<a href=#81 id=81 data-nosnippet>81</a>    <span class="comment">// Stop any 
containers from previous runs and start new ones
+<a href=#82 id=82 data-nosnippet>82</a>    </span>docker_compose.down();
+<a href=#83 id=83 data-nosnippet>83</a>    docker_compose.up();
+<a href=#84 id=84 data-nosnippet>84</a>
+<a href=#85 id=85 data-nosnippet>85</a>    <span class="kw">let 
</span>rest_catalog_ip = docker_compose.get_container_ip(<span 
class="string">"rest"</span>);
+<a href=#86 id=86 data-nosnippet>86</a>    <span class="kw">let 
</span>minio_ip = docker_compose.get_container_ip(<span 
class="string">"minio"</span>);
+<a href=#87 id=87 data-nosnippet>87</a>
+<a href=#88 id=88 data-nosnippet>88</a>    <span class="kw">let 
</span>catalog_config = HashMap::from([
+<a href=#89 id=89 data-nosnippet>89</a>        (
+<a href=#90 id=90 data-nosnippet>90</a>            
REST_CATALOG_PROP_URI.to_string(),
+<a href=#91 id=91 data-nosnippet>91</a>            <span 
class="macro">format!</span>(<span 
class="string">"http://{rest_catalog_ip}:{REST_CATALOG_PORT}";</span>),
+<a href=#92 id=92 data-nosnippet>92</a>        ),
+<a href=#93 id=93 data-nosnippet>93</a>        (
+<a href=#94 id=94 data-nosnippet>94</a>            S3_ENDPOINT.to_string(),
+<a href=#95 id=95 data-nosnippet>95</a>            <span 
class="macro">format!</span>(<span class="string">"http://{}:{}";</span>, 
minio_ip, <span class="number">9000</span>),
+<a href=#96 id=96 data-nosnippet>96</a>        ),
+<a href=#97 id=97 data-nosnippet>97</a>        (S3_ACCESS_KEY_ID.to_string(), 
<span class="string">"admin"</span>.to_string()),
+<a href=#98 id=98 data-nosnippet>98</a>        
(S3_SECRET_ACCESS_KEY.to_string(), <span 
class="string">"password"</span>.to_string()),
+<a href=#99 id=99 data-nosnippet>99</a>        (S3_REGION.to_string(), <span 
class="string">"us-east-1"</span>.to_string()),
+<a href=#100 id=100 data-nosnippet>100</a>    ]);
+<a href=#101 id=101 data-nosnippet>101</a>
+<a href=#102 id=102 data-nosnippet>102</a>    TestFixture {
+<a href=#103 id=103 data-nosnippet>103</a>        _docker_compose: 
docker_compose,
+<a href=#104 id=104 data-nosnippet>104</a>        catalog_config,
+<a href=#105 id=105 data-nosnippet>105</a>    }
+<a href=#106 id=106 
data-nosnippet>106</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/api/src/iceberg_test_utils/lib.rs.html 
b/api/src/iceberg_test_utils/lib.rs.html
index 977d3225c..1d7b4a637 100644
--- a/api/src/iceberg_test_utils/lib.rs.html
+++ b/api/src/iceberg_test_utils/lib.rs.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Source of 
the Rust file `crates/test_utils/src/lib.rs`."><title>lib.rs - 
source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSa
 [...]
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta 
name="viewport" content="width=device-width, initial-scale=1.0"><meta 
name="generator" content="rustdoc"><meta name="description" content="Source of 
the Rust file `crates/test_utils/src/lib.rs`."><title>lib.rs - 
source</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSa
 [...]
 <a href=#2 id=2 data-nosnippet>2</a>// or more contributor license agreements. 
 See the NOTICE file
 <a href=#3 id=3 data-nosnippet>3</a>// distributed with this work for 
additional information
 <a href=#4 id=4 data-nosnippet>4</a>// regarding copyright ownership.  The ASF 
licenses this file
@@ -31,11 +31,92 @@
 <a href=#31 id=31 data-nosnippet>31</a></span><span class="kw">mod 
</span>common {
 <a href=#32 id=32 data-nosnippet>32</a>    <span class="kw">use 
</span>std::sync::Once;
 <a href=#33 id=33 data-nosnippet>33</a>
-<a href=#34 id=34 data-nosnippet>34</a>    <span class="kw">static 
</span>INIT: Once = Once::new();
-<a href=#35 id=35 data-nosnippet>35</a>    <span class="kw">pub fn 
</span>set_up() {
-<a href=#36 id=36 data-nosnippet>36</a>        
INIT.call_once(tracing_subscriber::fmt::init);
-<a href=#37 id=37 data-nosnippet>37</a>    }
-<a href=#38 id=38 data-nosnippet>38</a>    <span class="kw">pub fn 
</span>normalize_test_name(s: <span class="kw">impl </span>ToString) -&gt; 
String {
-<a href=#39 id=39 data-nosnippet>39</a>        s.to_string().replace(<span 
class="string">"::"</span>, <span class="string">"__"</span>).replace(<span 
class="string">'.'</span>, <span class="string">"_"</span>)
-<a href=#40 id=40 data-nosnippet>40</a>    }
-<a href=#41 id=41 
data-nosnippet>41</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file
+<a href=#34 id=34 data-nosnippet>34</a>    <span class="kw">use 
</span>iceberg::{Catalog, NamespaceIdent};
+<a href=#35 id=35 data-nosnippet>35</a>
+<a href=#36 id=36 data-nosnippet>36</a>    <span class="kw">static 
</span>INIT: Once = Once::new();
+<a href=#37 id=37 data-nosnippet>37</a>    <span class="kw">pub fn 
</span>set_up() {
+<a href=#38 id=38 data-nosnippet>38</a>        
INIT.call_once(tracing_subscriber::fmt::init);
+<a href=#39 id=39 data-nosnippet>39</a>    }
+<a href=#40 id=40 data-nosnippet>40</a>    <span class="kw">pub fn 
</span>normalize_test_name(s: <span class="kw">impl </span>ToString) -&gt; 
String {
+<a href=#41 id=41 data-nosnippet>41</a>        s.to_string().replace(<span 
class="string">"::"</span>, <span class="string">"__"</span>).replace(<span 
class="string">'.'</span>, <span class="string">"_"</span>)
+<a href=#42 id=42 data-nosnippet>42</a>    }
+<a href=#43 id=43 data-nosnippet>43</a>
+<a href=#44 id=44 data-nosnippet>44</a>    <span class="comment">// 
Environment variable names for service endpoints
+<a href=#45 id=45 data-nosnippet>45</a>    </span><span class="kw">pub const 
</span>ENV_MINIO_ENDPOINT: <span class="kw-2">&amp;</span>str = <span 
class="string">"ICEBERG_TEST_MINIO_ENDPOINT"</span>;
+<a href=#46 id=46 data-nosnippet>46</a>    <span class="kw">pub const 
</span>ENV_REST_CATALOG_ENDPOINT: <span class="kw-2">&amp;</span>str = <span 
class="string">"ICEBERG_TEST_REST_ENDPOINT"</span>;
+<a href=#47 id=47 data-nosnippet>47</a>    <span class="kw">pub const 
</span>ENV_HMS_ENDPOINT: <span class="kw-2">&amp;</span>str = <span 
class="string">"ICEBERG_TEST_HMS_ENDPOINT"</span>;
+<a href=#48 id=48 data-nosnippet>48</a>    <span class="kw">pub const 
</span>ENV_GLUE_ENDPOINT: <span class="kw-2">&amp;</span>str = <span 
class="string">"ICEBERG_TEST_GLUE_ENDPOINT"</span>;
+<a href=#49 id=49 data-nosnippet>49</a>    <span class="kw">pub const 
</span>ENV_GCS_ENDPOINT: <span class="kw-2">&amp;</span>str = <span 
class="string">"ICEBERG_TEST_GCS_ENDPOINT"</span>;
+<a href=#50 id=50 data-nosnippet>50</a>
+<a href=#51 id=51 data-nosnippet>51</a>    <span class="comment">// Default 
ports matching dev/docker-compose.yaml
+<a href=#52 id=52 data-nosnippet>52</a>    </span><span class="kw">pub const 
</span>DEFAULT_MINIO_PORT: u16 = <span class="number">9000</span>;
+<a href=#53 id=53 data-nosnippet>53</a>    <span class="kw">pub const 
</span>DEFAULT_REST_CATALOG_PORT: u16 = <span class="number">8181</span>;
+<a href=#54 id=54 data-nosnippet>54</a>    <span class="kw">pub const 
</span>DEFAULT_HMS_PORT: u16 = <span class="number">9083</span>;
+<a href=#55 id=55 data-nosnippet>55</a>    <span class="kw">pub const 
</span>DEFAULT_GLUE_PORT: u16 = <span class="number">5000</span>;
+<a href=#56 id=56 data-nosnippet>56</a>    <span class="kw">pub const 
</span>DEFAULT_GCS_PORT: u16 = <span class="number">4443</span>;
+<a href=#57 id=57 data-nosnippet>57</a>
+<a href=#58 id=58 data-nosnippet>58</a>    <span class="doccomment">/// 
Returns the MinIO S3-compatible endpoint.
+<a href=#59 id=59 data-nosnippet>59</a>    /// Checks 
ICEBERG_TEST_MINIO_ENDPOINT env var, otherwise returns localhost default.
+<a href=#60 id=60 data-nosnippet>60</a>    </span><span class="kw">pub fn 
</span>get_minio_endpoint() -&gt; String {
+<a href=#61 id=61 data-nosnippet>61</a>        
std::env::var(ENV_MINIO_ENDPOINT)
+<a href=#62 id=62 data-nosnippet>62</a>            .unwrap_or_else(|<span 
class="kw">_</span>| <span class="macro">format!</span>(<span 
class="string">"http://localhost:{DEFAULT_MINIO_PORT}";</span>))
+<a href=#63 id=63 data-nosnippet>63</a>    }
+<a href=#64 id=64 data-nosnippet>64</a>
+<a href=#65 id=65 data-nosnippet>65</a>    <span class="doccomment">/// 
Returns the REST catalog endpoint.
+<a href=#66 id=66 data-nosnippet>66</a>    /// Checks 
ICEBERG_TEST_REST_ENDPOINT env var, otherwise returns localhost default.
+<a href=#67 id=67 data-nosnippet>67</a>    </span><span class="kw">pub fn 
</span>get_rest_catalog_endpoint() -&gt; String {
+<a href=#68 id=68 data-nosnippet>68</a>        
std::env::var(ENV_REST_CATALOG_ENDPOINT)
+<a href=#69 id=69 data-nosnippet>69</a>            .unwrap_or_else(|<span 
class="kw">_</span>| <span class="macro">format!</span>(<span 
class="string">"http://localhost:{DEFAULT_REST_CATALOG_PORT}";</span>))
+<a href=#70 id=70 data-nosnippet>70</a>    }
+<a href=#71 id=71 data-nosnippet>71</a>
+<a href=#72 id=72 data-nosnippet>72</a>    <span class="doccomment">/// 
Returns the HMS (Hive Metastore) endpoint.
+<a href=#73 id=73 data-nosnippet>73</a>    /// Checks 
ICEBERG_TEST_HMS_ENDPOINT env var, otherwise returns localhost default.
+<a href=#74 id=74 data-nosnippet>74</a>    </span><span class="kw">pub fn 
</span>get_hms_endpoint() -&gt; String {
+<a href=#75 id=75 data-nosnippet>75</a>        
std::env::var(ENV_HMS_ENDPOINT).unwrap_or_else(|<span class="kw">_</span>| 
<span class="macro">format!</span>(<span 
class="string">"localhost:{DEFAULT_HMS_PORT}"</span>))
+<a href=#76 id=76 data-nosnippet>76</a>    }
+<a href=#77 id=77 data-nosnippet>77</a>
+<a href=#78 id=78 data-nosnippet>78</a>    <span class="doccomment">/// 
Returns the Glue (Moto mock) endpoint.
+<a href=#79 id=79 data-nosnippet>79</a>    /// Checks 
ICEBERG_TEST_GLUE_ENDPOINT env var, otherwise returns localhost default.
+<a href=#80 id=80 data-nosnippet>80</a>    </span><span class="kw">pub fn 
</span>get_glue_endpoint() -&gt; String {
+<a href=#81 id=81 data-nosnippet>81</a>        std::env::var(ENV_GLUE_ENDPOINT)
+<a href=#82 id=82 data-nosnippet>82</a>            .unwrap_or_else(|<span 
class="kw">_</span>| <span class="macro">format!</span>(<span 
class="string">"http://localhost:{DEFAULT_GLUE_PORT}";</span>))
+<a href=#83 id=83 data-nosnippet>83</a>    }
+<a href=#84 id=84 data-nosnippet>84</a>
+<a href=#85 id=85 data-nosnippet>85</a>    <span class="doccomment">/// 
Returns the GCS (fake-gcs-server) endpoint.
+<a href=#86 id=86 data-nosnippet>86</a>    /// Checks 
ICEBERG_TEST_GCS_ENDPOINT env var, otherwise returns localhost default.
+<a href=#87 id=87 data-nosnippet>87</a>    </span><span class="kw">pub fn 
</span>get_gcs_endpoint() -&gt; String {
+<a href=#88 id=88 data-nosnippet>88</a>        std::env::var(ENV_GCS_ENDPOINT)
+<a href=#89 id=89 data-nosnippet>89</a>            .unwrap_or_else(|<span 
class="kw">_</span>| <span class="macro">format!</span>(<span 
class="string">"http://localhost:{DEFAULT_GCS_PORT}";</span>))
+<a href=#90 id=90 data-nosnippet>90</a>    }
+<a href=#91 id=91 data-nosnippet>91</a>
+<a href=#92 id=92 data-nosnippet>92</a>    <span class="doccomment">/// Helper 
to clean up a namespace and its tables before a test runs.
+<a href=#93 id=93 data-nosnippet>93</a>    /// This handles the case where 
previous test runs left data in the persistent database.
+<a href=#94 id=94 data-nosnippet>94</a>    </span><span class="kw">pub async 
fn </span>cleanup_namespace&lt;C: Catalog&gt;(catalog: <span 
class="kw-2">&amp;</span>C, ns: <span class="kw-2">&amp;</span>NamespaceIdent) {
+<a href=#95 id=95 data-nosnippet>95</a>        <span class="comment">// Try to 
drop all tables in the namespace first
+<a href=#96 id=96 data-nosnippet>96</a>        </span><span class="kw">if let 
</span><span class="prelude-val">Ok</span>(tables) = 
catalog.list_tables(ns).<span class="kw">await </span>{
+<a href=#97 id=97 data-nosnippet>97</a>            <span class="kw">for 
</span>table <span class="kw">in </span>tables {
+<a href=#98 id=98 data-nosnippet>98</a>                <span class="kw">let _ 
</span>= catalog.drop_table(<span class="kw-2">&amp;</span>table).<span 
class="kw">await</span>;
+<a href=#99 id=99 data-nosnippet>99</a>            }
+<a href=#100 id=100 data-nosnippet>100</a>        }
+<a href=#101 id=101 data-nosnippet>101</a>        <span class="comment">// 
Then try to drop the namespace itself
+<a href=#102 id=102 data-nosnippet>102</a>        </span><span class="kw">let 
_ </span>= catalog.drop_namespace(ns).<span class="kw">await</span>;
+<a href=#103 id=103 data-nosnippet>103</a>    }
+<a href=#104 id=104 data-nosnippet>104</a>
+<a href=#105 id=105 data-nosnippet>105</a>    <span class="doccomment">/// 
Macro to generate a normalized test name with module path prefix.
+<a href=#106 id=106 data-nosnippet>106</a>    /// Takes one or more string 
parts and joins them with the module path.
+<a href=#107 id=107 data-nosnippet>107</a>    ///
+<a href=#108 id=108 data-nosnippet>108</a>    /// Example:
+<a href=#109 id=109 data-nosnippet>109</a>    /// ```ignore
+<a href=#110 id=110 data-nosnippet>110</a>    /// // Returns something like 
"rest_catalog_test__test_create_table"
+<a href=#111 id=111 data-nosnippet>111</a>    /// let name = 
normalize_test_name_with_parts!("test_create_table");
+<a href=#112 id=112 data-nosnippet>112</a>    ///
+<a href=#113 id=113 data-nosnippet>113</a>    /// // Returns something like 
"rest_catalog_test__apple__ios"
+<a href=#114 id=114 data-nosnippet>114</a>    /// let name = 
normalize_test_name_with_parts!("apple", "ios");
+<a href=#115 id=115 data-nosnippet>115</a>    /// ```
+<a href=#116 id=116 data-nosnippet>116</a>    </span><span 
class="attr">#[macro_export]
+<a href=#117 id=117 data-nosnippet>117</a>    </span><span 
class="macro">macro_rules!</span> normalize_test_name_with_parts {
+<a href=#118 id=118 data-nosnippet>118</a>        ($(<span 
class="macro-nonterminal">$part</span>:expr),+) =&gt; {
+<a href=#119 id=119 data-nosnippet>119</a>            <span 
class="macro-nonterminal">$crate::normalize_test_name</span>([<span 
class="macro">module_path!</span>(), $(<span 
class="macro-nonterminal">$part</span>),+].join(<span 
class="string">"_"</span>))
+<a href=#120 id=120 data-nosnippet>120</a>        };
+<a href=#121 id=121 data-nosnippet>121</a>    }
+<a href=#122 id=122 
data-nosnippet>122</a>}</code></pre></div></section></main></body></html>
\ No newline at end of file
diff --git a/api/trait.impl/core/marker/trait.Freeze.js 
b/api/trait.impl/core/marker/trait.Freeze.js
index 1b1a96c51..e9b71e5b0 100644
--- a/api/trait.impl/core/marker/trait.Freeze.js
+++ b/api/trait.impl/core/marker/trait.Freeze.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["iceberg",[["impl !<a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html\"; 
title=\"trait core::marker::Freeze\">Freeze</a> for <a class=\"enum\" 
href=\"iceberg/enum.TableUpdate.html\" title=\"enum 
iceberg::TableUpdate\">TableUpdate</a>",1,["iceberg::catalog::TableUpdate"]],["impl
 !<a class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html\"; 
title=\"trait core::marker::Freeze\">F [...]
+    var implementors = Object.fromEntries([["iceberg",[["impl !<a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html\"; 
title=\"trait core::marker::Freeze\">Freeze</a> for <a class=\"enum\" 
href=\"iceberg/enum.TableUpdate.html\" title=\"enum 
iceberg::TableUpdate\">TableUpdate</a>",1,["iceberg::catalog::TableUpdate"]],["impl
 !<a class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Freeze.html\"; 
title=\"trait core::marker::Freeze\">F [...]
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[58534,401,741,1088,397,6364,801,1064,2542,381,390,1418,384]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[58534,401,741,1088,397,6364,801,1064,2542,754,390,1418,384]}
\ No newline at end of file
diff --git a/api/trait.impl/core/marker/trait.Send.js 
b/api/trait.impl/core/marker/trait.Send.js
index 24787429f..9f0a48986 100644
--- a/api/trait.impl/core/marker/trait.Send.js
+++ b/api/trait.impl/core/marker/trait.Send.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["iceberg",[["impl <a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\"; 
title=\"trait core::marker::Send\">Send</a> for <a class=\"enum\" 
href=\"iceberg/arrow/enum.FieldMatchMode.html\" title=\"enum 
iceberg::arrow::FieldMatchMode\">FieldMatchMode</a>",1,["iceberg::arrow::value::FieldMatchMode"]],["impl
 <a class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\"; 
title=\"trait core [...]
+    var implementors = Object.fromEntries([["iceberg",[["impl <a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\"; 
title=\"trait core::marker::Send\">Send</a> for <a class=\"enum\" 
href=\"iceberg/arrow/enum.FieldMatchMode.html\" title=\"enum 
iceberg::arrow::FieldMatchMode\">FieldMatchMode</a>",1,["iceberg::arrow::value::FieldMatchMode"]],["impl
 <a class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Send.html\"; 
title=\"trait core [...]
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[52628,395,729,1070,391,6258,789,1046,2506,375,384,1394,378]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[52628,395,729,1070,391,6258,789,1046,2506,742,384,1394,378]}
\ No newline at end of file
diff --git a/api/trait.impl/core/marker/trait.Sync.js 
b/api/trait.impl/core/marker/trait.Sync.js
index d745a241a..c1b310536 100644
--- a/api/trait.impl/core/marker/trait.Sync.js
+++ b/api/trait.impl/core/marker/trait.Sync.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["iceberg",[["impl !<a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\"; 
title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" 
href=\"iceberg/puffin/struct.PuffinWriter.html\" title=\"struct 
iceberg::puffin::PuffinWriter\">PuffinWriter</a>",1,["iceberg::puffin::writer::PuffinWriter"]],["impl
 !<a class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\"; 
title=\"trait  [...]
+    var implementors = Object.fromEntries([["iceberg",[["impl !<a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\"; 
title=\"trait core::marker::Sync\">Sync</a> for <a class=\"struct\" 
href=\"iceberg/puffin/struct.PuffinWriter.html\" title=\"struct 
iceberg::puffin::PuffinWriter\">PuffinWriter</a>",1,["iceberg::puffin::writer::PuffinWriter"]],["impl
 !<a class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Sync.html\"; 
title=\"trait  [...]
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[55699,395,729,1070,391,6258,789,1046,2506,375,384,1395,378]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[55699,395,729,1070,391,6258,789,1046,2506,742,384,1395,378]}
\ No newline at end of file
diff --git a/api/trait.impl/core/marker/trait.Unpin.js 
b/api/trait.impl/core/marker/trait.Unpin.js
index 1d0a9b5f2..33e4329a4 100644
--- a/api/trait.impl/core/marker/trait.Unpin.js
+++ b/api/trait.impl/core/marker/trait.Unpin.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["iceberg",[["impl <a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\"; 
title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"enum\" 
href=\"iceberg/arrow/enum.FieldMatchMode.html\" title=\"enum 
iceberg::arrow::FieldMatchMode\">FieldMatchMode</a>",1,["iceberg::arrow::value::FieldMatchMode"]],["impl
 <a class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\"; 
title=\"trait  [...]
+    var implementors = Object.fromEntries([["iceberg",[["impl <a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\"; 
title=\"trait core::marker::Unpin\">Unpin</a> for <a class=\"enum\" 
href=\"iceberg/arrow/enum.FieldMatchMode.html\" title=\"enum 
iceberg::arrow::FieldMatchMode\">FieldMatchMode</a>",1,["iceberg::arrow::value::FieldMatchMode"]],["impl
 <a class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/marker/trait.Unpin.html\"; 
title=\"trait  [...]
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[59161,398,735,1079,394,6309,795,1055,2524,378,387,1406,381]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[59161,398,735,1079,394,6309,795,1055,2524,748,387,1406,381]}
\ No newline at end of file
diff --git a/api/trait.impl/core/marker/trait.UnsafeUnpin.js 
b/api/trait.impl/core/marker/trait.UnsafeUnpin.js
index 384b1b113..3496a86b7 100644
--- a/api/trait.impl/core/marker/trait.UnsafeUnpin.js
+++ b/api/trait.impl/core/marker/trait.UnsafeUnpin.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["iceberg",[["impl UnsafeUnpin for 
<a class=\"enum\" href=\"iceberg/arrow/enum.FieldMatchMode.html\" title=\"enum 
iceberg::arrow::FieldMatchMode\">FieldMatchMode</a>",1,["iceberg::arrow::value::FieldMatchMode"]],["impl
 UnsafeUnpin for <a class=\"enum\" href=\"iceberg/enum.ErrorKind.html\" 
title=\"enum 
iceberg::ErrorKind\">ErrorKind</a>",1,["iceberg::error::ErrorKind"]],["impl 
UnsafeUnpin for <a class=\"enum\" href=\"iceberg/enum.TableRequirement [...]
+    var implementors = Object.fromEntries([["iceberg",[["impl UnsafeUnpin for 
<a class=\"enum\" href=\"iceberg/arrow/enum.FieldMatchMode.html\" title=\"enum 
iceberg::arrow::FieldMatchMode\">FieldMatchMode</a>",1,["iceberg::arrow::value::FieldMatchMode"]],["impl
 UnsafeUnpin for <a class=\"enum\" href=\"iceberg/enum.ErrorKind.html\" 
title=\"enum 
iceberg::ErrorKind\">ErrorKind</a>",1,["iceberg::error::ErrorKind"]],["impl 
UnsafeUnpin for <a class=\"enum\" href=\"iceberg/enum.TableRequirement [...]
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[36247,273,485,704,269,4184,545,680,1774,253,262,906,256]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[36247,273,485,704,269,4184,545,680,1774,498,262,906,256]}
\ No newline at end of file
diff --git a/api/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js 
b/api/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js
index a124eaedf..f2951f49e 100644
--- a/api/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js
+++ b/api/trait.impl/core/panic/unwind_safe/trait.RefUnwindSafe.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["iceberg",[["impl !<a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html\";
 title=\"trait core::panic::unwind_safe::RefUnwindSafe\">RefUnwindSafe</a> for 
<a class=\"struct\" 
href=\"iceberg/arrow/partition_value_calculator/struct.PartitionValueCalculator.html\"
 title=\"struct 
iceberg::arrow::partition_value_calculator::PartitionValueCalculator\">PartitionValueCalculator</a>",1,["iceberg::arrow
 [...]
+    var implementors = Object.fromEntries([["iceberg",[["impl !<a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.RefUnwindSafe.html\";
 title=\"trait core::panic::unwind_safe::RefUnwindSafe\">RefUnwindSafe</a> for 
<a class=\"struct\" 
href=\"iceberg/arrow/partition_value_calculator/struct.PartitionValueCalculator.html\"
 title=\"struct 
iceberg::arrow::partition_value_calculator::PartitionValueCalculator\">PartitionValueCalculator</a>",1,["iceberg::arrow
 [...]
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[62766,446,830,1221,441,7110,891,1197,2811,425,435,1595,428]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[62766,446,830,1221,441,7110,891,1197,2811,842,435,1595,428]}
\ No newline at end of file
diff --git a/api/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js 
b/api/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js
index 5fd9471cc..6cf276be3 100644
--- a/api/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js
+++ b/api/trait.impl/core/panic/unwind_safe/trait.UnwindSafe.js
@@ -1,9 +1,9 @@
 (function() {
-    var implementors = Object.fromEntries([["iceberg",[["impl !<a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html\";
 title=\"trait core::panic::unwind_safe::UnwindSafe\">UnwindSafe</a> for <a 
class=\"struct\" 
href=\"iceberg/arrow/partition_value_calculator/struct.PartitionValueCalculator.html\"
 title=\"struct 
iceberg::arrow::partition_value_calculator::PartitionValueCalculator\">PartitionValueCalculator</a>",1,["iceberg::arrow::partiti
 [...]
+    var implementors = Object.fromEntries([["iceberg",[["impl !<a 
class=\"trait\" 
href=\"https://doc.rust-lang.org/nightly/core/panic/unwind_safe/trait.UnwindSafe.html\";
 title=\"trait core::panic::unwind_safe::UnwindSafe\">UnwindSafe</a> for <a 
class=\"struct\" 
href=\"iceberg/arrow/partition_value_calculator/struct.PartitionValueCalculator.html\"
 title=\"struct 
iceberg::arrow::partition_value_calculator::PartitionValueCalculator\">PartitionValueCalculator</a>",1,["iceberg::arrow::partiti
 [...]
     if (window.register_implementors) {
         window.register_implementors(implementors);
     } else {
         window.pending_implementors = implementors;
     }
 })()
-//{"start":57,"fragment_lengths":[61317,437,812,1194,432,6957,873,1170,2757,416,426,1559,419]}
\ No newline at end of file
+//{"start":57,"fragment_lengths":[61317,437,812,1194,432,6957,873,1170,2757,824,426,1559,419]}
\ No newline at end of file

Reply via email to