- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
...
fun([N1, _N2], Trace) ->
?assert(
?strict_causality( #{?snk_kind := "Adding table to a shard", shard := _Shard, live_change := true}
, #{?snk_kind := "Shard schema change"}
, ?of_node(N1, Trace)
)),
?assert(
?strict_causality( #{?snk_kind := "Shard schema change", shard := _Shard}
, #{?snk_kind := "Restarting shard server", shard := _Shard}
, ?of_node(N1, Trace)
)),
%% Schema change must cause restart of the replica process and bootstrap:
{_, Rest} = ?split_trace_at(#{?snk_kind := "Shard schema change"}, Trace),
?assert(
?strict_causality( #{?snk_kind := "Restarting shard server", shard := _Shard}
, #{?snk_kind := state_change, to := bootstrap}
, Rest
))
end).
Тут чекаются не анскильные состояния, а видимые сайд-эффекты. Хуй знает, как это по науке называют. Я это называю trace-based testing.
В Erlang'е вообще нет никакой `науки', именно поэтому я... Был забавный тред в его мейлинг-листах, где кто-то начал писать что, мол, у вас неправильный π-calculus, потому что вот в статьях... На что ему Robert Virding ответил в духе ``хорошо, что мы не знали про π-calculus, иначе у нас получилась бы какая-то непрактичная питушня для ма-те-матиков из рашки''.
чего именно "нет"?
Вообще, подобная проблема есть среди программистов (как минимум, на ГК). Народ слишком дофига знает, начинает верить в математику, а не в реальность, и знания начинают ограничивать мышление.
А как оно проверяет, что это строгая причинно-следственная связь? Просто что события в правильно порядке произошли? Или прям проверяет, что между ними есть какая-то цепочка из happens before, а не просто так вышло?
Как-то так. "За каждым событием с паттерном A следует событие с паттерном B". Можно ещё эту питушню пускать под model-checker'ом, и тогда можно убедиться, что так происходит всегда.
#{key := Value} — заматчить мапу с key / Value.