auser-poolparty 0.2.66 → 0.2.67

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. data/Manifest.txt +83 -41
  2. data/PostInstall.txt +2 -2
  3. data/README.txt +1 -2
  4. data/Rakefile +14 -1
  5. data/bin/cloud-start +11 -10
  6. data/bin/{pool-spec → pool-generate} +0 -0
  7. data/bin/pool-init +3 -3
  8. data/bin/pool-start +8 -7
  9. data/bin/server-update-hosts +1 -1
  10. data/lib/erlang/messenger/ebin/pm_client_rel-0.1.rel +1 -1
  11. data/lib/erlang/messenger/ebin/pm_master_rel-0.1.rel +1 -1
  12. data/lib/erlang/messenger/ebin/pm_node_rel-0.1.rel +1 -1
  13. data/lib/erlang/messenger/include/defines.hrl +7 -3
  14. data/lib/erlang/messenger/lib/eunit/.svn/all-wcprops +53 -0
  15. data/lib/erlang/messenger/lib/eunit/.svn/entries +140 -0
  16. data/lib/erlang/messenger/lib/eunit/.svn/format +1 -0
  17. data/lib/erlang/messenger/lib/eunit/.svn/prop-base/NOTES.svn-base +5 -0
  18. data/lib/erlang/messenger/lib/eunit/.svn/text-base/AUTHORS.svn-base +2 -0
  19. data/lib/erlang/messenger/lib/eunit/.svn/text-base/CHANGELOG.svn-base +14 -0
  20. data/lib/erlang/messenger/lib/eunit/.svn/text-base/COPYING.svn-base +504 -0
  21. data/lib/erlang/messenger/lib/eunit/.svn/text-base/NOTES.svn-base +276 -0
  22. data/lib/erlang/messenger/lib/eunit/.svn/text-base/README.svn-base +3 -0
  23. data/lib/erlang/messenger/lib/eunit/.svn/text-base/sys.config.svn-base +9 -0
  24. data/lib/erlang/messenger/lib/eunit/.svn/text-base/vsn.mk.svn-base +1 -0
  25. data/lib/erlang/messenger/lib/eunit/doc/.svn/all-wcprops +59 -0
  26. data/lib/erlang/messenger/lib/eunit/doc/.svn/entries +142 -0
  27. data/lib/erlang/messenger/lib/eunit/doc/.svn/format +1 -0
  28. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/erlang.png.svn-base +5 -0
  29. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/eunit.html.svn-base +5 -0
  30. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/index.html.svn-base +5 -0
  31. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/modules-frame.html.svn-base +5 -0
  32. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/overview-summary.html.svn-base +5 -0
  33. data/lib/erlang/messenger/lib/eunit/doc/.svn/prop-base/packages-frame.html.svn-base +5 -0
  34. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/edoc-info.svn-base +3 -0
  35. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/erlang.png.svn-base +0 -0
  36. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/eunit.html.svn-base +172 -0
  37. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/index.html.svn-base +17 -0
  38. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/modules-frame.html.svn-base +12 -0
  39. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/overview-summary.html.svn-base +984 -0
  40. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/overview.edoc.svn-base +980 -0
  41. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/packages-frame.html.svn-base +11 -0
  42. data/lib/erlang/messenger/lib/eunit/doc/.svn/text-base/stylesheet.css.svn-base +55 -0
  43. data/lib/erlang/messenger/lib/eunit/ebin/.svn/all-wcprops +5 -0
  44. data/lib/erlang/messenger/lib/eunit/ebin/.svn/dir-prop-base +8 -0
  45. data/lib/erlang/messenger/lib/eunit/ebin/.svn/entries +28 -0
  46. data/lib/erlang/messenger/lib/eunit/ebin/.svn/format +1 -0
  47. data/lib/erlang/messenger/lib/eunit/examples/.svn/all-wcprops +23 -0
  48. data/lib/erlang/messenger/lib/eunit/examples/.svn/entries +66 -0
  49. data/lib/erlang/messenger/lib/eunit/examples/.svn/format +1 -0
  50. data/lib/erlang/messenger/lib/eunit/examples/.svn/prop-base/eunit_examples.erl.svn-base +5 -0
  51. data/lib/erlang/messenger/lib/eunit/examples/.svn/prop-base/fib.erl.svn-base +5 -0
  52. data/lib/erlang/messenger/lib/eunit/examples/.svn/text-base/eunit_examples.erl.svn-base +339 -0
  53. data/lib/erlang/messenger/lib/eunit/examples/.svn/text-base/fib.erl.svn-base +19 -0
  54. data/lib/erlang/messenger/lib/eunit/examples/.svn/text-base/tests.txt.svn-base +1 -0
  55. data/lib/erlang/messenger/lib/eunit/include/.svn/all-wcprops +11 -0
  56. data/lib/erlang/messenger/lib/eunit/include/.svn/entries +41 -0
  57. data/lib/erlang/messenger/lib/eunit/include/.svn/format +1 -0
  58. data/lib/erlang/messenger/lib/eunit/include/.svn/prop-base/eunit.hrl.svn-base +5 -0
  59. data/lib/erlang/messenger/lib/eunit/include/.svn/text-base/eunit.hrl.svn-base +313 -0
  60. data/lib/erlang/messenger/lib/eunit/src/.svn/all-wcprops +113 -0
  61. data/lib/erlang/messenger/lib/eunit/src/.svn/entries +259 -0
  62. data/lib/erlang/messenger/lib/eunit/src/.svn/format +1 -0
  63. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/autoload.erl.svn-base +5 -0
  64. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/code_monitor.erl.svn-base +5 -0
  65. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit.erl.svn-base +5 -0
  66. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_autoexport.erl.svn-base +5 -0
  67. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_data.erl.svn-base +5 -0
  68. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_internal.hrl.svn-base +5 -0
  69. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_lib.erl.svn-base +5 -0
  70. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_proc.erl.svn-base +5 -0
  71. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_serial.erl.svn-base +5 -0
  72. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_server.erl.svn-base +5 -0
  73. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_striptests.erl.svn-base +5 -0
  74. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_test.erl.svn-base +5 -0
  75. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_tests.erl.svn-base +5 -0
  76. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/eunit_tty.erl.svn-base +5 -0
  77. data/lib/erlang/messenger/lib/eunit/src/.svn/prop-base/file_monitor.erl.svn-base +5 -0
  78. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/autoload.erl.svn-base +388 -0
  79. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/code_monitor.erl.svn-base +243 -0
  80. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit.app.src.svn-base +21 -0
  81. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit.appup.src.svn-base +1 -0
  82. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit.erl.svn-base +196 -0
  83. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_autoexport.erl.svn-base +102 -0
  84. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_data.erl.svn-base +798 -0
  85. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_internal.hrl.svn-base +48 -0
  86. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_lib.erl.svn-base +682 -0
  87. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_proc.erl.svn-base +552 -0
  88. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_serial.erl.svn-base +157 -0
  89. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_server.erl.svn-base +340 -0
  90. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_striptests.erl.svn-base +64 -0
  91. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_test.erl.svn-base +334 -0
  92. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_tests.erl.svn-base +45 -0
  93. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/eunit_tty.erl.svn-base +272 -0
  94. data/lib/erlang/messenger/lib/eunit/src/.svn/text-base/file_monitor.erl.svn-base +409 -0
  95. data/lib/erlang/messenger/pm_client_rel-0.1.boot +0 -0
  96. data/lib/erlang/messenger/pm_client_rel-0.1.script +77 -85
  97. data/lib/erlang/messenger/pm_master_rel-0.1.boot +0 -0
  98. data/lib/erlang/messenger/pm_master_rel-0.1.script +78 -85
  99. data/lib/erlang/messenger/pm_node_rel-0.1.boot +0 -0
  100. data/lib/erlang/messenger/pm_node_rel-0.1.script +77 -86
  101. data/lib/erlang/messenger/src/pm_node.erl +46 -9
  102. data/lib/erlang/messenger/src/utils.erl +7 -1
  103. data/lib/poolparty.rb +17 -23
  104. data/lib/poolparty/base_packages/poolparty.rb +1 -1
  105. data/lib/poolparty/core/string.rb +11 -2
  106. data/lib/poolparty/helpers/binary.rb +31 -0
  107. data/lib/poolparty/helpers/console.rb +25 -16
  108. data/lib/poolparty/helpers/nice_printer.rb +36 -0
  109. data/lib/poolparty/helpers/optioner.rb +8 -0
  110. data/lib/poolparty/helpers/provisioner_base.rb +7 -5
  111. data/lib/poolparty/helpers/provisioners/master.rb +1 -1
  112. data/lib/poolparty/helpers/provisioners/slave.rb +2 -1
  113. data/lib/poolparty/modules/cloud_resourcer.rb +1 -1
  114. data/lib/poolparty/modules/file_writer.rb +12 -1
  115. data/lib/poolparty/modules/resourcing_dsl.rb +2 -1
  116. data/lib/poolparty/monitors/base_monitor.rb +3 -0
  117. data/lib/poolparty/net/remoter.rb +13 -11
  118. data/lib/poolparty/pool/base.rb +25 -13
  119. data/lib/poolparty/pool/cloud.rb +32 -10
  120. data/lib/poolparty/pool/custom_resource.rb +16 -7
  121. data/lib/poolparty/pool/plugin_model.rb +2 -2
  122. data/lib/poolparty/pool/pool.rb +2 -2
  123. data/lib/poolparty/pool/resource.rb +25 -7
  124. data/lib/poolparty/pool/resources/class_package.rb +3 -2
  125. data/lib/poolparty/pool/resources/exec.rb +1 -1
  126. data/lib/poolparty/pool/resources/variable.rb +4 -0
  127. data/lib/poolparty/version.rb +1 -1
  128. data/poolparty.gemspec +13 -11
  129. data/spec/poolparty/core/hash_spec.rb +1 -1
  130. data/spec/poolparty/core/time_spec.rb +1 -1
  131. data/spec/poolparty/net/remote_spec.rb +1 -1
  132. data/spec/poolparty/pool/base_spec.rb +25 -20
  133. data/spec/poolparty/pool/cloud_spec.rb +50 -3
  134. data/spec/poolparty/pool/plugin_spec.rb +1 -0
  135. data/spec/poolparty/pool/resource_spec.rb +4 -3
  136. data/spec/poolparty/spec_helper.rb +3 -4
  137. data/tasks/deployment.rake +15 -3
  138. data/website/index.html +2 -2
  139. metadata +88 -46
  140. data/lib/erlang/messenger/Makefile +0 -15
  141. data/lib/erlang/messenger/lib/eunit/Makefile +0 -28
  142. data/lib/erlang/messenger/lib/eunit/ebin/autoload.beam +0 -0
  143. data/lib/erlang/messenger/lib/eunit/ebin/code_monitor.beam +0 -0
  144. data/lib/erlang/messenger/lib/eunit/ebin/eunit.beam +0 -0
  145. data/lib/erlang/messenger/lib/eunit/ebin/eunit_autoexport.beam +0 -0
  146. data/lib/erlang/messenger/lib/eunit/ebin/eunit_data.beam +0 -0
  147. data/lib/erlang/messenger/lib/eunit/ebin/eunit_lib.beam +0 -0
  148. data/lib/erlang/messenger/lib/eunit/ebin/eunit_proc.beam +0 -0
  149. data/lib/erlang/messenger/lib/eunit/ebin/eunit_serial.beam +0 -0
  150. data/lib/erlang/messenger/lib/eunit/ebin/eunit_server.beam +0 -0
  151. data/lib/erlang/messenger/lib/eunit/ebin/eunit_striptests.beam +0 -0
  152. data/lib/erlang/messenger/lib/eunit/ebin/eunit_test.beam +0 -0
  153. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tests.beam +0 -0
  154. data/lib/erlang/messenger/lib/eunit/ebin/eunit_tty.beam +0 -0
  155. data/lib/erlang/messenger/lib/eunit/ebin/file_monitor.beam +0 -0
  156. data/lib/erlang/messenger/lib/eunit/src/Makefile +0 -46
  157. data/lib/poolparty/config/allowed_commands.yml +0 -1
  158. data/lib/poolparty/plugins/git.rb +0 -45
  159. data/spec/poolparty/plugins/git_spec.rb +0 -40
