Skip to content

Commit 2ff95fb

Browse files
committed
test(prelude): cover concurrent store invariants
Assert same-id concurrent writes leave the bare default on the latest version, and same-parent contenders allow only one append while stale writers fail. Verified with repeated focused prelude store tests and mix precommit.
1 parent ed8908e commit 2ff95fb

1 file changed

Lines changed: 41 additions & 2 deletions

File tree

test/ptc_runner/prelude_store_test.exs

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ defmodule PtcRunner.PreludeStoreTest do
437437
assert {:error, %{reason: :not_found}} = PreludeStore.read(store, "paged@1")
438438
end
439439

440-
test "same-id concurrent writes produce contiguous versions" do
440+
test "same-id concurrent writes produce contiguous versions and leave bare reads on latest" do
441441
{:ok, store} = PreludeStore.new()
442442

443443
versions =
@@ -459,6 +459,45 @@ defmodule PtcRunner.PreludeStoreTest do
459459
|> Enum.sort()
460460

461461
assert versions == Enum.to_list(1..10)
462-
assert [%{latest_version: 10, versions_count: 10}] = PreludeStore.list(store)
462+
463+
assert [%{current_version: 10, latest_version: 10, versions_count: 10}] =
464+
PreludeStore.list(store)
465+
466+
assert {:ok, current} = PreludeStore.read(store, "paged")
467+
assert current.version == 10
468+
end
469+
470+
test "same-parent concurrent writes allow one append and reject stale contenders" do
471+
{:ok, store} = PreludeStore.new()
472+
assert {:ok, base} = PreludeStore.write(store, "paged", @paged_v1)
473+
474+
results =
475+
2..8
476+
|> Task.async_stream(
477+
fn n ->
478+
source = """
479+
(ns paged)
480+
(defn v [] #{n})
481+
"""
482+
483+
PreludeStore.write(store, "paged", source, %{"parent_checksum" => base.checksum})
484+
end,
485+
max_concurrency: 7,
486+
timeout: 5_000
487+
)
488+
|> Enum.map(fn {:ok, result} -> result end)
489+
490+
successes = Enum.filter(results, &match?({:ok, _}, &1))
491+
stale_errors = Enum.filter(results, &match?({:error, %{reason: :stale_base}}, &1))
492+
493+
assert [{:ok, written}] = successes
494+
assert length(stale_errors) == 6
495+
assert written.version == 2
496+
497+
assert [%{current_version: 2, latest_version: 2, versions_count: 2}] =
498+
PreludeStore.list(store)
499+
500+
assert {:ok, current} = PreludeStore.read(store, "paged")
501+
assert current.version == 2
463502
end
464503
end

0 commit comments

Comments
 (0)