Арматура распределенных тестов

У меня есть некоторые проблемы с распределенными тестами под арматурой. Арматура запускает узел с именем nonode@nohost, После этого я вызываю функцию помощи make_distrib которые предоставляют нормальное имя узла и начинают работу по распространению.
После запуска подчиненного узла я не смог отправить на него лямбду. У меня была ошибка:

    = ОТЧЕТ ОБ ОШИБКАХ ==== 27-Jul-2013::22:48:02 ===
    Ошибка в процессе на узле 'test1@just' со значением выхода: {{badfun, # Fun }, [{error_handler, undefined_lambda, 3, [{file, "error_handler.erl"}, {line, 64 }]}]}

Но! Если я запускаю тестирование простым способом - все работает хорошо:

    $ Эрл
    1> c(msg_proxy_tests).
    {Ок,msg_proxy_tests}
    2> eunit:test({модуль, msg_proxy_tests},[подробный]).
    ======================== EUnit ========================
    Модуль 'msg_proxy_tests'msg_proxy_tests: distrib_mode_test_ (тест режима распространения для узлов)...
    msg_proxy_tests.erl:14:<0.48.0>: node () = [test1@just]
    msg_proxy_tests.erl:15:<9999.39.0>: node () = test1@just
    msg_proxy_tests.erl:17:<0.48.0>: node () = [test1@just]
    [0,238 с] хорошо

Как я могу это исправить?


Источник модуля:

    -модуль (msg_proxy_tests).

    -include_lib("eunit/ включить /eunit.hrl").

    distrib_mode_test_()->
    {"тест режима распространения для узлов", тайм-аут, 60, 
        fun() ->
            {ok, Host} = inet:gethostname(),
            make_distrib("tests@"++Host, shortnames),
            slave: начало (Host, test1),?debugVal(node ​​()),
            spawn(list_to_atom("test1@"++Host), fun()->?debugVal(node ​​()) end), таймер:sleep(100),?debugVal(node ​​()),
            stop_distrib(),
            ok
        end}.

    -spec make_distrib( NodeName::string()|atom(), NodeType::shortnames | longnames) ->
        {ok, ActualNodeName::atom} | {ошибка, причина:: термин ()}.
    make_distrib(NodeName, NodeType) когда is_list(NodeName) ->
        make_distrib(erlang:list_to_atom(NodeName), NodeType);
    make_distrib(NodeName, NodeType) ->
        case case () из 'nonode@nohost' -> 
                [] = os:cmd("epmd -daemon"),
                case net_kernel:start([NodeName, NodeType]) из {ok, _Pid} -> node() 
                end;
            CurrNode -> конец CurrNode.

    stop_distrib()->
        net_kernel:stop(). 

1 ответ

Решение

Это связано с тем, что хеш модуля на обоих узлах различен. Это происходит потому, что eunit компилирует код перед запуском и модуль содержит -ifdef(TEST) макросы, которые определенно изменят свой хеш.

Вот почему анонимная функция #Fun<msg_proxy_tests.2.117197241 не удалось вызвать и произошла ошибка. (посмотрите на имя функции, и вы заметите забавные числа, это хеш модуля, он будет отличаться на обоих узлах).

Если вы хотите избежать этого, вы должны называть фанатов этим полным именем: module:fun_name/arity,

Другие вопросы по тегам