okami.mom/albedo

git clone https://git.nkp.pet/okami.mom/albedo

nekomimi.petruntime: share the installed extensions through a persistent term so the Runtime handle and every selection over it copy nothinge4803b3

main
1.5 KiB40 linesraw
1//// A shared value must cost nothing to capture or send, and a released
2//// handle must fail loudly rather than answer a stale value; neither shows
3//// through the daemon's behaviour until memory or a wrong catalog does.
4
5import albedo/harness/protect
6import albedo/shared
7import gleam/int
8import gleam/list
9import gleam/string
10import gleeunit/should
11
12@external(erlang, "albedo_copy_test_support", "captured_words")
13fn captured_words(term: a) -> Int
14
15pub fn read_answers_the_published_value_test() -> Nil {
16  let handle = shared.publish(#("catalog", [1, 2, 3]))
17  shared.read(handle) |> should.equal(#("catalog", [1, 2, 3]))
18  shared.release(handle)
19}
20
21pub fn captured_shared_value_copies_nothing_test() -> Nil {
22  let baseline = captured_words(Nil)
23  // Built at runtime: a string literal would already be one.
24  let value =
25    list.repeat(Nil, 20_000) |> list.index_map(fn(_, n) { int.to_string(n) })
26  should.be_true(captured_words(value) > baseline + 60_000)
27  let handle = shared.publish(value)
28  let read = shared.read(handle)
29  captured_words(read) |> should.equal(baseline)
30  // A selection over a shared list copies its cells, never its elements.
31  should.be_true(captured_words(list.take(read, 10_000)) < baseline + 30_000)
32  shared.release(handle)
33}
34
35pub fn reading_a_released_handle_panics_test() -> Nil {
36  let handle = shared.publish("gone")
37  shared.release(handle)
38  let assert Error(reason) = protect.attempt(fn() { shared.read(handle) })
39  should.be_true(string.contains(reason, "shared value was released"))
40}