53 lines
1.6 KiB
Elixir
53 lines
1.6 KiB
Elixir
defmodule BDS.PersistenceTest do
|
|
use ExUnit.Case, async: true
|
|
|
|
alias BDS.Persistence
|
|
alias BDS.Posts.TranslationValidation
|
|
|
|
test "atomic_write keeps concurrent writers intact" do
|
|
temp_dir = Path.join(System.tmp_dir!(), "bds-persistence-#{System.unique_integer([:positive])}")
|
|
path = Path.join(temp_dir, "shared.txt")
|
|
payload_a = String.duplicate("alpha", 200_000)
|
|
payload_b = String.duplicate("bravo", 200_000)
|
|
|
|
on_exit(fn -> File.rm_rf(temp_dir) end)
|
|
|
|
parent = self()
|
|
|
|
tasks =
|
|
for index <- 1..12 do
|
|
payload = if rem(index, 2) == 0, do: payload_a, else: payload_b
|
|
|
|
Task.async(fn ->
|
|
send(parent, :ready)
|
|
|
|
receive do
|
|
:go -> Persistence.atomic_write(path, payload)
|
|
end
|
|
end)
|
|
end
|
|
|
|
for _ <- tasks do
|
|
assert_receive :ready
|
|
end
|
|
|
|
Enum.each(tasks, fn task -> send(task.pid, :go) end)
|
|
|
|
assert Enum.map(tasks, &Task.await(&1, 15_000)) == List.duplicate(:ok, length(tasks))
|
|
assert File.read!(path) in [payload_a, payload_b]
|
|
end
|
|
|
|
test "post rebuild globs ignore atomic temp files" do
|
|
temp_dir = Path.join(System.tmp_dir!(), "bds-persistence-glob-#{System.unique_integer([:positive])}")
|
|
posts_dir = Path.join(temp_dir, "posts")
|
|
|
|
File.mkdir_p!(posts_dir)
|
|
File.write!(Path.join(posts_dir, "entry.md"), "---\ntitle: Entry\n---\n")
|
|
File.write!(Path.join(posts_dir, "entry.md.tmp.123"), "temp")
|
|
|
|
on_exit(fn -> File.rm_rf(temp_dir) end)
|
|
|
|
assert TranslationValidation.list_matching_files(posts_dir, "*.md") ==
|
|
[Path.join(posts_dir, "entry.md")]
|
|
end
|
|
end |