gproc_test_lib.erl 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. -module(gproc_test_lib).
  2. -export([t_spawn/1, t_spawn/2,
  3. t_spawn_reg/2, t_spawn_reg/3,
  4. t_spawn_reg_shared/3,
  5. t_spawn_mreg/2,
  6. t_call/2,
  7. t_loop/0, t_loop/1,
  8. t_pool_contains_atleast/2,
  9. got_msg/1, got_msg/2]).
  10. -include_lib("eunit/include/eunit.hrl").
  11. t_spawn(Node) ->
  12. t_spawn(Node, false).
  13. t_spawn(Node, Selective) when is_boolean(Selective) ->
  14. Me = self(),
  15. P = spawn(Node, fun() ->
  16. Me ! {self(), ok},
  17. t_loop(Selective)
  18. end),
  19. receive
  20. {P, ok} -> P
  21. after 1000 ->
  22. erlang:error({timeout, t_spawn, [Node, Selective]})
  23. end.
  24. t_spawn_reg(Node, Name) ->
  25. t_spawn_reg(Node, Name, default_value(Name)).
  26. t_spawn_reg(Node, Name, Value) ->
  27. Me = self(),
  28. P = spawn(Node, fun() ->
  29. ?assertMatch(true, gproc:reg(Name, Value)),
  30. Me ! {self(), ok},
  31. t_loop()
  32. end),
  33. receive
  34. {P, ok} -> P
  35. after 1000 ->
  36. erlang:error({timeout, t_spawn_reg, [Node, Name, Value]})
  37. end.
  38. t_spawn_mreg(Node, KVL) ->
  39. Me = self(),
  40. P = spawn(Node, fun() ->
  41. ?assertMatch(true, gproc:mreg(n, g, KVL)),
  42. Me ! {self(), ok},
  43. t_loop()
  44. end),
  45. receive
  46. {P, ok} -> P
  47. end.
  48. t_spawn_reg_shared(Node, Name, Value) ->
  49. Me = self(),
  50. P = spawn(Node, fun() ->
  51. ?assertMatch(true, gproc:reg_shared(Name, Value)),
  52. Me ! {self(), ok},
  53. t_loop()
  54. end),
  55. receive
  56. {P, ok} -> P
  57. after 1000 ->
  58. erlang:error({timeout, t_spawn_reg_shared, [Node,Name,Value]})
  59. end.
  60. default_value({c,_,_}) -> 0;
  61. default_value(_) -> undefined.
  62. t_call(P, Req) ->
  63. Ref = erlang:monitor(process, P),
  64. P ! {self(), Ref, Req},
  65. receive
  66. {P, Ref, Res} ->
  67. erlang:demonitor(Ref, [flush]),
  68. Res;
  69. {'DOWN', Ref, _, _, Error} ->
  70. erlang:error({'DOWN', P, Error})
  71. after 1000 ->
  72. erlang:error({timeout,t_call,[P,Req]})
  73. end.
  74. t_loop() ->
  75. t_loop(false).
  76. t_loop(Selective) when is_boolean(Selective) ->
  77. receive
  78. {From, Ref, die} ->
  79. From ! {self(), Ref, ok};
  80. {From, Ref, {selective, Bool}} when is_boolean(Bool) ->
  81. From ! {self(), Ref, ok},
  82. t_loop(Bool);
  83. {From, Ref, {apply, M, F, A}} ->
  84. From ! {self(), Ref, apply(M, F, A)},
  85. t_loop(Selective);
  86. {From, Ref, {apply_fun, F}} ->
  87. From ! {self(), Ref, F()},
  88. t_loop(Selective);
  89. Other when not Selective ->
  90. ?debugFmt("got unknown msg: ~p~n", [Other]),
  91. exit({unknown_msg, Other})
  92. end.
  93. got_msg(Pb) ->
  94. t_call(Pb,
  95. {apply_fun,
  96. fun() ->
  97. receive M -> M
  98. after 1000 ->
  99. erlang:error({timeout, got_msg, [Pb]})
  100. end
  101. end}).
  102. got_msg(Pb, Tag) ->
  103. t_call(Pb,
  104. {apply_fun,
  105. fun() ->
  106. receive
  107. M when element(1, M) == Tag ->
  108. M
  109. after 1000 ->
  110. erlang:error({timeout, got_msg, [Pb, Tag]})
  111. end
  112. end}).
  113. t_pool_contains_atleast(Pool,N)->
  114. Existing = lists:foldl(fun({_X,_Y},Acc)->
  115. Acc+1;
  116. (_,Acc) ->
  117. Acc
  118. end, 0, gproc_pool:worker_pool(Pool) ),
  119. Existing >= N.