auser-poolparty 0.2.66 → 0.2.67

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.