em
module.
Copyright © (C) 2018,2021 Sven Heyll
Behaviours: gen_statem.
Authors: Sven Heyll (sven@wega.lbaum.eu).
INTERNAL MODULE
Load modules on behalf of the em
module.
A story why we need this:
Stardate "Feburary 2018". We have a Heisenbug in the unit test execution introduced in version 7.0.0.
After narrowing it down to code loading race conditions, We failed
to fix the problem by using global:set_lock
around critical sections.
Also, we don't know why.
This module is an attempt to answer to the situation.
Q: When the em
process manages loading and restoring the
mocking and original code, what happens if the em
process
gets killed after loading a module, and a process tries to execute
functions from that module?
-module(yolo_tests). ... killing_the_mock_test() -> M = em:new(), em:strict(M, foo, aaaa, [], {function, fun(_) -> exit(kill) end}), em:replay(M), ?assertEqual(test_result, yolo:do_aaaa_with_foo()), em:verify(M). simple_test() -> ?assertEqual(ok, yolo:just_do_it()).The implementation:
-module(yolo). -behaviour(gen_server). ... just_do_it() -> foo:do_just_it(), ok. do_aaaa_with_foo() -> foo:aaaa().Without another server that cares about loading and unloading the modules, there is no way the test above can be fixed without removing the brutal
kill
in the strict callback.
disable_module_loading/0 | |
enable_module_loading/0 | |
load_modules/2 | |
restore_modules/0 | |
start/0 |
disable_module_loading() -> ok | error
enable_module_loading() -> ok | error
load_modules(Modules::[{module(), file:filename(), binary()}], Timeout::gen_statem:timeout()) -> ok | error
restore_modules() -> ok | error
start() -> ok
Generated by EDoc