4
%% Copyright Ericsson AB 1997-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
20
%%-----------------------------------------------------------------
23
%% Test suite for the CDR basic type encode/decode functions
25
%%-----------------------------------------------------------------
26
-module(cdrlib_SUITE).
28
-include_lib("test_server/include/test_server.hrl").
30
-define(default_timeout, ?t:minutes(3)).
32
%%-----------------------------------------------------------------
34
%%-----------------------------------------------------------------
35
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
36
init_per_group/2,end_per_group/2]).
38
%%-----------------------------------------------------------------
40
%%-----------------------------------------------------------------
43
%%-----------------------------------------------------------------
47
%%-----------------------------------------------------------------
48
suite() -> [{ct_hooks,[ts_install_cth]}].
51
[short, ushort, long, ulong, longlong, ulonglong,
52
boolean, character, octet, float, double, enum].
57
init_per_suite(Config) ->
60
end_per_suite(_Config) ->
63
init_per_group(_GroupName, Config) ->
66
end_per_group(_GroupName, Config) ->
70
%%-----------------------------------------------------------------
71
%% Init and cleanup functions.
72
%%-----------------------------------------------------------------
74
init_per_testcase(_Case, Config) ->
75
?line Dog=test_server:timetrap(?default_timeout),
76
[{watchdog, Dog}|Config].
79
end_per_testcase(_Case, Config) ->
80
Dog = ?config(watchdog, Config),
81
test_server:timetrap_cancel(Dog),
84
%%-----------------------------------------------------------------
85
%% Test Case: short integer test
87
%%-----------------------------------------------------------------
88
short(doc) -> ["Description", "more description"];
91
short_big_loop([-32768, -4040, -1, 0, 4040, 32767]),
92
short_little_loop([-32768, -4040, -1, 0, 4040, 32767]),
97
short_big_loop([X |List]) ->
98
?line [CodedType] = cdrlib:enc_short(X, []),
99
?line {X, <<>>} = cdrlib:dec_short(big, CodedType),
100
short_big_loop(List),
103
short_little_loop([]) ->
105
short_little_loop([X |List]) ->
106
?line CodedType = enc_short_little(X, []),
107
?line {X, <<>>} = cdrlib:dec_short(little, CodedType),
108
short_little_loop(List),
111
enc_short_little(X, Message) ->
112
list_to_binary([(X) band 16#ff, ((X) bsr 8) band 16#ff | Message]).
115
?line {'EXCEPTION', _} = (catch cdrlib:enc_short('atom', [])),
116
?line [CodedType] = cdrlib:enc_char($a, []),
117
?line {'EXIT', _} = (catch cdrlib:dec_short(big, CodedType)),
119
%%-----------------------------------------------------------------
120
%% Test Case: unsigned short integer test
122
%%-----------------------------------------------------------------
123
ushort(doc) -> ["Description", "more description"];
126
ushort_big_loop([0, 4040, 65535]),
127
ushort_little_loop([0, 4040, 65535]),
130
ushort_big_loop([]) ->
132
ushort_big_loop([X |List]) ->
133
?line [CodedType] = cdrlib:enc_unsigned_short(X, []),
134
?line {X, <<>>} = cdrlib:dec_unsigned_short(big, CodedType),
135
ushort_big_loop(List),
138
ushort_little_loop([]) ->
140
ushort_little_loop([X |List]) ->
141
?line CodedType = enc_ushort_little(X, []),
142
?line {X, <<>>} = cdrlib:dec_unsigned_short(little, CodedType),
143
ushort_little_loop(List),
146
enc_ushort_little(X, Message) ->
147
list_to_binary([(X) band 16#ff, ((X) bsr 8) band 16#ff | Message]).
151
%%-----------------------------------------------------------------
152
%% Test Case: long integer test
154
%%-----------------------------------------------------------------
155
long(doc) -> ["Description", "more description"];
158
long_big_loop([-2147483648, -40404040, -32768, -4040, -1,
159
0, 4040, 32767, 40404040, 2147483647]),
160
long_little_loop([-2147483648, -40404040, -32768, -4040, -1,
161
0, 4040, 32767, 40404040, 2147483647]),
167
long_big_loop([X |List]) ->
168
?line [CodedType] = cdrlib:enc_long(X, []),
169
?line {X, <<>>} = cdrlib:dec_long(big, CodedType),
173
long_little_loop([]) ->
175
long_little_loop([X |List]) ->
176
?line CodedType = enc_long_little(X, []),
177
?line {X, <<>>} = cdrlib:dec_long(little, CodedType),
178
long_little_loop(List),
181
enc_long_little(X, Message) ->
182
list_to_binary([(X) band 16#ff, ((X) bsr 8) band 16#ff, ((X) bsr 16) band 16#ff,
183
((X) bsr 24) band 16#ff | Message]).
188
%%-----------------------------------------------------------------
189
%% Test Case: unsigned long integer test
191
%%-----------------------------------------------------------------
192
ulong(doc) -> ["Description", "more description"];
195
ulong_big_loop([0, 4040, 65535, 40404040, 2147483647, 4294967295]),
196
ulong_little_loop([0, 4040, 65535, 40404040, 2147483647, 4294967295]),
200
ulong_big_loop([]) ->
202
ulong_big_loop([X |List]) ->
203
?line [CodedType] = cdrlib:enc_unsigned_long(X, []),
204
?line {X, <<>>} = cdrlib:dec_unsigned_long(big, CodedType),
205
ulong_big_loop(List),
208
ulong_little_loop([]) ->
210
ulong_little_loop([X |List]) ->
211
?line CodedType = enc_ulong_little(X, []),
212
?line {X, <<>>} = cdrlib:dec_unsigned_long(little, CodedType),
213
ulong_little_loop(List),
216
enc_ulong_little(X, Message) ->
217
list_to_binary([(X) band 16#ff, ((X) bsr 8) band 16#ff, ((X) bsr 16) band 16#ff,
218
((X) bsr 24) band 16#ff | Message]).
224
%%-----------------------------------------------------------------
225
%% Test Case: long integer test
227
%%-----------------------------------------------------------------
228
longlong(doc) -> ["Description", "more description"];
229
longlong(suite) -> [];
231
longlong_big_loop([-2147483648, -40404040, -32768, -4040, -1,
232
0, 4040, 32767, 40404040, 2147483647]),
233
longlong_little_loop([-2147483648, -40404040, -32768, -4040, -1,
234
0, 4040, 32767, 40404040, 2147483647]),
238
longlong_big_loop([]) ->
240
longlong_big_loop([X |List]) ->
241
?line [CodedType] = cdrlib:enc_longlong(X, []),
242
?line {X, <<>>} = cdrlib:dec_longlong(big, CodedType),
243
longlong_big_loop(List),
246
longlong_little_loop([]) ->
248
longlong_little_loop([X |List]) ->
249
?line CodedType = enc_longlong_little(X, []),
250
?line {X, <<>>} = cdrlib:dec_longlong(little, CodedType),
251
longlong_little_loop(List),
254
enc_longlong_little(X, Message) ->
255
list_to_binary([(X) band 16#ff, ((X) bsr 8) band 16#ff, ((X) bsr 16) band 16#ff,
256
((X) bsr 24) band 16#ff, ((X) bsr 32) band 16#ff, ((X) bsr 40) band 16#ff,
257
((X) bsr 48) band 16#ff, ((X) bsr 56) band 16#ff | Message]).
262
%%-----------------------------------------------------------------
263
%% Test Case: unsigned long integer test
265
%%-----------------------------------------------------------------
266
ulonglong(doc) -> ["Description", "more description"];
267
ulonglong(suite) -> [];
269
ulonglong_big_loop([0, 4040, 65535, 40404040, 2147483647, 4294967295]),
270
ulonglong_little_loop([0, 4040, 65535, 40404040, 2147483647, 4294967295]),
274
ulonglong_big_loop([]) ->
276
ulonglong_big_loop([X |List]) ->
277
?line [CodedType] = cdrlib:enc_unsigned_longlong(X, []),
278
?line {X, <<>>} = cdrlib:dec_unsigned_longlong(big, CodedType),
279
ulonglong_big_loop(List),
282
ulonglong_little_loop([]) ->
284
ulonglong_little_loop([X |List]) ->
285
?line CodedType = enc_ulonglong_little(X, []),
286
?line {X, <<>>} = cdrlib:dec_unsigned_longlong(little, CodedType),
287
ulonglong_little_loop(List),
290
enc_ulonglong_little(X, Message) ->
291
list_to_binary([(X) band 16#ff, ((X) bsr 8) band 16#ff, ((X) bsr 16) band 16#ff,
292
((X) bsr 24) band 16#ff, ((X) bsr 32) band 16#ff, ((X) bsr 40) band 16#ff,
293
((X) bsr 48) band 16#ff, ((X) bsr 56) band 16#ff | Message]).
300
%%-----------------------------------------------------------------
301
%% Test Case: boolean test
303
%%-----------------------------------------------------------------
304
boolean(doc) -> ["Description", "more description"];
305
boolean(suite) -> [];
307
?line [CodedTrue] = cdrlib:enc_bool('true', []),
308
?line {'true', <<>>} = cdrlib:dec_bool(CodedTrue),
309
?line [CodedFalse] = cdrlib:enc_bool('false', []),
310
?line {'false', <<>>} = cdrlib:dec_bool(CodedFalse),
313
%%-----------------------------------------------------------------
314
%% Test Case: character test
316
%%-----------------------------------------------------------------
317
character(doc) -> ["Description", "more description"];
318
character(suite) -> [];
320
?line [Coded_0] = cdrlib:enc_char($0, []),
321
?line {$0, <<>>} = cdrlib:dec_char(Coded_0),
322
?line [Coded_a] = cdrlib:enc_char($a, []),
323
?line {$a, <<>>} = cdrlib:dec_char(Coded_a),
324
?line [Coded_Z] = cdrlib:enc_char($Z, []),
325
?line {$Z, <<>>} = cdrlib:dec_char(Coded_Z),
326
?line [Coded_dollar] = cdrlib:enc_char($$, []),
327
?line {$$, <<>>} = cdrlib:dec_char(Coded_dollar),
330
%%-----------------------------------------------------------------
331
%% Test Case: octet test
333
%%-----------------------------------------------------------------
334
octet(doc) -> ["Description", "more description"];
337
?line [Coded_ff] = cdrlib:enc_octet(16#ff, []),
338
?line {16#ff, <<>>} = cdrlib:dec_octet(Coded_ff),
339
?line [Coded_00] = cdrlib:enc_octet(16#00, []),
340
?line {16#00, <<>>} = cdrlib:dec_octet(Coded_00),
341
?line [Coded_5a] = cdrlib:enc_octet(16#5a, []),
342
?line {16#5a, <<>>} = cdrlib:dec_octet(Coded_5a),
343
?line [Coded_48] = cdrlib:enc_octet(16#48, []),
344
?line {16#48, <<>>} = cdrlib:dec_octet(Coded_48),
349
%%-----------------------------------------------------------------
350
%% Test Case: float test
352
%%-----------------------------------------------------------------
353
float(doc) -> ["Description", "more description"];
356
G = 16#7fffff / 16#800000 + 1.0,
357
H1 = math:pow(2, 127),
358
H2 = math:pow(2, -126),
359
float_big_loop([-H1 * G, -H1 * 1.0, -H2 * G, -H2 * 1.0,
360
-4040.313131, -3.141592, 0.0, 3.141592, 4040.313131,
361
H1 * G, H1 * 1.0, H2 * G, H2 * 1.0]),
362
float_little_loop([-H1 * G, -H1 * 1.0, -H2 * G, -H2 * 1.0,
363
-4040.313131, -3.141592, 0.0, 3.141592, 4040.313131,
364
H1 * G, H1 * 1.0, H2 * G, H2 * 1.0]),
367
float_big_loop([]) ->
369
float_big_loop([X |List]) ->
370
?line [CodedType] = cdrlib:enc_float(X, []),
371
?line {Y, <<>>} = cdrlib:dec_float(big, CodedType),
372
?line float_comp(X,Y),
373
float_big_loop(List),
376
float_little_loop([]) ->
378
float_little_loop([X |List]) ->
379
?line [CodedType] = enc_float_little(X, []),
380
?line {Y, <<>>} = cdrlib:dec_float(little, CodedType),
381
?line float_comp(X,Y),
382
float_little_loop(List),
385
float_comp(X,Y) when X == 0.0, Y == 0.0 ->
388
Div = abs(Y) / abs(X),
389
%% io:format("~p~n", [float_to_list(Div)]),
390
?line true = (Div < 1.0000001),
391
?line true = (Div > 0.9999999),
394
enc_float_little(X, Message) ->
395
[ <<X:32/little-float>> | Message].
397
%%-----------------------------------------------------------------
398
%% Test Case: double test
400
%%-----------------------------------------------------------------
401
double(doc) -> ["Description", "more description"];
404
F = 16#0fffffffffffff / 16#10000000000000 + 1.0,
405
E1 = math:pow(2, 1023),
406
E2 = math:pow(2, -1022),
407
G = 16#7fffff / 16#800000 + 1.0,
408
H1 = math:pow(2, 128),
409
H2 = math:pow(2, -127),
410
double_big_loop([-E1 * F, -E1 * 1.0, -E2 * F, -E2 * 1.0,
411
-H1 * G, -H1 * 1.0, -H2 * G, -H2 * 1.0,
412
-4040.313131, -3.141592, 0.0, 3.141592, 4040.313131,
413
H1 * G, H1 * 1.0, H2 * G, H2 * 1.0,
414
E1 * F, E1 * 1.0, E2 * F, E2 * 1.0]),
415
double_little_loop([-E1 * F, -E1 * 1.0, -E2 * F, -E2 * 1.0,
416
-H1 * G, -H1 * 1.0, -H2 * G, -H2 * 1.0,
417
-4040.313131, -3.141592, 0.0, 3.141592, 4040.313131,
418
H1 * G, H1 * 1.0, H2 * G, H2 * 1.0,
419
E1 * F, E1 * 1.0, E2 * F, E2 * 1.0]),
422
double_big_loop([]) ->
424
double_big_loop([X |List]) ->
425
?line [CodedType] = cdrlib:enc_double(X, []),
426
?line {Y, <<>>} = cdrlib:dec_double(big, CodedType),
427
?line double_comp(X,Y),
428
double_big_loop(List),
431
double_little_loop([]) ->
433
double_little_loop([X |List]) ->
434
?line [CodedType] = enc_double_little(X, []),
435
?line {Y, <<>>} = cdrlib:dec_double(little, CodedType),
436
?line double_comp(X,Y),
437
double_little_loop(List),
440
enc_double_little(X, Message) ->
441
[ <<X:64/little-float>> | Message].
443
double_comp(X,Y) when X == 0.0, Y == 0.0 ->
446
Div = abs(Y) / abs(X),
447
%% io:format("~p~n", [float_to_list(Div)]),
448
?line true = (Div < 1.00000000000001),
449
?line true = (Div > 0.99999999999999),
452
double_should_be_ok(doc) -> ["Description", "more description"];
453
double_should_be_ok(suite) -> [];
454
double_should_be_ok(_) ->
455
F = 16#0fffffffffffff / 16#10000000000000 + 1.0,
456
E1 = math:pow(2, 1024), % erlang can't handle this.
457
E2 = math:pow(2, -1023),
458
double_big_loop([-E1 * F, -E1 * 1.0, -E2 * F, -E2 * 1.0,
459
E1 * F, E1 * 1.0, E2 * F, E2 * 1.0]),
460
double_little_loop([-E1 * F, -E1 * 1.0, -E2 * F, -E2 * 1.0,
461
E1 * F, E1 * 1.0, E2 * F, E2 * 1.0]),
464
%%-----------------------------------------------------------------
465
%% Test Case: enum test
467
%%-----------------------------------------------------------------
468
enum(doc) -> ["Description", "more description"];
476
?line [Coded_a] = cdrlib:enc_enum(a,[a,b,c],[]),
477
?line {a, <<>>} = cdrlib:dec_enum(big, ["a","b","c"], Coded_a),
478
?line [Coded_b] = cdrlib:enc_enum(b,[a,b,c],[]),
479
?line {b, <<>>} = cdrlib:dec_enum(big, ["a","b","c"], Coded_b),
480
?line [Coded_c] = cdrlib:enc_enum(c,[a,b,c],[]),
481
?line {c, <<>>} = cdrlib:dec_enum(big, ["a","b","c"], Coded_c),
485
?line Coded_a = enc_r_enum(a,[a,b,c],[]),
486
?line {a, <<>>} = cdrlib:dec_enum(little, ["a","b","c"], Coded_a),
487
?line Coded_b = enc_r_enum(b,[a,b,c],[]),
488
?line {b, <<>>} = cdrlib:dec_enum(little, ["a","b","c"], Coded_b),
489
?line Coded_c = enc_r_enum(c,[a,b,c],[]),
490
?line {c, <<>>} = cdrlib:dec_enum(little, ["a","b","c"], Coded_c),
493
enc_r_enum(Enum, ElemList, Message) ->
494
Val = getEnumValue(ElemList,Enum, 0),
495
enc_r_unsigned_long(Val, Message).
497
getEnumValue([Enum |_List], Enum, N) ->
499
getEnumValue([_ |List], Enum, N) ->
500
getEnumValue(List, Enum, N + 1).
502
enc_r_unsigned_long(X, Message) ->
503
list_to_binary([(X) band 16#ff, ((X) bsr 8) band 16#ff,
504
((X) bsr 16) band 16#ff, ((X) bsr 24) band 16#ff | Message]).