gproc_test_lib.erl 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. -module(gproc_test_lib).
  2. -export([t_spawn/1, t_spawn/2,
  3. t_spawn_reg/2, t_spawn_reg/3, t_spawn_reg/4,
  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_reg(Node, Name, Value, Attrs) ->
  39. Me = self(),
  40. P = spawn(Node, fun() ->
  41. ?assertMatch(true, gproc:reg(Name, Value, Attrs)),
  42. Me ! {self(), ok},
  43. t_loop()
  44. end),
  45. receive
  46. {P, ok} -> P
  47. after 1000 ->
  48. erlang:error({timeout, t_spawn_reg, [Node, Name, Value]})
  49. end.
  50. t_spawn_mreg(Node, KVL) ->
  51. Me = self(),
  52. P = spawn(Node, fun() ->
  53. ?assertMatch(true, gproc:mreg(n, g, KVL)),
  54. Me ! {self(), ok},
  55. t_loop()
  56. end),
  57. receive
  58. {P, ok} -> P
  59. end.
  60. t_spawn_reg_shared(Node, Name, Value) ->
  61. Me = self(),
  62. P = spawn(Node, fun() ->
  63. ?assertMatch(true, gproc:reg_shared(Name, Value)),
  64. Me ! {self(), ok},
  65. t_loop()
  66. end),
  67. receive
  68. {P, ok} -> P
  69. after 1000 ->
  70. erlang:error({timeout, t_spawn_reg_shared, [Node,Name,Value]})
  71. end.
  72. default_value({c,_,_}) -> 0;
  73. default_value(_) -> undefined.
  74. t_call(P, Req) ->
  75. Ref = erlang:monitor(process, P),
  76. P ! {self(), Ref, Req},
  77. receive
  78. {P, Ref, Res} ->
  79. erlang:demonitor(Ref, [flush]),
  80. Res;
  81. {'DOWN', Ref, _, _, Error} ->
  82. erlang:error({'DOWN', P, Error})
  83. after 1000 ->
  84. erlang:error({timeout,t_call,[P,Req]})
  85. end.
  86. t_loop() ->
  87. t_loop(false).
  88. t_loop(Selective) when is_boolean(Selective) ->
  89. receive
  90. {From, Ref, die} ->
  91. From ! {self(), Ref, ok};
  92. {From, Ref, {selective, Bool}} when is_boolean(Bool) ->
  93. From ! {self(), Ref, ok},
  94. t_loop(Bool);
  95. {From, Ref, {apply, M, F, A}} ->
  96. From ! {self(), Ref, apply(M, F, A)},
  97. t_loop(Selective);
  98. {From, Ref, {apply_fun, F}} ->
  99. From ! {self(), Ref, F()},
  100. t_loop(Selective);
  101. Other when not Selective ->
  102. ?debugFmt("got unknown msg: ~p~n", [Other]),
  103. exit({unknown_msg, Other})
  104. end.
  105. got_msg(Pb) ->
  106. t_call(Pb,
  107. {apply_fun,
  108. fun() ->
  109. receive M -> M
  110. after 1000 ->
  111. erlang:error({timeout, got_msg, [Pb]})
  112. end
  113. end}).
  114. got_msg(Pb, Tag) ->
  115. t_call(Pb,
  116. {apply_fun,
  117. fun() ->
  118. receive
  119. M when element(1, M) == Tag ->
  120. M
  121. after 1000 ->
  122. erlang:error({timeout, got_msg, [Pb, Tag]})
  123. end
  124. end}).
  125. t_pool_contains_atleast(Pool,N)->
  126. Existing = lists:foldl(fun({_X,_Y},Acc)->
  127. Acc+1;
  128. (_,Acc) ->
  129. Acc
  130. end, 0, gproc_pool:worker_pool(Pool) ),
  131. Existing >= N.