1 /******************************************************************************
2 * Copyright (c) 2000-2016 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
12 ******************************************************************************/
15 import from Functions all;
16 import from Types all;
17 import from JsonData language "ASN.1" all;
19 modulepar R tsp_r := {
26 modulepar charstring tsp_cs_long := "123456789123456789123456789 abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz ;""'\\/\n\r\t\f\b.,<>?|:][{}=-+!@#$%^&*()";
31 const octetstring c_BOM_UTF8 :='EFBBBF'O;
33 const integer c_i :=18
42 const charstring qm := "\""; //quotation mark
43 const octetstring qmo :='22'O;
44 const octetstring commao := '2C'O;
45 const universal charstring c_arvizturo := char(0,0,0,193)&"rv"&char(0,0,0,237)&"zt"&char(0,0,1,113)&"r"&char(0,0,1,81) & "t" & char(0,0,0,252)&"k"&char(0,0,0,246)&"rfr"&char(0,0,0,243)&"g"&char(0,0,0,233)&"p";
46 const charstring c_cs_long := "123456789123456789123456789 abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz ;"
47 const charstring c_cs_escapes := "'\\/\n\r\t\f\b.,<>?|:][{}=-+!@#$%^&*()";
50 //=========================================================================
52 //=========================================================================
54 testcase tc_integer_pos() runs on MTC{
56 f_check_encoding(encoded:= f_enc_int(x1), expected := '3138'O)
57 f_bool2verdict(x1==f_dec_int(f_enc_int(x1)));
60 testcase tc_integer_0() runs on MTC{
62 f_check_encoding(encoded:= f_enc_int(x1), expected := '30'O)
63 f_bool2verdict(x1==f_dec_int(f_enc_int(x1)));
66 testcase tc_integer_neg() runs on MTC{
67 var integer x := -917805;
69 f_check_encoding(encoded:= f_enc_int(x), expected := char2oct(int2str(x))) ;
70 f_bool2verdict(x==f_dec_int(f_enc_int(x)));
73 testcase tc_integer_bigpos() runs on MTC{
74 var integer x1 := 123456789123456789123456789;
75 f_check_encoding(encoded:= f_enc_int(x1), expected := '313233343536373839313233343536373839313233343536373839'O)
76 f_bool2verdict(x1==f_dec_int(f_enc_int(x1)));
79 testcase tc_integer_expression1() runs on MTC{
81 var octetstring os:= f_enc_int( 6*x )
82 f_check_encoding(encoded:= os, expected := '3132'O)
83 f_bool2verdict(12==f_dec_int(os));
86 testcase tc_integer_const() runs on MTC{
88 var octetstring os:= f_enc_int( c_i )
89 f_check_encoding(encoded:= os, expected := '3138'O)
90 f_bool2verdict(c_i==f_dec_int(os));
93 testcase tc_integer_imported() runs on MTC{
94 var octetstring os:= f_enc_int( c_imported_i )
95 f_check_encoding(encoded:= os, expected := '3131'O)
96 f_bool2verdict(c_imported_i==f_dec_int(os));
99 testcase tc_boolean_true() runs on MTC{
100 var boolean x := true;
101 var octetstring os:= f_enc_bool( x )
102 f_check_encoding(encoded:= os, expected := char2oct("true"));
103 f_bool2verdict(x==f_dec_bool(os));
106 testcase tc_boolean_false() runs on MTC{
107 var boolean x := false;
108 var octetstring os:= f_enc_bool( x )
109 f_check_encoding(encoded:= os, expected := char2oct("false"));
110 f_bool2verdict(x==f_dec_bool(os));
113 testcase tc_charstring_ascii_basic() runs on MTC{
114 var charstring cs := "everything or nothing"
115 var octetstring os:= f_enc_cs( cs )
116 f_check_encoding(encoded:= os, expected := char2oct(qm & cs & qm));
117 f_bool2verdict(cs==f_dec_cs(os));
120 testcase tc_charstring_ascii_basic_long() runs on MTC{
121 var charstring cs := c_cs_long;
122 var octetstring os:= f_enc_cs( cs )
123 f_check_encoding(encoded:= os, expected := char2oct(qm & cs & qm));
124 f_bool2verdict(cs==f_dec_cs(os));
127 testcase tc_charstring_ascii_basic_long_const() runs on MTC{
128 var charstring cs := c_cs_long;
129 var octetstring os:= f_enc_cs( c_cs_long )
130 f_check_encoding(encoded:= os, expected := char2oct(qm & cs & qm));
131 f_bool2verdict( cs ==f_dec_cs(os));
134 testcase tc_charstring_ascii_basic_punctuation() runs on MTC{
135 var charstring cs := ".,<>?|:][{}=-+!@#$%^&*()";
136 var octetstring os:= f_enc_cs( cs )
137 f_check_encoding(encoded:= os, expected := char2oct(qm & cs & qm));
138 f_bool2verdict(cs ==f_dec_cs(os));
142 testcase tc_charstring_ascii_basic_escapes() runs on MTC{
147 var RoOS os_expected := {
148 '225C5C22'O, '222F22'O,'225C6E22'O,
149 '225C7222'O,'225C7422'O,'225C6622'O, '225C6222'O
151 var integer len:=lengthof(cs);
153 for(var integer i:=0;i<len;i:=i+1) {
154 var octetstring os:= f_enc_cs( cs[i] )
155 f_check_encoding(encoded:= os, expected := os_expected[i]);
156 f_bool2verdict(cs[i] ==f_dec_cs(os_expected[i]));
160 testcase tc_charstring_ascii_extended1() runs on MTC{
161 var charstring cs := "Vire au Vert l"&char(0,0,0,224)&"!";
162 var octetstring os:= f_enc_cs( cs )
163 f_check_encoding(encoded:= os, expected := char2oct(qm & cs & qm));
165 f_bool2verdict(cs==f_dec_cs(os));
166 setverdict(fail,"error expected")
169 setverdict(pass,"expected error, ok")
174 testcase tc_ucharstring_ascii_extended1_xer() runs on MTC{
175 var universal charstring ucs := "Vire au Vert l" & char(0,0,0,224)&"!";
176 var octetstring os:= f_enc_ucs_x( ucs )
177 log( "Octetstring:" , os);
180 f_bool2verdict(ucs==f_dec_ucs_x(os));
181 setverdict(pass,ucs," == ", f_dec_ucs_x(os) );
184 setverdict(fail,"unexpected error, nok")
190 //========== Universal Charstring =================
194 testcase tc_ucharstring_ascii_basic_long() runs on MTC{
195 var universal charstring ucs := c_cs_long;
196 var octetstring os:= f_enc_ucs( ucs )
197 f_check_encoding(encoded:= os, expected := remove_bom(unichar2oct( qm & ucs & qm, "UTF-8")));
198 f_bool2verdict(ucs==f_dec_ucs(os));
201 testcase tc_ucharstring_ascii_basic_escapes() runs on MTC{
206 var RoOS os_expected := {
207 '225C5C22'O, '222F22'O,'225C6E22'O,
208 '225C7222'O,'225C7422'O,'225C6622'O, '225C6222'O
210 var integer len:=lengthof(cs);
212 for(var integer i:=0;i<len;i:=i+1) {
213 var octetstring os:= f_enc_ucs( cs[i] )
214 f_check_encoding(encoded:= os, expected := os_expected[i]);
215 f_bool2verdict(cs[i] ==f_dec_ucs(os_expected[i]));
219 testcase tc_ucharstring_ascii_extended1() runs on MTC{
220 var universal charstring ucs := "Vire au Vert l" & char(0,0,0,224)&"!";
221 var octetstring os:= f_enc_ucs( ucs )
222 f_check_encoding(encoded:= os, expected := remove_bom(unichar2oct( qm & ucs & qm, "UTF-8")));
223 f_bool2verdict(ucs==f_dec_ucs(os));
226 testcase tc_ucharstring_ascii_extended2() runs on MTC{
227 //var universal charstring ucs := "Ã
\81rvÃÂztűrÃ…
\91 tükörfúrógép";'
228 var universal charstring ucs :="Ã
\81r";
229 var octetstring os:= f_enc_ucs( ucs )
230 f_check_encoding(encoded:= os, expected := remove_bom(unichar2oct( qm & ucs & qm, "UTF-8")));
231 f_bool2verdict(ucs==f_dec_ucs(os));
234 testcase tc_ucharstring_ascii_extended3() runs on MTC{
235 var universal charstring ucs := c_arvizturo;
237 var octetstring os:= f_enc_ucs( ucs )
238 f_check_encoding(encoded:= os, expected := remove_bom(unichar2oct( qm & ucs & qm, "UTF-8")));
239 f_bool2verdict(ucs==f_dec_ucs(os));
242 testcase tc_ucharstring_higherplanes() runs on MTC{
244 char(0,1,0,0) & char(0,1,0,175) & char(0,1,255,255),
245 char(0,2,0,0) & char(0,2,0,175) & char(0,2,255,255),
246 char(0,3,0,0) & char(0,3,0,175) & char(0,3,255,255),
247 char(0,15,0,0)& char(0,15,0,175)& char(0,15,255,255),
248 char(0,16,0,0)& char(0,16,0,175)& char(0,16,255,255),
249 char(0,16,0,0) & char(0,0,0,1) & " "
252 var integer len:=lengthof(us);
254 for(var integer i:=0;i<len;i:=i+1) {
255 os:= f_enc_ucs( us[i] );
256 f_check_encoding(encoded:= os, expected := remove_bom(unichar2oct( qm & us[i] & qm, "UTF-8")));
257 f_bool2verdict(us[i]==f_dec_ucs(os));
261 //========= Octetstring ===================
263 testcase tc_octetstring() runs on MTC{
264 var octetstring o := '51AD7F32112CC89D'O;
265 var octetstring os:= f_enc_os( o )
266 f_check_encoding(encoded:= os, expected := '223531414437463332313132434338394422'O);
267 f_check_encoding(encoded:= os, expected := qmo & char2oct(oct2str(o)) & qmo);
268 f_bool2verdict(o == f_dec_os(os));
272 //========= Hexstring ===================
274 testcase tc_hexstring() runs on MTC{
275 var hexstring h := '51AD7F32112CC89D1778DE213A345BA'H;
277 var octetstring os:= f_enc_hex( h );
279 f_check_encoding(encoded:= os, expected := '223531414437463332313132434338394431373738444532313341333435424122'O);
280 f_check_encoding(encoded:= os, expected := qmo & char2oct(hex2str(h)) & qmo);
281 f_bool2verdict(h == f_dec_hex(os));
285 //========= Bitstring ===================
286 testcase tc_bitstring() runs on MTC{
287 var bitstring bs := '1101001101111011'B;
288 var octetstring os:= f_enc_bit(bs);
289 f_check_encoding(encoded:= os, expected := qmo & char2oct(bit2str(bs)) & qmo);
290 f_bool2verdict(bs == f_dec_bit(os));
293 //========= Verdicttype ===================
294 testcase tc_verdicttype() runs on MTC{
295 var RoV vt := { none, inconc, pass, fail, error};
296 var RoCS cs :={"none","inconc","pass", "fail", "error"}
297 //var verdicttype vt := inconc;
299 var integer len :=lengthof(vt)
300 for(var integer i:=0;i<len;i:=i+1) {
301 os:= f_enc_vt(vt[i]);
302 f_check_encoding(encoded:= os, expected := qmo & char2oct(cs[i]) & qmo);
303 f_bool2verdict(vt[i] == f_dec_vt(f_enc_vt(vt[i])));
308 //========= Float ===================
309 testcase tc_float() runs on MTC{
310 var RoF f := { 58.1165, 19.6695e16, not_a_number, infinity, -infinity };
311 var RoCS cs := {"58.116500","1.966950e+17","\"not_a_number\"", "\"infinity\"", "\"-infinity\""}
313 var integer len :=lengthof(f)
315 for(var integer i:=0;i<len;i:=i+1) {
317 f_check_encoding(encoded:= os, expected := char2oct(cs[i]) );
318 log(f_dec_f(f_enc_f(f[i])))
319 f_bool2verdict( f[i] == f_dec_f(f_enc_f(f[i])) ) ;
325 //============ enum ======================
327 testcase tc_enum() runs on MTC{
328 var Days day := Monday;
329 var octetstring os:= char2oct("Monday");
330 f_check_encoding(encoded:= os, expected := char2oct("Monday") );
331 f_bool2verdict(day ==f_dec_days(f_enc_days(day)) )
334 //===== Record =======
336 testcase tc_record() runs on MTC{
343 var octetstring os := char2oct("{\"i\":1,\"cs\":\"two\",\"b\":true,\"d\":\"Monday\"}");
344 f_check_encoding(encoded:= f_enc_R(r), expected := os)
345 f_bool2verdict(match(f_dec_R(f_enc_R(r)), r));
348 testcase tc_record_const() runs on MTC{
349 var octetstring os := char2oct("{\"i\":1,\"cs\":\"two\",\"b\":true,\"d\":\"Monday\"}");
350 f_check_encoding(encoded:= f_enc_R(c_r), expected := os)
351 f_bool2verdict(match(f_dec_R(f_enc_R(c_r)), c_r));
354 testcase tc_record_modulepar() runs on MTC{
355 var octetstring os := char2oct("{\"i\":1,\"cs\":\"two\",\"b\":true,\"d\":\"Monday\"}");
356 f_check_encoding(encoded:= f_enc_R(tsp_r), expected := os)
357 f_bool2verdict(match(f_dec_R(f_enc_R(tsp_r)), tsp_r));
360 testcase tc_record_empty() runs on MTC{
361 var EmptyRec r := { };
362 var octetstring os := char2oct("{}");
363 f_check_encoding(encoded:= f_enc_ER(r), expected := os)
364 f_bool2verdict(match(f_dec_ER(f_enc_ER(r)), r));
368 //====== Record of===============
371 testcase tc_recordofinteger_empty() runs on MTC{
373 var octetstring os := char2oct("[]");
374 f_check_encoding(encoded:= f_enc_roi(r), expected := os)
375 f_bool2verdict(match(f_dec_roi(f_enc_roi(r)), r));
378 testcase tc_recordofinteger_short() runs on MTC{
379 var RoI r:= { 1, 4, 5, 7, 6, 6, 4, 0 , -1 };
380 var octetstring os := char2oct("[1,4,5,7,6,6,4,0,-1]");
381 f_check_encoding(encoded:= f_enc_roi(r), expected := os)
382 f_bool2verdict(match(f_dec_roi(f_enc_roi(r)), r));
385 testcase tc_recordofinteger_long() runs on MTC{
387 var octetstring os := char2oct("[0");
390 for(var integer i:=1; i<50; i:=i+1) {
392 os := os & commao & char2oct(int2str(i));
394 os := os & char2oct("]")
398 f_check_encoding(encoded:= f_enc_roi(r), expected := os)
399 f_bool2verdict(match(f_dec_roi(f_enc_roi(r)), r));
403 testcase tc_recordoffloat_empty() runs on MTC{
405 var octetstring os := char2oct("[]");
406 f_check_encoding(encoded:= f_enc_rof(r), expected := os)
407 f_bool2verdict(match(f_dec_rof(f_enc_rof(r)), r));
410 testcase tc_recordoffloat_short() runs on MTC{
411 var RoF r:={1.0, 1.234, 12.345e12, 12.345e-3, infinity}
412 var octetstring os := char2oct("[1.000000,1.234000,1.234500e+13,0.012345,\"infinity\"]");
413 f_check_encoding(encoded:= f_enc_rof(r), expected := os)
414 f_bool2verdict( match(r,f_dec_rof(f_enc_rof(r))));
415 log(match(r,f_dec_rof(f_enc_rof(r))));
419 testcase tc_recordofCS_empty() runs on MTC{
421 var octetstring os := char2oct("[]");
422 f_check_encoding(encoded:= f_enc_rocs(r), expected := os)
423 f_bool2verdict(match(f_dec_rocs(f_enc_rocs(r)), r));
426 testcase tc_recordofCS_short() runs on MTC{
427 var RoCS r:={ "alMa", "","korte","joe@gmail.com"}
428 var octetstring os := char2oct("[\"alMa\",\"\",\"korte\",\"joe@gmail.com\"]");
429 f_check_encoding(encoded:= f_enc_rocs(r), expected := os)
430 f_bool2verdict( match(r,f_dec_rocs(f_enc_rocs(r))));
431 log(match(r,f_dec_rocs(f_enc_rocs(r))));
434 //====== Array ==================
436 testcase tc_array_int() runs on MTC {
437 var IntArr r:= { 1, 4, 7 };
438 var octetstring os := char2oct("[1,4,7]");
439 f_check_encoding(encoded:= f_enc_ints(r), expected := os)
440 f_bool2verdict(match(r,f_dec_ints(f_enc_ints(r))));
441 log(match(r,f_dec_ints(f_enc_ints(r))));
444 testcase tc_array_float() runs on MTC {
445 var FloatArr r:= { 3.14, 2.73, 0.66666 };
446 var octetstring os := char2oct("[3.140000,2.730000,0.666660]");
447 f_check_encoding(encoded:= f_enc_floats(r), expected := os)
448 f_bool2verdict(match(r,f_dec_floats(f_enc_floats(r))));
449 log(match(r,f_dec_floats(f_enc_floats(r))));
452 testcase tc_array_str() runs on MTC {
453 var StrArr r:= { "red", "blue", "green", "white" };
454 var octetstring os := char2oct("[\"red\",\"blue\",\"green\",\"white\"]");
455 f_check_encoding(encoded:= f_enc_strs(r), expected := os)
456 f_bool2verdict(match(r,f_dec_strs(f_enc_strs(r))));
457 log(match(r,f_dec_strs(f_enc_strs(r))));
460 //====== Union ==================
461 testcase tc_union() runs on MTC{
462 var A myunion := { b:= true }
463 var octetstring os := char2oct("{\"b\":true}");
464 f_check_encoding(encoded:= f_enc_A(myunion), expected := os)
465 f_bool2verdict(match(f_dec_A(f_enc_A(myunion)), myunion));
468 testcase tc_union2() runs on MTC{
469 var A myunion := { f:= infinity }
470 var octetstring os := char2oct("{\"f\":\"infinity\"}");
471 f_check_encoding(encoded:= f_enc_A(myunion), expected := os)
472 f_bool2verdict(match(f_dec_A(f_enc_A(myunion)), myunion));
475 testcase tc_union_false() runs on MTC{
476 var A myunion := { b:= true }
477 var octetstring os := char2oct("{\"b\":true}");
478 f_check_encoding(encoded:= f_enc_A(myunion), expected := os)
480 var A retval := f_dec_A('ABBA'O);
481 setverdict(fail,"error expected, not received");
485 setverdict(pass,"expected error received")
489 //====== ASN.1 types ==================
490 // SEQUENCE OF INTEGER
491 testcase tc_asn_seqof() runs on MTC {
492 var octetstring os := char2oct(c_ints_str);
493 f_check_encoding(encoded:= f_enc_seqofint(c_ints), expected := os)
494 f_bool2verdict(match(f_dec_seqofint(os), c_ints));
498 testcase tc_asn_seq() runs on MTC {
499 var octetstring os := char2oct(c_product_str);
500 f_check_encoding(encoded:= f_enc_seqprod(c_product), expected := os)
501 f_bool2verdict(match(f_dec_seqprod(os), c_product));
505 testcase tc_asn_choice() runs on MTC {
506 var octetstring os := char2oct(c_number_str);
507 f_check_encoding(encoded:= f_enc_number(c_number), expected := os)
508 f_bool2verdict(match(f_dec_number(os), c_number));
511 // SEQUENCE OF CHOICE
512 testcase tc_asn_strings() runs on MTC {
513 var octetstring os := char2oct(c_strings_str);
514 f_check_encoding(encoded:= f_enc_strings(c_strings), expected := os)
515 f_bool2verdict(match(f_dec_strings(os), c_strings));
518 // SET containing a SEQUENCE, a SET OF CHOICE and a SEQUENCE OF CHOICE
519 testcase tc_asn_complex() runs on MTC {
520 var octetstring os := char2oct(c_set_val_str);
521 f_check_encoding(encoded:= f_enc_complex(c_set_val), expected := os)
522 f_bool2verdict(match(f_dec_complex(os), c_set_val));
525 // ====== Special ASN.1 types ======
526 // record containing an open type and a possible NULL value
527 testcase tc_asn_open_type_and_null() runs on MTC {
528 var HasPardType x := {
532 val := { iNTEGER := 19 }
535 price := { invaluable := NULL }
537 var octetstring os := char2oct("{\"pard\":{\"id\":0,\"priority\":\"low\",\"val\":{\"iNTEGER\":19}},\"buul\":true,\"price\":{\"invaluable\":null}}");
538 f_check_encoding(encoded := f_enc_hpt(x), expected := os);
539 f_bool2verdict(match(f_dec_hpt(os), x));
542 // SEQUENCE containing an object identifier and an ANY type
543 testcase tc_asn_objid_and_any() runs on MTC {
544 var octetstring os := char2oct(c_obj_str);
545 f_check_encoding(encoded:= f_enc_obj(c_obj), expected := os);
546 f_bool2verdict(match(f_dec_obj(os), c_obj));
549 testcase tc_asn_optional_null() runs on MTC {
550 var octetstring os := char2oct(c_null_str);
551 f_check_encoding(encoded:= f_enc_null(c_null), expected := os);
552 f_bool2verdict(match(f_dec_null(os), c_null));
553 os := char2oct(c_not_null_str);
554 f_check_encoding(encoded:= f_enc_null(c_not_null), expected := os);
555 f_bool2verdict(match(f_dec_null(os), c_not_null));
558 //=========================================================================
560 //=========================================================================
563 execute(tc_integer_pos());
564 execute(tc_integer_0());
565 execute(tc_integer_neg());
566 execute(tc_integer_bigpos());
567 execute(tc_integer_expression1());
568 execute(tc_integer_const());
569 execute(tc_integer_imported());
570 execute(tc_boolean_true());
571 execute(tc_boolean_false());
572 execute(tc_charstring_ascii_basic());
573 execute(tc_charstring_ascii_basic_long());
574 execute(tc_charstring_ascii_basic_long_const());
575 execute(tc_charstring_ascii_basic_punctuation());
576 execute(tc_charstring_ascii_basic_escapes());
577 execute(tc_charstring_ascii_extended1());
578 execute(tc_charstring_ascii_basic_escapes());
580 execute(tc_ucharstring_ascii_extended1_xer());
581 execute(tc_ucharstring_ascii_extended1());
582 execute(tc_ucharstring_ascii_extended2());
583 execute(tc_ucharstring_ascii_extended3());
584 execute(tc_ucharstring_higherplanes());
585 execute(tc_octetstring());
586 execute(tc_hexstring());
587 execute(tc_bitstring());
588 execute(tc_verdicttype());
590 execute(tc_record());
591 execute(tc_record_const());
592 execute(tc_record_modulepar());
593 execute(tc_record_empty());
594 execute(tc_recordofinteger_empty());
595 execute(tc_recordofinteger_short());
596 execute(tc_recordoffloat_empty());
597 execute(tc_recordoffloat_short());
598 execute(tc_recordofCS_empty());
599 execute(tc_recordofCS_short());
600 execute(tc_array_int());
601 execute(tc_array_float());
602 execute(tc_array_str());
604 execute(tc_union2());
605 execute(tc_union_false());
607 execute(tc_asn_seqof());
608 execute(tc_asn_seq());
609 execute(tc_asn_choice());
610 execute(tc_asn_strings());
611 execute(tc_asn_complex());
613 execute(tc_asn_open_type_and_null());
614 execute(tc_asn_objid_and_any());
615 execute(tc_asn_optional_null());