1%%
2%% %CopyrightBegin%
3%%
4%% Copyright Ericsson AB 2002-2016. All Rights Reserved.
5%%
6%% Licensed under the Apache License, Version 2.0 (the "License");
7%% you may not use this file except in compliance with the License.
8%% You may obtain a copy of the License at
9%%
10%%     http://www.apache.org/licenses/LICENSE-2.0
11%%
12%% Unless required by applicable law or agreed to in writing, software
13%% distributed under the License is distributed on an "AS IS" BASIS,
14%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15%% See the License for the specific language governing permissions and
16%% limitations under the License.
17%%
18%% %CopyrightEnd%
19%%
20%%
21-module(erl_client).
22
23-export([void_test/2, long_test/2, longlong_test/2, ushort_test/2,
24	 ulong_test/2, ulonglong_test/2, double_test/2, char_test/2,
25	 wchar_test/2, octet_test/2, bool_test/2, struct_test/2,
26	 struct2_test/2, seq1_test/2, seq2_test/2, seq3_test/2,
27	 seq4_test/2, seq5_test/2, array1_test/2, array2_test/2,
28	 enum_test/2, string1_test/2, wstring1_test/2, string2_test/2,
29	 string3_test/2, string4_test/2, pid_test/2, port_test/2,
30	 ref_test/2, term_test/2, typedef_test/2,
31	 inline_sequence_test/2, term_sequence_test/2,
32	 term_struct_test/2
33
34]).
35
36-include("m.hrl").
37-include("m_i.hrl").
38-include("oe_erl_c_test.hrl").
39
40%%b
41void_test(Node, Timeout) ->
42    Ret = m_i:void_test({olsson, Node}, Timeout),
43    Ret == void.				% XXX Not documented
44%%e
45
46%%b
47long_test(Node, Timeout) ->
48    In = max_long(),
49    {Ret, Out} = m_i:long_test({olsson, Node}, Timeout, In),
50    (Ret == In) and (Out == In).
51%%e
52
53%%b
54longlong_test(Node, Timeout) ->
55    In = 65537,
56    {Ret, Out} = m_i:longlong_test({olsson, Node}, Timeout, In),
57    (Ret == In) and (Out == In).
58%%e
59
60%%b
61ushort_test(Node, Timeout) ->
62    In = max_ushort(),
63    {Ret, Out} = m_i:ushort_test({olsson, Node}, Timeout, In),
64    (Ret == In) and (Out == In).
65%%e
66
67%%b
68ulong_test(Node, Timeout) ->
69    In = max_ulong(),
70    {Ret, Out} = m_i:ulong_test({olsson, Node}, Timeout, In),
71    (Ret == In) and (Out == In).
72%%e
73
74%%b
75ulonglong_test(Node, Timeout) ->
76    In = 65537,
77    {Ret, Out} = m_i:ulonglong_test({olsson, Node}, Timeout, In),
78    (Ret == In) and (Out == In).
79%%e
80
81%%b
82double_test(Node, Timeout) ->
83    In = 37768.93,
84    {Ret, Out} = m_i:double_test({olsson, Node}, Timeout, In),
85    (Ret == In) and (Out == In).
86%%e
87
88%%b
89char_test(Node, Timeout) ->
90    In = 80,
91    {Ret, Out} = m_i:char_test({olsson, Node}, Timeout, In),
92    (Ret == In) and (Out == In).
93%%e
94
95%%b
96wchar_test(Node, Timeout) ->
97    In = 4097,
98    {Ret, Out} = m_i:wchar_test({olsson, Node}, Timeout, In),
99    (Ret == In) and (Out == In).
100%%e
101
102%%b
103octet_test(Node, Timeout) ->
104    In = 255,
105    {Ret, Out} = m_i:octet_test({olsson, Node}, Timeout, In),
106    (Ret == In) and (Out == In).
107%%e
108
109%%b
110bool_test(Node, Timeout) ->
111    In = false,
112    {Ret, Out} = m_i:bool_test({olsson, Node}, Timeout, In),
113    (Ret == In) and (Out == In).
114%%e
115
116%%b
117struct_test(Node, Timeout) ->
118    In = #m_b{l = max_long(), c = $a},
119    {Ret, Out} = m_i:struct_test({olsson, Node}, Timeout, In),
120    (Ret == In) and (Out == In).
121%%e
122
123%%b
124struct2_test(Node, Timeout) ->
125    In = #m_es{ f = banana, l = max_long()},
126    {Ret, Out} = m_i:struct2_test({olsson, Node}, Timeout, In),
127    (Ret == In) and (Out == In).
128%%e
129
130%%b
131seq1_test(Node, Timeout) ->
132    B1 = #m_b{l = max_long(), c = $a},
133    B2 = #m_b{l = min_long(), c = $b},
134    In = [B1, B2],
135    {Ret, Out} = m_i:seq1_test({olsson, Node}, Timeout, In),
136    (Ret == In) and (Out == In).
137%%e
138
139%%b
140seq2_test(Node, Timeout) ->
141    B = #m_b{l = max_long(), c = $a},
142    A = #m_a{l = min_long(), y = [B, B], d = 4711.31},
143    In = [A, A, A],
144    {Ret, Out} = m_i:seq2_test({olsson, Node}, Timeout, In),
145    (Ret == In) and (Out == In).
146%%e
147
148%%b
149seq3_test(Node, Timeout) ->
150    In = [max_long(), min_long(), max_long()],
151    {Ret, Out} = m_i:seq3_test({olsson, Node}, Timeout, In),
152    (Ret == In) and (Out == In).
153%%e
154
155%%b
156seq4_test(Node, Timeout) ->
157    In = [["hello", "all"], ["Erlang", "users", "!"]],
158    {Ret, Out} = m_i:seq4_test({olsson, Node}, Timeout, In),
159    (Ret == In) and (Out == In).
160%%e
161
162%%b
163seq5_test(Node, Timeout) ->
164    Arr3 = mk_array(3, max_long()),
165    In = [[Arr3, Arr3], [Arr3, Arr3, Arr3]],
166    {Ret, Out} = m_i:seq5_test({olsson, Node}, Timeout, In),
167    (Ret == In) and (Out == In).
168%%e
169
170%%b
171array1_test(Node, Timeout) ->
172    In = mk_array(500, min_long()),
173    {Ret, Out} = m_i:array1_test({olsson, Node}, Timeout, In),
174    (Ret == In) and (Out == In).
175%%e
176
177%%b
178array2_test(Node, Timeout) ->
179    In = mk_array(2, mk_array(3, min_long())),
180    {Ret, Out} = m_i:array2_test({olsson, Node}, Timeout, In),
181    (Ret == In) and (Out == In).
182%%e
183
184%%b
185enum_test(Node, Timeout) ->
186    In = banana,
187    {Ret, Out} = m_i:enum_test({olsson, Node}, Timeout, In),
188    (Ret == In) and (Out == In).
189%%e
190
191%%b
192string1_test(Node, Timeout) ->
193    In = "Developing Erlang applications is fun!",
194    {Ret, Out} = m_i:string1_test({olsson, Node}, Timeout, In),
195    (Ret == In) and (Out == In).
196%%e
197
198%%b
199wstring1_test(Node, Timeout) ->
200    In = [1047| "eveloping Erlang applications is fun!"],
201    {Ret, Out} = m_i:wstring1_test({olsson, Node}, Timeout, In),
202    (Ret == In) and (Out == In).
203%%e
204
205%%b
206string2_test(Node, Timeout) ->
207    In = ["Developing Erlang applications ", "is fun!"],
208    {Ret, Out} = m_i:string2_test({olsson, Node}, Timeout, In),
209    (Ret == In) and (Out == In).
210%%e
211
212%%b
213string3_test(Node, Timeout) ->
214    In = "Developing Erlang applications is fun!",
215    {Ret, Out} = m_i:string3_test({olsson, Node}, Timeout, In),
216    (Ret == In) and (Out == In).
217%%e
218
219%%b
220string4_test(Node, Timeout) ->
221
222    In = #m_strRec{
223      bb = true,
224      str4 = "Developing Erlang applications "
225      "is fun!",
226      str7 = mk_array(3, mk_array(2, max_long())),
227      str5 = [$a, $b, $c, $d, $e, $f],
228      str6 = "123456789012",
229      str8 = {$x, $y, $x},
230      str9 = "123456789012",
231      str10 = [$a, $b, $c, $d, $e, $f]
232      },
233    {Ret, Out} = m_i:string4_test({olsson, Node}, Timeout, In),
234    (Ret == In) and (Out == In).
235%%e
236
237%%b
238pid_test(Node, Timeout) ->
239    In = self(),
240    {Ret, Out} = m_i:pid_test({olsson, Node}, Timeout, In),
241    (Ret == In) and (Out == In).
242%%e
243
244%%b
245port_test(Node, Timeout) ->
246    In = get(port_test_port),
247    {Ret, Out} = m_i:port_test({olsson, Node}, Timeout, In),
248    (Ret == In) and (Out == In).
249%%e
250
251%%b
252ref_test(Node, Timeout) ->
253    In = make_ref(),
254    {Ret, Out} = m_i:ref_test({olsson, Node}, Timeout, In),
255    (Ret == In) and (Out == In).
256%%e
257
258%%b
259term_test(Node, Timeout) ->
260    In = {[a, b], 17, kalle},
261    {Ret, Out} = m_i:term_test({olsson, Node}, Timeout, In),
262    (Ret == In) and (Out == In).
263%%e
264
265%%b
266typedef_test(Node, Timeout) ->
267    In1 = {nisse, [1, 2], olsson},
268    In2 = get(port_test_port),
269    {Ret, Out1, Out2} = m_i:typedef_test({olsson, Node}, Timeout, In1, In2),
270    %% XXX Should check that Ret is an integer.
271    (Out1 == In1) and (Out2 == In2).
272%%e
273
274%%b
275inline_sequence_test(Node, Timeout) ->
276    In = #m_s{l = min_long(), sl = [max_long(), min_long()]},
277    {Ret, Out} = m_i:inline_sequence_test({olsson, Node}, Timeout, In),
278    (Ret == In) and (Out == In).
279%%e
280
281%%b
282term_sequence_test(Node, Timeout) ->
283    In = lists:duplicate(17, {nisse, [1, 2], {kalle, olsson}}),
284    {Ret, Out} = m_i:term_sequence_test({olsson, Node}, Timeout, In),
285    (Ret == In) and (Out == In).
286%%e
287
288%%b
289term_struct_test(Node, Timeout) ->
290    In = #m_et{e = {nisse, ["abcde"], {kalle, olsson}}, l = 4711},
291    {Ret, Out} = m_i:term_struct_test({olsson, Node}, Timeout, In),
292    (Ret == In) and (Out == In).
293%%e
294
295
296%% Locals
297
298mk_array(Es) ->
299    list_to_tuple(Es).
300
301mk_array(N, E) ->
302    mk_array(lists:duplicate(N, E)).
303
304%% max_short() ->
305%%     power_of_two(15) - 1.
306max_long() ->
307    power_of_two(31) - 1.
308max_longlong() ->
309    power_of_two(63) - 1.
310max_ushort() ->
311    power_of_two(16) - 1.
312max_ulong() ->
313    power_of_two(32) - 1.
314max_ulonglong() ->
315    power_of_two(64) - 1.
316
317%% min_short() ->
318%%     -power_of_two(15).
319min_long() ->
320    -power_of_two(31).
321%% min_longlong() ->
322%%     -power_of_two(63).
323%% min_ushort() ->
324%%     0.
325%% min_ulong() ->
326%%     0.
327%% min_ulonglong() ->
328%%     0.
329
330power_of_two(N) ->
331    round(math:pow(2, N)).
332
333