I have some issue with distributed tests under rebar.
Rebar starts node with name nonode@nohost
. After it I call help function make_distrib
which provide normal node name and starts distribution work.
After starting the slave node I couldn't sent to it any lambda. I had error:
=ERROR REPORT==== 27-Jul-2013::22:48:02 === Error in process on node 'test1@just' with exit value: {{badfun,#Fun<msg_proxy_tests.2.117197241>},[{error_handler,undefined_lambda,3,[{file,"error_handler.erl"},{line,64}]}]}
But! If I run it test with simple way - all works good:
$erl 1> c(msg_proxy_tests). {ok,msg_proxy_tests} 2> eunit:test({module, msg_proxy_tests},[verbose]). ======================== EUnit ======================== module 'msg_proxy_tests'msg_proxy_tests: distrib_mode_test_ (distribute mode test for nodes)... msg_proxy_tests.erl:14:<0.48.0>: nodes ( ) = [test1@just] msg_proxy_tests.erl:15:<9999.39.0>: node ( ) = test1@just msg_proxy_tests.erl:17:<0.48.0>: nodes ( ) = [test1@just] [0.238 s] ok
How can I fix this?
Module source:
-module(msg_proxy_tests). -include_lib("eunit/include/eunit.hrl"). distrib_mode_test_()-> {"distribute mode test for nodes", timeout, 60, fun() -> {ok, Host} = inet:gethostname(), make_distrib("tests@"++Host, shortnames), slave:start(Host, test1), ?debugVal(nodes()), spawn(list_to_atom("test1@"++Host), fun()-> ?debugVal(node()) end), timer:sleep(100), ?debugVal(nodes()), stop_distrib(), ok end}. -spec make_distrib( NodeName::string()|atom(), NodeType::shortnames | longnames) -> {ok, ActualNodeName::atom} | {error, Reason::term()}. make_distrib(NodeName, NodeType) when is_list(NodeName) -> make_distrib(erlang:list_to_atom(NodeName), NodeType); make_distrib(NodeName, NodeType) -> case node() of 'nonode@nohost' -> [] = os:cmd("epmd -daemon"), case net_kernel:start([NodeName, NodeType]) of {ok, _Pid} -> node() end; CurrNode -> CurrNode end. stop_distrib()-> net_kernel:stop().