@@ -0,0 +1,243 @@
1
+ %% This library is free software; you can redistribute it and/or modify
2
+ %% it under the terms of the GNU Lesser General Public License as
3
+ %% published by the Free Software Foundation; either version 2 of the
4
+ %% License, or (at your option) any later version.
5
+ %%
6
+ %% This library is distributed in the hope that it will be useful, but
7
+ %% WITHOUT ANY WARRANTY; without even the implied warranty of
8
+ %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9
+ %% Lesser General Public License for more details.
10
+ %%
11
+ %% You should have received a copy of the GNU Lesser General Public
12
+ %% License along with this library; if not, write to the Free Software
13
+ %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
14
+ %% USA
15
+ %%
16
+ %% $Id:$
17
+ %%
18
+ %% @private (for now)
19
+ %% @author Richard Carlsson <richardc@it.uu.se>
20
+ %% @copyright 2006 Richard Carlsson
21
+ %% @doc Erlang code monitoring service
22
+
23
+ -module(code_monitor).
24
+
25
+ -export([start/0, start/1, stop/0, stop/1, monitor/1, monitor/2,
26
+ demonitor/1, demonitor/2, install_codespy/1, wiretap/3]).
27
+
28
+ -export([main/1]). %% private
29
+
30
+
31
+ -define(SERVER, code_monitor).
32
+
33
+ monitor(Pid) ->
34
+ monitor(?SERVER, Pid).
35
+
36
+ monitor(Server, Pid) when is_pid(Pid) ->
37
+ ensure_started(Server),
38
+ Server ! {monitor, Pid},
39
+ ok.
40
+
41
+ demonitor(Pid) ->
42
+ demonitor(?SERVER, Pid).
43
+
44
+ demonitor(Server, Pid) when is_pid(Pid) ->
45
+ ensure_started(Server),
46
+ Server ! {demonitor, Pid},
47
+ ok.
48
+
49
+ stop() ->
50
+ stop(?SERVER).
51
+
52
+ stop(Server) ->
53
+ Server ! stop,
54
+ ok.
55
+
56
+ ensure_started(Name) when is_atom(Name) ->
57
+ start(Name);
58
+ ensure_started(Pid) when is_pid(Pid) ->
59
+ Pid.
60
+
61
+ start() ->
62
+ start(?SERVER).
63
+
64
+ start(Name) ->
65
+ case whereis(Name) of
66
+ undefined ->
67
+ Parent = self(),
68
+ Pid = spawn(fun () -> server_init(Name, Parent) end),
69
+ receive
70
+ {Pid, ok} -> Pid;
71
+ {Pid, error} -> throw(no_server)
72
+ end;
73
+ Pid -> Pid
74
+ end.
75
+
76
+ server_init(undefined = Name, Parent) ->
77
+ %% anonymous server
78
+ server_init_1(Name, Parent);
79
+ server_init(Name, Parent) ->
80
+ case catch register(Name, self()) of
81
+ true ->
82
+ server_init_1(Name, Parent);
83
+ _ ->
84
+ init_failure(Parent)
85
+ end.
86
+
87
+ server_init_1(Name, Parent) ->
88
+ case install_codespy(self()) of
89
+ {ok, _Spy} ->
90
+ Parent ! {self(), ok},
91
+ server(Name, sets:new());
92
+ {error, _} ->
93
+ init_failure(Parent)
94
+ end.
95
+
96
+ init_failure(Parent) ->
97
+ Parent ! {self(), error},
98
+ exit(failed).
99
+
100
+ server(Name, Listeners) ->
101
+ ?MODULE:main({Name, Listeners}).
102
+
103
+ %% @private
104
+ main({Name, Listeners}) ->
105
+ receive
106
+ {code_server, {module, M}} ->
107
+ cast({loaded, M, erlang:now()}, Listeners),
108
+ server(Name, Listeners);
109
+ {monitor, Pid} when is_pid(Pid) ->
110
+ server(Name, sets:add_element(Pid, Listeners));
111
+ {demonitor, Pid} ->
112
+ server(Name, sets:del_element(Pid, Listeners));
113
+ stop ->
114
+ exit(normal);
115
+ _ ->
116
+ server(Name, Listeners)
117
+ end.
118
+
119
+ cast(M, Listeners) ->
120
+ sets:fold(fun (L, M) -> L ! M end, {code_monitor, M}, Listeners).
121
+
122
+
123
+ %% code server spy process using generic wiretap functionality
124
+
125
+ install_codespy(To) ->
126
+ wiretap(code_server, To, fun code_spy/3).
127
+
128
+ code_spy({code_call,From,{load_file,_}=Req}, Server, To) ->
129
+ handle_load(Req, From, Req, Server, To);
130
+ code_spy({code_call,From,{ensure_loaded,M}=Req}=Msg, Server, To) ->
131
+ case erlang:module_loaded(M) of
132
+ true -> Server ! Msg;
133
+ false -> handle_load(Req, From, Req, Server, To)
134
+ end;
135
+ code_spy({code_call,From,{load_abs,_,_}=Req}, Server, To) ->
136
+ handle_load(Req, From, Req, Server, To);
137
+ code_spy({code_call,From,{load_binary,_,_,_}=Req}, Server, To) ->
138
+ handle_load(Req, From, Req, Server, To);
139
+ code_spy({code_call,From,{load_native_partial,_,_}=Req}, Server, To) ->
140
+ handle_load(Req, From, Req, Server, To);
141
+ code_spy({code_call,From,{load_native_sticky,_,_,_}=Req}, Server, To) ->
142
+ handle_load(Req, From, Req, Server, To);
143
+ code_spy(Msg, Server, _To) ->
144
+ Server ! Msg.
145
+
146
+ handle_load(Req, From, Req, Server, To) ->
147
+ ReplyTo = spawn(fun () -> reply_handler(Server, From, To) end),
148
+ Server ! {code_call, ReplyTo, Req}.
149
+
150
+ %% one-shot processes - receive, pass on and die
151
+ reply_handler(Server, Client, To) ->
152
+ link(Server),
153
+ receive
154
+ {code_server, _Reply} = M ->
155
+ To ! Client ! M
156
+ end.
157
+
158
+ %% basic wiretapping of registered processes (it should be possible to
159
+ %% have several wiretaps attached to the same registered name; they will
160
+ %% transparently form a chain, without knowing about each other)
161
+
162
+ wiretap(Name, To, F) when is_atom(Name), is_pid(To), is_function(F) ->
163
+ Parent = self(),
164
+ Pid = spawn(fun () -> wiretap_init(Name, To, F, Parent) end),
165
+ receive
166
+ {Pid, Result} -> Result
167
+ end.
168
+
169
+ wiretap_init(Name, To, F, Parent) ->
170
+ case whereis(Name) of
171
+ undefined ->
172
+ Parent ! {self(), {error, undefined}},
173
+ exit(error);
174
+ Pid ->
175
+ catch unregister(Name),
176
+ catch register(Name, self()),
177
+ Self = self(),
178
+ case whereis(Name) of
179
+ Self ->
180
+ process_flag(trap_exit, true),
181
+ link(Pid),
182
+ link(To),
183
+ Parent ! {self(), {ok, self()}},
184
+ wiretap_loop(Name, To, Pid, F);
185
+ _ ->
186
+ Parent ! {self(), {error, register_failed}},
187
+ exit(error)
188
+ end
189
+ end.
190
+
191
+ wiretap_loop(Name, To, Pid, F) ->
192
+ receive
193
+ {'EXIT', Pid, _} ->
194
+ wiretap_dropped(Name, To, F);
195
+ {'EXIT', To, _} ->
196
+ wiretap_exit(Name, Pid);
197
+ Msg ->
198
+ F(Msg, Pid, To),
199
+ wiretap_loop(Name, To, Pid, F)
200
+ end.
201
+
202
+ %% note that the registered name might get stolen from the spy process,
203
+ %% e.g., by another active wiretap
204
+
205
+ wiretap_exit(Name, Pid) ->
206
+ %% the receiver died - restore things and go away invisibly
207
+ unlink(Pid),
208
+ Self = self(),
209
+ %% sadly, this is not atomic...
210
+ case whereis(Name) of
211
+ Self ->
212
+ catch unregister(Name),
213
+ catch register(Name, Pid);
214
+ _ -> ok
215
+ end,
216
+ exit(normal).
217
+
218
+ %% if the real server goes away, make sure to unregister, and keep watch
219
+ %% in order to restart the wiretap when the server comes up again
220
+
221
+ wiretap_dropped(Name, To, F) ->
222
+ Self = self(),
223
+ case whereis(Name) of
224
+ Self -> (catch unregister(Name));
225
+ _ -> ok
226
+ end,
227
+ wiretap_watch(Name, To, F).
228
+
229
+ wiretap_watch(Name, To, F) ->
230
+ receive
231
+ {'EXIT', To, _} ->
232
+ exit(normal)
233
+ after 1000 ->
234
+ case whereis(Name) of
235
+ Pid when is_pid(Pid) ->
236
+ %% this process will terminate after starting the
237
+ %% new wiretap (even it that call fails)
238
+ wiretap(Name, To, F),
239
+ exit(normal);
240
+ _ ->
241
+ wiretap_watch(Name, To, F)
242
+ end
243
+ end.
@@ -0,0 +1,21 @@
1
+ % This is an -*- erlang -*- file.
2
+
3
+ {application, eunit,
4
+ [{description, "EUnit"},
5
+ {vsn, "%VSN%"},
6
+ {modules, [eunit,
7
+ eunit_autoexport,
8
+ eunit_striptests,
9
+ eunit_server,
10
+ eunit_proc,
11
+ eunit_serial,
12
+ eunit_test,
13
+ eunit_lib,
14
+ eunit_data,
15
+ eunit_tty,
16
+ code_monitor,
17
+ file_monitor,
18
+ autoload]},
19
+ {registered,[]},
20
+ {applications, [stdlib]},
21
+ {env, []}]}.
@@ -0,0 +1,196 @@
1
+ %% This library is free software; you can redistribute it and/or modify
2
+ %% it under the terms of the GNU Lesser General Public License as
3
+ %% published by the Free Software Foundation; either version 2 of the
4
+ %% License, or (at your option) any later version.
5
+ %%
6
+ %% This library is distributed in the hope that it will be useful, but
7
+ %% WITHOUT ANY WARRANTY; without even the implied warranty of
8
+ %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
9
+ %% Lesser General Public License for more details.
10
+ %%
11
+ %% You should have received a copy of the GNU Lesser General Public
12
+ %% License along with this library; if not, write to the Free Software
13
+ %% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
14
+ %% USA
15
+ %%
16
+ %% $Id$
17
+ %%
18
+ %% @copyright 2004-2007 Micka�l R�mond, Richard Carlsson
19
+ %% @author Micka�l R�mond <mickael.remond@process-one.net>
20
+ %% [http://www.process-one.net/]
21
+ %% @author Richard Carlsson <richardc@it.uu.se>
22
+ %% [http://user.it.uu.se/~richardc/]
23
+ %% @version {@version}, {@date} {@time}
24
+ %% @doc This module is the normal EUnit user interface.
25
+
26
+ -module(eunit).
27
+
28
+ -include("eunit.hrl").
29
+ -include("eunit_internal.hrl").
30
+
31
+
32
+ -export([start/0, start/1, stop/0, stop/1, test/1, test/2, test/3,
33
+ list/1, submit/1, submit/2, submit/3, watch/1, watch/2,
34
+ watch/3, watch_path/1, watch_path/2, watch_path/3,
35
+ watch_regexp/1, watch_regexp/2, watch_regexp/3, watch_app/1,
36
+ watch_app/2, watch_app/3]).
37
+
38
+ -export([testp/1]). %% for development testing, not official
39
+
40
+
41
+ %% EUnit entry points
42
+
43
+ start() ->
44
+ start(?SERVER).
45
+
46
+ start(Server) ->
47
+ eunit_server:start(Server).
48
+
49
+ stop() ->
50
+ stop(?SERVER).
51
+
52
+ stop(Server) ->
53
+ eunit_server:stop(Server).
54
+
55
+ watch(Target) ->
56
+ watch(Target, []).
57
+
58
+ watch(Target, Options) ->
59
+ watch(?SERVER, Target, Options).
60
+
61
+ watch(Server, Target, Options) ->
62
+ eunit_server:watch(Server, Target, Options).
63
+
64
+ watch_path(Target) ->
65
+ watch_path(Target, []).
66
+
67
+ watch_path(Target, Options) ->
68
+ watch_path(?SERVER, Target, Options).
69
+
70
+ watch_path(Server, Target, Options) ->
71
+ eunit_server:watch_path(Server, Target, Options).
72
+
73
+ watch_regexp(Target) ->
74
+ watch_regexp(Target, []).
75
+
76
+ watch_regexp(Target, Options) ->
77
+ watch_regexp(?SERVER, Target, Options).
78
+
79
+ watch_regexp(Server, Target, Options) ->
80
+ eunit_server:watch_regexp(Server, Target, Options).
81
+
82
+ watch_app(Name) ->
83
+ watch_app(Name, []).
84
+
85
+ watch_app(Name, Options) ->
86
+ watch_app(?SERVER, Name, Options).
87
+
88
+ watch_app(Server, Name, Options) ->
89
+ case code:lib_dir(Name) of
90
+ Path when is_list(Path) ->
91
+ watch_path(Server, filename:join(Path, "ebin"), Options);
92
+ _ ->
93
+ error
94
+ end.
95
+
96
+ list(T) ->
97
+ try eunit_data:list(T)
98
+ catch
99
+ {error, R} -> {error, R}
100
+ end.
101
+
102
+ test(T) ->
103
+ test(T, [{order, inorder}]).
104
+
105
+ testp(T) ->
106
+ test(T, [{order, inparallel}]).
107
+
108
+ test(T, Options) ->
109
+ test(?SERVER, T, Options).
110
+
111
+ test(Server, T, Options) ->
112
+ %% TODO: try to eliminate call to list/1
113
+ try eunit_data:list(T) of
114
+ List ->
115
+ Listeners = [eunit_tty:start(List, Options)
116
+ | listeners(Options)],
117
+ Serial = eunit_serial:start(Listeners),
118
+ case eunit_server:start_test(Server, Serial, T, Options) of
119
+ {ok, Reference} -> test_run(Reference, Listeners);
120
+ {error, R} -> {error, R}
121
+ end
122
+ catch
123
+ {error, R} ->
124
+ io:put_chars(eunit_lib:format_error(R)),
125
+ {error, R}
126
+ end.
127
+
128
+ test_run(Reference, Listeners) ->
129
+ receive
130
+ {start, Reference} ->
131
+ cast(Listeners, {start, Reference})
132
+ end,
133
+ receive
134
+ {done, Reference} ->
135
+ cast(Listeners, {stop, Reference, self()}),
136
+ receive
137
+ {result, Reference, Result} ->
138
+ Result
139
+ end
140
+ end.
141
+
142
+ cast([P | Ps], Msg) ->
143
+ P ! Msg,
144
+ cast(Ps, Msg);
145
+ cast([], Msg) ->
146
+ Msg.
147
+
148
+ %% TODO: functions that run tests on a given node, not a given server
149
+ %% TODO: maybe some functions could check for a globally registered server?
150
+ %% TODO: some synchronous but completely quiet interface function
151
+
152
+ submit(T) ->
153
+ submit(T, []).
154
+
155
+ submit(T, Options) ->
156
+ submit(?SERVER, T, Options).
157
+
158
+ submit(Server, T, Options) ->
159
+ Dummy = spawn(fun devnull/0),
160
+ eunit_server:start_test(Server, Dummy, T, Options).
161
+
162
+ listeners(Options) ->
163
+ case proplists:get_value(event_log, Options) of
164
+ undefined ->
165
+ [];
166
+ LogFile ->
167
+ [spawn(fun () -> event_logger(LogFile) end)]
168
+ end.
169
+
170
+ %% TODO: make this report file errors
171
+ event_logger(LogFile) ->
172
+ case file:open(LogFile, [write]) of
173
+ {ok, FD} ->
174
+ receive
175
+ {start, Reference} ->
176
+ event_logger_loop(Reference, FD)
177
+ end;
178
+ Error ->
179
+ exit(Error)
180
+ end.
181
+
182
+ event_logger_loop(Reference, FD) ->
183
+ receive
184
+ {status, _Id, _Info}=Msg ->
185
+ io:fwrite(FD, "~w.\n", [Msg]),
186
+ event_logger_loop(Reference, FD);
187
+ {stop, Reference, _ReplyTo} ->
188
+ %% no need to reply, just exit
189
+ file:close(FD),
190
+ exit(normal)
191
+ end.
192
+
193
+ %% TODO: make a proper logger for asynchronous execution with submit/3
194
+
195
+ devnull() ->
196
+ receive _ -> devnull() end.