Search code examples
erlangerlang-otpgen-servercommon-test

Erlang init_per_group terminates gen_server


Common test init_per_group/2 terminates gen_server when it is started with gen_server:start_link. But it is ok to start server with gen_server:start.

gen_server can be started with any of these methods (start and start_link) in init_per_suite/1 and init_per_testcase/2.

Why it is not possible to start gen_server in init_per_group/2 with gen_server:start_link?


Solution

  • This happens because init_per_group is run in a separate process, just like each test case, and that process exits with an exit reason that communicates information about success/failure of group initialisation. From test_server:run_test_case_eval:

    exit({Ref,Time,Value,Loc,Opts}).
    

    Since the gen_server is linked to the process that runs init_per_group, and since the exit reason is not normal and the gen_server is not trapping exits, the gen_server process exits with that same exit reason.

    On the other hand, init_per_testcase is run in the same process as the test case itself, so this problem does not appear.