4
%% Copyright Ericsson AB 2004-2011. All Rights Reserved.
6
%% The contents of this file are subject to the Erlang Public License,
7
%% Version 1.1, (the "License"); you may not use this file except in
8
%% compliance with the License. You should have received a copy of the
9
%% Erlang Public License along with this software. If not, it can be
10
%% retrieved online at http://www.erlang.org/.
12
%% Software distributed under the License is distributed on an "AS IS"
13
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
14
%% the License for the specific language governing rights and limitations
21
%%----------------------------------------------------------------------
22
%% Purpose : Test suite for erl-client/c-server
23
%%----------------------------------------------------------------------
26
-module(erl_client_c_server_proto_SUITE).
27
-include_lib("common_test/include/ct.hrl").
29
-export([init_per_testcase/2, end_per_testcase/2,all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2, void_test/1,
30
long_test/1, longlong_test/1, ushort_test/1, ulong_test/1,
31
ulonglong_test/1, double_test/1, char_test/1, wchar_test/1,
32
octet_test/1, bool_test/1, struct_test/1, struct2_test/1,
33
seq1_test/1, seq2_test/1, seq3_test/1, seq4_test/1,
34
seq5_test/1, array1_test/1, array2_test/1, enum_test/1,
35
string1_test/1, string2_test/1, string3_test/1,
36
string4_test/1, pid_test/1, port_test/1, ref_test/1,
37
term_test/1, typedef_test/1, inline_sequence_test/1,
38
term_sequence_test/1, term_struct_test/1, wstring1_test/1]).
40
-define(DEFAULT_TIMEOUT, 20000).
41
-define(PORT_TIMEOUT, 15000).
42
-define(CALL_TIMEOUT, 5000).
44
-define(C_SERVER_NODE_NAME, idl_c_server_test).
46
%% Add/remove code path and watchdog before/after each test case.
48
init_per_testcase(_Case, Config) ->
49
DataDir = ?config(data_dir, Config),
50
code:add_patha(DataDir),
52
%% Since other test suites use the module m_i, we have
53
%% to make sure we are using the right m_i module.
57
WatchDog = test_server:timetrap(?DEFAULT_TIMEOUT),
58
[{watchdog, WatchDog}| Config].
60
end_per_testcase(_Case, Config) ->
61
DataDir = ?config(data_dir, Config),
62
code:del_path(DataDir),
63
WatchDog = ?config(watchdog, Config),
64
test_server:timetrap_cancel(WatchDog).
66
suite() -> [{ct_hooks,[ts_install_cth]}].
69
[void_test, long_test, longlong_test, ushort_test,
70
ulong_test, ulonglong_test, double_test, char_test,
71
wchar_test, octet_test, bool_test, struct_test,
72
struct2_test, seq1_test, seq2_test, seq3_test,
73
seq4_test, seq5_test, array1_test, array2_test,
74
enum_test, string1_test, string2_test, string3_test,
75
string4_test, pid_test, port_test, ref_test, term_test,
76
typedef_test, inline_sequence_test, term_sequence_test,
77
term_struct_test, wstring1_test].
82
init_per_suite(Config) ->
85
end_per_suite(_Config) ->
88
init_per_group(_GroupName, Config) ->
91
end_per_group(_GroupName, Config) ->
96
array1_test(doc) -> "";
97
array1_test(suite) -> [];
98
array1_test(Config) ->
99
do_test(array1_test, Config).
101
array2_test(doc) -> "";
102
array2_test(suite) -> [];
103
array2_test(Config) ->
104
do_test(array2_test, Config).
106
bool_test(doc) -> "";
107
bool_test(suite) -> [];
109
do_test(bool_test, Config).
111
char_test(doc) -> "";
112
char_test(suite) -> [];
114
do_test(char_test, Config).
116
double_test(doc) -> "";
117
double_test(suite) -> [];
118
double_test(Config) ->
119
do_test(double_test, Config).
121
enum_test(doc) -> "";
122
enum_test(suite) -> [];
124
do_test(enum_test, Config).
126
inline_sequence_test(doc) -> "";
127
inline_sequence_test(suite) -> [];
128
inline_sequence_test(Config) ->
129
do_test(inline_sequence_test, Config).
131
longlong_test(doc) -> "";
132
longlong_test(suite) -> [];
133
longlong_test(Config) ->
134
do_test(longlong_test, Config).
136
long_test(doc) -> "";
137
long_test(suite) -> [];
139
do_test(long_test, Config).
141
octet_test(doc) -> "";
142
octet_test(suite) -> [];
143
octet_test(Config) ->
144
do_test(octet_test, Config).
147
pid_test(suite) -> [];
149
do_test(pid_test, Config).
151
port_test(doc) -> "";
152
port_test(suite) -> [];
154
do_test(port_test, Config).
157
ref_test(suite) -> [];
159
do_test(ref_test, Config).
161
seq1_test(doc) -> "";
162
seq1_test(suite) -> [];
164
do_test(seq1_test, Config).
166
seq2_test(doc) -> "";
167
seq2_test(suite) -> [];
169
do_test(seq2_test, Config).
171
seq3_test(doc) -> "";
172
seq3_test(suite) -> [];
174
do_test(seq3_test, Config).
176
seq4_test(doc) -> "";
177
seq4_test(suite) -> [];
179
do_test(seq4_test, Config).
181
seq5_test(doc) -> "";
182
seq5_test(suite) -> [];
184
do_test(seq5_test, Config).
186
string1_test(doc) -> "";
187
string1_test(suite) -> [];
188
string1_test(Config) ->
189
do_test(string1_test, Config).
191
string2_test(doc) -> "";
192
string2_test(suite) -> [];
193
string2_test(Config) ->
194
do_test(string2_test, Config).
196
string3_test(doc) -> "";
197
string3_test(suite) -> [];
198
string3_test(Config) ->
199
do_test(string3_test, Config).
201
string4_test(doc) -> "";
202
string4_test(suite) -> [];
203
string4_test(Config) ->
204
do_test(string4_test, Config).
206
struct2_test(doc) -> "";
207
struct2_test(suite) -> [];
208
struct2_test(Config) ->
209
do_test(struct2_test, Config).
211
struct_test(doc) -> "";
212
struct_test(suite) -> [];
213
struct_test(Config) ->
214
do_test(struct_test, Config).
216
term_sequence_test(doc) -> "";
217
term_sequence_test(suite) -> [];
218
term_sequence_test(Config) ->
219
do_test(term_sequence_test, Config).
221
term_struct_test(doc) -> "";
222
term_struct_test(suite) -> [];
223
term_struct_test(Config) ->
224
do_test(term_struct_test, Config).
226
term_test(doc) -> "";
227
term_test(suite) -> [];
229
do_test(term_test, Config).
231
typedef_test(doc) -> "";
232
typedef_test(suite) -> [];
233
typedef_test(Config) ->
234
do_test(typedef_test, Config).
236
ulonglong_test(doc) -> "";
237
ulonglong_test(suite) -> [];
238
ulonglong_test(Config) ->
239
do_test(ulonglong_test, Config).
241
ulong_test(doc) -> "";
242
ulong_test(suite) -> [];
243
ulong_test(Config) ->
244
do_test(ulong_test, Config).
246
ushort_test(doc) -> "";
247
ushort_test(suite) -> [];
248
ushort_test(Config) ->
249
do_test(ushort_test, Config).
251
void_test(doc) -> "";
252
void_test(suite) -> [];
254
do_test(void_test, Config).
256
wchar_test(doc) -> "";
257
wchar_test(suite) -> [];
258
wchar_test(Config) ->
259
do_test(wchar_test, Config).
261
wstring1_test(doc) -> "";
262
wstring1_test(suite) -> [];
263
wstring1_test(Config) ->
264
do_test(wstring1_test, Config).
267
do_test(Case, Config) ->
269
process_flag(trap_exit, true),
270
Node = atom_to_list(node()),
271
[_NodeName, HostName] = string:tokens(Node, "@"),
272
DataDir = ?config(data_dir, Config),
273
%% io:format("~p: data directory: ~p~n", [?MODULE, DataDir]),
274
Cookie = atom_to_list(erlang:get_cookie()),
275
ServerNodeName = atom_to_list(?C_SERVER_NODE_NAME),
276
%% Start C-server node as a port program. We wait for the node
278
Cmd = filename:join([DataDir, "c_server"]) ++
279
" -this-node-name " ++ ServerNodeName ++
280
" -peer-node " ++ Node ++
281
" -cookie " ++ Cookie,
282
Port = open_port({spawn, Cmd}, [exit_status, eof, stderr_to_stdout]),
283
ServerNode = list_to_atom(ServerNodeName ++ "@" ++ HostName),
284
Res = case wait_for_hidden_node(ServerNode) of
286
%% Need a port for port_test and typedef_test
287
put(port_test_port, Port),
288
R = (catch erl_client:Case(ServerNode, ?CALL_TIMEOUT)),
289
case wait_for_completion(Port) of
291
kill_off_node(ServerNode);
297
case wait_for_completion(Port) of
299
kill_off_node(ServerNode);
305
process_flag(trap_exit, false),
309
%% Wait for eof *and* exit status, but return if exit status indicates
310
%% an error, or we have been waiting more than PORT_TIMEOUT seconds.
312
wait_for_completion(Port) ->
313
wait_for_completion(Port, 0).
315
wait_for_completion(Port, N) when N < 2 ->
317
{Port, {data, Bytes}} ->
319
io:format("~s", [Bytes]),
320
wait_for_completion(Port, N);
321
{Port, {exit_status, 0}} ->
322
wait_for_completion(Port, N + 1);
323
{Port, {exit_status, Status}} ->
326
wait_for_completion(Port, N + 1);
327
{'EXIT', Port, Reason} ->
328
io:format("Port exited with reason: ~w~n", [Reason]),
329
wait_for_completion(Port, N);
330
{'EXIT', From, Reason} ->
331
io:format("Got unexpected exit: ~p~n", [{'EXIT', From, Reason}]),
332
wait_for_completion(Port, N)
333
after ?PORT_TIMEOUT ->
336
wait_for_completion(_, _) ->
339
wait_for_hidden_node(Node) ->
340
Times = ?DEFAULT_TIMEOUT div 100,
341
wait_for_hidden_node(Node, Times, 100).
343
wait_for_hidden_node(Node, Times, WaitTime) when Times > 0 ->
344
io:format("Waiting for hidden node: ~p~n", [Node]),
345
case lists:member(Node, erlang:nodes(hidden)) of
350
wait_for_hidden_node(Node, Times - 1, WaitTime)
352
wait_for_hidden_node(_Node, _, _WaitTime) ->
355
kill_off_node(Node) ->
356
catch rpc:cast(Node, erlang, halt, [1]).