If you carefully study the gproc_tests.erl file of the gproc project. I found the following code. A goodbye message is sent before erlang: monitor / 2, I think the DOWN message will not be received. Is it correct? If so, you should switch the two lines, right?
t_simple_aggr_counter() -> ?assert(gproc:reg({c,l,c1}, 3) =:= true), ?assert(gproc:reg({a,l,c1}) =:= true), ?assert(gproc:get_value({a,l,c1}) =:= 3), P = self(), P1 = spawn_link(fun() -> gproc:reg({c,l,c1}, 5), P ! {self(), ok}, receive {P, goodbye} -> ok end end), receive {P1, ok} -> ok end, ?assert(gproc:get_value({a,l,c1}) =:= 8), ?assert(gproc:update_counter({c,l,c1}, 4) =:= 7), ?assert(gproc:get_value({a,l,c1}) =:= 12), P1 ! {self(), goodbye}, %<<===========This line R = erlang:monitor(process, P1), %<<======This line receive {'DOWN', R, _, _, _} -> gproc:audit_process(P1) end, ?assert(gproc:get_value({a,l,c1}) =:= 7).