gproc_test_lib.erl 3.1 KB

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