It's a while since you wrote this, so you might have come to some conclusion by now, but anyway - here's what happens:<div><br></div><div>Since your top supervisor is started with start_link, it will be linked to the test case process. The test case process does not trap exit. When stopping your service, the supervisor is terminated with reason shutdown. Due to the link and not trapping exits, the test case process will also terminate with reason shutdown and thus common_test believes that the test has failed with this reason. After all, a terminating test case process is the definition of a failed test case in common_test world.</div>
<div><br></div><div>Regards</div><div>/siri</div><div><br></div><div><br><div class="gmail_quote">2012/6/21 Attila Rajmund Nohl <span dir="ltr"><<a href="mailto:attila.r.nohl@gmail.com" target="_blank">attila.r.nohl@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello!<br>
<br>
I try to test our code with common_test (from the OTP master branch).<br>
This code starts a supervisor, which starts a process. For some reason<br>
the test fails with:<br>
<br>
*** CT Error Notification 2012-06-21 19:38:59.236 ***<br>
Error detected: shutdown<br>
<br>
even though the started process doesn't crash (or at least I don't see<br>
it). I'm probably making something really stupid, do you have any idea<br>
what?<br>
<br>
Here's the important part of the code. The testcase (the init_*<br>
functions are empty):<br>
<br>
start_stop_test(_Config) -><br>
    {ok, Pid} = inets:start(ftpd, [{port, 2021}]),<br>
    inets:stop(ftpd, Pid).<br>
<br>
The ftpd module:<br>
<br>
start_service(Config) -><br>
    ftpd_sup:start_link(Config).<br>
<br>
stop_service(Pid) when is_pid(Pid) -><br>
   case ftpd_sup:stop(Pid) of<br>
        true -> ok;<br>
        R -> { error, R }<br>
   end.<br>
<br>
The ftpd_sup module:<br>
<br>
start_link(Args) -><br>
    supervisor:start_link(ftpd_sup, Args).<br>
<br>
stop(Pid) -><br>
        exit(Pid,shutdown),<br>
        true.<br>
<br>
init(Args) -><br>
        NewArgs = [ {sup_pid, self()} | Args],<br>
        {ok, {{one_for_one, 10, 60},<br>
          [{ftpd_listener,<br>
           {ftpd_listener, start_link, [NewArgs]},<br>
           permanent,<br>
           brutal_kill,<br>
           worker,<br>
           [ftpd_listener]}]}}.<br>
<br>
And the ftpd_listener:<br>
<br>
start_link(Args) -><br>
    proc_lib:start_link(?MODULE, listener_init, [self(), Args]).<br>
<br>
listener_init(Parent, Args) -><br>
    proc_lib:init_ack(Parent, {ok, self()}),<br>
    Port = proplists:get_value(port,Args),<br>
    SupPid = proplists:get_value(sup_pid,Args),<br>
    {ok, LSock} = gen_tcp:listen(Port, [binary, {packet, 0}, {active, false}]),<br>
    loop(LSock, SupPid).<br>
<br>
loop(LSock, SupPid) -><br>
        case gen_tcp:accept(LSock) of<br>
                {ok, Sock} -><br>
                    loop(LSock, SupPid);<br>
                {_, Res} -> ok<br>
        end.<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br></div>