From 06924e6114d8f49897f42aeaf8a5874af77d5c1e Mon Sep 17 00:00:00 2001 From: Ian Hunt-Isaak Date: Tue, 30 Dec 2025 15:59:33 -0500 Subject: [PATCH 1/3] add repo spec version to zarr stateful tests --- .../tests/test_zarr/test_stateful.py | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/icechunk-python/tests/test_zarr/test_stateful.py b/icechunk-python/tests/test_zarr/test_stateful.py index 07cc0d644..bd5103044 100644 --- a/icechunk-python/tests/test_zarr/test_stateful.py +++ b/icechunk-python/tests/test_zarr/test_stateful.py @@ -10,6 +10,7 @@ import pytest from hypothesis import assume, note, settings from hypothesis.stateful import ( + initialize, invariant, precondition, rule, @@ -105,9 +106,26 @@ class ModifiedZarrHierarchyStateMachine(ZarrHierarchyStateMachine): def __init__(self, storage: Storage) -> None: self.storage = storage - self.repo = Repository.create(self.storage) - store = self.repo.writable_session("main").store - super().__init__(store) + # Create a temporary repository with spec_version=1 in a separate storage + # This will be replaced in init_store with the Hypothesis-sampled version + # we need this in order to properly initialize the superclass MemoryStore + # model + temp_repo = Repository.create(in_memory_storage(), spec_version=1) + temp_store = temp_repo.writable_session("main").store + super().__init__(temp_store) + + @initialize(spec_version=st.sampled_from([1, 2])) + def init_store(self, spec_version: int) -> None: + """Override parent's init_store to sample spec_version and create repository.""" + # necessary to control the order of calling. if multiple intiliazes they will be + # called by hypothesis in a random order + note(f"Creating repository with spec_version={spec_version}") + + # Create repository with the drawn spec version + self.repo = Repository.create(self.storage, spec_version=spec_version) + self.store = self.repo.writable_session("main").store + + super().init_store() @precondition( lambda self: not self.store.session.has_uncommitted_changes @@ -199,6 +217,28 @@ def commit_with_check(self, data: st.DataObject) -> None: f"Expected: {get_expect.to_bytes()!r}" ) + @rule() + @precondition(lambda self: self.repo.spec_version == 1) + @precondition(lambda self: not self.store.session.has_uncommitted_changes) + def upgrade_spec_version(self) -> None: + """Upgrade repository from spec version 1 to version 2.""" + note("upgrading spec version from 1 to 2") + ic.upgrade_icechunk_repository(self.repo) + # Reopen to pick up the upgraded spec version + note("reopening after upgrade") + self.repo = Repository.open(self.storage) + self.store = self.repo.writable_session("main").store + note(f"reopened repository with spec_version={self.repo.spec_version}") + + @rule() + @precondition(lambda self: not self.store.session.has_uncommitted_changes) + def reopen_repository(self) -> None: + """Reopen the repository from storage to get fresh state.""" + note(f"reopening repository (current spec_version={self.repo.spec_version})") + self.repo = Repository.open(self.storage) + self.store = self.repo.writable_session("main").store + note(f"reopened repository (spec_version={self.repo.spec_version})") + @rule( data=st.data(), name=node_names, From a32e0eb77f6806acfc93d1bd98cb9acf3282b222 Mon Sep 17 00:00:00 2001 From: Ian Hunt-Isaak Date: Tue, 30 Dec 2025 16:00:24 -0500 Subject: [PATCH 2/3] fewer notes --- icechunk-python/tests/test_zarr/test_stateful.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/icechunk-python/tests/test_zarr/test_stateful.py b/icechunk-python/tests/test_zarr/test_stateful.py index bd5103044..a694ff30e 100644 --- a/icechunk-python/tests/test_zarr/test_stateful.py +++ b/icechunk-python/tests/test_zarr/test_stateful.py @@ -225,16 +225,13 @@ def upgrade_spec_version(self) -> None: note("upgrading spec version from 1 to 2") ic.upgrade_icechunk_repository(self.repo) # Reopen to pick up the upgraded spec version - note("reopening after upgrade") self.repo = Repository.open(self.storage) self.store = self.repo.writable_session("main").store - note(f"reopened repository with spec_version={self.repo.spec_version}") @rule() @precondition(lambda self: not self.store.session.has_uncommitted_changes) def reopen_repository(self) -> None: """Reopen the repository from storage to get fresh state.""" - note(f"reopening repository (current spec_version={self.repo.spec_version})") self.repo = Repository.open(self.storage) self.store = self.repo.writable_session("main").store note(f"reopened repository (spec_version={self.repo.spec_version})") From 9705347c52aa5214a8b7a0b3a62ec85550969913 Mon Sep 17 00:00:00 2001 From: Deepak Cherian Date: Wed, 31 Dec 2025 09:25:03 -0700 Subject: [PATCH 3/3] cleanup --- icechunk-python/tests/test_zarr/test_stateful.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/icechunk-python/tests/test_zarr/test_stateful.py b/icechunk-python/tests/test_zarr/test_stateful.py index a694ff30e..df89961b4 100644 --- a/icechunk-python/tests/test_zarr/test_stateful.py +++ b/icechunk-python/tests/test_zarr/test_stateful.py @@ -228,14 +228,6 @@ def upgrade_spec_version(self) -> None: self.repo = Repository.open(self.storage) self.store = self.repo.writable_session("main").store - @rule() - @precondition(lambda self: not self.store.session.has_uncommitted_changes) - def reopen_repository(self) -> None: - """Reopen the repository from storage to get fresh state.""" - self.repo = Repository.open(self.storage) - self.store = self.repo.writable_session("main").store - note(f"reopened repository (spec_version={self.repo.spec_version})") - @rule( data=st.data(), name=node_names,