/****************************************************************************** * Copyright (c) 2000-2015 Ericsson Telecom AB * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html ******************************************************************************/ module Txerasntypes { modulepar boolean Txerasntypes_verbose := false; #define verbose Txerasntypes_verbose #include "../macros.ttcnin" import from Asntypes all; import from AsnValues all; import from UTF8 all; type component ASN1 {} //external function flatten(inout charstring par) ; external function flatten(inout universal charstring par) ; /**************************** BIT STRING ****************************/ DECLARE_XER_ENCODERS(Asn_bs,bs) DECLARE_EXER_ENCODERS(Asn_bs,bs) const charstring xer_fifteen := "00001111"; const charstring xer_pi1 := "0010010000111111011010101000100010000101101000110000100011010011"& "0001001100011001100010100010111000000011011100000111001101000100"& "1010010000001001001110000010001000101001100111110011000111010000"& "0000100000101110111110101001100011101100010011100110110010001001"; const charstring xer_pi2 := "010001010010100000100001111001100011100011010000" & "000100110111011110111110010101000110011011001111001101001110100100001100"& "011011001100000010101100001010011011011111001001011111000101000011011101"& "0011111110000100110101011011010110110101010001110000100100010111"; const charstring xer_bs_empty := ""; testcase encode_bs() runs on ASN1 // BIT STRING { var Asn_bs bsval := '00001111'B; var universal charstring expected := xer_fifteen; CHECK_METHOD(cxer_enc_bs, bsval, expected); CHECK_METHOD(bxer_enc_bs, bsval, expected & lf); CHECK_METHOD(exer_enc_bs, bsval, expected & lf); bsval := ''B; expected := xer_bs_empty; CHECK_METHOD(cxer_enc_bs, bsval, expected); CHECK_METHOD(bxer_enc_bs, bsval, expected & lf); CHECK_METHOD(exer_enc_bs, bsval, expected & lf); expected := xer_bs_empty; // FIXME: Asn-bs ? CHECK_METHOD(cxer_enc_bs, AsnValues.bstr0, expected); CHECK_METHOD(bxer_enc_bs, AsnValues.bstr0, expected & lf); expected := "10100100"; CHECK_METHOD(cxer_enc_bs, AsnValues.bstr, expected); CHECK_METHOD(bxer_enc_bs, AsnValues.bstr, expected & lf); expected := xer_pi2; CHECK_METHOD(cxer_enc_bs, AsnValues.binpi2, expected); CHECK_METHOD(bxer_enc_bs, AsnValues.binpi2, expected & lf); expected := xer_pi1; CHECK_METHOD(cxer_enc_bs, AsnValues.binpi, expected); CHECK_METHOD(bxer_enc_bs, AsnValues.binpi, expected & lf); } testcase decode_bs() runs on ASN1 { var Asn_bs expected; expected := ''B; CHECK_DECODE(cxer_dec_bs, xer_bs_empty, Asn_bs, expected); CHECK_DECODE(bxer_dec_bs, xer_bs_empty, Asn_bs, expected); CHECK_DECODE(exer_dec_bs, xer_bs_empty, Asn_bs, expected); expected := '00001111'B; CHECK_DECODE(cxer_dec_bs, xer_fifteen, Asn_bs, expected); CHECK_DECODE(bxer_dec_bs, xer_fifteen, Asn_bs, expected); CHECK_DECODE(exer_dec_bs, xer_fifteen, Asn_bs, expected); expected := '0100010100101000001000011110011000111000110100000001001101110111101111100101010001100110110011110011010011101001000011000110110011000000101011000010100110110111110010010111110001010000110111010011111110000100110101011011010110110101010001110000100100010111'B; CHECK_DECODE(cxer_dec_bs, xer_pi2, Asn_bs, expected); CHECK_DECODE(bxer_dec_bs, xer_pi2, Asn_bs, expected); CHECK_DECODE(exer_dec_bs, xer_pi2, Asn_bs, expected); CHECK_DECODE(cxer_dec_bs, xer_pi2, Asn_bs, AsnValues.binpi2); CHECK_DECODE(bxer_dec_bs, xer_pi2, Asn_bs, AsnValues.binpi2); CHECK_DECODE(exer_dec_bs, xer_pi2, Asn_bs, AsnValues.binpi2); expected := '0010010000111111011010101000100010000101101000110000100011010011000100110001100110001010001011100000001101110000011100110100010010100100000010010011100000100010001010011001111100110001110100000000100000101110111110101001100011101100010011100110110010001001'B; CHECK_DECODE(cxer_dec_bs, xer_pi1, Asn_bs, AsnValues.binpi); CHECK_DECODE(bxer_dec_bs, xer_pi1, Asn_bs, AsnValues.binpi); CHECK_DECODE(exer_dec_bs, xer_pi1, Asn_bs, AsnValues.binpi); } /**************************** BOOLEAN ****************************/ DECLARE_XER_ENCODERS(Asn_bool, bool); DECLARE_EXER_ENCODERS(Asn_bool,bool) DECLARE_XER_ENCODERS(A_rboolean, arbool); DECLARE_EXER_ENCODERS(A_rboolean,arbool) testcase encode_abool() runs on ASN1 { var Asn_bool boolval := true; var universal charstring expected := ""; CHECK_METHOD(cxer_enc_bool, boolval, expected); CHECK_METHOD(bxer_enc_bool, boolval, expected & lf); expected := "true"; // EXER uses TextBoolean CHECK_METHOD(exer_enc_bool, boolval, expected & lf); expected := ""; CHECK_METHOD(cxer_enc_bool, AsnValues.boo, expected); CHECK_METHOD(bxer_enc_bool, AsnValues.boo, expected & lf); CHECK_METHOD(cxer_enc_bool, AsnValues.so_true, expected); CHECK_METHOD(bxer_enc_bool, AsnValues.so_true, expected & lf); expected := "true"; // EXER uses TextBoolean CHECK_METHOD(exer_enc_bool, AsnValues.boo, expected & lf); CHECK_METHOD(exer_enc_bool, AsnValues.so_true, expected & lf); boolval := false; expected := ""; CHECK_METHOD(cxer_enc_bool, boolval, expected); CHECK_METHOD(bxer_enc_bool, boolval, expected & lf); expected := "false"; // EXER uses TextBoolean CHECK_METHOD(exer_enc_bool, boolval, expected & lf); expected := ""; CHECK_METHOD(cxer_enc_bool, AsnValues.noo, expected); CHECK_METHOD(bxer_enc_bool, AsnValues.noo, expected & lf); expected := "false"; // EXER uses TextBoolean CHECK_METHOD(exer_enc_bool, AsnValues.noo, expected & lf); expected := "\n\n"; CHECK_METHOD(bxer_enc_arbool, AsnValues.arbomit, expected); CHECK_METHOD(exer_enc_arbool, AsnValues.arbomit, expected); flatten(expected); CHECK_METHOD(cxer_enc_arbool, AsnValues.arbomit, expected & lf); expected := "\n" & "\t\n" & "\n\n"; CHECK_METHOD(bxer_enc_arbool, AsnValues.arbtrue, expected); flatten(expected); CHECK_METHOD(cxer_enc_arbool, AsnValues.arbtrue, expected & lf); expected := "\n" & "\ttrue\n" & // EXER uses TextBoolean "\n\n"; CHECK_METHOD(exer_enc_arbool, AsnValues.arbtrue, expected); expected := "\n" & "\t\n" & "\n\n"; CHECK_METHOD(bxer_enc_arbool, AsnValues.arbfalse, expected); flatten(expected); CHECK_METHOD(cxer_enc_arbool, AsnValues.arbfalse, expected & lf); expected := "\n" & "\tfalse\n" & "\n\n"; CHECK_METHOD(exer_enc_arbool, AsnValues.arbfalse, expected); } testcase decode_abool() runs on ASN1 { { var Asn_bool expected; const charstring verite := ""; expected := true; CHECK_DECODE2(bool, verite, Asn_bool, expected); const charstring faux := "" expected := false; CHECK_DECODE2(bool, faux, Asn_bool, expected); } { var A_rboolean expected := { omit }; const charstring omitted := "\n\n"; CHECK_DECODE2(arbool, omitted, A_rboolean, expected); } { var A_rboolean expected := { true }; const charstring one_true := "\n" & "\t\n" & "\n\n"; CHECK_DECODE2(arbool, one_true, A_rboolean, expected); } { var A_rboolean expected := { false }; const charstring one_true := "\n" & "\t\n" & "\n\n"; CHECK_DECODE2(arbool, one_true, A_rboolean, expected); } } /**************************** EMBEDDED PDV ****************************/ DECLARE_XER_ENCODERS(Asn_pdv, pdv); DECLARE_EXER_ENCODERS(Asn_pdv,pdv) const charstring pdvstr_syntax := "\n" & "\t\n" & "\t\t0.4.0.0.1.2\n" & "\t\n" & "\tBABEFACE\n" & "\n"; const charstring pdvstr_pci := // pci = initials of presentation-context-id "\n" & "\t\n" & "\t\t1\n" & "\t\n" & "\tBABEFACE\n" & "\n"; const charstring pdvstr_syntaxes := "\n" & "\t\n" & "\t\t\n" & "\t\t\t1.0.9.8.7.6.5\n" & "\t\t\t1.0.5.6.7.8.9\n" & "\t\t\n" & "\t\n" & //"\tFood given to cattle\n" & "\tBEEFFEED\n" & "\n" const charstring pdvstr_syntax2 := "\n" & "\t\n" & "\t\t0.4.0.1.3.5\n" & "\t\n" & //"\tWe need real coffee\n" & "\tDECAFBAD\n" & "\n" const charstring pdvstr_context_neg := "\n" & "\t\n" & "\t\t\n" & "\t\t\t69\n" & "\t\t\t2.7.18.28.18.28.45.90.45\n" & "\t\t\n" & "\t\n" & "\tC1AFB1\n" & "\n" const charstring pdvstr_xfer := "\n" & "\t\n" & "\t\t0.4.0.0.1.2\n" & "\t\n" & "\tC0FFEE\n" & "\n"; const charstring pdvstr_fixed := "\n" & "\t\n" & "\t\t\n" & "\t\n" & "\tF1\n" & "\n"; const Asn_pdv tpdv := { { syntax := objid { etsi 0 1 2 } }, omit, // data-value-descriptor not allowed for EMBEDDED PDV 'BABEFACE'O }; testcase encode_pdv() runs on ASN1 { var universal charstring expected; expected := pdvstr_syntax; CHECK_METHOD(bxer_enc_pdv, tpdv, expected); CHECK_METHOD(exer_enc_pdv, tpdv, expected); flatten(expected); CHECK_METHOD(cxer_enc_pdv, tpdv, expected); expected := pdvstr_pci; CHECK_METHOD(bxer_enc_pdv, AsnValues.pdv_pci, expected); CHECK_METHOD(bxer_enc_pdv, AsnValues.epdv_pci, expected); flatten(expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.pdv_pci, expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.epdv_pci, expected); expected := pdvstr_syntaxes; CHECK_METHOD(bxer_enc_pdv, AsnValues.pdv_sxs, expected); CHECK_METHOD(bxer_enc_pdv, AsnValues.epdv_sxs, expected); flatten(expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.pdv_sxs, expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.epdv_sxs, expected); expected := pdvstr_syntax2; CHECK_METHOD(bxer_enc_pdv, AsnValues.pdv_sx, expected); CHECK_METHOD(bxer_enc_pdv, AsnValues.epdv_sx, expected); flatten(expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.pdv_sx, expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.epdv_sx, expected); expected := pdvstr_context_neg; CHECK_METHOD(bxer_enc_pdv, AsnValues.pdv_cneg, expected); CHECK_METHOD(bxer_enc_pdv, AsnValues.epdv_cneg, expected); flatten(expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.pdv_cneg, expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.epdv_cneg, expected); expected := pdvstr_xfer; CHECK_METHOD(bxer_enc_pdv, AsnValues.pdv_xsx, expected); CHECK_METHOD(bxer_enc_pdv, AsnValues.epdv_xsx, expected); flatten(expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.pdv_xsx, expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.epdv_xsx, expected); expected := pdvstr_fixed; CHECK_METHOD(bxer_enc_pdv, AsnValues.pdv_fix, expected); CHECK_METHOD(bxer_enc_pdv, AsnValues.epdv_fix, expected); flatten(expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.pdv_fix, expected); CHECK_METHOD(cxer_enc_pdv, AsnValues.epdv_fix, expected); } testcase decode_pdv() runs on ASN1 { var Asn_pdv expected; expected := AsnValues.pdv_sxs; CHECK_DECODE2(pdv, pdvstr_syntaxes, Asn_pdv, expected); expected := AsnValues.pdv_sx; CHECK_DECODE2(pdv, pdvstr_syntax2, Asn_pdv, expected); expected := AsnValues.pdv_pci; CHECK_DECODE2(pdv, pdvstr_pci, Asn_pdv, expected); expected := AsnValues.pdv_cneg; CHECK_DECODE2(pdv, pdvstr_context_neg, Asn_pdv, expected); expected := AsnValues.pdv_xsx; CHECK_DECODE2(pdv, pdvstr_xfer, Asn_pdv, expected); expected := AsnValues.pdv_fix; CHECK_DECODE2(pdv, pdvstr_fixed, Asn_pdv, expected); } /**************************** EXTERNAL ****************************/ DECLARE_XER_ENCODERS(Asn_ext, ext); DECLARE_EXER_ENCODERS(Asn_ext,ext) type record extwrap { Asn_ext SEQUENCE } DECLARE_XER_ENCODERS(extwrap, extw); DECLARE_EXER_ENCODERS(extwrap,extw) const charstring ext_octet_aligned := "\n" & "\t66\n" & "\t\n" & "\t\tDECAFBAD\n" & "\t\n" & "\n"; const charstring ext_octet_aligned2 := "\n" & "\t2\n" & "\t\n" & "\t\tBABEFACE\n" & "\t\n" & "\n"; const charstring ext_syntax_direct := "\n" & "\t2.7.18.28.18.28.45.90.45\n" & "\tusing syntax, direct only\n" & "\t\n" & "\t\tBAADF00D\n" & "\t\n" & "\n"; const charstring ext_context_both := "\n" & "\t2.1.1\n" & "\t111\n" & "\tusing context negotiation, both\n" & "\t\n" & "\t\t1337D00D\n" & "\t\n" & "\n"; const charstring ext_octet_aligned_wrap := "\n" & "\t\n" & "\t\t66\n" & "\t\t\n" & "\t\t\tDECAFBAD\n" & "\t\t\n" & "\t\n" & "\n\n"; const charstring ext_syntax_direct_wrap := "\n" & "\t\n" & "\t\t2.7.18.28.18.28.45.90.45\n" & "\t\tusing syntax, direct only\n" & "\t\t\n" & "\t\t\tBAADF00D\n" & "\t\t\n" & "\t\n" & "\n\n"; const Asn_ext extval := { { presentation_context_id := 66 }, omit, 'DECAFBAD'O }; testcase encode_ext() runs on ASN1 { var universal charstring expected := ext_octet_aligned; CHECK_METHOD(bxer_enc_ext, extval, expected); CHECK_METHOD(exer_enc_ext, extval, expected); flatten(expected); CHECK_METHOD(cxer_enc_ext, extval, expected); expected := ext_octet_aligned2; CHECK_METHOD(bxer_enc_ext, AsnValues.ext, expected); flatten(expected); CHECK_METHOD(cxer_enc_ext, AsnValues.ext, expected); expected := ext_syntax_direct; CHECK_METHOD(bxer_enc_ext, AsnValues.ext_sx, expected); flatten(expected); CHECK_METHOD(cxer_enc_ext, AsnValues.ext_sx, expected); expected := ext_context_both; CHECK_METHOD(bxer_enc_ext, AsnValues.ext_cn, expected); flatten(expected); CHECK_METHOD(cxer_enc_ext, AsnValues.ext_cn, expected); var extwrap xw := { SEQUENCE := extval } expected := ext_octet_aligned_wrap; CHECK_METHOD(bxer_enc_extw, xw, expected); CHECK_METHOD(exer_enc_extw, xw, expected); flatten(expected); CHECK_METHOD(cxer_enc_extw, xw, expected & lf); } testcase decode_ext() runs on ASN1 { var Asn_ext expected := extval; CHECK_DECODE2(ext, ext_octet_aligned, Asn_ext, expected); CHECK_DECODE2(ext, ext_octet_aligned2, Asn_ext, AsnValues.ext); CHECK_DECODE2(ext, ext_syntax_direct, Asn_ext, AsnValues.ext_sx); CHECK_DECODE2(ext, ext_context_both, Asn_ext, AsnValues.ext_cn); var extwrap expectedw := { SEQUENCE := extval }; var universal charstring xwrap := ext_octet_aligned_wrap; CHECK_DECODE2(extw, xwrap, extwrap, expectedw); expectedw := { SEQUENCE := AsnValues.ext_sx }; xwrap := ext_syntax_direct_wrap; CHECK_DECODE2(extw, xwrap, extwrap, expectedw); } /**************************** INTEGER ****************************/ DECLARE_XER_ENCODERS(Asn_int, aint); DECLARE_EXER_ENCODERS(Asn_int,aint) testcase encode_aint() runs on ASN1 { var Asn_int intval := -137; var universal charstring expected := "-137"; // ""; // It can never do that. Unbound should cause an error. CHECK_METHOD(cxer_enc_aint, intval, expected); CHECK_METHOD(bxer_enc_aint, intval, expected & lf); CHECK_METHOD(exer_enc_aint, intval, expected & lf); expected := "42"; CHECK_METHOD(cxer_enc_aint, AsnValues.fourty_two, expected); CHECK_METHOD(bxer_enc_aint, AsnValues.fourty_two, expected & lf); expected := "0"; CHECK_METHOD(cxer_enc_aint, AsnValues.zarro, expected); CHECK_METHOD(bxer_enc_aint, AsnValues.zarro, expected & lf); intval := 0; CHECK_METHOD(cxer_enc_aint, intval, expected); CHECK_METHOD(bxer_enc_aint, intval, expected & lf); CHECK_METHOD(exer_enc_aint, intval, expected & lf); expected := "602214179000000000000000"; CHECK_METHOD(cxer_enc_aint, AsnValues.avogadro, expected); CHECK_METHOD(bxer_enc_aint, AsnValues.avogadro, expected & lf); // This is somewhat redundant because [bc]xer_enc_int doesn't encode // a TTCN3 integer (see Txerint.ttcnpp for that), but an Asn_int. intval := 602214179000000000000000; CHECK_METHOD(cxer_enc_aint, intval, expected); CHECK_METHOD(bxer_enc_aint, intval, expected & lf); CHECK_METHOD(exer_enc_aint, intval, expected & lf); } testcase decode_aint() runs on ASN1 { var integer expected; const charstring one_three_seven := "137"; expected := 137; CHECK_DECODE2(aint, one_three_seven, integer, expected); const charstring minus_nine := "-9"; expected := -9; CHECK_DECODE2(aint, minus_nine, integer, expected); const charstring fourtytwo := "42"; CHECK_DECODE2(aint, fourtytwo, integer, AsnValues.fourty_two); const charstring nix := "0"; CHECK_DECODE2(aint, nix, integer, AsnValues.zarro); const charstring minix := "-0"; CHECK_DECODE2(aint, minix, integer, AsnValues.zarro); const charstring avo := "602214179000000000000000"; expected := 602214179000000000000000; CHECK_DECODE2(aint, avo, Asn_int, expected); const charstring empty_int := ""; var octetstring bytes; var integer rv := u2o("UTF-8", empty_int, bytes); MUST_UNBOUND(bxer_dec_aint(bytes)); // can't check with == } /**************************** NULL ****************************/ DECLARE_XER_ENCODERS(Asn_nul, nul); DECLARE_EXER_ENCODERS(Asn_nul,nul) testcase encode_nul() runs on ASN1 { var Asn_nul nulval := NULL; var universal charstring expected := ""; CHECK_METHOD(cxer_enc_nul, nulval, expected); CHECK_METHOD(bxer_enc_nul, nulval, expected & lf); CHECK_METHOD(exer_enc_nul, nulval, expected & lf); } testcase decode_nul() runs on ASN1 { const charstring nullstr := ""; var Asn_nul expected := NULL; CHECK_DECODE2(nul, nullstr, Asn_nul, expected); } /**************************** OBJECT IDENTIFIER ****************************/ DECLARE_XER_ENCODERS(Asn_oid, oid); DECLARE_EXER_ENCODERS(Asn_oid,oid) const charstring oidstr_empty := ""; const charstring oidstr_etsiMobNet := "0.4.0.0.1"; const charstring oidstr_pi := "1.3.14.15.9.2.6.5.3.5.8.9.7.9.3.2.3.8.4.6.2.6.4.3.3"; const charstring oidstr_e := "2.7.18.28.18.28.45.90.45"; const charstring oidstr_ericsson_testing := "0.4.0.127.0.5.0"; const charstring oidstr_etsi_solo := "0.4.0"; const charstring oidstr_ber := "2.1.1"; const charstring oidstr_cer := "2.6.6.1.2.4.4"; const Asn_oid etsiMobNet := objid{ itu_t identified_organization etsi(0) mobile_domain(0) umts_Network(1) } testcase encode_oid() runs on ASN1 { var Asn_oid noid; var universal charstring expected := oidstr_empty; // unbound! CHECK_METHOD(cxer_enc_oid, noid, expected); // unbound! CHECK_METHOD(bxer_enc_oid, noid, expected & lf); expected := oidstr_etsiMobNet; expected := oidstr_pi CHECK_METHOD(cxer_enc_oid, pi_oid, expected); CHECK_METHOD(bxer_enc_oid, pi_oid, expected & lf); CHECK_METHOD(exer_enc_oid, pi_oid, expected & lf); expected := oidstr_e; CHECK_METHOD(cxer_enc_oid, e_oid, expected); CHECK_METHOD(bxer_enc_oid, e_oid, expected & lf); CHECK_METHOD(exer_enc_oid, e_oid, expected & lf); // { itu-t identified-organization etsi(0) reserved(127) etsi-identified-organization(0) ericsson(5) testing(0) } expected := oidstr_ericsson_testing; CHECK_METHOD(cxer_enc_oid, ericsson_testing, expected); CHECK_METHOD(bxer_enc_oid, ericsson_testing, expected & lf); CHECK_METHOD(exer_enc_oid, ericsson_testing, expected & lf); expected := oidstr_etsi_solo; CHECK_METHOD(cxer_enc_oid, etsi_solo, expected); CHECK_METHOD(bxer_enc_oid, etsi_solo, expected & lf); CHECK_METHOD(exer_enc_oid, etsi_solo, expected & lf); expected := oidstr_ber; CHECK_METHOD(cxer_enc_oid, ber_oid, expected); CHECK_METHOD(bxer_enc_oid, ber_oid, expected & lf); CHECK_METHOD(exer_enc_oid, ber_oid, expected & lf); expected := oidstr_cer; CHECK_METHOD(cxer_enc_oid, cer_oid, expected); CHECK_METHOD(bxer_enc_oid, cer_oid, expected & lf); CHECK_METHOD(exer_enc_oid, cer_oid, expected & lf); } testcase decode_oid() runs on ASN1 { var Asn_oid expected; //compiler error, must have at least two components := objid { 1 }; //CHECK_DECODE2(oid, oidstr_empty, Asn_oid, expected); expected := etsiMobNet; CHECK_DECODE2(oid, oidstr_etsiMobNet, Asn_oid, expected); expected := pi_oid; CHECK_DECODE2(oid, oidstr_pi, Asn_oid, expected); expected := e_oid; CHECK_DECODE2(oid, oidstr_e, Asn_oid, expected); expected := ericsson_testing; CHECK_DECODE2(oid, oidstr_ericsson_testing, Asn_oid, expected); expected := etsi_solo; CHECK_DECODE2(oid, oidstr_etsi_solo, Asn_oid, expected); expected := ber_oid; CHECK_DECODE2(oid, oidstr_ber, Asn_oid, expected); expected := cer_oid; CHECK_DECODE2(oid, oidstr_cer, Asn_oid, expected); } /**************************** RELATIVE OBJECT IDENTIFIER ****************************/ DECLARE_XER_ENCODERS(Asn_roid, roid); DECLARE_EXER_ENCODERS(Asn_roid,roid) testcase encode_roid() runs on ASN1 { var Asn_oid roidval; var universal charstring expected := ""; // unbound! CHECK_METHOD(cxer_enc_roid, roidval, expected); // unbound! CHECK_METHOD(bxer_enc_roid, roidval, expected & lf); roidval := objid {iso(1) member_body(2) bsi(826) disc(0) ericsson(1249)}; expected := "1.2.826.0.1249"; CHECK_METHOD(cxer_enc_roid, roidval, expected); CHECK_METHOD(bxer_enc_roid, roidval, expected & lf); CHECK_METHOD(exer_enc_roid, roidval, expected & lf); CHECK_METHOD(cxer_enc_roid, AsnValues.zoid, expected); CHECK_METHOD(bxer_enc_roid, AsnValues.zoid, expected & lf); } testcase decode_roid() runs on ASN1 { var Asn_oid expected; expected := objid {iso(1) member_body(2) bsi(826) disc(0) ericsson(1249)}; CHECK_DECODE2(roid, "1.2.826.0.1249", Asn_oid, expected); } /**************************** OCTET STRING ****************************/ DECLARE_XER_ENCODERS(Asn_os,os) DECLARE_EXER_ENCODERS(Asn_os,os) const charstring ostr_1111 := "00001111"; const charstring ostr_empty := ""; const charstring ostr_0123 := "00112233"; testcase encode_os() runs on ASN1 // OCTET STRING { var Asn_os osval := '00001111'O; var universal charstring expected := ostr_1111; //var charstring encoded := bxer_enc_bs(bsval); CHECK_METHOD(cxer_enc_os, osval, expected); CHECK_METHOD(bxer_enc_os, osval, expected & lf); CHECK_METHOD(exer_enc_os, osval, expected & lf); osval := ''O; expected := ostr_empty; CHECK_METHOD(cxer_enc_os, osval, expected); CHECK_METHOD(bxer_enc_os, osval, expected & lf); CHECK_METHOD(exer_enc_os, osval, expected & lf); // still empty expected CHECK_METHOD(cxer_enc_os, AsnValues.os0, expected); CHECK_METHOD(bxer_enc_os, AsnValues.os0, expected & lf); expected := ostr_0123; CHECK_METHOD(cxer_enc_os, AsnValues.os, expected); CHECK_METHOD(bxer_enc_os, AsnValues.os, expected & lf); } testcase decode_os() runs on ASN1 // OCTET STRING { var Asn_os expected; expected := '00001111'O; CHECK_DECODE2(os, ostr_1111, Asn_os, expected); expected := ''O; CHECK_DECODE2(os, ostr_empty, Asn_os, expected); expected := AsnValues.os CHECK_DECODE2(os, ostr_0123, Asn_os, expected); } /**************************** REAL ****************************/ DECLARE_XER_ENCODERS(Asn_real, real); DECLARE_EXER_ENCODERS(Asn_real,real) const charstring floatstr_pi := "3.141593"; const charstring floatstr_longpi := "3.14159265358979"; testcase encode_real() runs on ASN1 { var Asn_real rval := 3.1415926; var universal charstring expected := floatstr_pi; // ""; // It can never do that. Unbound should cause an error. CHECK_METHOD(cxer_enc_real, rval, expected); CHECK_METHOD(bxer_enc_real, rval, expected & lf); CHECK_METHOD(exer_enc_real, rval, expected & lf); // TODO CHECK_METHOD(cxer_enc_real, AsnValues.pi, expected); CHECK_METHOD(bxer_enc_real, AsnValues.pi, expected & lf); } testcase decode_real() runs on ASN1 { var float expected := 3.141593; CHECK_DECODE2(real, floatstr_pi, float, expected); CHECK_DECODE2(real, floatstr_longpi, float, AsnValues.pi); } /**************************** Strings ****************************/ DECLARE_XER_ENCODERS(Asn_ia5, ia5s); DECLARE_EXER_ENCODERS(Asn_ia5,ia5s) const charstring ia5_yay := "Yay!\n"; const charstring ia5_cthulhu := "Ia5! Ia5! Cthulhu fhtagn!\n"; const charstring ia5_empty := "\n"; const charstring ia5_bonafide := "A bona fide IA5String\n"; testcase encode_ia5str() runs on ASN1 { var Asn_ia5 rval := "Yay!"; var universal charstring expected := ia5_yay; CHECK_METHOD(cxer_enc_ia5s, rval, expected); CHECK_METHOD(bxer_enc_ia5s, rval, expected & lf); CHECK_METHOD(exer_enc_ia5s, rval, expected & lf); expected := ia5_cthulhu; CHECK_METHOD(cxer_enc_ia5s, AsnValues.ia5val, expected); CHECK_METHOD(bxer_enc_ia5s, AsnValues.ia5val, expected & lf); expected := ia5_empty; CHECK_METHOD(cxer_enc_ia5s, AsnValues.ia6val, expected); CHECK_METHOD(bxer_enc_ia5s, AsnValues.ia6val, expected & lf); expected := ia5_bonafide; CHECK_METHOD(cxer_enc_ia5s, AsnValues.ia7val, expected); CHECK_METHOD(bxer_enc_ia5s, AsnValues.ia7val, expected & lf); expected := ia5_empty; CHECK_METHOD(cxer_enc_ia5s, AsnValues.ia8val, expected); CHECK_METHOD(bxer_enc_ia5s, AsnValues.ia8val, expected & lf); } testcase decode_ia5str() runs on ASN1 { var charstring expected; expected := "Yay!"; CHECK_DECODE2(ia5s, ia5_yay, Asn_ia5, expected); expected := AsnValues.ia5val; CHECK_DECODE2(ia5s, ia5_cthulhu, Asn_ia5, expected); expected := AsnValues.ia6val; CHECK_DECODE2(ia5s, ia5_empty, Asn_ia5, expected); expected := AsnValues.ia7val; CHECK_DECODE2(ia5s, ia5_bonafide, Asn_ia5, expected); } /**************************** UTF8String ****************************/ DECLARE_XER_ENCODERS(Asn_utf, utf); DECLARE_EXER_ENCODERS(Asn_utf,utf) // XER encoding of "UTF8 A'RVI'ZTU"RO"" TU:KO:RFU'RO'GE'P" const universal charstring utf_arviz_turo := "UTF8 " & Aacute & "RV" & Iacute & "ZT" & Udouble & "R" & Odouble & " T" & Uuml & "K" & Ouml & "RF" & Uacute & "R" & Oacute & "G" & Eacute & "P\n"; // XER encoding of an empty string const charstring utf_empty := "\n"; // XER encoding which needs to do a lot of escaping const universal charstring utf_esc_oss := "UTF8 escapology\n\t\n\r" & //these would be the UTF8 bytes: "\xc2\x84\xC5\x82\xE4\x89\x82\xF0\x94\x89\x82\xF4\x84\x89\x82\n"; //but universal charstring uses UCS4 char(0,0,0,132) & char(0,0,1,66) & char(0,0,66,66) & char(0,1,66,66) & char(0,16,66,66) & "\n"; // An alternative representation which should decode into the same value const universal charstring utf_esc_oss_alt := "UTF8 escapology\n\t\n\r" & // libxml2 handles &#n; and &#xn; for us. But it won't accept control characters. "„ł䉂𔉂􄉂" & "\n"; const universal charstring utf_bogus := "UTF8 escapology\n\t\n\r" & //--------------------------^^^ char(0,0,0,132) & char(0,0,1,66) & char(0,0,66,66) & char(0,1,66,66) & char(0,16,66,66) & "\n"; // XER encoding which needs to do a lot of escaping: // "UTF8 " followed by "\x01\x02...\x1F" then \x84\x0142\x4242\x00014242\x00104242 //const charstring utf_esc := //"UTF8\n\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F" & //"\xc2\x84\xC5\x82\xE4\x89\x82\xF0\x94\x89\x82\xF4\x84\x89\x82\n"; // XER encoding of an HTML fragment const charstring utf_html := "<html><body onload='javascript.alert("UTF8")'>&nbsp;</body></html>\n"; testcase encode_utf() runs on ASN1 { // Encode "UTF8 A'RVI'ZTU"RO"" TU:KO:RFU'RO'GE'P" var universal charstring expected := utf_arviz_turo; CHECK_METHOD(cxer_enc_utf, AsnValues.val_utf, expected); CHECK_METHOD(bxer_enc_utf, AsnValues.val_utf, expected & lf); // Encode an empty string expected := utf_empty; CHECK_METHOD(cxer_enc_utf, AsnValues.blank_utf, expected); CHECK_METHOD(bxer_enc_utf, AsnValues.blank_utf, expected & lf); // Encode a string with lots of characters that need to be escaped: expected := utf_esc_oss; CHECK_METHOD(cxer_enc_utf, AsnValues.esc_utf, expected); CHECK_METHOD(bxer_enc_utf, AsnValues.esc_utf, expected & lf); expected := utf_html; CHECK_METHOD(cxer_enc_utf, AsnValues.html_utf, expected); CHECK_METHOD(bxer_enc_utf, AsnValues.html_utf, expected & lf); } testcase decode_utf() runs on ASN1 { var Asn_utf expected; expected := AsnValues.val_utf; CHECK_DECODE2(utf, utf_arviz_turo, Asn_utf, expected); expected := AsnValues.blank_utf; CHECK_DECODE2(utf, utf_empty, Asn_utf, expected); expected := AsnValues.esc_utf_dec; CHECK_DECODE2(utf, utf_esc_oss, Asn_utf, expected); CHECK_DECODE2(utf, utf_esc_oss_alt, Asn_utf, expected); // Dynamic testcase error, as expected: //CHECK_DECODE2(utf, utf_bogus, Asn_utf, expected); expected := AsnValues.html_utf; CHECK_DECODE2(utf, utf_html, Asn_utf, expected); } /**************** Other restricted character string types ****************/ DECLARE_XER_ENCODERS(Asn_bmp, bmp); DECLARE_EXER_ENCODERS(Asn_bmp,bmp) DECLARE_XER_ENCODERS(Asn_gen, gen); DECLARE_EXER_ENCODERS(Asn_gen,gen) DECLARE_XER_ENCODERS(Asn_gra, gra); DECLARE_EXER_ENCODERS(Asn_gra,gra) DECLARE_XER_ENCODERS(Asn_num, num); DECLARE_EXER_ENCODERS(Asn_num,num) DECLARE_XER_ENCODERS(Asn_prn, prn); DECLARE_EXER_ENCODERS(Asn_prn,prn) DECLARE_XER_ENCODERS(Asn_ttx, ttx); DECLARE_EXER_ENCODERS(Asn_ttx,ttx) DECLARE_XER_ENCODERS(Asn_uni, uni); DECLARE_EXER_ENCODERS(Asn_uni,uni) DECLARE_XER_ENCODERS(Asn_vtx, vtx); DECLARE_EXER_ENCODERS(Asn_vtx,vtx) DECLARE_XER_ENCODERS(Asn_vis, vis); DECLARE_EXER_ENCODERS(Asn_vis,vis) DECLARE_XER_ENCODERS(universal charstring, ustr); const charstring str_bmp := "Ich weiß es! Basic Multilingual Plane.\n"; const charstring str_bmp0 := "\n"; const charstring str_bmp_esc := "BMP\n\t\n\r„ł䉂\n"; const charstring str_bmp_html := "<html><body onload='javascript.alert("BMP")'>&nbsp;</body></html>\n"; const charstring str_gen0 := "\n"; const charstring str_gen := "Who is General Failure and why is he reading my disk ?\n"; const charstring str_gra0 := "\n"; const charstring str_gra := "Graphic\n"; const charstring str_num0 := "\n"; const charstring str_num := "150130937545296572356771972164254457814047970568738777235893533016064\n"; const charstring str_prn0 := "\n"; const charstring str_prn := "Printable\n"; const charstring str_ttx0 := "\n"; const charstring str_ttx := "Teletex\n"; const charstring str_uni0 := "\n"; const charstring str_uni := "Universal 灰羽árvíztűrő tükörfúrógép\n"; const charstring str_uni_esc := "Universal escapology\n\t\n\r„ł䉂𔉂􄉂\n"; //�„ł䉂 const charstring str_uni_html:= "<html><body onload='javascript.alert("Universal")'>&nbsp;</body></html>\n"; const charstring str_vtx0 := "\n"; const charstring str_vtx := "Videotex\n"; const charstring str_vis0 := "\n"; const charstring str_vis := "Visible (ISO646)\n"; testcase encode_restricted_strings() runs on ASN1 { var universal charstring expected; expected := str_bmp; CHECK_METHOD(cxer_enc_bmp, AsnValues.b1val, expected); CHECK_METHOD(bxer_enc_bmp, AsnValues.b1val, expected & lf); expected := str_bmp0; CHECK_METHOD(cxer_enc_bmp, AsnValues.b0val, expected); CHECK_METHOD(bxer_enc_bmp, AsnValues.b0val, expected & lf); expected := str_bmp_esc; CHECK_METHOD(cxer_enc_bmp, AsnValues.esc_bmp, expected); CHECK_METHOD(bxer_enc_bmp, AsnValues.esc_bmp, expected & lf); expected := str_bmp_html; CHECK_METHOD(cxer_enc_bmp, AsnValues.html_bmp, expected); CHECK_METHOD(bxer_enc_bmp, AsnValues.html_bmp, expected & lf); //---------------------------------------------------- expected := str_gen0; CHECK_METHOD(cxer_enc_gen, AsnValues.g0val, expected); CHECK_METHOD(bxer_enc_gen, AsnValues.g0val, expected & lf); expected := str_gen; CHECK_METHOD(cxer_enc_gen, AsnValues.g1val, expected); CHECK_METHOD(bxer_enc_gen, AsnValues.g1val, expected & lf); //---------------------------------------------------- expected := str_gra0; CHECK_METHOD(cxer_enc_gra, AsnValues.gr0val, expected); CHECK_METHOD(bxer_enc_gra, AsnValues.gr0val, expected & lf); expected := str_gra; CHECK_METHOD(cxer_enc_gra, AsnValues.gr1val, expected); CHECK_METHOD(bxer_enc_gra, AsnValues.gr1val, expected & lf); //---------------------------------------------------- expected := str_num0; CHECK_METHOD(cxer_enc_num, AsnValues.blank_num, expected); CHECK_METHOD(bxer_enc_num, AsnValues.blank_num, expected & lf); expected := str_num; CHECK_METHOD(cxer_enc_num, AsnValues.val_num, expected); CHECK_METHOD(bxer_enc_num, AsnValues.val_num, expected & lf); //---------------------------------------------------- expected := str_prn0; CHECK_METHOD(cxer_enc_prn, AsnValues.blank_prn, expected); CHECK_METHOD(bxer_enc_prn, AsnValues.blank_prn, expected & lf); expected := str_prn; CHECK_METHOD(cxer_enc_prn, AsnValues.val_prn, expected); CHECK_METHOD(bxer_enc_prn, AsnValues.val_prn, expected & lf); //---------------------------------------------------- expected := str_ttx0; CHECK_METHOD(cxer_enc_ttx, AsnValues.blank_ttx, expected); CHECK_METHOD(bxer_enc_ttx, AsnValues.blank_ttx, expected & lf); expected := str_ttx; CHECK_METHOD(cxer_enc_ttx, AsnValues.val_ttx, expected); CHECK_METHOD(bxer_enc_ttx, AsnValues.val_ttx, expected & lf); //---------------------------------------------------- expected := str_uni0; CHECK_METHOD(cxer_enc_uni, AsnValues.blank_uni, expected); CHECK_METHOD(bxer_enc_uni, AsnValues.blank_uni, expected & lf); expected := str_uni_esc; CHECK_METHOD(cxer_enc_uni, AsnValues.esc_uni, expected); CHECK_METHOD(bxer_enc_uni, AsnValues.esc_uni, expected & lf); expected := str_uni; CHECK_METHOD(cxer_enc_uni, AsnValues.val_uni, expected); CHECK_METHOD(bxer_enc_uni, AsnValues.val_uni, expected & lf); expected := str_uni_html; CHECK_METHOD(cxer_enc_uni, AsnValues.html_uni, expected); CHECK_METHOD(bxer_enc_uni, AsnValues.html_uni, expected & lf); //---------------------------------------------------- expected := str_vtx0; CHECK_METHOD(cxer_enc_vtx, AsnValues.blank_vtx, expected); CHECK_METHOD(bxer_enc_vtx, AsnValues.blank_vtx, expected & lf); expected := str_vtx; CHECK_METHOD(cxer_enc_vtx, AsnValues.val_vtx, expected); CHECK_METHOD(bxer_enc_vtx, AsnValues.val_vtx, expected & lf); //---------------------------------------------------- expected := str_vis0; CHECK_METHOD(cxer_enc_vis, AsnValues.blank_vis, expected); CHECK_METHOD(bxer_enc_vis, AsnValues.blank_vis, expected & lf); expected := str_vis; CHECK_METHOD(cxer_enc_vis, AsnValues.val_vis, expected); CHECK_METHOD(bxer_enc_vis, AsnValues.val_vis, expected & lf); } testcase decode_restricted_strings() runs on ASN1 { { var Asn_bmp expected; expected := AsnValues.b1val; CHECK_DECODE(cxer_dec_bmp, str_bmp, universal charstring, expected/*AsnValues.b1val*/); CHECK_DECODE(bxer_dec_bmp, str_bmp, universal charstring, expected /*& lf*/); expected := AsnValues.b0val; CHECK_DECODE(cxer_dec_bmp, str_bmp0, universal charstring, expected); CHECK_DECODE(bxer_dec_bmp, str_bmp0, universal charstring, expected /*& lf*/); expected := AsnValues.esc_bmp_dec; CHECK_DECODE(cxer_dec_bmp, str_bmp_esc, universal charstring, expected); CHECK_DECODE(bxer_dec_bmp, str_bmp_esc, universal charstring, expected /*& lf*/); expected := AsnValues.html_bmp; CHECK_DECODE(cxer_dec_bmp, str_bmp_html, universal charstring, expected); CHECK_DECODE(bxer_dec_bmp, str_bmp_html, universal charstring, expected /*& lf*/); } //---------------------------------------------------- { var Asn_gen expected := AsnValues.g0val; CHECK_DECODE(cxer_dec_gen, str_gen0, Asn_gen, expected); CHECK_DECODE(bxer_dec_gen, str_gen0, Asn_gen, expected); expected := AsnValues.g1val; CHECK_DECODE(cxer_dec_gen, str_gen, Asn_gen, expected); CHECK_DECODE(bxer_dec_gen, str_gen, Asn_gen, expected); } //---------------------------------------------------- { var Asn_gra expected := AsnValues.gr0val; CHECK_DECODE(cxer_dec_gra, str_gra0, Asn_gra, expected); CHECK_DECODE(bxer_dec_gra, str_gra0, Asn_gra, expected); expected := AsnValues.gr1val; CHECK_DECODE(cxer_dec_gra, str_gra, Asn_gra, expected); CHECK_DECODE(bxer_dec_gra, str_gra, Asn_gra, expected); } //---------------------------------------------------- { var Asn_num expected := AsnValues.blank_num; CHECK_DECODE3(num, str_num0, expected); // checks both BXER and CXER expected := AsnValues.val_num; CHECK_DECODE3(num, str_num, expected); } //---------------------------------------------------- { var Asn_prn expected := AsnValues.blank_prn; CHECK_DECODE3(prn, str_prn0, expected); expected := AsnValues.val_prn; CHECK_DECODE3(prn, str_prn, expected); } //---------------------------------------------------- { var Asn_ttx expected := AsnValues.blank_ttx; CHECK_DECODE3(ttx, str_ttx0, expected); expected := AsnValues.val_ttx; CHECK_DECODE3(ttx, str_ttx, expected); } //---------------------------------------------------- { var Asn_uni expected := AsnValues.blank_uni; CHECK_DECODE3(uni, str_uni0, expected); expected := AsnValues.esc_uni_dec; CHECK_DECODE3(uni, str_uni_esc, expected); expected := AsnValues.val_uni; CHECK_DECODE3(uni, str_uni, expected); expected := AsnValues.html_uni; CHECK_DECODE3(uni, str_uni_html, expected); } //---------------------------------------------------- { var Asn_vtx expected := AsnValues.blank_vtx; CHECK_DECODE3(vtx, str_vtx0, expected); expected := AsnValues.val_vtx; CHECK_DECODE3(vtx, str_vtx, expected); } //---------------------------------------------------- { var Asn_vis expected := AsnValues.blank_vis; CHECK_DECODE3(vis, str_vis0, expected); expected := AsnValues.val_vis; CHECK_DECODE3(vis, str_vis, expected); } } /************ The big, scary, unrestricted CHARACTER STRING ************/ DECLARE_XER_ENCODERS(Asn_unr, unr); DECLARE_EXER_ENCODERS(Asn_unr,unr) const charstring str_unr_sxs := "\n" & "\t\n" & "\t\t\n" & "\t\t\t1.3.14.15.9.2.6.5.3.5.8.9.7.9.3.2.3.8.4.6.2.6.4.3.3\n" & "\t\t\t2.7.18.28.18.28.45.90.45\n" & "\t\t\n" & "\t\n" & "\tC3A17276C3AD7A74C5B172C5912074C3\n" & "\n\n"; const charstring str_unr_sx := "\n" & "\t\n" & "\t\t1.3.14.15.9.2.6.5.3.5.8.9.7.9.3.2.3.8.4.6.2.6.4.3.3\n" & "\t\n" & "\tBC6BC3B67266C3BA72C3B367C3A970\n" & "\n\n"; const charstring str_unr_pci := "\n" & "\t\n" & "\t\t42\n" & "\t\n" & "\tC3815256C38D5A54C5B052C5902054C3\n" & "\n\n"; const charstring str_unr_cneg := "\n" & "\t\n" & "\t\t\n" & "\t\t\t17\n" & "\t\t\t2.1.1\n" & "\t\t\n" & "\t\n" & "\t9C4BC3965246C39A52C39347C38950\n" & "\n\n"; const charstring str_unr_tsx := "\n" & "\t\n" & "\t\t2.1.1\n" & "\t\n" & "\tBEEE\n" & "\n\n"; const charstring str_unr_fix := "\n" & "\t\n" & "\t\t\n" & "\t\n" & "\t" & "C3815256C38D5A54C5B052C5902054C39C4BC3965246C39A52C39347C38950" & "\n" & "\n\n" ; testcase encode_unr() runs on ASN1 { var universal charstring expected; expected := str_unr_sxs; // syntaxes CHECK_METHOD(bxer_enc_unr, val_unr_sxs, expected); CHECK_METHOD(exer_enc_unr, val_unr_sxs, expected); flatten(expected); CHECK_METHOD(cxer_enc_unr, val_unr_sxs, expected & lf); expected := str_unr_sx; // syntax CHECK_METHOD(bxer_enc_unr, val_unr_sx, expected); CHECK_METHOD(exer_enc_unr, val_unr_sx, expected); flatten(expected); CHECK_METHOD(cxer_enc_unr, val_unr_sx, expected & lf); expected := str_unr_pci; // presentation-context-id CHECK_METHOD(bxer_enc_unr, val_unr_pci, expected); CHECK_METHOD(exer_enc_unr, val_unr_pci, expected); flatten(expected); CHECK_METHOD(cxer_enc_unr, val_unr_pci, expected & lf); expected := str_unr_cneg; // context-negotiation CHECK_METHOD(bxer_enc_unr, val_unr_cneg, expected); CHECK_METHOD(exer_enc_unr, val_unr_cneg, expected); flatten(expected); CHECK_METHOD(cxer_enc_unr, val_unr_cneg, expected & lf); expected := str_unr_tsx; // transfer-syntax CHECK_METHOD(bxer_enc_unr, val_unr_tsx, expected); CHECK_METHOD(exer_enc_unr, val_unr_tsx, expected); flatten(expected); CHECK_METHOD(cxer_enc_unr, val_unr_tsx, expected & lf); expected := str_unr_fix; // fixed CHECK_METHOD(bxer_enc_unr, val_unr_fix, expected); CHECK_METHOD(exer_enc_unr, val_unr_fix, expected); flatten(expected); CHECK_METHOD(cxer_enc_unr, val_unr_fix, expected & lf); } testcase decode_unr() runs on ASN1 { var Asn_unr expected; expected := val_unr_sxs; CHECK_DECODE2(unr, str_unr_sxs, Asn_unr, expected); expected := val_unr_sx; CHECK_DECODE2(unr, str_unr_sx, Asn_unr, expected); expected := val_unr_pci; CHECK_DECODE2(unr, str_unr_pci, Asn_unr, expected); expected := val_unr_cneg; CHECK_DECODE2(unr, str_unr_cneg, Asn_unr, expected); expected := val_unr_tsx; CHECK_DECODE2(unr, str_unr_tsx, Asn_unr, expected); expected := val_unr_fix; CHECK_DECODE2(unr, str_unr_fix, Asn_unr, expected); } /**************************** XXXX ****************************/ DECLARE_XER_ENCODERS(LotsaText, softext); DECLARE_EXER_ENCODERS(LotsaText,softext) testcase limerick() runs on ASN1 { var LotsaText rval := AsnValues.limerick; var universal charstring expected := "\n" & "\tThere was a young fellow named Fisk\n" & "\tA swordsman, exceedingly brisk\n" & "\tSo fast was his action\n" & "\tThe Lorentz contraction\n" & "\tReduced his rapier to a disc\n" & "\n\n"; CHECK_METHOD(bxer_enc_softext, rval, expected); CHECK_METHOD(exer_enc_softext, rval, expected); flatten(expected); CHECK_METHOD(cxer_enc_softext, rval, expected & lf); // TODO } /**************************** XXXX **************************** DECLARE_XER_ENCODERS(Asn_xxxx, xxxx); DECLARE_EXER_ENCODERS(Asn_xxxx,xxxx) testcase xxxx() runs on ASN1 { var Asn_xxxx rval := xXxX; var yyyy expected := "3.141593"; CHECK_METHOD(cxer_enc_xxxx, rval, expected); CHECK_METHOD(bxer_enc_xxxx, rval, expected & lf); CHECK_METHOD(exer_enc_xxxx, rval, expected & lf); // TODO } --------------- >8 --------------- cut here */ // An empty SEQUENCE DECLARE_XER_ENCODERS(NothingToSeeHere, nix); DECLARE_EXER_ENCODERS(NothingToSeeHere,nix) const universal charstring emptyelement := "\n"; testcase encode_emptyrec() runs on ASN1 { CHECK_METHOD(cxer_enc_nix, AsnValues.move_along, emptyelement); CHECK_METHOD(bxer_enc_nix, AsnValues.move_along, emptyelement & lf); } const universal charstring nonempty_element := "\n"; testcase decode_emptyrec() runs on ASN1 { CHECK_DECODE2(nix, emptyelement, NothingToSeeHere, AsnValues.move_along); // Use of the empty-element form is required for Canonical XER. // Basic XER should accept it. CHECK_DECODE(bxer_dec_nix, nonempty_element, NothingToSeeHere, AsnValues.move_along); } /**************************** choice ****************************/ DECLARE_XER_ENCODERS(Something, smth); DECLARE_EXER_ENCODERS(Something,smth) const charstring smth_bitstr := "\n" & "\t01001000100001\n" & "\n\n"; const charstring smth_bool := "\n" & "\t\n" & "\n\n"; const charstring smth_ebool := "\n" & "\ttrue\n" & "\n\n"; const charstring smth_float := "\n" & "\t3.141593\n" & "\n\n"; const charstring smth_barney := "\n" & "\t\n" & "\n\n"; const charstring smth_ebarney := "\n" & "\tbarney\n" & "\n\n"; const charstring smth_int := "\n" & "\t42\n" & "\n\n"; testcase encode_something() runs on ASN1 { var universal charstring expected; { var Something eval := { bitstr := '01001000100001'B } expected := smth_bitstr; CHECK_METHOD(bxer_enc_smth, eval, expected); CHECK_METHOD(exer_enc_smth, eval, expected); CHECK_METHOD(exer_enc_smth, eval, expected); flatten(expected); CHECK_METHOD(cxer_enc_smth, eval, expected & lf); } { var Something eval := { booool := true } expected := smth_ebool; CHECK_METHOD(exer_enc_smth, eval, expected); expected := smth_bool; CHECK_METHOD(bxer_enc_smth, eval, expected); flatten(expected); CHECK_METHOD(cxer_enc_smth, eval, expected & lf); } { var Something eval := { floating := 3.141593 }; expected := smth_float; CHECK_METHOD(bxer_enc_smth, eval, expected); CHECK_METHOD(exer_enc_smth, eval, expected); CHECK_METHOD(exer_enc_smth, eval, expected); flatten(expected); CHECK_METHOD(cxer_enc_smth, eval, expected & lf); } { var Something neval := { wholenum := 42 }; expected := smth_int; CHECK_METHOD(bxer_enc_smth, neval, expected); CHECK_METHOD(exer_enc_smth, neval, expected); CHECK_METHOD(exer_enc_smth, neval, expected); flatten(expected); CHECK_METHOD(cxer_enc_smth, neval, expected & lf); } { var Something feval := { cartoon := barney }; expected := smth_ebarney; CHECK_METHOD(exer_enc_smth, feval, expected); expected := smth_barney; CHECK_METHOD(bxer_enc_smth, feval, expected); flatten(expected); CHECK_METHOD(cxer_enc_smth, feval, expected & lf); } } testcase decode_something() runs on ASN1 { var Something expected; expected := { bitstr := '01001000100001'B }; CHECK_DECODE2(smth, smth_bitstr, Something, expected); expected := { booool := true }; CHECK_DECODE2(smth, smth_bool, Something, expected); expected := { floating := 3.141593 }; CHECK_DECODE2(smth, smth_float, Something, expected); expected := { wholenum := 42 }; CHECK_DECODE2(smth, smth_int, Something, expected); expected := { cartoon := barney }; CHECK_DECODE2(smth, smth_barney, Something, expected); } /**************************** record ****************************/ DECLARE_XER_ENCODERS(Everything, ev); DECLARE_EXER_ENCODERS(Everything,ev) DECLARE_XER_ENCODERS(MaybeEverything, mev); DECLARE_EXER_ENCODERS(MaybeEverything,mev) const charstring xer_everything := "\n" & "\t01011010\n" & "\t\n" & "\t\n" & "\t\t\n" & "\t\t\t\n" & "\t\t\t\t69\n" & "\t\t\t\t2.7.18.28.18.28.45.90.45\n" & "\t\t\t\n" & "\t\t\n" & "\t\tC1AFB1\n" & "\t\n" & "\t\n" & "\t\n" & "\t\t2.1.1\n" & "\t\t111\n" & "\t\tusing context negotiation, both\n" & "\t\t\n" & "\t\t\t1337D00D\n" & "\t\t\n" & "\t\n" & "\t1252\n" & "\t\n" & "\t\n" & "\t2.1.1\n" & "\tBAADF00D\n" & "\tevth\n" & "\t3.141593\n" & //"\t<>\n" & "\t1.2.826.0.1249\n" & "\n\n"; const charstring exer_everything := "\n" & "\t01011010\n" & "\ttrue\n" & // EXER uses TextBoolean "\t\n" & "\t\t\n" & "\t\t\t\n" & "\t\t\t\t69\n" & "\t\t\t\t2.7.18.28.18.28.45.90.45\n" & "\t\t\t\n" & "\t\t\n" & "\t\tC1AFB1\n" & "\t\n" & "\twilma\n" & // EXER "\t\n" & "\t\t2.1.1\n" & "\t\t111\n" & "\t\tusing context negotiation, both\n" & "\t\t\n" & "\t\t\t1337D00D\n" & "\t\t\n" & "\t\n" & "\t1252\n" & "\t\n" & "\t\n" & "\t2.1.1\n" & "\tBAADF00D\n" & "\tevth\n" & "\t3.141593\n" & //"\t<>\n" & "\t1.2.826.0.1249\n" & "\n\n"; const Everything evth := { bitstr := '01011010'B, booool := true, pdv := AsnValues.pdv_cneg, cartoon := wilma, outsider := AsnValues.ext_cn, wholenum := 1252, nix := NULL, emptyrec := {}, objection:= AsnValues.ber_oid, octets := 'BAADF00D'O, printer := "evth", floating := 3.141593, rroid := AsnValues.zoid } testcase encode_everything() runs on ASN1 { var universal charstring expected; { var Everything eval := evth; expected := xer_everything; CHECK_METHOD(bxer_enc_ev, eval, expected); flatten(expected); CHECK_METHOD(cxer_enc_ev, eval, expected & lf); expected := exer_everything; CHECK_METHOD(exer_enc_ev, eval, expected); } { var Everything eval := AsnValues.a_evth; } } testcase decode_everything() runs on ASN1 { var Everything expected; expected := evth; CHECK_DECODE2(ev, xer_everything, Everything, expected); } /*********************** record with optional fields ***********************/ const charstring mevstr_all := "\n" & "\t01011010\n" & "\t\n" & "\t\n" & "\t\t\n" & "\t\t\t\n" & "\t\t\t\t69\n" & "\t\t\t\t2.7.18.28.18.28.45.90.45\n" & "\t\t\t\n" & "\t\t\n" & "\t\tC1AFB1\n" & "\t\n" & "\t\n" & "\t\n" & "\t\t2.1.1\n" & "\t\t111\n" & "\t\tusing context negotiation, both\n" & "\t\t\n" & "\t\t\t1337D00D\n" & "\t\t\n" & "\t\n" & "\t1252\n" & "\t\n" & "\tDECAFF\n" & "\t\n" & "\t2.1.1\n" & "\tBAADF00D\n" & "\tmev-all\n" & "\t3.141593\n" & "\t1.2.826.0.1249\n" & "\n\n"; const charstring mevstr_all_exer := "\n" & "\t01011010\n" & "\ttrue\n" & // EXER uses TextBooleean "\t\n" & "\t\t\n" & "\t\t\t\n" & "\t\t\t\t69\n" & "\t\t\t\t2.7.18.28.18.28.45.90.45\n" & "\t\t\t\n" & "\t\t\n" & "\t\tC1AFB1\n" & "\t\n" & "\tbetty\n" & // EXER uses TextEnumerated "\t\n" & "\t\t2.1.1\n" & "\t\t111\n" & "\t\tusing context negotiation, both\n" & "\t\t\n" & "\t\t\t1337D00D\n" & "\t\t\n" & "\t\n" & "\t1252\n" & "\t\n" & "\tDECAFF\n" & "\t\n" & "\t2.1.1\n" & "\tBAADF00D\n" & "\tmev-all\n" & "\t3.141593\n" & "\t1.2.826.0.1249\n" & "\n\n"; const MaybeEverything mev_all := { bitstr := '01011010'B, booool := true, pdv := AsnValues.pdv_cneg, cartoon := betty, outsider := AsnValues.ext_cn, wholenum := 1252, nix := NULL, anyad := 'DECAFF'O, emptyrec := {}, objection:= AsnValues.ber_oid, octets := 'BAADF00D'O, printer := "mev-all", floating := 3.141593, rroid := AsnValues.zoid }; const charstring mevstr_none := "\n\n"; const MaybeEverything mev_none := { bitstr := omit, booool := omit, pdv := omit, cartoon := omit, outsider := omit, wholenum := omit, nix := omit, anyad := omit, emptyrec := omit, objection:= omit, octets := omit, printer := omit, floating := omit, rroid := omit }; const charstring mevstr_bits := "\n" & "\t1010101001010101\n" & "\n\n"; const MaybeEverything mev_bits := { bitstr := '1010101001010101'B, booool := omit, pdv := omit, cartoon := omit, outsider := omit, wholenum := omit, nix := omit, anyad := omit, emptyrec := omit, objection:= omit, octets := omit, printer := omit, floating := omit, rroid := omit }; const charstring mevstr_bitsbool := "\n" & "\t1010101001010101\n" & "\t\n" & "\n\n"; const charstring mevstr_bitsbool_exer := "\n" & "\t1010101001010101\n" & "\tfalse\n" & // EXER "\n\n"; const MaybeEverything mev_bitsbool := { bitstr := '1010101001010101'B, booool := false, pdv := omit, cartoon := omit, outsider := omit, wholenum := omit, nix := omit, anyad := omit, emptyrec := omit, objection:= omit, octets := omit, printer := omit, floating := omit, rroid := omit }; const charstring mevstr_3 := "\n" & "\t1010101001010101\n" & "\t\n" & "\t\n" & "\n\n"; const charstring mevstr_3_exer := "\n" & "\t1010101001010101\n" & "\tfalse\n" & // EXER "\tfred\n" & // EXER "\n\n"; const MaybeEverything mev_3 := { bitstr := '1010101001010101'B, booool := false, pdv := omit, cartoon := fred, outsider := omit, wholenum := omit, nix := omit, anyad := omit, emptyrec := omit, objection:= omit, octets := omit, printer := omit, floating := omit, rroid := omit }; testcase encode_everything_opt() runs on ASN1 { var universal charstring expected; expected := mevstr_all; CHECK_METHOD(bxer_enc_mev, mev_all, expected); flatten(expected); CHECK_METHOD(cxer_enc_mev, mev_all, expected & lf); expected := mevstr_all_exer; CHECK_METHOD(exer_enc_mev, mev_all, expected); expected := mevstr_none; CHECK_METHOD(bxer_enc_mev, mev_none, expected); CHECK_METHOD(exer_enc_mev, mev_none, expected); flatten(expected); CHECK_METHOD(cxer_enc_mev, mev_none, expected & lf); expected := mevstr_bits; CHECK_METHOD(bxer_enc_mev, mev_bits, expected); CHECK_METHOD(exer_enc_mev, mev_bits, expected); flatten(expected); CHECK_METHOD(cxer_enc_mev, mev_bits, expected & lf); expected := mevstr_bitsbool; CHECK_METHOD(bxer_enc_mev, mev_bitsbool, expected); flatten(expected); CHECK_METHOD(cxer_enc_mev, mev_bitsbool, expected & lf); expected := mevstr_bitsbool_exer; CHECK_METHOD(exer_enc_mev, mev_bitsbool, expected); expected := mevstr_3; CHECK_METHOD(bxer_enc_mev, mev_3, expected); flatten(expected); CHECK_METHOD(cxer_enc_mev, mev_3, expected & lf); expected := mevstr_3_exer; CHECK_METHOD(exer_enc_mev, mev_3, expected); } testcase decode_everything_opt() runs on ASN1 { CHECK_DECODE2(mev, mevstr_all, MaybeEverything, mev_all); CHECK_DECODE2(mev, mevstr_none, MaybeEverything, mev_none); CHECK_DECODE2(mev, mevstr_bits, MaybeEverything, mev_bits); CHECK_DECODE2(mev, mevstr_bitsbool, MaybeEverything, mev_bitsbool); CHECK_DECODE2(mev, mevstr_3, MaybeEverything, mev_3); } /**************************** enumerated ****************************/ DECLARE_XER_ENCODERS(Flintstones, flin); DECLARE_EXER_ENCODERS(Flintstones,flin) const universal charstring fredstr_exer := "fred"; const universal charstring barneystr_exer:= "barney"; const universal charstring wilmastr_exer := "wilma"; const universal charstring bettystr_exer := "betty"; const universal charstring fredstr := "<" & fredstr_exer & "/>"; const universal charstring barneystr:= "<" & barneystr_exer & "/>"; const universal charstring wilmastr := "<" & wilmastr_exer & "/>"; const universal charstring bettystr := "<" & bettystr_exer & "/>"; const universal charstring fred_nested_exer := "" & fredstr_exer & "\n\n"; const universal charstring barney_nested_exer:= "" & barneystr_exer & "\n\n"; const universal charstring wilma_nested_exer := "" & wilmastr_exer & "\n\n"; const universal charstring betty_nested_exer := "" & bettystr_exer & "\n\n"; const universal charstring fred_nested := "" & fredstr & "\n"; const universal charstring barney_nested:= "" & barneystr & "\n"; const universal charstring wilma_nested := "" & wilmastr & "\n"; const universal charstring betty_nested := "" & bettystr & "\n"; testcase encode_flintstones() runs on ASN1 { CHECK_METHOD(bxer_enc_flin, fred, fred_nested & lf); CHECK_METHOD(exer_enc_flin, fred, fred_nested_exer); CHECK_METHOD(cxer_enc_flin, fred, fred_nested); CHECK_METHOD(bxer_enc_flin, barney, barney_nested & lf); CHECK_METHOD(exer_enc_flin, barney, barney_nested_exer); CHECK_METHOD(cxer_enc_flin, barney, barney_nested); CHECK_METHOD(bxer_enc_flin, wilma, wilma_nested & lf); CHECK_METHOD(exer_enc_flin, wilma, wilma_nested_exer); CHECK_METHOD(cxer_enc_flin, wilma, wilma_nested); CHECK_METHOD(bxer_enc_flin, betty, betty_nested & lf); CHECK_METHOD(exer_enc_flin, betty, betty_nested_exer); CHECK_METHOD(cxer_enc_flin, betty, betty_nested); } testcase decode_flintstones() runs on ASN1 { var Flintstones expected; expected := fred; CHECK_DECODE2(flin, fred_nested, Flintstones, expected); expected := barney; CHECK_DECODE2(flin, barney_nested, Flintstones, expected); expected := wilma; CHECK_DECODE2(flin, wilma_nested, Flintstones, expected); expected := betty; CHECK_DECODE2(flin, betty_nested, Flintstones, expected); } /**************************** set of enumerated ****************************/ DECLARE_XER_ENCODERS(Family, fam); DECLARE_EXER_ENCODERS(Family,fam) const universal charstring rubblestr := "\n\t" & barneystr & bettystr & "\n\n\n"; const universal charstring nobodystr := "\n\n"; const universal charstring allstr := "\n\t" & fredstr & wilmastr & bettystr & barneystr & "\n\n\n"; const universal charstring allstr_exer := "\n" & "\t" & fredstr_exer & "\n" & "\t" & wilmastr_exer & "\n" & "\t" & bettystr_exer & "\n" & "\t" & barneystr_exer & "\n" & "\n\n"; const Family nobody := {} const Family alll := { fred, wilma, betty, barney } testcase encode_family() runs on ASN1 { //family rubble := { barney, betty } var universal charstring expected; expected := rubblestr; CHECK_METHOD(bxer_enc_fam, AsnValues.rubble, expected); flatten(expected); CHECK_METHOD(cxer_enc_fam, AsnValues.rubble, expected & lf); expected := nobodystr; CHECK_METHOD(bxer_enc_fam, nobody, expected); CHECK_METHOD(exer_enc_fam, nobody, expected); flatten(expected); CHECK_METHOD(cxer_enc_fam, nobody, expected & lf); expected := allstr; CHECK_METHOD(bxer_enc_fam, alll, expected); flatten(expected); CHECK_METHOD(cxer_enc_fam, alll, expected & lf); expected := allstr_exer; CHECK_METHOD(exer_enc_fam, alll, expected); } testcase decode_family() runs on ASN1 { // suffix, input , type , expected CHECK_DECODE2(fam, rubblestr, Family, AsnValues.rubble); CHECK_DECODE2(fam, nobodystr, Family, nobody); CHECK_DECODE2(fam, allstr , Family, alll); } const universal charstring nagy_arvizturo := char(0,0,0,193) & "RV" & char(0,0,0,205) & "ZT" & char(0,0,1,112) & "R" & char(0,0,1,80) & " T" & char(0,0,0,220) & "K" & char(0,0,0,214) & "RF" & char(0,0,0,218) & "R" & char(0,0,0,211) & "G" & char(0,0,0,201) & "P"; const universal charstring kis_arvizturo := char(0,0,0,225) & "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) & "rf" & char(0,0,0,250) & "r" & char(0,0,0,243) & "g" & char(0,0,0,233) & "p"; ////////////////////////////////////////////////////////////////////////// // // Control part // ////////////////////////////////////////////////////////////////////////// control { execute(encode_bs()); execute(encode_abool()); execute(encode_pdv()); execute(encode_ext()); execute(encode_aint()); execute(encode_nul()); execute(encode_oid()); execute(encode_roid()); execute(encode_os()); execute(encode_real()); execute(encode_ia5str()); execute(encode_utf()); execute(encode_restricted_strings()); execute(encode_unr()); execute(encode_emptyrec()); execute(encode_something()); execute(encode_everything()); execute(encode_everything_opt()); execute(encode_flintstones()); execute(encode_family()); execute(limerick()); execute(decode_bs()); execute(decode_abool()); execute(decode_pdv()); execute(decode_ext()); execute(decode_aint()); execute(decode_nul()); execute(decode_oid()); execute(decode_roid()); execute(decode_os()); execute(decode_real()); execute(decode_ia5str()); execute(decode_utf()); execute(decode_restricted_strings()); execute(decode_unr()); execute(decode_emptyrec()); execute(decode_something()); execute(decode_everything()); execute(decode_everything_opt()); execute(decode_flintstones()); execute(decode_family()); } } with { encode "XML"; extension "version R8A"; }