aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2014-01-29 10:50:21 +0100
committerBjörn Gustavsson <[email protected]>2014-01-29 10:50:21 +0100
commit228ef1c22ee2f6f39183091aa70f17417c3d9aa6 (patch)
tree7d2203d6df886ce1d7f2344dbfd3e6ec7c8a5c3d
parentae2c2f1d838b523939b586014ceb66c2970b8cf2 (diff)
parentd16a480a43a858d604d1ac8d644589be3f49dda1 (diff)
downloadotp-228ef1c22ee2f6f39183091aa70f17417c3d9aa6.tar.gz
otp-228ef1c22ee2f6f39183091aa70f17417c3d9aa6.tar.bz2
otp-228ef1c22ee2f6f39183091aa70f17417c3d9aa6.zip
Merge branch 'bjorn/asn1/erlang-types/OTP-11594'
* bjorn/asn1/erlang-types/OTP-11594: Update documentation Fix open types Fix OCTET STRING Fix BIT STRING Add legacy_erlang_types asn1 test suite: Modernize testTimer_* and testTimer.erl testPrimStrings: Run test of fragmented strings for PER too
-rw-r--r--lib/asn1/doc/src/asn1_ug.xml90
-rw-r--r--lib/asn1/doc/src/asn1ct.xml25
-rw-r--r--lib/asn1/src/asn1ct.erl29
-rw-r--r--lib/asn1/src/asn1ct_check.erl45
-rw-r--r--lib/asn1/src/asn1ct_constructed_per.erl68
-rw-r--r--lib/asn1/src/asn1ct_gen.erl7
-rw-r--r--lib/asn1/src/asn1ct_gen_ber_bin_v2.erl122
-rw-r--r--lib/asn1/src/asn1ct_gen_per.erl22
-rw-r--r--lib/asn1/src/asn1ct_imm.erl47
-rw-r--r--lib/asn1/src/asn1ct_value.erl6
-rw-r--r--lib/asn1/src/asn1rtt_ber.erl65
-rw-r--r--lib/asn1/src/asn1rtt_ext.erl2
-rw-r--r--lib/asn1/src/asn1rtt_per_common.erl37
-rw-r--r--lib/asn1/test/asn1_SUITE.erl44
-rw-r--r--lib/asn1/test/asn1_SUITE_data/TCAPPackage_msg.erl36
-rw-r--r--lib/asn1/test/asn1_SUITE_data/extensionAdditionGroup.erl4
-rw-r--r--lib/asn1/test/h323test.erl14
-rw-r--r--lib/asn1/test/testChoExtension.erl4
-rw-r--r--lib/asn1/test/testChoExternal.erl20
-rw-r--r--lib/asn1/test/testChoOptional.erl12
-rw-r--r--lib/asn1/test/testChoRecursive.erl4
-rw-r--r--lib/asn1/test/testChoTypeRefCho.erl2
-rw-r--r--lib/asn1/test/testChoTypeRefPrim.erl22
-rw-r--r--lib/asn1/test/testChoTypeRefSeq.erl27
-rw-r--r--lib/asn1/test/testChoTypeRefSet.erl27
-rw-r--r--lib/asn1/test/testConstraints.erl8
-rw-r--r--lib/asn1/test/testFragmented.erl4
-rw-r--r--lib/asn1/test/testInfObj.erl8
-rw-r--r--lib/asn1/test/testMergeCompile.erl44
-rw-r--r--lib/asn1/test/testParameterizedInfObj.erl78
-rw-r--r--lib/asn1/test/testPrimExternal.erl2
-rw-r--r--lib/asn1/test/testPrimStrings.erl317
-rw-r--r--lib/asn1/test/testSeqExtension.erl4
-rw-r--r--lib/asn1/test/testSeqExternal.erl18
-rw-r--r--lib/asn1/test/testSeqOf.erl26
-rw-r--r--lib/asn1/test/testSeqOfExternal.erl63
-rw-r--r--lib/asn1/test/testSeqOfTag.erl72
-rw-r--r--lib/asn1/test/testSeqPrim.erl6
-rw-r--r--lib/asn1/test/testSeqSetDefaultVal.erl15
-rw-r--r--lib/asn1/test/testSeqTag.erl36
-rw-r--r--lib/asn1/test/testSeqTypeRefCho.erl8
-rw-r--r--lib/asn1/test/testSeqTypeRefPrim.erl18
-rw-r--r--lib/asn1/test/testSeqTypeRefSeq.erl18
-rw-r--r--lib/asn1/test/testSeqTypeRefSet.erl18
-rw-r--r--lib/asn1/test/testSetExternal.erl18
-rw-r--r--lib/asn1/test/testSetOf.erl6
-rw-r--r--lib/asn1/test/testSetOfExternal.erl54
-rw-r--r--lib/asn1/test/testSetOfTag.erl72
-rw-r--r--lib/asn1/test/testSetTag.erl36
-rw-r--r--lib/asn1/test/testSetTypeRefCho.erl8
-rw-r--r--lib/asn1/test/testSetTypeRefPrim.erl18
-rw-r--r--lib/asn1/test/testSetTypeRefSeq.erl18
-rw-r--r--lib/asn1/test/testSetTypeRefSet.erl18
-rw-r--r--lib/asn1/test/testTimer.erl242
-rw-r--r--lib/asn1/test/testTypeValueNotation.erl2
-rw-r--r--lib/megaco/src/binary/depend.mk2
56 files changed, 1232 insertions, 806 deletions
diff --git a/lib/asn1/doc/src/asn1_ug.xml b/lib/asn1/doc/src/asn1_ug.xml
index 74c4aa9948..eb9f000e75 100644
--- a/lib/asn1/doc/src/asn1_ug.xml
+++ b/lib/asn1/doc/src/asn1_ug.xml
@@ -653,7 +653,7 @@ Day1 = saturday,
Bits1 ::= BIT STRING
Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}
</pre>
- <p>There are five different notations available for representation of
+ <p>There are two notations available for representation of
BIT STRING values in Erlang and as input to the encode functions.</p>
<list type="ordered">
<item>A bitstring. By default, a BIT STRING with no
@@ -661,43 +661,10 @@ Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}
<item>A list of atoms corresponding to atoms in the <c>NamedBitList</c>
in the BIT STRING definition. A BIT STRING with symbolic
names will always be decoded to this format.</item>
- <item>A list of binary digits (0 or 1). This format is always
- accepted as input to the encode functions. A BIT STRING will
- be decoded to this format if <em>legacy_bit_string</em> option
- has been given. <em>This format may be withdrawn in a future
- release.</em>
- </item>
- <item>As <c>{Unused,Binary}</c> where <c>Unused</c> denotes how
- many trailing zero-bits 0 to 7 that are unused in the least
- significant byte in <c>Binary</c>. This format is always
- accepted as input to the encode functions. A BIT STRING will
- be decoded to this format if <em>compact_bit_string</em> has
- been given. <em>This format may be withdrawn in a future
- release.</em>
- </item>
- <item>A hexadecimal number (or an integer). This format should be
- avoided, since it is easy to misinterpret a <c>BIT STRING</c>
- value in this format. <em>This format may be withdrawn in a future
- release.</em>
- </item>
</list>
- <note>
- <p>It is recommended to either use the bitstring format (for
- BIT STRINGs with no symbolic names) or a list of symbolic
- names (for BIT STRINGs with symbolic names). The other formats
- should be avoided since they may be withdrawn in a future
- release.
- </p>
- </note>
+ <p>Example:</p>
<pre>
Bits1Val1 = &lt;&lt;0:1,1:1,0:1,1:1,1:1&gt;&gt;,
-Bits1Val2 = 16#1A,
-Bits1Val3 = {3,&lt;&lt;0:1,1:1,0:1,1:1,1:1,0:3&gt;&gt;},
-Bits1Val4 = [0,1,0,1,1]
- </pre>
- <p>Note that <c>Bits1Val1</c>, <c>Bits1Val2</c>, <c>Bits1Val3</c>,
- and <c>Bits1Val1</c> denote the same value.</p>
- <pre>
Bits2Val1 = [gnu,punk],
Bits2Val2 = &lt;&lt;2#1110:4&gt;&gt;,
Bits2Val3 = [bar,gnu,gnome],
@@ -708,37 +675,60 @@ Bits2Val3 = [bar,gnu,gnome],
2 and 14 are set to 1 and the rest set to 0. The symbolic values
appear as a list of values. If a named value appears, which is not
specified in the type definition, a run-time error will occur.</p>
- <p>The compact notation equivalent to the empty BIT STRING is
- <c><![CDATA[{0,<<>>}]]></c>, which in the other notations is
- <c><![CDATA[<<>>]]></c>, <c>[]</c>, or
- <c>0</c>.</p>
<p>BIT STRINGS may also be sub-typed with, for example, a SIZE
specification:</p>
<pre>
Bits3 ::= BIT STRING (SIZE(0..31)) </pre>
<p>This means that no bit higher than 31 can ever be set.</p>
+
+ <section>
+ <title>Deprecated representations for BIT STRING</title>
+ <p>In addition to the representations described above, the
+ following deprecated representations are available if the
+ specification has been compiled with the
+ <c>legacy_erlang_types</c> option:</p>
+ <list type="ordered">
+ <item>A list of binary digits (0 or 1). This format is
+ accepted as input to the encode functions, and a BIT STRING
+ will be decoded to this format if the
+ <em>legacy_bit_string</em> option has been given.
+ </item>
+ <item>As <c>{Unused,Binary}</c> where <c>Unused</c> denotes
+ how many trailing zero-bits 0 to 7 that are unused in the
+ least significant byte in <c>Binary</c>. This format is
+ accepted as input to the encode functions, and a <c>BIT
+ STRING</c> will be decoded to this format if
+ <em>compact_bit_string</em> has been given.
+ </item>
+ <item>A hexadecimal number (or an integer). This format
+ should be avoided, since it is easy to misinterpret a BIT
+ STRING value in this format.
+ </item>
+ </list>
+ </section>
</section>
<section>
<marker id="OCTET STRING"></marker>
<title>OCTET STRING</title>
- <p>The OCTET STRING is the simplest of all ASN.1 types The OCTET STRING
- only moves or transfers e.g. binary files or other unstructured
- information complying to two rules.
- Firstly, the bytes consist of octets and secondly, encoding is
- not required.</p>
+ <p>The OCTET STRING is the simplest of all ASN.1 types. The
+ OCTET STRING only moves or transfers e.g. binary files or other
+ unstructured information complying to two rules. Firstly, the
+ bytes consist of octets and secondly, encoding is not
+ required.</p>
<p>It is possible to have the following ASN.1 type definitions:</p>
<pre>
O1 ::= OCTET STRING
O2 ::= OCTET STRING (SIZE(28)) </pre>
<p>With the following example assignments in Erlang:</p>
<pre>
-O1Val = [17,13,19,20,0,0,255,254],
-O2Val = "must be exactly 28 chars....", </pre>
- <p>Observe that <c>O1Val</c> is assigned a series of numbers between 0
- and 255 i.e. octets.
- <c>O2Val</c> is assigned using the string notation.
- </p>
+O1Val = &lt;&lt;17,13,19,20,0,0,255,254&gt;&gt;,
+O2Val = &lt;&lt;"must be exactly 28 chars...."&gt;&gt;,</pre>
+ <p>By default, an OCTET STRING is always represented as
+ an Erlang binary. If the specification has been compiled with
+ the <c>legacy_erlang_types</c> option, the encode functions
+ will accept both lists and binaries, and the decode functions
+ will decode an OCTET STRING to a list.</p>
</section>
<section>
diff --git a/lib/asn1/doc/src/asn1ct.xml b/lib/asn1/doc/src/asn1ct.xml
index ada2aace87..5871c8ad68 100644
--- a/lib/asn1/doc/src/asn1ct.xml
+++ b/lib/asn1/doc/src/asn1ct.xml
@@ -42,6 +42,17 @@
can be used in during development of applications which handles ASN.1
data (encoded as BER or PER).</p>
<note>
+ <p>By default in OTP 17, the representation of the BIT STRING
+ and OCTET STRING types as Erlang terms have changed. BIT
+ STRING values are now Erlang bitstrings and OCTET STRING values
+ are binaries. For details see <seealso
+ marker="asn1_ug#BIT STRING">BIT STRING</seealso> and <seealso
+ marker="asn1_ug#OCTET STRING">OCTET STRING</seealso> in User's
+ Guide.</p>
+ <p>To revert to the old representation of the types, use the
+ <c>legacy_erlang_types</c> option.</p>
+ </note>
+ <note>
<p>In R16, the options have been simplified. The back-end is chosen
using one of the options <c>ber</c>, <c>per</c>, or <c>uper</c>.
The options <c>optimize</c>, <c>nif</c>, and <c>driver</c> options
@@ -64,7 +75,7 @@
<v>Asn1module = atom() | string()</v>
<v>Options = [Option| OldOption]</v>
<v>Option = ber | per | uper | der | compact_bit_string |
- legacy_bit_string |
+ legacy_bit_string | legacy_erlang_types |
noobj | {n2n, EnumTypeName} |{outdir, Dir} | {i, IncludeDir} |
asn1config | undec_rest | no_ok_wrapper |
{macro_name_prefix, Prefix} | {record_name_prefix, Prefix} | verbose | warnings_as_errors</v>
@@ -163,6 +174,7 @@ File3.asn </pre>
BIT STRING type section in the Users Guide
</seealso>.
</p>
+ <p>This option implies the <c>legacy_erlang_types</c> option.</p>
</item>
<tag><c>legacy_bit_string</c></tag>
<item>
@@ -175,8 +187,19 @@ File3.asn </pre>
<seealso marker="asn1_ug#BIT STRING">
BIT STRING type section in the Users Guide
</seealso>.
+ <p>This option implies the <c>legacy_erlang_types</c> option.</p>
</p>
</item>
+ <tag><c>legacy_erlang_types</c></tag>
+ <item>
+ <p>Use the same Erlang types to represent BIT STRING and
+ OCTET STRING as in R16. For details see <seealso
+ marker="asn1_ug#BIT STRING">BIT STRING</seealso> and
+ <seealso marker="asn1_ug#OCTET STRING">OCTET
+ STRING</seealso> in User's Guide.</p>
+ <p><em>This option is not recommended for
+ new code.</em></p>
+ </item>
<tag><c>{n2n, EnumTypeName}</c></tag>
<item>
<p>
diff --git a/lib/asn1/src/asn1ct.erl b/lib/asn1/src/asn1ct.erl
index f2e9606ccb..531a4935fe 100644
--- a/lib/asn1/src/asn1ct.erl
+++ b/lib/asn1/src/asn1ct.erl
@@ -40,7 +40,7 @@
maybe_rename_function/3,current_sindex/0,
set_current_sindex/1,maybe_saved_sindex/2,
parse_and_save/2,verbose/3,warning/3,warning/4,error/3]).
--export([get_bit_string_format/0]).
+-export([get_bit_string_format/0,use_legacy_types/0]).
-include("asn1_records.hrl").
-include_lib("stdlib/include/erl_compile.hrl").
@@ -841,6 +841,7 @@ delete_double_of_symbol1([],Acc) ->
generate({M,GenTOrV}, OutFile, EncodingRule, Options) ->
debug_on(Options),
setup_bit_string_format(Options),
+ setup_legacy_erlang_types(Options),
put(encoding_options,Options),
asn1ct_table:new(check_functions),
@@ -869,6 +870,31 @@ generate({M,GenTOrV}, OutFile, EncodingRule, Options) ->
asn1ct_table:delete(check_functions),
Result.
+setup_legacy_erlang_types(Opts) ->
+ F = case lists:member(legacy_erlang_types, Opts) of
+ false ->
+ case get_bit_string_format() of
+ bitstring ->
+ false;
+ compact ->
+ legacy_forced_info(compact_bit_string),
+ true;
+ legacy ->
+ legacy_forced_info(legacy_bit_string),
+ true
+ end;
+ true ->
+ true
+ end,
+ put(use_legacy_erlang_types, F).
+
+legacy_forced_info(Opt) ->
+ io:format("Info: The option 'legacy_erlang_types' "
+ "is implied by the '~s' option.\n", [Opt]).
+
+use_legacy_types() ->
+ get(use_legacy_erlang_types).
+
setup_bit_string_format(Opts) ->
Format = case {lists:member(compact_bit_string, Opts),
lists:member(legacy_bit_string, Opts)} of
@@ -1075,6 +1101,7 @@ remove_asn_flags(Options) ->
X /= optimize,
X /= compact_bit_string,
X /= legacy_bit_string,
+ X /= legacy_erlang_types,
X /= debug,
X /= asn1config,
X /= record_name_prefix].
diff --git a/lib/asn1/src/asn1ct_check.erl b/lib/asn1/src/asn1ct_check.erl
index 0a13801e08..f94f3b56bc 100644
--- a/lib/asn1/src/asn1ct_check.erl
+++ b/lib/asn1/src/asn1ct_check.erl
@@ -2574,6 +2574,18 @@ normalize_bitstring(S, Value, Type)->
Bs
end.
+hstring_to_binary(L) ->
+ byte_align(hstring_to_bitstring(L)).
+
+bstring_to_binary(L) ->
+ byte_align(bstring_to_bitstring(L)).
+
+byte_align(Bs) ->
+ case bit_size(Bs) rem 8 of
+ 0 -> Bs;
+ N -> <<Bs/bitstring,0:(8-N)>>
+ end.
+
hstring_to_bitstring(L) ->
<< <<(hex_to_int(D)):4>> || D <- L >>.
@@ -2592,9 +2604,9 @@ hex_to_int(D) when $A =< D, D =< $F -> D - ($A - 10).
normalize_octetstring(S,Value,CType) ->
case Value of
{bstring,String} ->
- bstring_to_octetlist(String);
+ bstring_to_binary(String);
{hstring,String} ->
- hstring_to_octetlist(String);
+ hstring_to_binary(String);
Rec when is_record(Rec,'Externalvaluereference') ->
get_normalized_value(S,Value,CType,
fun normalize_octetstring/3,[]);
@@ -2616,35 +2628,6 @@ normalize_octetstring(S,Value,CType) ->
Value
end.
-
-bstring_to_octetlist([]) ->
- [];
-bstring_to_octetlist([H|T]) when H == $0 ; H == $1 ->
- bstring_to_octetlist(T,6,[(H - $0) bsl 7]).
-bstring_to_octetlist([H|T],0,[Hacc|Tacc]) when H == $0; H == $1 ->
- bstring_to_octetlist(T, 7, [0,Hacc + (H -$0)| Tacc]);
-bstring_to_octetlist([H|T],BSL,[Hacc|Tacc]) when H == $0; H == $1 ->
- bstring_to_octetlist(T, BSL-1, [Hacc + ((H - $0) bsl BSL)| Tacc]);
-bstring_to_octetlist([],7,[0|Acc]) ->
- lists:reverse(Acc);
-bstring_to_octetlist([],_,Acc) ->
- lists:reverse(Acc).
-
-hstring_to_octetlist([]) ->
- [];
-hstring_to_octetlist(L) ->
- hstring_to_octetlist(L,4,[]).
-hstring_to_octetlist([H|T],0,[Hacc|Tacc]) when H >= $A, H =< $F ->
- hstring_to_octetlist(T,4,[Hacc + (H - $A + 10)|Tacc]);
-hstring_to_octetlist([H|T],BSL,Acc) when H >= $A, H =< $F ->
- hstring_to_octetlist(T,0,[(H - $A + 10) bsl BSL|Acc]);
-hstring_to_octetlist([H|T],0,[Hacc|Tacc]) when H >= $0; H =< $9 ->
- hstring_to_octetlist(T,4,[Hacc + (H - $0)|Tacc]);
-hstring_to_octetlist([H|T],BSL,Acc) when H >= $0; H =< $9 ->
- hstring_to_octetlist(T,0,[(H - $0) bsl BSL|Acc]);
-hstring_to_octetlist([],_,Acc) ->
- lists:reverse(Acc).
-
normalize_objectidentifier(S, Value) ->
{ok,Val} = validate_objectidentifier(S, o_id, Value, []),
Val.
diff --git a/lib/asn1/src/asn1ct_constructed_per.erl b/lib/asn1/src/asn1ct_constructed_per.erl
index c224f4c9fa..ed3f6f886e 100644
--- a/lib/asn1/src/asn1ct_constructed_per.erl
+++ b/lib/asn1/src/asn1ct_constructed_per.erl
@@ -450,8 +450,13 @@ dec_objset_default(N, C, LeadingAttr, false) ->
"{value,Bytes},"
"{unique_name_and_value,",{asis,LeadingAttr},",Id}}}).",nl,nl]);
dec_objset_default(N, _, _, true) ->
- emit([{asis,N},"(Bytes, Id) ->",nl,
- "Bytes.",nl,nl]).
+ emit([{asis,N},"(Bytes, Id) ->",nl|
+ case asn1ct:use_legacy_types() of
+ false ->
+ ["{asn1_OPENTYPE,Bytes}.",nl,nl];
+ true ->
+ ["Bytes.",nl,nl]
+ end]).
dec_objset_1(Erule, N, {Id,Obj}, RestFields, Typename) ->
emit([{asis,N},"(Bytes, ",{asis,Id},") ->",nl]),
@@ -906,26 +911,36 @@ def_values(#type{def=#'Externaltypereference'{module=Mod,type=Type}}, Def) ->
#typedef{typespec=T} = asn1_db:dbget(Mod, Type),
def_values(T, Def);
def_values(#type{def={'BIT STRING',[]}}, Bs) when is_bitstring(Bs) ->
- ListBs = [B || <<B:1>> <= Bs],
- IntBs = lists:foldl(fun(B, A) ->
- (A bsl 1) bor B
- end, 0, lists:reverse(ListBs)),
- Sz = bit_size(Bs),
- Compact = case 8 - Sz rem 8 of
- 8 ->
- {0,Bs};
- Unused ->
- {Unused,<<Bs:Sz/bits,0:Unused>>}
- end,
- [asn1_DEFAULT,Bs,Compact,ListBs,IntBs];
+ case asn1ct:use_legacy_types() of
+ false ->
+ [asn1_DEFAULT,Bs];
+ true ->
+ ListBs = [B || <<B:1>> <= Bs],
+ IntBs = lists:foldl(fun(B, A) ->
+ (A bsl 1) bor B
+ end, 0, lists:reverse(ListBs)),
+ Sz = bit_size(Bs),
+ Compact = case 8 - Sz rem 8 of
+ 8 ->
+ {0,Bs};
+ Unused ->
+ {Unused,<<Bs:Sz/bits,0:Unused>>}
+ end,
+ [asn1_DEFAULT,Bs,Compact,ListBs,IntBs]
+ end;
def_values(#type{def={'BIT STRING',[_|_]=Ns}}, List) when is_list(List) ->
Bs = asn1ct_gen:named_bitstring_value(List, Ns),
- ListBs = [B || <<B:1>> <= Bs],
- IntBs = lists:foldl(fun(B, A) ->
- (A bsl 1) bor B
- end, 0, lists:reverse(ListBs)),
- Args = [List,Bs,ListBs,IntBs],
- {call,per_common,is_default_bitstring,Args};
+ As = case asn1ct:use_legacy_types() of
+ false ->
+ [List,Bs];
+ true ->
+ ListBs = [B || <<B:1>> <= Bs],
+ IntBs = lists:foldl(fun(B, A) ->
+ (A bsl 1) bor B
+ end, 0, lists:reverse(ListBs)),
+ [List,Bs,ListBs,IntBs]
+ end,
+ {call,per_common,is_default_bitstring,As};
def_values(#type{def={'INTEGER',Ns}}, Def) ->
[asn1_DEFAULT,Def|case lists:keyfind(Def, 2, Ns) of
false -> [];
@@ -1059,8 +1074,17 @@ enc_objset_imm(Erule, Component, ObjSet, RestFieldNames, Extensible) ->
enc_obj(Erule, Obj, RestFieldNames, Aligned)] ||
{Key,Obj} <- ObjSet] ++
[['_',case Extensible of
- false -> E;
- true -> {put_bits,{var,"Val"},binary,[1]}
+ false ->
+ E;
+ true ->
+ case asn1ct:use_legacy_types() of
+ false ->
+ {call,per_common,open_type_to_binary,
+ [{var,"Val"}]};
+ true ->
+ {call,per_common,legacy_open_type_to_binary,
+ [{var,"Val"}]}
+ end
end]]}].
enc_obj(Erule, Obj, RestFieldNames0, Aligned) ->
diff --git a/lib/asn1/src/asn1ct_gen.erl b/lib/asn1/src/asn1ct_gen.erl
index 37b33194d0..71d870b4ce 100644
--- a/lib/asn1/src/asn1ct_gen.erl
+++ b/lib/asn1/src/asn1ct_gen.erl
@@ -790,7 +790,8 @@ gen_decode_constructed(Erules,Typename,InnerType,D) when is_record(D,typedef) ->
pgen_exports(Erules,_Module,{Types,Values,_,_,Objects,ObjectSets}) ->
- emit(["-export([encoding_rule/0,bit_string_format/0]).",nl]),
+ emit(["-export([encoding_rule/0,bit_string_format/0,"
+ " legacy_erlang_types/0]).",nl]),
case Types of
[] -> ok;
_ ->
@@ -1022,7 +1023,9 @@ gen_info_functions(Erules) ->
emit(["encoding_rule() -> ",
{asis,Erules},".",nl,nl,
"bit_string_format() -> ",
- {asis,asn1ct:get_bit_string_format()},".",nl,nl]).
+ {asis,asn1ct:get_bit_string_format()},".",nl,nl,
+ "legacy_erlang_types() -> ",
+ {asis,asn1ct:use_legacy_types()},".",nl,nl]).
gen_decode_partial_incomplete(ber) ->
case {asn1ct:read_config_data(partial_incomplete_decode),
diff --git a/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl b/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl
index de81259fcb..bea0ec8968 100644
--- a/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl
+++ b/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl
@@ -206,10 +206,32 @@ gen_encode_prim(_Erules, #type{}=D, DoTag, Value) ->
{call,ber,encode_tags,
[DoTag,{curr,realval},{curr,realsize}]},nl,
"end"]);
+ {'BIT STRING',[]} ->
+ case asn1ct:use_legacy_types() of
+ false when BitStringConstraint =:= [] ->
+ call(encode_unnamed_bit_string, [Value,DoTag]);
+ false ->
+ call(encode_unnamed_bit_string,
+ [{asis,BitStringConstraint},Value,DoTag]);
+ true ->
+ call(encode_bit_string,
+ [{asis,BitStringConstraint},Value,
+ {asis,[]},DoTag])
+ end;
{'BIT STRING',NamedNumberList} ->
- call(encode_bit_string,
- [{asis,BitStringConstraint},Value,
- {asis,NamedNumberList},DoTag]);
+ case asn1ct:use_legacy_types() of
+ false when BitStringConstraint =:= [] ->
+ call(encode_named_bit_string,
+ [Value,{asis,NamedNumberList},DoTag]);
+ false ->
+ call(encode_named_bit_string,
+ [{asis,BitStringConstraint},Value,
+ {asis,NamedNumberList},DoTag]);
+ true ->
+ call(encode_bit_string,
+ [{asis,BitStringConstraint},Value,
+ {asis,NamedNumberList},DoTag])
+ end;
'NULL' ->
call(encode_null, [Value,DoTag]);
'OBJECT IDENTIFIER' ->
@@ -471,7 +493,6 @@ gen_dec_prim(_Erules, Att, BytesVar, DoTag, _TagIn, _Form, _OptOrMand) ->
_ -> ""
end,
NewTypeName = case Typename of
- 'OCTET STRING' -> restricted_string;
'NumericString' -> restricted_string;
'TeletexString' -> restricted_string;
'T61String' -> restricted_string;
@@ -529,6 +550,19 @@ gen_dec_prim(_Erules, Att, BytesVar, DoTag, _TagIn, _Form, _OptOrMand) ->
'RELATIVE-OID' ->
emit(["decode_relative_oid(",BytesVar,","]),
need(decode_relative_oid, 2);
+ 'OCTET STRING' ->
+ F = case asn1ct:use_legacy_types() of
+ false -> decode_octet_string;
+ true -> decode_restricted_string
+ end,
+ emit([{asis,F},"(",BytesVar,","]),
+ case Constraint of
+ [] ->
+ need(F, 2);
+ _ ->
+ emit([{asis,Constraint},","]),
+ need(F, 3)
+ end;
restricted_string ->
emit(["decode_restricted_string",AsBin,"(",BytesVar,","]),
case Constraint of
@@ -1090,13 +1124,11 @@ gen_objset_enc(Erules, ObjSetName, UniqueName,
%% See X.681 Annex E for the following case
gen_objset_enc(_,ObjSetName,_UniqueName,['EXTENSIONMARK'],_ClName,
_ClFields,_NthObj,Acc) ->
- emit(["'getenc_",ObjSetName,"'(_) ->",nl]),
- emit({indent(3),"fun(_, Val, _RestPrimFieldName) ->",nl}),
- emit({indent(6),"Len = case Val of",nl,indent(9),
- "Bin when is_binary(Bin) -> byte_size(Bin);",nl,indent(9),
- "_ -> length(Val)",nl,indent(6),"end,"}),
- emit({indent(6),"{Val,Len}",nl}),
- emit({indent(3),"end.",nl,nl}),
+ emit(["'getenc_",ObjSetName,"'(_) ->",nl,
+ indent(2),"fun(_, Val, _RestPrimFieldName) ->",nl]),
+ emit_enc_open_type(4),
+ emit([nl,
+ indent(2),"end.",nl,nl]),
Acc;
gen_objset_enc(_, ObjSetName, UniqueName, [], _, _, _, Acc) ->
emit_default_getenc(ObjSetName, UniqueName),
@@ -1158,13 +1190,8 @@ gen_inlined_enc_funs1(Fields, [{typefield,Name,_}|Rest], ObjSetName,
%% were no type in the table and we therefore generate
%% code that returns the input for application
%% treatment.
- emit([indent(9),{asis,Name}," ->",nl,
- indent(12),"Len = case Val of",nl,
- indent(15),"Bin when is_binary(Bin) -> "
- "byte_size(Bin);",nl,
- indent(15),"_ -> length(Val)",nl,
- indent(12),"end,",nl,
- indent(12),"{Val,Len}"]),
+ emit([indent(9),{asis,Name}," ->",nl]),
+ emit_enc_open_type(11),
{Acc0,0}
end,
gen_inlined_enc_funs1(Fields, Rest, ObjSetName, Sep, NthObj+NAdd, Acc);
@@ -1175,6 +1202,25 @@ gen_inlined_enc_funs1(_, [], _, _, NthObj, Acc) ->
indent(3),"end"]),
{Acc,NthObj}.
+emit_enc_open_type(I) ->
+ Indent = indent(I),
+ S = [Indent, "case Val of",nl,
+ Indent,indent(2),"{asn1_OPENTYPE,Bin} when is_binary(Bin) ->",nl,
+ Indent,indent(4),"{Bin,byte_size(Bin)}"|
+ case asn1ct:use_legacy_types() of
+ false ->
+ [nl,
+ Indent,"end"];
+ true ->
+ [";",nl,
+ Indent,indent(2),"Bin when is_binary(Bin) ->",nl,
+ Indent,indent(4),"{Bin,byte_size(Bin)};",nl,
+ Indent,indent(2),"_ ->",nl,
+ Indent,indent(4),"{Val,length(Val)}",nl,
+ Indent, "end"]
+ end],
+ emit(S).
+
emit_inner_of_fun(TDef=#typedef{name={ExtMod,Name},typespec=Type},
InternalDefFunName) ->
OTag = Type#type.tag,
@@ -1258,14 +1304,9 @@ gen_objset_dec(_,ObjSetName,_UniqueName,['EXTENSIONMARK'],_ClName,
_ClFields,_NthObj) ->
emit(["'getdec_",ObjSetName,"'(_) ->",nl]),
emit([indent(2),"fun(_,Bytes, _RestPrimFieldName) ->",nl]),
-
- emit([indent(4),"case Bytes of",nl,
- indent(6),"Bin when is_binary(Bin) -> ",nl,
- indent(8),"Bin;",nl,
- indent(6),"_ ->",nl,
- indent(8),{call,ber,ber_encode,["Bytes"]},nl,
- indent(4),"end",nl]),
- emit([indent(2),"end.",nl,nl]),
+ emit_dec_open_type(4),
+ emit([nl,
+ indent(2),"end.",nl,nl]),
ok;
gen_objset_dec(_, ObjSetName, UniqueName, [], _, _, _) ->
emit_default_getdec(ObjSetName, UniqueName),
@@ -1312,12 +1353,8 @@ gen_inlined_dec_funs1(Fields, [{typefield,Name,Prop}|Rest],
end,
0;
false ->
- emit([indent(9),{asis,Name}," ->",nl,
- indent(12),"Len = case Bytes of",nl,
- indent(15),"B when is_binary(B) -> byte_size(B);",nl,
- indent(15),"_ -> length(Bytes)",nl,
- indent(12),"end,",nl,
- indent(12),"{Bytes,[],Len}"]),
+ emit([indent(9),{asis,Name}," ->",nl]),
+ emit_dec_open_type(11),
0
end,
gen_inlined_dec_funs1(Fields, Rest, ObjSetName, Sep, NthObj+N);
@@ -1328,6 +1365,27 @@ gen_inlined_dec_funs1(_, [], _, _, NthObj) ->
indent(3),"end"]),
NthObj.
+emit_dec_open_type(I) ->
+ Indent = indent(I),
+ S = case asn1ct:use_legacy_types() of
+ false ->
+ [Indent, "case Bytes of",nl,
+ Indent,indent(2),"Bin when is_binary(Bin) -> ",nl,
+ Indent,indent(4),"{asn1_OPENTYPE,Bin};",nl,
+ Indent,indent(2),"_ ->",nl,
+ Indent,indent(4),"{asn1_OPENTYPE,",
+ {call,ber,ber_encode,["Bytes"]},"}",nl,
+ Indent, "end"];
+ true ->
+ [Indent, "case Bytes of",nl,
+ Indent,indent(2),"Bin when is_binary(Bin) -> ",nl,
+ Indent,indent(4),"Bin;",nl,
+ Indent,indent(2),"_ ->",nl,
+ Indent,indent(4),{call,ber,ber_encode,["Bytes"]},nl,
+ Indent, "end"]
+ end,
+ emit(S).
+
emit_inner_of_decfun(#typedef{name={ExtName,Name},typespec=Type},Prop,
InternalDefFunName) ->
OTag = Type#type.tag,
diff --git a/lib/asn1/src/asn1ct_gen_per.erl b/lib/asn1/src/asn1ct_gen_per.erl
index 7ba649c874..519ce9f054 100644
--- a/lib/asn1/src/asn1ct_gen_per.erl
+++ b/lib/asn1/src/asn1ct_gen_per.erl
@@ -132,7 +132,14 @@ gen_encode_prim_imm(Val, #type{def=Type0,constraint=Constraint}, Aligned) ->
ToBinary = {real_common,encode_real},
asn1ct_imm:per_enc_restricted_string(Val, ToBinary, Aligned);
{'BIT STRING',NNL} ->
- asn1ct_imm:per_enc_bit_string(Val, NNL, Constraint, Aligned);
+ case asn1ct:use_legacy_types() of
+ false ->
+ asn1ct_imm:per_enc_bit_string(Val, NNL,
+ Constraint, Aligned);
+ true ->
+ asn1ct_imm:per_enc_legacy_bit_string(Val, NNL,
+ Constraint, Aligned)
+ end;
'NULL' ->
asn1ct_imm:per_enc_null(Val, Aligned);
'OBJECT IDENTIFIER' ->
@@ -144,7 +151,13 @@ gen_encode_prim_imm(Val, #type{def=Type0,constraint=Constraint}, Aligned) ->
'BOOLEAN' ->
asn1ct_imm:per_enc_boolean(Val, Aligned);
'OCTET STRING' ->
- asn1ct_imm:per_enc_octet_string(Val, Constraint, Aligned);
+ case asn1ct:use_legacy_types() of
+ false ->
+ asn1ct_imm:per_enc_octet_string(Val, Constraint, Aligned);
+ true ->
+ asn1ct_imm:per_enc_legacy_octet_string(Val, Constraint,
+ Aligned)
+ end;
'ASN1_OPEN_TYPE' ->
case Constraint of
[#'Externaltypereference'{type=Tname}] ->
@@ -325,7 +338,10 @@ gen_dec_imm_1('GeneralizedTime', Constraint, Aligned) ->
gen_dec_imm_1('OCTET STRING', Constraint, Aligned) ->
SzConstr = asn1ct_imm:effective_constraint(bitstring, Constraint),
Imm = asn1ct_imm:per_dec_octet_string(SzConstr, Aligned),
- {convert,binary_to_list,Imm};
+ case asn1ct:use_legacy_types() of
+ false -> {convert,{binary,copy},Imm};
+ true -> {convert,binary_to_list,Imm}
+ end;
gen_dec_imm_1('TeletexString', _Constraint, Aligned) ->
gen_dec_restricted_string(Aligned);
gen_dec_imm_1('T61String', _Constraint, Aligned) ->
diff --git a/lib/asn1/src/asn1ct_imm.erl b/lib/asn1/src/asn1ct_imm.erl
index c14f0b889f..fde39c674e 100644
--- a/lib/asn1/src/asn1ct_imm.erl
+++ b/lib/asn1/src/asn1ct_imm.erl
@@ -26,11 +26,13 @@
per_dec_octet_string/2,per_dec_open_type/1,per_dec_real/1,
per_dec_restricted_string/1]).
-export([per_dec_constrained/3,per_dec_normally_small_number/1]).
--export([per_enc_bit_string/4,per_enc_boolean/2,
+-export([per_enc_bit_string/4,per_enc_legacy_bit_string/4,
+ per_enc_boolean/2,
per_enc_choice/3,per_enc_enumerated/3,
per_enc_integer/3,per_enc_integer/4,
per_enc_null/2,
per_enc_k_m_string/4,per_enc_octet_string/3,
+ per_enc_legacy_octet_string/3,
per_enc_open_type/2,
per_enc_restricted_string/3,
per_enc_small_number/2]).
@@ -157,7 +159,35 @@ per_dec_restricted_string(Aligned) ->
%%% Encoding.
%%%
-per_enc_bit_string(Val0, [], Constraint0, Aligned) ->
+per_enc_bit_string(Val, [], Constraint0, Aligned) ->
+ {B,[[],Bits]} = mk_vars([], [bits]),
+ Constraint = effective_constraint(bitstring, Constraint0),
+ B ++ [{call,erlang,bit_size,[Val],Bits}|
+ per_enc_length(Val, 1, Bits, Constraint, Aligned, 'BIT STRING')];
+per_enc_bit_string(Val0, NNL0, Constraint0, Aligned) ->
+ {B,[Val,Bs,Bits,Positions]} = mk_vars(Val0, [bs,bits,positions]),
+ NNL = lists:keysort(2, NNL0),
+ Constraint = effective_constraint(bitstring, Constraint0),
+ ExtraArgs = case constr_min_size(Constraint) of
+ no -> [];
+ Lb -> [Lb]
+ end,
+ ToBs = case ExtraArgs of
+ [] ->
+ {call,per_common,bs_drop_trailing_zeroes,[Val]};
+ [Lower] ->
+ {call,per_common,adjust_trailing_zeroes,[Val,Lower]}
+ end,
+ B ++ [{'try',
+ [bit_string_name2pos_fun(NNL, Val)],
+ {Positions,
+ [{call,per_common,bitstring_from_positions,
+ [Positions|ExtraArgs]}]},
+ [ToBs],Bs},
+ {call,erlang,bit_size,[Bs],Bits}|
+ per_enc_length(Bs, 1, Bits, Constraint, Aligned, 'BIT STRING')].
+
+per_enc_legacy_bit_string(Val0, [], Constraint0, Aligned) ->
{B,[Val,Bs,Bits]} = mk_vars(Val0, [bs,bits]),
Constraint = effective_constraint(bitstring, Constraint0),
ExtraArgs = case constr_min_size(Constraint) of
@@ -167,7 +197,7 @@ per_enc_bit_string(Val0, [], Constraint0, Aligned) ->
B ++ [{call,per_common,to_bitstring,[Val|ExtraArgs],Bs},
{call,erlang,bit_size,[Bs],Bits}|
per_enc_length(Bs, 1, Bits, Constraint, Aligned, 'BIT STRING')];
-per_enc_bit_string(Val0, NNL0, Constraint0, Aligned) ->
+per_enc_legacy_bit_string(Val0, NNL0, Constraint0, Aligned) ->
{B,[Val,Bs,Bits,Positions]} = mk_vars(Val0, [bs,bits,positions]),
NNL = lists:keysort(2, NNL0),
Constraint = effective_constraint(bitstring, Constraint0),
@@ -276,7 +306,13 @@ per_enc_open_type(Imm0, Aligned) ->
{call,erlang,byte_size,[Bin],Len}|
per_enc_length(Bin, 8, Len, Aligned)].
-per_enc_octet_string(Val0, Constraint0, Aligned) ->
+per_enc_octet_string(Bin, Constraint0, Aligned) ->
+ {B,[[],Len]} = mk_vars([], [len]),
+ Constraint = effective_constraint(bitstring, Constraint0),
+ B ++ [{call,erlang,byte_size,[Bin],Len}|
+ per_enc_length(Bin, 8, Len, Constraint, Aligned, 'OCTET STRING')].
+
+per_enc_legacy_octet_string(Val0, Constraint0, Aligned) ->
{B,[Val,Bin,Len]} = mk_vars(Val0, [bin,len]),
Constraint = effective_constraint(bitstring, Constraint0),
B ++ [{call,erlang,iolist_to_binary,[Val],Bin},
@@ -874,6 +910,9 @@ dcg_list_outside([{call,Fun,{V,Buf},{Dst,DstBuf}}|T]) ->
emit(["{",Dst,",",DstBuf,"} = "]),
Fun(V, Buf),
iter_dcg_list_outside(T);
+dcg_list_outside([{convert,{M,F},V,Dst}|T]) ->
+ emit([Dst," = ",{asis,M},":",{asis,F},"(",V,")"]),
+ iter_dcg_list_outside(T);
dcg_list_outside([{convert,Op,V,Dst}|T]) ->
emit([Dst," = ",Op,"(",V,")"]),
iter_dcg_list_outside(T);
diff --git a/lib/asn1/src/asn1ct_value.erl b/lib/asn1/src/asn1ct_value.erl
index 862b3c4ea5..a86c963b9d 100644
--- a/lib/asn1/src/asn1ct_value.erl
+++ b/lib/asn1/src/asn1ct_value.erl
@@ -260,7 +260,11 @@ from_type_prim(M, D) ->
'BOOLEAN' ->
true;
'OCTET STRING' ->
- adjust_list(size_random(C),c_string(C,"OCTET STRING"));
+ S0 = adjust_list(size_random(C), c_string(C, "OCTET STRING")),
+ case M:legacy_erlang_types() of
+ false -> list_to_binary(S0);
+ true -> S0
+ end;
'NumericString' ->
adjust_list(size_random(C),c_string(C,"0123456789"));
'TeletexString' ->
diff --git a/lib/asn1/src/asn1rtt_ber.erl b/lib/asn1/src/asn1rtt_ber.erl
index 583ff790b7..4bd814769f 100644
--- a/lib/asn1/src/asn1rtt_ber.erl
+++ b/lib/asn1/src/asn1rtt_ber.erl
@@ -29,6 +29,8 @@
decode_integer/2,decode_integer/3,
decode_named_integer/3,decode_named_integer/4,
encode_enumerated/2,decode_enumerated/3,
+ encode_unnamed_bit_string/2,encode_unnamed_bit_string/3,
+ encode_named_bit_string/3,encode_named_bit_string/4,
encode_bit_string/4,
decode_named_bit_string/3,
decode_compact_bit_string/3,
@@ -38,6 +40,7 @@
encode_relative_oid/2,decode_relative_oid/2,
encode_object_identifier/2,decode_object_identifier/2,
encode_restricted_string/2,
+ decode_octet_string/2,decode_octet_string/3,
decode_restricted_string/2,decode_restricted_string/3,
encode_universal_string/2,decode_universal_string/3,
encode_UTF8_string/2,decode_UTF8_string/2,
@@ -780,6 +783,55 @@ decode_enumerated1(Val, NamedNumberList) ->
{asn1_enum,Val}
end.
+%%============================================================================
+%% Bitstring value, ITU_T X.690 Chapter 8.6
+%%
+%% encode bitstring value
+%%============================================================================
+
+encode_unnamed_bit_string(Bits, TagIn) ->
+ Unused = (8 - (bit_size(Bits) band 7)) band 7,
+ Bin = <<Unused,Bits/bitstring,0:Unused>>,
+ encode_tags(TagIn, Bin, byte_size(Bin)).
+
+encode_unnamed_bit_string(C, Bits, TagIn) ->
+ NumBits = bit_size(Bits),
+ Unused = (8 - (NumBits band 7)) band 7,
+ Bin = <<Unused,Bits/bitstring,0:Unused>>,
+ case C of
+ {_Min,Max} ->
+ if
+ NumBits > Max ->
+ exit({error,{asn1,
+ {bitstring_length,
+ {{was,NumBits},{maximum,Max}}}}});
+ true ->
+ ok
+ end;
+ Size ->
+ if NumBits =< Size ->
+ ok;
+ true ->
+ exit({error,{asn1,
+ {bitstring_length,
+ {{was,NumBits},{should_be,Size}}}}})
+ end
+ end,
+ encode_tags(TagIn, Bin, byte_size(Bin)).
+
+encode_named_bit_string([H|_]=Bits, NamedBitList, TagIn) when is_atom(H) ->
+ encode_bit_string_named([], Bits, NamedBitList, TagIn);
+encode_named_bit_string([{bit,_}|_]=Bits, NamedBitList, TagIn) ->
+ encode_bit_string_named([], Bits, NamedBitList, TagIn);
+encode_named_bit_string(Bits, _NamedBitList, TagIn) when is_bitstring(Bits) ->
+ encode_unnamed_bit_string(Bits, TagIn).
+
+encode_named_bit_string(C, [H|_]=Bits, NamedBitList, TagIn) when is_atom(H) ->
+ encode_bit_string_named(C, Bits, NamedBitList, TagIn);
+encode_named_bit_string(C, [{bit,_}|_]=Bits, NamedBitList, TagIn) ->
+ encode_bit_string_named(C, Bits, NamedBitList, TagIn);
+encode_named_bit_string(C, Bits, _NamedBitList, TagIn) when is_bitstring(Bits) ->
+ encode_unnamed_bit_string(C, Bits, TagIn).
%%============================================================================
%% Bitstring value, ITU_T X.690 Chapter 8.6
@@ -1251,6 +1303,19 @@ encode_restricted_string(OctetList, TagIn) when is_list(OctetList) ->
encode_tags(TagIn, OctetList, length(OctetList)).
%%============================================================================
+%% decode OCTET STRING to binary
+%%============================================================================
+
+decode_octet_string(Tlv, TagsIn) ->
+ Bin = match_and_collect(Tlv, TagsIn),
+ binary:copy(Bin).
+
+decode_octet_string(Tlv, Range, TagsIn) ->
+ Bin0 = match_and_collect(Tlv, TagsIn),
+ Bin = binary:copy(Bin0),
+ check_restricted_string(Bin, byte_size(Bin), Range).
+
+%%============================================================================
%% decode Numeric Printable Teletex Videotex Visible IA5 Graphic General strings
%%============================================================================
diff --git a/lib/asn1/src/asn1rtt_ext.erl b/lib/asn1/src/asn1rtt_ext.erl
index 46adb2007d..f3eee1cdd5 100644
--- a/lib/asn1/src/asn1rtt_ext.erl
+++ b/lib/asn1/src/asn1rtt_ext.erl
@@ -38,7 +38,7 @@ transform_to_EXTERNAL1990([{'context-negotiation',Context_negot}|Rest], Acc) ->
transform_to_EXTERNAL1990([asn1_NOVALUE|Rest], Acc) ->
transform_to_EXTERNAL1990(Rest, [asn1_NOVALUE|Acc]);
transform_to_EXTERNAL1990([Data_val_desc,Data_value], Acc)
- when is_list(Data_value)->
+ when is_list(Data_value); is_binary(Data_value) ->
list_to_tuple(lists:reverse([{'octet-aligned',Data_value},
Data_val_desc|Acc]));
transform_to_EXTERNAL1990([Data_val_desc,Data_value], Acc)
diff --git a/lib/asn1/src/asn1rtt_per_common.erl b/lib/asn1/src/asn1rtt_per_common.erl
index 3309e6a4ca..71fec411a0 100644
--- a/lib/asn1/src/asn1rtt_per_common.erl
+++ b/lib/asn1/src/asn1rtt_per_common.erl
@@ -37,8 +37,10 @@
bitstring_from_positions/1,bitstring_from_positions/2,
to_bitstring/1,to_bitstring/2,
to_named_bitstring/1,to_named_bitstring/2,
- is_default_bitstring/5,
- extension_bitmap/3]).
+ bs_drop_trailing_zeroes/1,adjust_trailing_zeroes/2,
+ is_default_bitstring/3,is_default_bitstring/5,
+ extension_bitmap/3,
+ open_type_to_binary/1,legacy_open_type_to_binary/1]).
-define('16K',16384).
@@ -272,6 +274,25 @@ to_named_bitstring(Val, Lb) ->
%% for correctness, not speed.
adjust_trailing_zeroes(to_bitstring(Val), Lb).
+is_default_bitstring(asn1_DEFAULT, _, _) ->
+ true;
+is_default_bitstring(Named, Named, _) ->
+ true;
+is_default_bitstring(Bs, _, Bs) ->
+ true;
+is_default_bitstring(Val, _, Def) when is_bitstring(Val) ->
+ Sz = bit_size(Def),
+ case Val of
+ <<Def:Sz/bitstring,T/bitstring>> ->
+ NumZeroes = bit_size(T),
+ case T of
+ <<0:NumZeroes>> -> true;
+ _ -> false
+ end;
+ _ ->
+ false
+ end.
+
is_default_bitstring(asn1_DEFAULT, _, _, _, _) ->
true;
is_default_bitstring({Unused,Bin}, V0, V1, V2, V3) when is_integer(Unused) ->
@@ -306,6 +327,16 @@ is_default_bitstring(_, _, _, _, _) -> false.
extension_bitmap(Val, Pos, Limit) ->
extension_bitmap(Val, Pos, Limit, 0).
+open_type_to_binary({asn1_OPENTYPE,Bin}) when is_binary(Bin) ->
+ Bin.
+
+legacy_open_type_to_binary({asn1_OPENTYPE,Bin}) when is_binary(Bin) ->
+ Bin;
+legacy_open_type_to_binary(Bin) when is_binary(Bin) ->
+ Bin;
+legacy_open_type_to_binary(List) when is_list(List) ->
+ List.
+
%%%
%%% Internal functions.
%%%
@@ -438,6 +469,8 @@ adjust_trailing_zeroes(Bs0, Lb) ->
bs_drop_trailing_zeroes(Bs) ->
bs_drop_trailing_zeroes(Bs, bit_size(Bs)).
+bs_drop_trailing_zeroes(Bs, 0) ->
+ Bs;
bs_drop_trailing_zeroes(Bs0, Sz0) when Sz0 < 8 ->
<<Byte:Sz0>> = Bs0,
Sz = Sz0 - ntz(Byte),
diff --git a/lib/asn1/test/asn1_SUITE.erl b/lib/asn1/test/asn1_SUITE.erl
index 83bd66a631..3b34feb5a3 100644
--- a/lib/asn1/test/asn1_SUITE.erl
+++ b/lib/asn1/test/asn1_SUITE.erl
@@ -328,6 +328,10 @@ testCompactBitString(Config, Rule, Opts) ->
testPrimStrings(Config) ->
test(Config, fun testPrimStrings/3, [ber,{ber,[der]},per,uper]).
testPrimStrings(Config, Rule, Opts) ->
+ LegacyOpts = [legacy_erlang_types|Opts],
+ asn1_test_lib:compile_all(["PrimStrings", "BitStr"], Config,
+ [Rule|LegacyOpts]),
+ testPrimStrings_cases(Rule, LegacyOpts),
asn1_test_lib:compile_all(["PrimStrings", "BitStr"], Config, [Rule|Opts]),
testPrimStrings_cases(Rule, Opts),
asn1_test_lib:compile_all(["PrimStrings", "BitStr"], Config,
@@ -432,7 +436,8 @@ testDef(Config, Rule, Opts) ->
testDEFAULT(Config) ->
test(Config, fun testDEFAULT/3, [ber,{ber,[der]},per,uper]).
testDEFAULT(Config, Rule, Opts) ->
- asn1_test_lib:compile_all(["Def","Default"], Config, [Rule|Opts]),
+ asn1_test_lib:compile_all(["Def","Default"], Config,
+ [legacy_erlang_types,Rule|Opts]),
testDef:main(Rule),
testSeqSetDefaultVal:main(Rule, Opts).
@@ -766,7 +771,10 @@ testParameterizedInfObj(Config) ->
testParameterizedInfObj(Config, Rule, Opts) ->
Files = ["Param","Param2"],
asn1_test_lib:compile_all(Files, Config, [Rule|Opts]),
- testParameterizedInfObj:main(Config, Rule).
+ testParameterizedInfObj:main(Config, Rule),
+ asn1_test_lib:compile("Param", Config,
+ [legacy_erlang_types,Rule|Opts]),
+ testParameterizedInfObj:param(Rule).
testFragmented(Config) ->
test(Config, fun testFragmented/3).
@@ -784,7 +792,8 @@ testMergeCompile(Config, Rule, Opts) ->
testobj(Config) -> test(Config, fun testobj/3).
testobj(Config, Rule, Opts) ->
- asn1_test_lib:compile("RANAP", Config, [Rule|Opts]),
+ asn1_test_lib:compile("RANAP", Config, [legacy_erlang_types,
+ Rule|Opts]),
asn1_test_lib:compile_erlang("testobj", Config, []),
ok = testobj:run(),
ok = testParameterizedInfObj:ranap(Rule).
@@ -811,7 +820,8 @@ testImport(Config, Rule, Opts) ->
testMegaco(Config) -> test(Config, fun testMegaco/3).
testMegaco(Config, Rule, Opts) ->
- {ok, Module1, Module2} = testMegaco:compile(Config, Rule, Opts),
+ {ok, Module1, Module2} = testMegaco:compile(Config, Rule,
+ [legacy_erlang_types|Opts]),
ok = testMegaco:main(Module1, Config),
ok = testMegaco:main(Module2, Config).
@@ -892,7 +902,8 @@ specialized_decodes(Config, Rule, Opts) ->
"PartialDecMyHTTP.asn",
"MEDIA-GATEWAY-CONTROL.asn",
"P-Record"],
- Config, [Rule, asn1config|Opts]),
+ Config,
+ [Rule,legacy_erlang_types,asn1config|Opts]),
test_partial_incomplete_decode:test(Config),
test_selective_decode:test().
@@ -1022,7 +1033,8 @@ test_x691(Config, Rule, Opts) ->
test_x691:cases(Rule),
%% OTP-7708.
- asn1_test_lib:compile("EUTRA-extract-55", Config, [Rule|Opts]),
+ asn1_test_lib:compile("EUTRA-extract-55", Config,
+ [legacy_erlang_types,Rule|Opts]),
%% OTP-7763.
Val = {'Seq',15,lists:duplicate(8, 0),[0],lists:duplicate(28, 0),15,true},
@@ -1128,21 +1140,21 @@ END
ok = asn1ct:compile(File, [{outdir, PrivDir}]).
-timer_compile(Config, Rule, Opts) ->
+timer_compile(Config, Rule) ->
asn1_test_lib:compile_all(["H235-SECURITY-MESSAGES", "H323-MESSAGES"],
- Config, [Rule|Opts]).
+ Config, [no_ok_wrapper,Rule]).
testTimer_ber(Config) ->
- timer_compile(Config,ber,[]),
- testTimer:go(Config,ber).
+ timer_compile(Config, ber),
+ testTimer:go().
testTimer_per(Config) ->
- timer_compile(Config,per,[]),
- testTimer:go(Config,per).
+ timer_compile(Config, per),
+ testTimer:go().
testTimer_uper(Config) ->
- timer_compile(Config,uper,[]),
- {comment,_} = testTimer:go(Config,uper).
+ timer_compile(Config, uper),
+ testTimer:go().
%% Test of multiple-line comment, OTP-8043
testComment(suite) -> [];
@@ -1200,8 +1212,8 @@ ticket_7407_code(FinalPadding) ->
eutra1(msg) ->
{'BCCH-BCH-Message',
- {'MasterInformationBlock',[0,1,0,1],[1,0,1,0],
- {'PHICH-Configuration',short,ffs},[1,0,1,0,0,0,0,0]}}.
+ {'MasterInformationBlock',<<2#0101:4>>,<<2#1010:4>>,
+ {'PHICH-Configuration',short,ffs},<<2#10100000>>}}.
eutra1(result, true) ->
<<90,80,0>>;
diff --git a/lib/asn1/test/asn1_SUITE_data/TCAPPackage_msg.erl b/lib/asn1/test/asn1_SUITE_data/TCAPPackage_msg.erl
index 06eba8b6eb..0bf4425263 100644
--- a/lib/asn1/test/asn1_SUITE_data/TCAPPackage_msg.erl
+++ b/lib/asn1/test/asn1_SUITE_data/TCAPPackage_msg.erl
@@ -47,7 +47,7 @@ val('TransactionPDU') ->
dialoguePortion=val('DialoguePortion'),
componentPortion=val('ComponentSequence')};
val('TransactionID') ->
- "OCTET STRING";
+ <<"OCTET STRING">>;
val('DialoguePortion') ->
#'DialoguePortion'{version=val('ProtocolVersion'),
applicationContext={integerApplicationId,12},
@@ -57,23 +57,23 @@ val('DialoguePortion') ->
val('Confidentiality') ->
#'Confidentiality'{confidentialityId={integerConfidentialityId,14}};
val('ProtocolVersion') ->
- "K";
+ <<"K">>;
val('UserInformation') ->
[val('EXTERNAL'),val('EXTERNAL')];
val('EXTERNAL') ->
#'EXTERNAL'{'direct-reference'={0,1,2},
- encoding={'single-ASN1-type',[1,2,3,4]}};
+ encoding={'single-ASN1-type',<<1,2,3,4>>}};
val('ComponentSequence') ->
[val('ComponentPDU',1),val('ComponentPDU',2),val('ComponentPDU',3)];
val('Invoke') ->
- #'Invoke'{componentIDs="AB",
+ #'Invoke'{componentIDs = <<"AB">>,
opcode={local,-2},
parameter=running};
val('ReturnResult') ->
- #'ReturnResult'{componentID="C",
+ #'ReturnResult'{componentID = <<"C">>,
parameter=[1,2,3,4]};
val('ReturnError') ->
- #'ReturnError'{componentID="D",
+ #'ReturnError'{componentID = <<"D">>,
errorCode={local,21},
parameter=true};
val('Abort') ->
@@ -87,8 +87,8 @@ val(Type) ->
check_result('PackageType',unidirectional,Res) ->
{unidirectional,
{'UniTransactionPDU',
- "OCTET STRING",
- {'DialoguePortion',"K",
+ <<"OCTET STRING">>,
+ {'DialoguePortion',<<"K">>,
{integerApplicationId,12},
[_,%{'EXTERNAL',{syntax,{0,1,2}},asn1_NOVALUE,OTVal},
_],%{'EXTERNAL',{syntax,{0,1,2}},asn1_NOVALUE,OTVal}],
@@ -96,14 +96,14 @@ check_result('PackageType',unidirectional,Res) ->
{'Confidentiality',
{integerConfidentialityId,14}}},
[{invokeLast,
- {_,"AB",{local,-2},running}},
- {returnResultLast,{_,"C",_}},
- {returnError,{_,"D",{local,21},true}}]}} = Res,
+ {_,<<"AB">>,{local,-2},running}},
+ {returnResultLast,{_,<<"C">>,_}},
+ {returnError,{_,<<"D">>,{local,21},true}}]}} = Res,
ok;
%% check_OT_val(OTVal);
check_result('PackageType',abort,Res)->
- {abort,{'Abort',"OCTET STRING",
- {'DialoguePortion',"K",
+ {abort,{'Abort',<<"OCTET STRING">>,
+ {'DialoguePortion',<<"K">>,
{integerApplicationId,12},
[_,%{'EXTERNAL',{syntax,{0,1,2}},asn1_NOVALUE,OTVal},
_],%{'EXTERNAL',{syntax,{0,1,2}},asn1_NOVALUE,OTVal}],
@@ -114,9 +114,9 @@ check_result('PackageType',abort,Res)->
ok;
%% check_OT_val(OTVal);
check_result('PackageType',response,Res) ->
- {response,{'TransactionPDU',"OCTET STRING",
+ {response,{'TransactionPDU',<<"OCTET STRING">>,
{'DialoguePortion',
- "K",
+ <<"K">>,
{integerApplicationId,12},
[_,%{'EXTERNAL',{syntax,{0,1,2}},asn1_NOVALUE,OTVal},
_],%{'EXTERNAL',{syntax,{0,1,2}},asn1_NOVALUE,OTVal}],
@@ -124,11 +124,11 @@ check_result('PackageType',response,Res) ->
{'Confidentiality',
{integerConfidentialityId,14}}},
[{invokeLast,
- {_,"AB",{local,-2},running}},
+ {_,<<"AB">>,{local,-2},running}},
{returnResultLast,
- {_,"C",_}},
+ {_,<<"C">>,_}},
{returnError,
- {_,"D",{local,21},true}}]}} = Res,
+ {_,<<"D">>,{local,21},true}}]}} = Res,
ok.
%% check_OT_val(OTVal).
diff --git a/lib/asn1/test/asn1_SUITE_data/extensionAdditionGroup.erl b/lib/asn1/test/asn1_SUITE_data/extensionAdditionGroup.erl
index 8e21e6ca84..a1e563f6be 100644
--- a/lib/asn1/test/asn1_SUITE_data/extensionAdditionGroup.erl
+++ b/lib/asn1/test/asn1_SUITE_data/extensionAdditionGroup.erl
@@ -67,8 +67,8 @@ run3(Erule) ->
asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,
asn1_NOVALUE,asn1_NOVALUE},
asn1_NOVALUE,
- [[80,66,0,5,10,0,5,0,24,11,7,84,54,33,0,1,1,0,0,0,1,39,5,66,127,0,0,1],
- []],
+ [<<80,66,0,5,10,0,5,0,24,11,7,84,54,33,0,1,1,0,0,0,1,39,5,66,127,0,0,1>>,
+ <<>>],
{'RRC-RadioResourceConfigDedicated',
[{'RRC-SRB-ToAddMod',1,
{explicitValue,
diff --git a/lib/asn1/test/h323test.erl b/lib/asn1/test/h323test.erl
index 3baaa994ea..7577928493 100644
--- a/lib/asn1/test/h323test.erl
+++ b/lib/asn1/test/h323test.erl
@@ -42,7 +42,7 @@ alerting_val() ->
{'TerminalInfo',asn1_NOVALUE},
false,false},
asn1_NOVALUE,
- {'CallIdentifier',[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},
+ {'CallIdentifier',<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>},
asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE}},
asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE},
asn1_NOVALUE}.
@@ -57,18 +57,18 @@ connect_val() ->
{'Connect-UUIE',
{0,0,8,2250,0,2},
{ipAddress,
- {'TransportAddress_ipAddress',[136,225,41,58],1187}},
+ {'TransportAddress_ipAddress',<<136,225,41,58>>,1187}},
{'EndpointType',asn1_NOVALUE,
{'VendorIdentifier',
{'H221NonStandard',181,0,21324},
- [77,105,99,114,111,115,111,102,116,174,32,78,101,116,
- 77,101,100,116,105,110,103,174,0],
- [51,46,48,0]},
+ <<77,105,99,114,111,115,111,102,116,174,32,78,101,116,
+ 77,101,100,116,105,110,103,174,0>>,
+ <<51,46,48,0>>},
asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,
{'TerminalInfo',asn1_NOVALUE},
false,false},
- [22,137,237,197,191,35,211,17,140,45,0,192,79,75,28,208],
- {'CallIdentifier',[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},
+ <<22,137,237,197,191,35,211,17,140,45,0,192,79,75,28,208>>,
+ {'CallIdentifier',<<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0>>},
asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE}},
asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE},
asn1_NOVALUE}.
diff --git a/lib/asn1/test/testChoExtension.erl b/lib/asn1/test/testChoExtension.erl
index e54cbe825b..09e19ceebb 100644
--- a/lib/asn1/test/testChoExtension.erl
+++ b/lib/asn1/test/testChoExtension.erl
@@ -31,13 +31,13 @@ extension(_Rules) ->
%% A trick to encode with another compatible CHOICE type to test reception
%% extension alternative
- roundtrip('ChoExt1x', {str,"abc"}),
+ roundtrip('ChoExt1x', {str,<<"abc">>}),
roundtrip('ChoExt2', {bool,true}),
roundtrip('ChoExt2', {int,33}),
roundtrip('ChoExt3', {bool,true}),
roundtrip('ChoExt3', {int,33}),
- roundtrip('ChoExt4', {str,"abc"}),
+ roundtrip('ChoExt4', {str,<<"abc">>}),
roundtrip('ChoEmptyRoot', {bool,false}),
roundtrip('ChoEmptyRoot', {bool,true}),
diff --git a/lib/asn1/test/testChoExternal.erl b/lib/asn1/test/testChoExternal.erl
index 12abdbb2bc..0914d54f33 100644
--- a/lib/asn1/test/testChoExternal.erl
+++ b/lib/asn1/test/testChoExternal.erl
@@ -31,16 +31,16 @@ external(_Rules) ->
roundtrip('ChoXBool', {xboolImp,true}),
roundtrip('ChoXBool', {xboolExp,true}),
- roundtrip('NT', {os,"kalle"}),
- roundtrip('Exp', {os,"kalle"}),
- roundtrip('NTNT', {os,"kalle"}),
- roundtrip('NTExp', {os,"kalle"}),
- roundtrip('ExpNT', {os,"kalle"}),
- roundtrip('ExpExp', {os,"kalle"}),
- roundtrip('XNTNT', {os,"kalle"}),
- roundtrip('XNTExp', {os,"kalle"}),
- roundtrip('XExpNT', {os,"kalle"}),
- roundtrip('XExpExp', {os,"kalle"}),
+ roundtrip('NT', {os,<<"kalle">>}),
+ roundtrip('Exp', {os,<<"kalle">>}),
+ roundtrip('NTNT', {os,<<"kalle">>}),
+ roundtrip('NTExp', {os,<<"kalle">>}),
+ roundtrip('ExpNT', {os,<<"kalle">>}),
+ roundtrip('ExpExp', {os,<<"kalle">>}),
+ roundtrip('XNTNT', {os,<<"kalle">>}),
+ roundtrip('XNTExp', {os,<<"kalle">>}),
+ roundtrip('XExpNT', {os,<<"kalle">>}),
+ roundtrip('XExpExp', {os,<<"kalle">>}),
ok.
diff --git a/lib/asn1/test/testChoOptional.erl b/lib/asn1/test/testChoOptional.erl
index f5e77cb721..71a7346e3f 100644
--- a/lib/asn1/test/testChoOptional.erl
+++ b/lib/asn1/test/testChoOptional.erl
@@ -27,16 +27,20 @@
run() ->
roundtrip('Seq1', #'Seq1'{bool=true,int=asn1_NOVALUE,cho=asn1_NOVALUE}),
roundtrip('Seq1', #'Seq1'{bool=true,int=233,cho=asn1_NOVALUE}),
- roundtrip('Seq1', #'Seq1'{bool=true,int=asn1_NOVALUE,cho={vsCho,"Vs Str"}}),
- roundtrip('Seq1', #'Seq1'{bool=true,int=asn1_NOVALUE,cho={ocStrCho,"Oct Str"}}),
+ roundtrip('Seq1', #'Seq1'{bool=true,int=asn1_NOVALUE,
+ cho={vsCho,"Vs Str"}}),
+ roundtrip('Seq1', #'Seq1'{bool=true,int=asn1_NOVALUE,
+ cho={ocStrCho,<<"Oct Str">>}}),
roundtrip('Seq2', #'Seq2'{int=asn1_NOVALUE,cho=asn1_NOVALUE,bool=true}),
roundtrip('Seq2', #'Seq2'{int=233,cho=asn1_NOVALUE,bool=true}),
roundtrip('Seq2', #'Seq2'{int=asn1_NOVALUE,cho={vsCho,"Vs Str"},bool=true}),
- roundtrip('Seq2', #'Seq2'{int=asn1_NOVALUE,cho={ocStrCho,"Oct Str"},bool=true}),
+ roundtrip('Seq2', #'Seq2'{int=asn1_NOVALUE,cho={ocStrCho,<<"Oct Str">>},
+ bool=true}),
roundtrip('Seq3', #'Seq3'{cho=asn1_NOVALUE,int=asn1_NOVALUE,bool=true}),
roundtrip('Seq3', #'Seq3'{cho=asn1_NOVALUE,int=233,bool=true}),
roundtrip('Seq3', #'Seq3'{cho={vsCho,"Vs Str"},int=asn1_NOVALUE,bool=true}),
- roundtrip('Seq3', #'Seq3'{cho={ocStrCho,"Oct Str"},int=asn1_NOVALUE,bool=true}),
+ roundtrip('Seq3', #'Seq3'{cho={ocStrCho,<<"Oct Str">>},
+ int=asn1_NOVALUE,bool=true}),
ok.
roundtrip(Type, Value) ->
diff --git a/lib/asn1/test/testChoRecursive.erl b/lib/asn1/test/testChoRecursive.erl
index 593b845949..ccd60c2897 100644
--- a/lib/asn1/test/testChoRecursive.erl
+++ b/lib/asn1/test/testChoRecursive.erl
@@ -31,13 +31,13 @@ recursive(_Rules) ->
roundtrip('ChoRec',
{something,
#'ChoRec_something'{a = 77,
- b = "some octets here",
+ b = <<"some octets here">>,
c = {nothing,'NULL'}}}),
roundtrip('ChoRec', {nothing,'NULL'}),
roundtrip('ChoRec2',
{something,
#'ChoRec2_something'{a = 77,
- b = "some octets here",
+ b = <<"some octets here">>,
c = {nothing,'NULL'}}}),
roundtrip('ChoRec2', {nothing,'NULL'}),
ok.
diff --git a/lib/asn1/test/testChoTypeRefCho.erl b/lib/asn1/test/testChoTypeRefCho.erl
index cd2672add0..636c301403 100644
--- a/lib/asn1/test/testChoTypeRefCho.erl
+++ b/lib/asn1/test/testChoTypeRefCho.erl
@@ -30,7 +30,7 @@ choice(_Rules) ->
roundtrip('ChoTRcho', {'choChoE-E',{choInt,88}}),
roundtrip('ChoChoInline', {bool1,true}),
roundtrip('ChoChoInline', {choCho,{bool,true}}),
- roundtrip('ChoChoInline', {choCho,{octStr,"kk"}}),
+ roundtrip('ChoChoInline', {choCho,{octStr,<<"kk">>}}),
roundtrip('ChoChoInline', {choCho,{int,55}}),
ok.
diff --git a/lib/asn1/test/testChoTypeRefPrim.erl b/lib/asn1/test/testChoTypeRefPrim.erl
index 8a2bc7bd8e..747baeddd8 100644
--- a/lib/asn1/test/testChoTypeRefPrim.erl
+++ b/lib/asn1/test/testChoTypeRefPrim.erl
@@ -25,18 +25,18 @@
prim(_Rules) ->
roundtrip('ChoTR', {bool,true}),
- roundtrip('ChoTR', {octStr,[11,12,13,14,15,16,17]}),
+ roundtrip('ChoTR', {octStr,<<11,12,13,14,15,16,17>>}),
roundtrip('ChoTR', {int,233}),
- roundtrip('ChoTR', {octStr,"Stringing in the rain"}),
- roundtrip('ChoTR2', {octStr,"A string"}),
- roundtrip('ChoTR2', {octStrI,"A string"}),
- roundtrip('ChoTR2', {octStrE,"A string"}),
- roundtrip('ChoTR2', {'octStr-I',"A string"}),
- roundtrip('ChoTR2', {'octStrI-I',"A string"}),
- roundtrip('ChoTR2', {'octStrE-I',"A string"}),
- roundtrip('ChoTR2', {'octStr-E',"A string"}),
- roundtrip('ChoTR2', {'octStrI-E',"A string"}),
- roundtrip('ChoTR2', {'octStrE-E',"A string"}),
+ roundtrip('ChoTR', {octStr,<<"Stringing in the rain">>}),
+ roundtrip('ChoTR2', {octStr,<<"A string">>}),
+ roundtrip('ChoTR2', {octStrI,<<"A string">>}),
+ roundtrip('ChoTR2', {octStrE,<<"A string">>}),
+ roundtrip('ChoTR2', {'octStr-I',<<"A string">>}),
+ roundtrip('ChoTR2', {'octStrI-I',<<"A string">>}),
+ roundtrip('ChoTR2', {'octStrE-I',<<"A string">>}),
+ roundtrip('ChoTR2', {'octStr-E',<<"A string">>}),
+ roundtrip('ChoTR2', {'octStrI-E',<<"A string">>}),
+ roundtrip('ChoTR2', {'octStrE-E',<<"A string">>}),
ok.
roundtrip(Type, Value) ->
diff --git a/lib/asn1/test/testChoTypeRefSeq.erl b/lib/asn1/test/testChoTypeRefSeq.erl
index 86c22619aa..91d0b45e89 100644
--- a/lib/asn1/test/testChoTypeRefSeq.erl
+++ b/lib/asn1/test/testChoTypeRefSeq.erl
@@ -28,15 +28,24 @@
-record('ChoSeqExp', {seqInt, seqOs}).
seq(_Rules) ->
- roundtrip('ChoTRseq', {choSeq,#'ChoSeq'{seqInt=88,seqOs="A string"}}),
- roundtrip('ChoTRseq', {choSeqI,#'ChoSeq'{seqInt=88,seqOs="A string"}}),
- roundtrip('ChoTRseq', {choSeqE,#'ChoSeq'{seqInt=88,seqOs="A string"}}),
- roundtrip('ChoTRseq', {'choSeq-I',#'ChoSeqImp'{seqInt=88,seqOs="A string"}}),
- roundtrip('ChoTRseq', {'choSeqI-I',#'ChoSeqImp'{seqInt=88,seqOs="A string"}}),
- roundtrip('ChoTRseq', {'choSeqE-I',#'ChoSeqImp'{seqInt=88,seqOs="A string"}}),
- roundtrip('ChoTRseq', {'choSeq-E',#'ChoSeqExp'{seqInt=88,seqOs="A string"}}),
- roundtrip('ChoTRseq', {'choSeqI-E',#'ChoSeqExp'{seqInt=88,seqOs="A string"}}),
- roundtrip('ChoTRseq', {'choSeqE-E',#'ChoSeqExp'{seqInt=88,seqOs="A string"}}),
+ roundtrip('ChoTRseq', {choSeq,#'ChoSeq'{seqInt=88,
+ seqOs = <<"A string">>}}),
+ roundtrip('ChoTRseq', {choSeqI,#'ChoSeq'{seqInt=88,
+ seqOs = <<"A string">>}}),
+ roundtrip('ChoTRseq', {choSeqE,#'ChoSeq'{seqInt=88,
+ seqOs = <<"A string">>}}),
+ roundtrip('ChoTRseq', {'choSeq-I',#'ChoSeqImp'{seqInt=88,
+ seqOs = <<"A string">>}}),
+ roundtrip('ChoTRseq', {'choSeqI-I',#'ChoSeqImp'{seqInt=88,
+ seqOs = <<"A string">>}}),
+ roundtrip('ChoTRseq', {'choSeqE-I',#'ChoSeqImp'{seqInt=88,
+ seqOs = <<"A string">>}}),
+ roundtrip('ChoTRseq', {'choSeq-E',#'ChoSeqExp'{seqInt=88,
+ seqOs = <<"A string">>}}),
+ roundtrip('ChoTRseq', {'choSeqI-E',#'ChoSeqExp'{seqInt=88,
+ seqOs = <<"A string">>}}),
+ roundtrip('ChoTRseq', {'choSeqE-E',#'ChoSeqExp'{seqInt=88,
+ seqOs = <<"A string">>}}),
ok.
roundtrip(Type, Value) ->
diff --git a/lib/asn1/test/testChoTypeRefSet.erl b/lib/asn1/test/testChoTypeRefSet.erl
index fd3d75cbcb..bd9068b53e 100644
--- a/lib/asn1/test/testChoTypeRefSet.erl
+++ b/lib/asn1/test/testChoTypeRefSet.erl
@@ -28,15 +28,24 @@
-record('ChoSetExp', {setInt, setOs}).
set(_Rules) ->
- roundtrip('ChoTRset', {choSet,#'ChoSet'{setInt=88,setOs="A string"}}),
- roundtrip('ChoTRset', {choSetI,#'ChoSet'{setInt=88,setOs="A string"}}),
- roundtrip('ChoTRset', {choSetE,#'ChoSet'{setInt=88,setOs="A string"}}),
- roundtrip('ChoTRset', {'choSet-I',#'ChoSetImp'{setInt=88,setOs="A string"}}),
- roundtrip('ChoTRset', {'choSetI-I',#'ChoSetImp'{setInt=88,setOs="A string"}}),
- roundtrip('ChoTRset', {'choSetE-I',#'ChoSetImp'{setInt=88,setOs="A string"}}),
- roundtrip('ChoTRset', {'choSet-E',#'ChoSetExp'{setInt=88,setOs="A string"}}),
- roundtrip('ChoTRset', {'choSetI-E',#'ChoSetExp'{setInt=88,setOs="A string"}}),
- roundtrip('ChoTRset', {'choSetE-E',#'ChoSetExp'{setInt=88,setOs="A string"}}),
+ roundtrip('ChoTRset', {choSet,#'ChoSet'{setInt=88,
+ setOs = <<"A string">>}}),
+ roundtrip('ChoTRset', {choSetI,#'ChoSet'{setInt=88,
+ setOs = <<"A string">>}}),
+ roundtrip('ChoTRset', {choSetE,#'ChoSet'{setInt=88,
+ setOs = <<"A string">>}}),
+ roundtrip('ChoTRset', {'choSet-I',#'ChoSetImp'{setInt=88,
+ setOs = <<"A string">>}}),
+ roundtrip('ChoTRset', {'choSetI-I',#'ChoSetImp'{setInt=88,
+ setOs = <<"A string">>}}),
+ roundtrip('ChoTRset', {'choSetE-I',#'ChoSetImp'{setInt=88,
+ setOs = <<"A string">>}}),
+ roundtrip('ChoTRset', {'choSet-E',#'ChoSetExp'{setInt=88,
+ setOs = <<"A string">>}}),
+ roundtrip('ChoTRset', {'choSetI-E',#'ChoSetExp'{setInt=88,
+ setOs = <<"A string">>}}),
+ roundtrip('ChoTRset', {'choSetE-E',#'ChoSetExp'{setInt=88,
+ setOs = <<"A string">>}}),
ok.
roundtrip(Type, Value) ->
diff --git a/lib/asn1/test/testConstraints.erl b/lib/asn1/test/testConstraints.erl
index 54ba748519..3ccf883bd6 100644
--- a/lib/asn1/test/testConstraints.erl
+++ b/lib/asn1/test/testConstraints.erl
@@ -208,14 +208,14 @@ int_constraints(Rules) ->
%% More SIZE Constraints
%%==========================================================
- roundtrip('FixedSize', "0123456789"),
- roundtrip('FixedSize2', "0123456789"),
- roundtrip('FixedSize2', "0123456789abcdefghij"),
+ roundtrip('FixedSize', <<"0123456789">>),
+ roundtrip('FixedSize2', <<"0123456789">>),
+ roundtrip('FixedSize2', <<"0123456789abcdefghij">>),
range_error(Rules, 'FixedSize', "short"),
range_error(Rules, 'FixedSize2', "short"),
- [roundtrip('VariableSize', lists:seq($A, $A+L-1)) ||
+ [roundtrip('VariableSize', list_to_binary(lists:seq($A, $A+L-1))) ||
L <- lists:seq(1, 10)],
roundtrip_enc('ShorterExt', "a", shorter_ext(Rules, "a")),
diff --git a/lib/asn1/test/testFragmented.erl b/lib/asn1/test/testFragmented.erl
index 8d5fa07a5b..35b21f90a9 100644
--- a/lib/asn1/test/testFragmented.erl
+++ b/lib/asn1/test/testFragmented.erl
@@ -22,10 +22,10 @@
-export([main/1]).
main(_Erule) ->
- roundtrip('PDU', {'PDU',1,false,["abc","def"]}),
+ roundtrip('PDU', {'PDU',1,false,[<<"abc">>,<<"def">>]}),
B256 = lists:seq(0, 255),
K1 = lists:duplicate(4, B256),
- K8 = binary_to_list(iolist_to_binary(lists:duplicate(8, K1))),
+ K8 = iolist_to_binary(lists:duplicate(8, K1)),
roundtrip('PDU', {'PDU',1,false,[K8,K8]}),
roundtrip('PDU', {'PDU',1,false,[K8,K8,K8,K8]}),
roundtrip('PDU', {'PDU',1,false,[K8,K8,K8,K8,K8,K8]}),
diff --git a/lib/asn1/test/testInfObj.erl b/lib/asn1/test/testInfObj.erl
index cd335e1023..311595cfda 100644
--- a/lib/asn1/test/testInfObj.erl
+++ b/lib/asn1/test/testInfObj.erl
@@ -49,7 +49,7 @@ main(_Erule) ->
roundtrip('RANAPextract1', 'InitiatingMessage2', Val3),
roundtrip('InfObj', 'MyPdu', {'MyPdu',42,12,false,"string"}),
- roundtrip('InfObj', 'MyPdu', {'MyPdu',{'Seq',1023,"hello"},
+ roundtrip('InfObj', 'MyPdu', {'MyPdu',{'Seq',1023,<<"hello">>},
42,true,"longer string"}),
roundtrip('InfObj', 'MyPdu', {'MyPdu',"75712346",43,true,"string"}),
@@ -110,11 +110,11 @@ main(_Erule) ->
enc_dec('InfObj', 'DefaultInSeq', {'DefaultInSeq',3,asn1_DEFAULT}),
roundtrip('InfObj', 'Multiple-Optionals',
- {'Multiple-Optionals',1,42,true,"abc"}),
+ {'Multiple-Optionals',1,42,true,<<"abc">>}),
roundtrip('InfObj', 'Multiple-Optionals',
- {'Multiple-Optionals',1,asn1_NOVALUE,true,"abc"}),
+ {'Multiple-Optionals',1,asn1_NOVALUE,true,<<"abc">>}),
roundtrip('InfObj', 'Multiple-Optionals',
- {'Multiple-Optionals',1,42,asn1_NOVALUE,"abc"}),
+ {'Multiple-Optionals',1,42,asn1_NOVALUE,<<"abc">>}),
roundtrip('InfObj', 'Multiple-Optionals',
{'Multiple-Optionals',1,42,true,asn1_NOVALUE}),
roundtrip('InfObj', 'Multiple-Optionals',
diff --git a/lib/asn1/test/testMergeCompile.erl b/lib/asn1/test/testMergeCompile.erl
index 7cda71c441..b21897cfc2 100644
--- a/lib/asn1/test/testMergeCompile.erl
+++ b/lib/asn1/test/testMergeCompile.erl
@@ -30,12 +30,12 @@
main(Erule) ->
%% test of module MS.set.asn that tests OTP-4492: different tagdefault in
%% modules and types with same name in modules
- MSVal = {'Type4M2',8,true,three,"OCTET STRING"},
+ MSVal = {'Type4M2',8,true,three,<<"OCTET STRING">>},
asn1_test_lib:roundtrip('MS', 'Type4M2', MSVal),
%% test of RANAP.set.asn1
PIEVal2 = [{'ProtocolIE-Field',4,ignore,{radioNetwork,'rab-pre-empted'}}],
- EncVal =
+ EncVal0 =
case Erule of
per ->
<<1,100>>;
@@ -44,6 +44,7 @@ main(Erule) ->
ber ->
<<2,1,1>>
end,
+ EncVal = {asn1_OPENTYPE,EncVal0},
PEVal2 = [{'ProtocolExtensionField',1,ignore,EncVal},
{'ProtocolExtensionField',2,reject,EncVal}],
Val2 =
@@ -142,7 +143,40 @@ test('InsertSubscriberDataArg') ->
ok.
test(mvrasn6,'InsertSubscriberDataArg') ->
- Val = {'InsertSubscriberDataArg',"IMSI","Address","C",serviceGranted,["abc","cde"],["tele","serv","ice"],asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,{'NAEA-PreferredCI',"NCC",asn1_NOVALUE},{'GPRSSubscriptionData','NULL',[{'PDP-Context',49,"PT","PDP-Address","QoS",'NULL',"APN",asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE}],asn1_NOVALUE},'NULL',onlyMSC,{'LSAInformation','NULL',accessOutsideLSAsAllowed,[{'LSAData',"LSA","L",'NULL',asn1_NOVALUE},{'LSAData',"LSA","L",'NULL',asn1_NOVALUE}],asn1_NOVALUE},'NULL',{'LCSInformation',["Addr","ess","string"],[{'LCS-PrivacyClass',"S","ExtSS",notifyLocationAllowed,[{'ExternalClient',{'LCSClientExternalID',"Addr",asn1_NOVALUE},asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE}],[broadcastService,anonymousLocation,targetMSsubscribedService],asn1_NOVALUE}],asn1_NOVALUE},100,"age",{'MC-SS-Info',"S","ExtSS",5,4,asn1_NOVALUE},"C",{'SGSN-CAMEL-SubscriptionInfo',{'GPRS-CSI',[{'GPRS-CamelTDPData',attach,13,"Addr",continueTransaction,asn1_NOVALUE}],11,asn1_NOVALUE,'NULL','NULL'},{'SMS-CSI',[{'SMS-CAMEL-TDP-DataList','sms-CollectedInfo',13,"Addr",continueTransaction,asn1_NOVALUE}],11,asn1_NOVALUE,'NULL','NULL'},asn1_NOVALUE},"ON"},
- {ok,Bytes} = 'Mvrasn6':encode('InsertSubscriberDataArg', Val),
- {ok,_} = 'Mvrasn6':decode('InsertSubscriberDataArg', Bytes),
+ Val = {'InsertSubscriberDataArg',<<"IMSI">>,<<"Address">>,<<"C">>,
+ serviceGranted,[<<"abc">>,<<"cde">>],
+ [<<"tele">>,<<"serv">>,<<"ice">>],
+ asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,
+ asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE,
+ {'NAEA-PreferredCI',<<"NCC">>,asn1_NOVALUE},
+ {'GPRSSubscriptionData','NULL',
+ [{'PDP-Context',49,<<"PT">>,<<"PDP-Address">>,<<"QoS">>,
+ 'NULL',<<"APN">>,asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE}],
+ asn1_NOVALUE},'NULL',onlyMSC,
+ {'LSAInformation','NULL',accessOutsideLSAsAllowed,
+ [{'LSAData',<<"LSA">>,<<"L">>,'NULL',asn1_NOVALUE},
+ {'LSAData',<<"LSA">>,<<"L">>,'NULL',asn1_NOVALUE}],
+ asn1_NOVALUE},'NULL',
+ {'LCSInformation',[<<"Addr">>,<<"ess">>,<<"string">>],
+ [{'LCS-PrivacyClass',<<"S">>,<<"ExtSS">>,notifyLocationAllowed,
+ [{'ExternalClient',
+ {'LCSClientExternalID',<<"Addr">>,asn1_NOVALUE},
+ asn1_NOVALUE,asn1_NOVALUE,asn1_NOVALUE}],
+ [broadcastService,anonymousLocation,targetMSsubscribedService],
+ asn1_NOVALUE}],asn1_NOVALUE},
+ 100,<<"age">>,
+ {'MC-SS-Info',<<"S">>,<<"ExtSS">>,5,4,asn1_NOVALUE},
+ <<"C">>,
+ {'SGSN-CAMEL-SubscriptionInfo',
+ {'GPRS-CSI',
+ [{'GPRS-CamelTDPData',attach,13,<<"Addr">>,
+ continueTransaction,asn1_NOVALUE}],
+ 11,asn1_NOVALUE,'NULL','NULL'},
+ {'SMS-CSI',
+ [{'SMS-CAMEL-TDP-Data','sms-CollectedInfo',
+ 13,<<"Addr">>,continueTransaction,asn1_NOVALUE}],
+ 11,asn1_NOVALUE,'NULL','NULL'},
+ asn1_NOVALUE},
+ <<"ON">>},
+ asn1_test_lib:roundtrip('Mvrasn6', 'InsertSubscriberDataArg', Val),
ok.
diff --git a/lib/asn1/test/testParameterizedInfObj.erl b/lib/asn1/test/testParameterizedInfObj.erl
index f3b4f9b170..2fe900792d 100644
--- a/lib/asn1/test/testParameterizedInfObj.erl
+++ b/lib/asn1/test/testParameterizedInfObj.erl
@@ -20,7 +20,7 @@
-module(testParameterizedInfObj).
--export([main/2,ranap/1]).
+-export([main/2,param/1,ranap/1]).
-include_lib("test_server/include/test_server.hrl").
@@ -36,31 +36,29 @@ main(Config, Erule) ->
param2(Config, Erule).
param(Erule) ->
- PERVal = #'AllocationOrRetentionPriority'
- {priorityLevel = true,
- iE_Extensions =
- [#'ProtocolExtensionField'{id=14,
- criticality=reject,
- extensionValue= <<0>>},
- #'ProtocolExtensionField'{id=2,
- criticality=ignore,
- extensionValue= <<1>>}]},
- BERVal = #'AllocationOrRetentionPriority'
- {priorityLevel = true,
- iE_Extensions =
- [#'ProtocolExtensionField'{id=14,
- criticality=reject,
- extensionValue= <<2,1,0>>},
- #'ProtocolExtensionField'{id=2,
- criticality=ignore,
- extensionValue= <<2,1,1>>}]},
- case Erule of
- ber ->
- roundtrip('AllocationOrRetentionPriority', BERVal);
- per ->
- roundtrip('AllocationOrRetentionPriority', PERVal);
- uper ->
- roundtrip('AllocationOrRetentionPriority', PERVal)
+ Exts0 = case Erule of
+ ber ->
+ %% As implemented, the open type must contain
+ %% valid BER-encoded data.
+ [{14,<<2,1,0>>},{2,<<2,1,0>>}];
+ _ ->
+ %% The PER decoder will not look inside the open type.
+ [{14,<<0>>},{2,<<"anything goes">>}]
+ end,
+ case 'Param':legacy_erlang_types() of
+ false ->
+ Exts = [#'ProtocolExtensionField'{id=Id,
+ criticality=reject,
+ extensionValue={asn1_OPENTYPE,
+ Eval}} ||
+ {Id,Eval} <- Exts0],
+ aor_roundtrip(Exts);
+ true ->
+ Exts = [#'ProtocolExtensionField'{id=Id,
+ criticality=reject,
+ extensionValue=Eval} ||
+ {Id,Eval} <- Exts0],
+ aor_roundtrip(Exts)
end,
%% test code for OTP-4242, ValueFromObject
@@ -72,8 +70,13 @@ param(Erule) ->
{error,_Reason2} = 'Param':decode('OS2',[4,4,1,2,3,4]),
{ok,_Val4} = 'Param':decode('OS1',[4,2,1,2]);
_ -> %per/uper
- roundtrip('OS1', [1,2]),
- {error,_Reason3} = 'Param':encode('OS1', [1,2,3,4])
+ case 'Param':legacy_erlang_types() of
+ false ->
+ roundtrip('OS1', <<1,2>>),
+ {error,_Reason3} = 'Param':encode('OS1', <<1,2,3,4>>);
+ true ->
+ ok
+ end
end,
roundtrip('Scl', {'Scl',42,{a,9738654}}),
@@ -82,6 +85,11 @@ param(Erule) ->
ok.
+aor_roundtrip(Exts) ->
+ Val = #'AllocationOrRetentionPriority'{priorityLevel = true,
+ iE_Extensions = Exts},
+ roundtrip('AllocationOrRetentionPriority', Val).
+
roundtrip(T, V) ->
asn1_test_lib:roundtrip('Param', T, V).
@@ -102,11 +110,11 @@ ranap(_Erule) ->
param2(Config, Erule) ->
roundtrip2('HandoverRequired',
{'HandoverRequired',
- [{'ProtocolIE-Field',1,"ABC"},
+ [{'ProtocolIE-Field',1,<<"ABC">>},
{'ProtocolIE-Field',2,577799}]}),
Enc = roundtrip2('HandoverRequired',
{'HandoverRequired',
- [{'ProtocolIE-Field',1,"ABC"},
+ [{'ProtocolIE-Field',1,<<"ABC">>},
{'ProtocolIE-Field',2,-42},
{'ProtocolIE-Field',100,533},
{'ProtocolIE-Field',101,true}]}),
@@ -127,17 +135,19 @@ param2(Config, Erule) ->
[{i,DataDir},{outdir,CaseDir},Erule]),
%% Decompile extended data.
- {ok,{'HandoverRequired',[{'ProtocolIE-Field',1,"ABC"},
+ {ok,{'HandoverRequired',[{'ProtocolIE-Field',1,<<"ABC">>},
{'ProtocolIE-Field',2,-42},
- {'ProtocolIE-Field',100,Open100},
- {'ProtocolIE-Field',101,Open101}]}} =
+ {'ProtocolIE-Field',100,
+ {asn1_OPENTYPE,Open100}},
+ {'ProtocolIE-Field',101,
+ {asn1_OPENTYPE,Open101}}]}} =
'Param2':decode('HandoverRequired', Enc),
true = is_binary(Open100),
true = is_binary(Open101),
%% Test single root.
roundtrip2('SingleRoot',
- {'SingleRoot',[{'ProtocolIE-Field',1,"ABC"},
+ {'SingleRoot',[{'ProtocolIE-Field',1,<<"ABC">>},
{'ProtocolIE-Field',2,9999}]}),
ok.
diff --git a/lib/asn1/test/testPrimExternal.erl b/lib/asn1/test/testPrimExternal.erl
index 07a1de931f..a03760976d 100644
--- a/lib/asn1/test/testPrimExternal.erl
+++ b/lib/asn1/test/testPrimExternal.erl
@@ -45,6 +45,6 @@ external(_Rules) ->
'XExpNT',
'XExpImp',
'XExpExp'],
- _ = [asn1_test_lib:roundtrip('PrimExternal', T, "kalle") ||
+ _ = [asn1_test_lib:roundtrip('PrimExternal', T, <<"kalle">>) ||
T <- Types],
ok.
diff --git a/lib/asn1/test/testPrimStrings.erl b/lib/asn1/test/testPrimStrings.erl
index 2fe0780701..3262d61a4d 100644
--- a/lib/asn1/test/testPrimStrings.erl
+++ b/lib/asn1/test/testPrimStrings.erl
@@ -34,14 +34,11 @@
fragmented(Rules) ->
Lens = fragmented_lengths(),
- fragmented_octet_string(Rules, Lens),
- case Rules of
- per ->
- %% NYI.
- ok;
- _ ->
- fragmented_strings(Lens)
- end.
+ case 'PrimStrings':legacy_erlang_types() of
+ false -> fragmented_octet_string(Rules, Lens);
+ true -> ok
+ end,
+ fragmented_strings(Lens).
fragmented_strings(Lens) ->
Types = ['Ns','Ps','Ps11','Vis','IA5'],
@@ -74,33 +71,37 @@ bit_string(Rules, Opts) ->
%% Bs1 ::= BIT STRING
%%==========================================================
- bs_roundtrip('Bs1', 0, <<>>),
- bs_roundtrip('Bs1', 4, <<1:3>>),
- bs_roundtrip('Bs1', 15, <<15:4>>),
- bs_roundtrip('Bs1', 255, <<255:8>>),
-
- bs_roundtrip('Bs1', 256, [0,0,0,0,0,0,0,0,1]),
- bs_roundtrip('Bs1', 257, [1,0,0,0,0,0,0,0,1]),
- bs_roundtrip('Bs1', 444, [0,0,1,1,1,1,0,1,1]),
-
- {ok,Enc1} = 'PrimStrings':encode('Bs1', 12345678901234567890),
- {ok,_} = 'PrimStrings':decode('Bs1', Enc1),
+ bs_roundtrip('Bs1', <<>>),
+ bs_roundtrip('Bs1', <<1:3>>),
+ bs_roundtrip('Bs1', <<15:4>>),
+ bs_roundtrip('Bs1', <<2#010010:6>>),
+ bs_roundtrip('Bs1', <<2#11111111:8>>),
+ bs_roundtrip('Bs1', <<2#100000000:9>>),
+ bs_roundtrip('Bs1', <<2#100000001:9>>),
+ bs_roundtrip('Bs1', <<2#001111011:9>>),
+ bs_roundtrip('Bs1', <<2#0100101111100010011:19>>),
- bs_roundtrip('Bs1', [1,1,1,1,1,1,1,1]),
- bs_roundtrip('Bs1', [0,1,0,0,1,0]),
- bs_roundtrip('Bs1', [1,0,0,0,0,0,0,0,0]),
- bs_roundtrip('Bs1', [0,1,0,0,1,0,1,1,1,1,1,0,0,0,1,0,0,1,1]),
+ case 'PrimStrings':legacy_erlang_types() of
+ false ->
+ ok;
+ true ->
+ {ok,Enc1} = 'PrimStrings':encode('Bs1', 12345678901234567890),
+ {ok,_} = 'PrimStrings':decode('Bs1', Enc1)
+ end,
case {Rules,Opts} of
- {ber,[]} ->
+ {ber,[legacy_erlang_types]} ->
bs_decode('Bs1', <<35,8,3,2,0,73,3,2,4,32>>,
[0,1,0,0,1,0,0,1,0,0,1,0]),
bs_decode('Bs1', <<35,9,3,2,0,234,3,3,7,156,0>>,
[1,1,1,0,1,0,1,0,1,0,0,1,1,1,0,0,0]),
bs_decode('Bs1', <<35,128,3,2,0,234,3,3,7,156,0,0,0>>,
[1,1,1,0,1,0,1,0,1,0,0,1,1,1,0,0,0]);
- _ ->
+ {ber,[]} ->
+ %% XXX
+ ok;
+ {_,_} ->
%% DER, PER, UPER
consistent_def_enc('BsDef1',
[2#111101,
@@ -120,30 +121,39 @@ bit_string(Rules, Opts) ->
%%==========================================================
roundtrip('Bs2', [mo,tu,fr]),
- roundtrip('Bs2', [0,1,1,0,0,1,0], [mo,tu,fr]),
+ bs_roundtrip('Bs2', <<2#0110010:7>>, [mo,tu,fr]),
+ bs_roundtrip('Bs2', <<2#0110011:7>>, [mo,tu,fr,sa]),
%%==========================================================
%% Bs3 ::= BIT STRING {su(0), mo(1), tu(2), we(3), th(4), fr(5), sa(6) } (SIZE (1..7))
%%==========================================================
roundtrip('Bs3', [mo,tu,fr]),
- bs_roundtrip('Bs3', [0,1,1,0,0,1,0], [mo,tu,fr]),
+ bs_roundtrip('Bs3', <<2#0110010:7>>, [mo,tu,fr]),
+ bs_roundtrip('Bs3', <<2#0110010:7>>, [mo,tu,fr]),
+ bs_roundtrip('Bs2', <<2#0110011:7>>, [mo,tu,fr,sa]),
+ bs_roundtrip('Bs3', <<2#011001:6>>, [mo,tu,fr]),
+ bs_roundtrip('Bs3', <<2#11:2>>, [su,mo]),
%%==========================================================
%% Bs7 ::= BIT STRING (SIZE (24))
%%==========================================================
- bs_roundtrip('Bs7', 53245,
- [1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0]),
- bs_roundtrip('Bs7', [1,0,1,0],
- [1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
+ bs_roundtrip('Bs7', <<23563:24>>),
+ case 'PrimStrings':legacy_erlang_types() of
+ false ->
+%% {error,_} = 'PrimStrings':encode('Bs7', <<2#1010:4>>);
+ ok;
+ true ->
+ ok
+ end,
%%==========================================================
%% BsPri ::= [PRIVATE 61] BIT STRING
%%==========================================================
- bs_roundtrip('BsPri', 45, [1,0,1,1,0,1]),
- bs_roundtrip('BsPri', 211, [1,1,0,0,1,0,1,1]),
+ bs_roundtrip('BsPri', <<2#101101:6>>),
+ bs_roundtrip('BsPri', <<2#11001011:8>>),
case Rules of
ber ->
@@ -164,8 +174,8 @@ bit_string(Rules, Opts) ->
%% BsExpPri ::= [PRIVATE 61] EXPLICIT BIT STRING
%%==========================================================
- bs_roundtrip('BsExpPri', 45, [1,0,1,1,0,1]),
- bs_roundtrip('BsExpPri', 211, [1,1,0,0,1,0,1,1]),
+ bs_roundtrip('BsExpPri', <<2#101101:6>>),
+ bs_roundtrip('BsExpPri', <<2#11001011:8>>),
case Rules of
ber ->
@@ -186,14 +196,14 @@ bit_string(Rules, Opts) ->
%% veteran(2), collegeGraduate(3)}, test case for OTP-5710
%%==========================================================
- {ok,Bytes54} = 'BitStr':encode('PersonalStatus', []),
+ {ok,Bytes54} = 'BitStr':encode('PersonalStatus', <<>>),
{ok,[]} = 'BitStr':decode('PersonalStatus', Bytes54),
%%==========================================================
%% BS5932 ::= BIT STRING (SIZE (5..MAX))
%% test case for OTP-5932
%%==========================================================
- bs_roundtrip('BSMAX', [1,0,1,0,1]),
+ bs_roundtrip('BSMAX', <<2#10101:5>>),
case Rules of
ber ->
{error,_} = 'PrimStrings':encode('BSMAX', [1,0,1]);
@@ -207,28 +217,35 @@ bit_string(Rules, Opts) ->
%% BS1024 ::= BIT STRING (SIZE (1024))
%% test case for OTP-7602
%%==========================================================
- BSmaker =
- fun(_F,S,S,_,Acc) ->
- Acc;
- (F,Ix,S,{A,B},Acc) ->
- F(F,Ix+1,S,{B,A},[A|Acc])
- end,
-
- BSList255 = BSmaker(BSmaker,0,255,{1,0},[]),
- bs_roundtrip('BS255', BSList255),
- BSList256 = BSmaker(BSmaker,0,256,{1,0},[]),
- bs_roundtrip('BS256', BSList256),
- BSList1024 = BSmaker(BSmaker,0,1024,{1,0},[]),
- bs_roundtrip('BS1024', BSList1024),
- bs_roundtrip('TransportLayerAddress', [0,1,1,0]),
+ bs_roundtrip('BS255', random_bits(255)),
+ bs_roundtrip('BS256', random_bits(256)),
+ bs_roundtrip('BS1024', random_bits(1024)),
+
+ bs_roundtrip('TransportLayerAddress', <<2#0110:4>>),
case Rules of
ber -> ok;
_ -> per_bs_strings()
end.
-consistent_def_enc(Type, Vs) ->
+random_bits(N) ->
+ Seed = integer_to_list(erlang:phash2(erlang:now())),
+ random_bits(<<>>, N, Seed).
+
+random_bits(Bin, N, Seed) ->
+ RandomBits = erlang:md5(Seed),
+ Bits = bit_size(RandomBits),
+ if
+ Bits < N ->
+ random_bits(<<Bin/bitstring,RandomBits/bitstring>>,
+ N-Bits, RandomBits);
+ true ->
+ <<LastBits:N/bitstring,_/bitstring>> = RandomBits,
+ <<Bin/bitstring,LastBits/bitstring>>
+ end.
+
+consistent_def_enc(Type, Vs0) ->
M = 'PrimStrings',
{ok,Enc} = M:encode(Type, {Type,asn1_DEFAULT}),
{ok,Val} = M:decode(Type, Enc),
@@ -241,6 +258,13 @@ consistent_def_enc(Type, Vs) ->
{legacy,{_,Bs}} when is_list(Bs) -> ok
end,
+ %% If this is not the legacy format, only bitstrings are
+ %% allowed.
+ Vs = case M:legacy_erlang_types() of
+ false -> [V || V <- Vs0, is_bitstring(V)];
+ true -> Vs0
+ end,
+
%% All values should be recognized and encoded as the
%% the default value (i.e. not encoded at all).
_ = [{ok,Enc} = M:encode(Type, {Type,V}) || V <- Vs],
@@ -252,18 +276,9 @@ consistent_def_enc(Type, Vs) ->
%% a SIZE constraint).
per_bs_strings() ->
- bs_roundtrip('Bs3', [0,0,1,0,0,0,0], [tu]),
bs_roundtrip('Bs3', <<2#0010000:7>>, [tu]),
- bs_roundtrip('Bs3', {1,<<2#00100000:8>>}, [tu]),
-
- bs_roundtrip('Bs4', [0,1,1,0,0,1,0], [mo,tu,fr]),
bs_roundtrip('Bs4', <<2#0110010:7>>, [mo,tu,fr]),
- bs_roundtrip('Bs4', {1,<<2#01100100:8>>}, [mo,tu,fr]),
-
- bs_roundtrip('Bs4', [0,1,1,0,0,0,0], [mo,tu]),
bs_roundtrip('Bs4', <<2#011:3,0:32>>, [mo,tu]),
- bs_roundtrip('Bs4', {5,<<2#011:3,0:32,0:5>>}, [mo,tu]),
-
[per_trailing_zeroes(B) || B <- lists:seq(0, 255)],
ok.
@@ -279,10 +294,6 @@ per_trailing_zeroes(Byte) ->
{bit,LastBitPos} -> LastBitPos+1
end,
- %% List of zeroes and ones.
- named_roundtrip(L, Pos, ExpectedSz),
- named_roundtrip(L++[0,0,0,0,0], Pos, ExpectedSz),
-
%% Bitstrings.
Bs = << <<B:1>> || B <- L >>,
Sz = bit_size(Bs),
@@ -290,14 +301,22 @@ per_trailing_zeroes(Byte) ->
Bin = <<Bs:Sz/bits,0:16,0:7>>,
named_roundtrip(Bin, Pos, ExpectedSz),
- %% Compact bitstring.
- named_roundtrip({7,Bin}, Pos, ExpectedSz),
+ case 'PrimStrings':legacy_erlang_types() of
+ false ->
+ ok;
+ true ->
+ %% List of zeroes and ones.
+ named_roundtrip(L, Pos, ExpectedSz),
+ named_roundtrip(L++[0,0,0,0,0], Pos, ExpectedSz),
- %% Integer bitstring (obsolete).
- IntBs = intlist_to_integer(L, 0, 0),
- named_roundtrip(IntBs, Pos, ExpectedSz),
+ %% Compact bitstring.
+ named_roundtrip({7,Bin}, Pos, ExpectedSz),
- ok.
+ %% Integer bitstring (obsolete).
+ IntBs = intlist_to_integer(L, 0, 0),
+ named_roundtrip(IntBs, Pos, ExpectedSz),
+ ok
+ end.
make_bit_list(0) -> [];
make_bit_list(B) -> [B band 1|make_bit_list(B bsr 1)].
@@ -331,61 +350,62 @@ octet_string(Rules) ->
%% Os ::= OCTET STRING
%%==========================================================
+ Legacy = 'PrimStrings':legacy_erlang_types(),
case Rules of
- ber ->
- {ok,"Jones"} =
+ ber when not Legacy ->
+ {ok,<<"Jones">>} =
'PrimStrings':decode('Os', <<4,5,16#4A,16#6F,16#6E,16#65,16#73>>),
- {ok,"Jones"} =
+ {ok,<<"Jones">>} =
'PrimStrings':decode('Os', <<36,9,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73>>),
- {ok,"Jones"} =
+ {ok,<<"Jones">>} =
'PrimStrings':decode('Os', <<36,128,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73,0,0>>),
ok;
_ ->
ok
end,
- roundtrip('Os', [47,23,99,255,1]),
- roundtrip('OsCon', [47,23,99,255,1]),
- roundtrip('OsPri', [47,23,99,255,1]),
- roundtrip('OsApp', [47,23,99,255,1]),
+ os_roundtrip('Os', <<47,23,99,255,1>>),
+ os_roundtrip('OsCon', <<47,23,99,255,1>>),
+ os_roundtrip('OsPri', <<47,23,99,255,1>>),
+ os_roundtrip('OsApp', <<47,23,99,255,1>>),
- roundtrip('OsExpCon', [47,23,99,255,1]),
- roundtrip('OsExpPri', [47,23,99,255,1]),
- roundtrip('OsExpApp', [47,23,99,255,1]),
+ os_roundtrip('OsExpCon', <<47,23,99,255,1>>),
+ os_roundtrip('OsExpPri', <<47,23,99,255,1>>),
+ os_roundtrip('OsExpApp', <<47,23,99,255,1>>),
- roundtrip('Os', []),
- roundtrip('OsApp', []),
- roundtrip('OsExpApp',[]),
+ os_roundtrip('Os', <<>>),
+ os_roundtrip('OsApp', <<>>),
+ os_roundtrip('OsExpApp', <<>>),
- OsR = "12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890",
+ OsR = <<"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890">>,
- roundtrip('Os', OsR),
- roundtrip('OsCon', OsR),
- roundtrip('OsExpApp', OsR),
+ os_roundtrip('Os', OsR),
+ os_roundtrip('OsCon', OsR),
+ os_roundtrip('OsExpApp', OsR),
case Rules of
- ber ->
- {ok,"Jones"} = 'PrimStrings':decode('OsExpApp', <<127,62,7,4,5,16#4A,16#6F,16#6E,16#65,16#73>>),
- {ok,"Jones"} = 'PrimStrings':decode('OsExpApp', <<127,62,11,36,9,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73>>),
- {ok,"Jones"} = 'PrimStrings':decode('OsExpApp', <<127,62,13,36,128,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73,0,0>>),
- {ok,"Jones"} = 'PrimStrings':decode('OsExpApp', <<127,62,128,36,128,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73,0,0,0,0>>),
- {ok,"JonesJones"} = 'PrimStrings':decode('OsExpApp', <<127,62,128,36,128,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73,0,0,36,128,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73,0,0,0,0>>),
+ ber when not Legacy ->
+ {ok,<<"Jones">>} = 'PrimStrings':decode('OsExpApp', <<127,62,7,4,5,16#4A,16#6F,16#6E,16#65,16#73>>),
+ {ok,<<"Jones">>} = 'PrimStrings':decode('OsExpApp', <<127,62,11,36,9,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73>>),
+ {ok,<<"Jones">>} = 'PrimStrings':decode('OsExpApp', <<127,62,13,36,128,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73,0,0>>),
+ {ok,<<"Jones">>} = 'PrimStrings':decode('OsExpApp', <<127,62,128,36,128,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73,0,0,0,0>>),
+ {ok,<<"JonesJones">>} = 'PrimStrings':decode('OsExpApp', <<127,62,128,36,128,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73,0,0,36,128,4,3,16#4A,16#6F,16#6E,4,2,16#65,16#73,0,0,0,0>>),
ok;
-
- _->
+ _ ->
ok
end,
S255 = lists:seq(1, 255),
- Strings = {type,true,"","1","12","345",true,
- S255,[$a|S255],[$a,$b|S255],397},
- p_roundtrip('OsFixedStrings', Strings),
- p_roundtrip('OsFixedStringsExt', Strings),
- p_roundtrip('OsVarStringsExt', Strings),
+ Strings = {type,true,<<"">>,<<"1">>,<<"12">>,<<"345">>,true,
+ list_to_binary(S255),list_to_binary([$a|S255]),
+ list_to_binary([$a,$b|S255]),397},
+ p_os_roundtrip('OsFixedStrings', Strings),
+ p_os_roundtrip('OsFixedStringsExt', Strings),
+ p_os_roundtrip('OsVarStringsExt', Strings),
ShortenedStrings = shorten_by_two(Strings),
- p_roundtrip('OsFixedStringsExt', ShortenedStrings),
- p_roundtrip('OsVarStringsExt', ShortenedStrings),
+ p_os_roundtrip('OsFixedStringsExt', ShortenedStrings),
+ p_os_roundtrip('OsVarStringsExt', ShortenedStrings),
ok.
fragmented_octet_string(Erules, Lens) ->
@@ -414,13 +434,14 @@ fragmented_octet_string(Erules, Types, L) ->
ok.
enc_frag(Erules, Type, Value) ->
- {ok,Encoded} = 'PrimStrings':encode(Type, Value),
+ M = 'PrimStrings',
+ {ok,Encoded} = M:encode(Type, Value),
case Erules of
ber ->
Encoded;
_ ->
%% Validate encoding with our own encoder.
- Encoded = enc_frag_1(<<>>, list_to_binary(Value))
+ Encoded = enc_frag_1(<<>>, Value)
end.
enc_frag_1(Res, Bin0) ->
@@ -439,12 +460,12 @@ enc_frag_1(Res, Bin0) ->
end.
make_value(L) ->
- make_value(L, 0, []).
+ make_value(L, 0, <<>>).
make_value(0, _, Acc) ->
Acc;
make_value(N, Byte, Acc) when Byte =< 255 ->
- make_value(N-1, Byte+7, [Byte|Acc]);
+ make_value(N-1, Byte+7, <<Acc/binary,Byte:8>>);
make_value(N, Byte, Acc) ->
make_value(N, Byte band 16#FF, Acc).
@@ -742,10 +763,32 @@ utf8_string(_Rules) ->
shorten_by_two(Tuple) ->
L = [case E of
[_,_|T] -> T;
+ <<_:16,T/binary>> -> T;
_ -> E
end || E <- tuple_to_list(Tuple)],
list_to_tuple(L).
+p_os_roundtrip(Type, Value0) ->
+ Value = setelement(1, Value0, Type),
+ p_os_roundtrip_1(Type, Value).
+
+p_os_roundtrip_1(Type, Value) ->
+ M = 'PrimStrings',
+ case M:legacy_erlang_types() of
+ false ->
+ asn1_test_lib:roundtrip(M, Type, Value);
+ true ->
+ {ok,Encoded} = M:encode(Type, Value),
+ Es0 = tuple_to_list(Value),
+ Es1 = [if
+ is_binary(E) -> binary_to_list(E);
+ true -> E
+ end || E <- Es0],
+ ListValue = list_to_tuple(Es1),
+ {ok,Encoded} = M:encode(Type, ListValue),
+ {ok,ListValue} = M:decode(Type, Encoded)
+ end.
+
p_roundtrip(Type, Value0) ->
Value = setelement(1, Value0, Type),
roundtrip(Type, Value).
@@ -759,15 +802,57 @@ roundtrip(Type, Value, Expected) ->
bs_roundtrip(Type, Value) ->
bs_roundtrip(Type, Value, Value).
-bs_roundtrip(Type, Value, Expected) ->
+os_roundtrip(Type, Bin) when is_binary(Bin) ->
M = 'PrimStrings',
- {ok,Encoded} = M:encode(Type, Value),
- {ok,Encoded} = M:encode(Type, Expected),
- case M:decode(Type, Encoded) of
- {ok,Expected} ->
- ok;
- {ok,Other} ->
- Expected = convert(Other, Expected)
+ case M:legacy_erlang_types() of
+ false ->
+ asn1_test_lib:roundtrip(M, Type, Bin);
+ true ->
+ {ok,Encoded} = M:encode(Type, Bin),
+ List = binary_to_list(Bin),
+ {ok,Encoded} = M:encode(Type, List),
+ {ok,List} = M:decode(Type, Encoded)
+ end.
+
+bs_roundtrip(Type, Value, Expected) when is_bitstring(Value) ->
+ M = 'PrimStrings',
+ case M:legacy_erlang_types() of
+ false ->
+ asn1_test_lib:roundtrip(M, Type, Value, Expected);
+ true ->
+ {ok,Encoded} = M:encode(Type, Value),
+ BitList = [B || <<B:1>> <= Value],
+ {ok,Encoded} = M:encode(Type, BitList),
+ case BitList of
+ [] ->
+ {ok,Encoded} = M:encode(Type, 0);
+ [_|_] ->
+ case lists:last(BitList) of
+ 1 ->
+ Int = lists:foldr(fun(B, A) ->
+ (A bsl 1) bor B
+ end, 0, BitList),
+ {ok,Encoded} = M:encode(Type, Int);
+ 0 ->
+ %% This BIT STRING cannot be represented
+ %% as an integer.
+ ok
+ end
+ end,
+ Compact = case bit_size(Value) of
+ Bits when Bits rem 8 =:= 0 ->
+ {0,Value};
+ Bits ->
+ Unused = 8 - Bits rem 8,
+ {Unused,<<Value:Bits/bitstring,0:Unused>>}
+ end,
+ {ok,Encoded} = M:encode(Type, Compact),
+ case M:decode(Type, Encoded) of
+ {ok,Expected} ->
+ ok;
+ {ok,Other} ->
+ Expected = convert(Other, Expected)
+ end
end.
bs_decode(Type, Encoded, Expected) ->
diff --git a/lib/asn1/test/testSeqExtension.erl b/lib/asn1/test/testSeqExtension.erl
index 8473459c36..c16e9fcd4c 100644
--- a/lib/asn1/test/testSeqExtension.erl
+++ b/lib/asn1/test/testSeqExtension.erl
@@ -44,7 +44,7 @@ main(Erule, DataDir, Opts) ->
roundtrip('SeqExt4', #'SeqExt4'{bool=true,int=12345}),
roundtrip('SeqExt4', #'SeqExt4'{bool=false,int=123456}),
- roundtrip('SeqExt5', #'SeqExt5'{name="Arne",shoesize=47}),
+ roundtrip('SeqExt5', #'SeqExt5'{name = <<"Arne">>,shoesize=47}),
%% Encode a value with this version of the specification.
BigInt = 128638468966,
@@ -52,7 +52,7 @@ main(Erule, DataDir, Opts) ->
s2=#'SeqExt2'{bool=true,int=2345},
s3=#'SeqExt3'{bool=false,int=17},
s4=#'SeqExt4'{bool=true,int=38739739},
- s5=#'SeqExt5'{name="Arne",shoesize=47},
+ s5=#'SeqExt5'{name = <<"Arne">>,shoesize=47},
s6=#'SeqExt6'{i1=531,i2=601,i3=999,
i4=777,i5=11953,
i6=13553,i7=77777},
diff --git a/lib/asn1/test/testSeqExternal.erl b/lib/asn1/test/testSeqExternal.erl
index a8e0902244..0b1d305054 100644
--- a/lib/asn1/test/testSeqExternal.erl
+++ b/lib/asn1/test/testSeqExternal.erl
@@ -29,15 +29,15 @@
-record('SeqXSet3',{bool, int, set}).
main(_Rules) ->
- roundtrip('XNTNT', #'XSeqNT'{os="kalle",bool=true}),
- roundtrip('XImpNT', #'XSeqNT'{os="kalle",bool=true}),
- roundtrip('XExpNT', #'XSeqNT'{os="kalle",bool=true}),
- roundtrip('XNTImp', #'XSeqImp'{os="kalle",bool=true}),
- roundtrip('XImpImp', #'XSeqImp'{os="kalle",bool=true}),
- roundtrip('XExpImp', #'XSeqImp'{os="kalle",bool=true}),
- roundtrip('XNTExp', #'XSeqExp'{os="kalle",bool=true}),
- roundtrip('XImpExp', #'XSeqExp'{os="kalle",bool=true}),
- roundtrip('XExpExp', #'XSeqExp'{os="kalle",bool=true}),
+ roundtrip('XNTNT', #'XSeqNT'{os = <<"kalle">>,bool=true}),
+ roundtrip('XImpNT', #'XSeqNT'{os = <<"kalle">>,bool=true}),
+ roundtrip('XExpNT', #'XSeqNT'{os = <<"kalle">>,bool=true}),
+ roundtrip('XNTImp', #'XSeqImp'{os = <<"kalle">>,bool=true}),
+ roundtrip('XImpImp', #'XSeqImp'{os = <<"kalle">>,bool=true}),
+ roundtrip('XExpImp', #'XSeqImp'{os = <<"kalle">>,bool=true}),
+ roundtrip('XNTExp', #'XSeqExp'{os = <<"kalle">>,bool=true}),
+ roundtrip('XImpExp', #'XSeqExp'{os = <<"kalle">>,bool=true}),
+ roundtrip('XExpExp', #'XSeqExp'{os = <<"kalle">>,bool=true}),
roundtrip('SeqXSet1',
#'SeqXSet1'{set=#'XSet1'{bool1=true,int1=77,
set1=#'XSetIn'{boolIn=false,intIn=88}},
diff --git a/lib/asn1/test/testSeqOf.erl b/lib/asn1/test/testSeqOf.erl
index 7f8f4079b4..25059d6052 100644
--- a/lib/asn1/test/testSeqOf.erl
+++ b/lib/asn1/test/testSeqOf.erl
@@ -85,10 +85,10 @@ main(_Rules) ->
seq43=SeqIn3}),
roundtrip('Seq5', {'Seq5',true,[],77}),
- roundtrip('Seq5', {'Seq5',true,[""],77}),
- roundtrip('Seq5', {'Seq5',true,["a"],77}),
- roundtrip('Seq5', {'Seq5',true,["ab"],77}),
- roundtrip('Seq5', {'Seq5',true,["abc"],77}),
+ roundtrip('Seq5', {'Seq5',true,[<<"">>],77}),
+ roundtrip('Seq5', {'Seq5',true,[<<"a">>],77}),
+ roundtrip('Seq5', {'Seq5',true,[<<"ab">>],77}),
+ roundtrip('Seq5', {'Seq5',true,[<<"abc">>],77}),
roundtrip('Seq6', {'Seq6',[],[],101}),
roundtrip('Seq6', {'Seq6',[],[7],101}),
@@ -100,15 +100,15 @@ main(_Rules) ->
roundtrip('Seq8', {'Seq8',[],37}),
roundtrip('Seq9', {'Seq9',true,[],97}),
- roundtrip('Seq9', {'Seq9',true,[""],97}),
- roundtrip('Seq9', {'Seq9',true,["x"],97}),
- roundtrip('Seq9', {'Seq9',true,["xy"],97}),
- roundtrip('Seq9', {'Seq9',true,["xyz"],97}),
-
- roundtrip('Seq10', {'Seq10',true,[""],97}),
- roundtrip('Seq10', {'Seq10',true,["a"],97}),
- roundtrip('Seq10', {'Seq10',true,["a","b"],97}),
- roundtrip('Seq10', {'Seq10',true,["a","b","c"],97}),
+ roundtrip('Seq9', {'Seq9',true,[<<"">>],97}),
+ roundtrip('Seq9', {'Seq9',true,[<<"x">>],97}),
+ roundtrip('Seq9', {'Seq9',true,[<<"xy">>],97}),
+ roundtrip('Seq9', {'Seq9',true,[<<"xyz">>],97}),
+
+ roundtrip('Seq10', {'Seq10',true,[<<"">>],97}),
+ roundtrip('Seq10', {'Seq10',true,[<<"a">>],97}),
+ roundtrip('Seq10', {'Seq10',true,[<<"a">>,<<"b">>],97}),
+ roundtrip('Seq10', {'Seq10',true,[<<"a">>,<<"b">>,<<"c">>],97}),
roundtrip('SeqEmp', #'SeqEmp'{seq1=[#'Empty'{}]}),
diff --git a/lib/asn1/test/testSeqOfExternal.erl b/lib/asn1/test/testSeqOfExternal.erl
index 2e60f441c1..38b9f0ce7c 100644
--- a/lib/asn1/test/testSeqOfExternal.erl
+++ b/lib/asn1/test/testSeqOfExternal.erl
@@ -29,50 +29,59 @@
main(_Rules) ->
roundtrip('NTNT',
- [#'NT'{os="kalle",bool=true},#'NT'{os="kalle",bool=true}]),
+ [#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]),
roundtrip('ImpNT',
- [#'NT'{os="kalle",bool=true},#'NT'{os="kalle",bool=true}]),
+ [#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]),
roundtrip('ExpNT',
- [#'NT'{os="kalle",bool=true},#'NT'{os="kalle",bool=true}]),
+ [#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]),
roundtrip('NTImp',
- [#'Imp'{os="kalle",bool=true},#'Imp'{os="kalle",bool=true}]),
+ [#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]),
roundtrip('ImpImp',
- [#'Imp'{os="kalle",bool=true},#'Imp'{os="kalle",bool=true}]),
+ [#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]),
roundtrip('ExpImp',
- [#'Imp'{os="kalle",bool=true},#'Imp'{os="kalle",bool=true}]),
+ [#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]),
roundtrip('NTExp',
- [#'Exp'{os="kalle",bool=true},#'Exp'{os="kalle",bool=true}]),
+ [#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]),
roundtrip('ImpExp',
- [#'Exp'{os="kalle",bool=true},#'Exp'{os="kalle",bool=true}]),
+ [#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]),
roundtrip('ExpExp',
- [#'Exp'{os="kalle",bool=true},#'Exp'{os="kalle",bool=true}]),
+ [#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]),
roundtrip('XNTNT',
- [#'XSeqNT'{os="kalle",bool=true},
- #'XSeqNT'{os="kalle",bool=true}]),
+ [#'XSeqNT'{os = <<"kalle">>,bool=true},
+ #'XSeqNT'{os = <<"kalle">>,bool=true}]),
roundtrip('XImpNT',
- [#'XSeqNT'{os="kalle",bool=true},
- #'XSeqNT'{os="kalle",bool=true}]),
+ [#'XSeqNT'{os = <<"kalle">>,bool=true},
+ #'XSeqNT'{os = <<"kalle">>,bool=true}]),
roundtrip('XExpNT',
- [#'XSeqNT'{os="kalle",bool=true},
- #'XSeqNT'{os="kalle",bool=true}]),
+ [#'XSeqNT'{os = <<"kalle">>,bool=true},
+ #'XSeqNT'{os = <<"kalle">>,bool=true}]),
roundtrip('XNTImp',
- [#'XSeqImp'{os="kalle",bool=true},
- #'XSeqImp'{os="kalle",bool=true}]),
+ [#'XSeqImp'{os = <<"kalle">>,bool=true},
+ #'XSeqImp'{os = <<"kalle">>,bool=true}]),
roundtrip('XImpImp',
- [#'XSeqImp'{os="kalle",bool=true},
- #'XSeqImp'{os="kalle",bool=true}]),
+ [#'XSeqImp'{os = <<"kalle">>,bool=true},
+ #'XSeqImp'{os = <<"kalle">>,bool=true}]),
roundtrip('XExpImp',
- [#'XSeqImp'{os="kalle",bool=true},
- #'XSeqImp'{os="kalle",bool=true}]),
+ [#'XSeqImp'{os = <<"kalle">>,bool=true},
+ #'XSeqImp'{os = <<"kalle">>,bool=true}]),
roundtrip('XNTExp',
- [#'XSeqExp'{os="kalle",bool=true},
- #'XSeqExp'{os="kalle",bool=true}]),
+ [#'XSeqExp'{os = <<"kalle">>,bool=true},
+ #'XSeqExp'{os = <<"kalle">>,bool=true}]),
roundtrip('XImpExp',
- [#'XSeqExp'{os="kalle",bool=true},
- #'XSeqExp'{os="kalle",bool=true}]),
+ [#'XSeqExp'{os = <<"kalle">>,bool=true},
+ #'XSeqExp'{os = <<"kalle">>,bool=true}]),
roundtrip('XExpExp',
- [#'XSeqExp'{os="kalle",bool=true},
- #'XSeqExp'{os="kalle",bool=true}]),
+ [#'XSeqExp'{os = <<"kalle">>,bool=true},
+ #'XSeqExp'{os = <<"kalle">>,bool=true}]),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSeqOfTag.erl b/lib/asn1/test/testSeqOfTag.erl
index 38c1dcb90f..f66e29e91d 100644
--- a/lib/asn1/test/testSeqOfTag.erl
+++ b/lib/asn1/test/testSeqOfTag.erl
@@ -44,47 +44,47 @@
-record('Exp',{os, bool}).
main(_Rules) ->
- roundtrip('SeqTagNt', #'SeqTagNt'{nt=[#'NT'{os="kalle",bool=true},
- #'NT'{os="kalle",bool=true}]}),
- roundtrip('SeqTagNtI', #'SeqTagNtI'{imp=[#'Imp'{os="kalle",bool=true},
- #'Imp'{os="kalle",bool=true}]}),
- roundtrip('SeqTagNtE', #'SeqTagNtE'{exp=[#'Exp'{os="kalle",bool=true},
- #'Exp'{os="kalle",bool=true}]}),
- roundtrip('SeqTagI', #'SeqTagI'{nt=[#'NT'{os="kalle",bool=true},
- #'NT'{os="kalle",bool=true}]}),
- roundtrip('SeqTagII', #'SeqTagII'{imp=[#'Imp'{os="kalle",bool=true},
- #'Imp'{os="kalle",bool=true}]}),
- roundtrip('SeqTagIE', #'SeqTagIE'{exp=[#'Exp'{os="kalle",bool=true},
- #'Exp'{os="kalle",bool=true}]}),
- roundtrip('SeqTagE', #'SeqTagE'{nt=[#'NT'{os="kalle",bool=true},
- #'NT'{os="kalle",bool=true}]}),
- roundtrip('SeqTagEI', #'SeqTagEI'{imp=[#'Imp'{os="kalle",bool=true},
- #'Imp'{os="kalle",bool=true}]}),
- roundtrip('SeqTagEE', #'SeqTagEE'{exp=[#'Exp'{os="kalle",bool=true},
- #'Exp'{os="kalle",bool=true}]}),
+ roundtrip('SeqTagNt', #'SeqTagNt'{nt=[#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SeqTagNtI', #'SeqTagNtI'{imp=[#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SeqTagNtE', #'SeqTagNtE'{exp=[#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SeqTagI', #'SeqTagI'{nt=[#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SeqTagII', #'SeqTagII'{imp=[#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SeqTagIE', #'SeqTagIE'{exp=[#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SeqTagE', #'SeqTagE'{nt=[#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SeqTagEI', #'SeqTagEI'{imp=[#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SeqTagEE', #'SeqTagEE'{exp=[#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]}),
roundtrip('SeqTagXNt',
- #'SeqTagXNt'{xnt=[#'XSeqNT'{os="kalle",bool=true},
- #'XSeqNT'{os="kalle",bool=true}]}),
+ #'SeqTagXNt'{xnt=[#'XSeqNT'{os = <<"kalle">>,bool=true},
+ #'XSeqNT'{os = <<"kalle">>,bool=true}]}),
roundtrip('SeqTagXI',
- #'SeqTagXI'{ximp=[#'XSeqImp'{os="kalle",bool=true},
- #'XSeqImp'{os="kalle",bool=true}]}),
+ #'SeqTagXI'{ximp=[#'XSeqImp'{os = <<"kalle">>,bool=true},
+ #'XSeqImp'{os = <<"kalle">>,bool=true}]}),
roundtrip('SeqTagXE',
- #'SeqTagXE'{xexp=[#'XSeqExp'{os="kalle",bool=true},
- #'XSeqExp'{os="kalle",bool=true}]}),
+ #'SeqTagXE'{xexp=[#'XSeqExp'{os = <<"kalle">>,bool=true},
+ #'XSeqExp'{os = <<"kalle">>,bool=true}]}),
roundtrip('SeqTagImpX',
- #'SeqTagImpX'{xnt=[#'XSeqNT'{os="kalle",bool=true},
- #'XSeqNT'{os="kalle",bool=true}],
- ximp=[#'XSeqImp'{os="kalle",bool=true},
- #'XSeqImp'{os="kalle",bool=true}],
- xexp=[#'XSeqExp'{os="kalle",bool=true},
- #'XSeqExp'{os="kalle",bool=true}]}),
+ #'SeqTagImpX'{xnt=[#'XSeqNT'{os = <<"kalle">>,bool=true},
+ #'XSeqNT'{os = <<"kalle">>,bool=true}],
+ ximp=[#'XSeqImp'{os = <<"kalle">>,bool=true},
+ #'XSeqImp'{os = <<"kalle">>,bool=true}],
+ xexp=[#'XSeqExp'{os = <<"kalle">>,bool=true},
+ #'XSeqExp'{os = <<"kalle">>,bool=true}]}),
roundtrip('SeqTagExpX',
- #'SeqTagExpX'{xnt=[#'XSeqNT'{os="kalle",bool=true},
- #'XSeqNT'{os="kalle",bool=true}],
- ximp=[#'XSeqImp'{os="kalle",bool=true},
- #'XSeqImp'{os="kalle",bool=true}],
- xexp=[#'XSeqExp'{os="kalle",bool=true},
- #'XSeqExp'{os="kalle",bool=true}]}),
+ #'SeqTagExpX'{xnt=[#'XSeqNT'{os = <<"kalle">>,bool=true},
+ #'XSeqNT'{os = <<"kalle">>,bool=true}],
+ ximp=[#'XSeqImp'{os = <<"kalle">>,bool=true},
+ #'XSeqImp'{os = <<"kalle">>,bool=true}],
+ xexp=[#'XSeqExp'{os = <<"kalle">>,bool=true},
+ #'XSeqExp'{os = <<"kalle">>,bool=true}]}),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSeqPrim.erl b/lib/asn1/test/testSeqPrim.erl
index 46bac77910..7f3ef86ac5 100644
--- a/lib/asn1/test/testSeqPrim.erl
+++ b/lib/asn1/test/testSeqPrim.erl
@@ -36,9 +36,9 @@ main(_Rules) ->
roundtrip('Seq', #'Seq'{bool=false,boolCon=true,boolPri=false,boolApp=true,
boolExpCon=false,boolExpPri=true,boolExpApp=false}),
roundtrip('Empty', #'Empty'{}),
- roundtrip('Big', #'Big'{os1=lists:duplicate(120, 16#A5),
- os2=lists:duplicate(128, 16#A7),
- os3=lists:duplicate(17777, 16#F5)}),
+ roundtrip('Big', #'Big'{os1=list_to_binary(lists:duplicate(120, 16#A5)),
+ os2=list_to_binary(lists:duplicate(128, 16#A7)),
+ os3=list_to_binary(lists:duplicate(17777, 16#F5))}),
ok.
roundtrip(Type, Value) ->
diff --git a/lib/asn1/test/testSeqSetDefaultVal.erl b/lib/asn1/test/testSeqSetDefaultVal.erl
index 044099199f..79992a0a94 100644
--- a/lib/asn1/test/testSeqSetDefaultVal.erl
+++ b/lib/asn1/test/testSeqSetDefaultVal.erl
@@ -162,7 +162,7 @@ main(Rule, Opts) ->
{#'SeqOS'{},
[{#'SeqOS'.a,
[asn1_DEFAULT,
- [172]]}]},
+ <<172>>]}]},
{#'SeqOI'{},
[{#'SeqOI'.a,
@@ -314,17 +314,10 @@ der() ->
c=[second], d = <<>>}),
roundtrip(<<48,0>>, 'SeqOS',
- #'SeqOS'{a=[172],b=[16#A8,16#A0],c='NULL'}),
- roundtrip(<<48,0>>,
- 'SeqOS',
- #'SeqOS'{a=172,b=43168,c='NULL'},
- #'SeqOS'{a=[172],b=[16#A8,16#A0],c='NULL'}),
+ #'SeqOS'{a = <<172>>,b = <<16#A8,16#A0>>,c='NULL'}),
- roundtrip(<<49,0>>, 'SetOS', #'SetOS'{a=[172],b=[16#A8,16#A0],c='NULL'}),
- roundtrip(<<49,0>>,
- 'SetOS',
- #'SetOS'{a=172,b=43168,c='NULL'},
- #'SetOS'{a=[172],b=[16#A8,16#A0],c='NULL'}),
+ roundtrip(<<49,0>>, 'SetOS',
+ #'SetOS'{a = <<172>>,b = <<16#A8,16#A0>>,c='NULL'}),
roundtrip(<<48,0>>,
'SeqOI',
diff --git a/lib/asn1/test/testSeqTag.erl b/lib/asn1/test/testSeqTag.erl
index 2f127b3e97..6bacca6808 100644
--- a/lib/asn1/test/testSeqTag.erl
+++ b/lib/asn1/test/testSeqTag.erl
@@ -35,24 +35,24 @@
-record('Exp',{os, bool}).
main(_Rules) ->
- roundtrip('SeqTag', #'SeqTag'{nt=#'NT'{os="kalle",bool=true},
- imp=#'Imp'{os="kalle",bool=true},
- exp=#'Exp'{os="kalle",bool=true}}),
- roundtrip('SeqTagImp', #'SeqTagImp'{nt=#'NT'{os="kalle",bool=true},
- imp=#'Imp'{os="kalle",bool=true},
- exp=#'Exp'{os="kalle",bool=true}}),
- roundtrip('SeqTagExp', #'SeqTagExp'{nt=#'NT'{os="kalle",bool=true},
- imp=#'Imp'{os="kalle",bool=true},
- exp=#'Exp'{os="kalle",bool=true}}),
- roundtrip('SeqTagX', #'SeqTagX'{xnt=#'XSeqNT'{os="kalle",bool=true},
- ximp=#'XSeqImp'{os="kalle",bool=true},
- xexp=#'XSeqExp'{os="kalle",bool=true}}),
- roundtrip('SeqTagImpX', #'SeqTagImpX'{xnt=#'XSeqNT'{os="kalle",bool=true},
- ximp=#'XSeqImp'{os="kalle",bool=true},
- xexp=#'XSeqExp'{os="kalle",bool=true}}),
- roundtrip('SeqTagExpX', #'SeqTagExpX'{xnt=#'XSeqNT'{os="kalle",bool=true},
- ximp=#'XSeqImp'{os="kalle",bool=true},
- xexp=#'XSeqExp'{os="kalle",bool=true}}),
+ roundtrip('SeqTag', #'SeqTag'{nt=#'NT'{os = <<"kalle">>,bool=true},
+ imp=#'Imp'{os = <<"kalle">>,bool=true},
+ exp=#'Exp'{os = <<"kalle">>,bool=true}}),
+ roundtrip('SeqTagImp', #'SeqTagImp'{nt=#'NT'{os = <<"kalle">>,bool=true},
+ imp=#'Imp'{os = <<"kalle">>,bool=true},
+ exp=#'Exp'{os = <<"kalle">>,bool=true}}),
+ roundtrip('SeqTagExp', #'SeqTagExp'{nt=#'NT'{os = <<"kalle">>,bool=true},
+ imp=#'Imp'{os = <<"kalle">>,bool=true},
+ exp=#'Exp'{os = <<"kalle">>,bool=true}}),
+ roundtrip('SeqTagX', #'SeqTagX'{xnt=#'XSeqNT'{os = <<"kalle">>,bool=true},
+ ximp=#'XSeqImp'{os = <<"kalle">>,bool=true},
+ xexp=#'XSeqExp'{os = <<"kalle">>,bool=true}}),
+ roundtrip('SeqTagImpX', #'SeqTagImpX'{xnt=#'XSeqNT'{os = <<"kalle">>,bool=true},
+ ximp=#'XSeqImp'{os = <<"kalle">>,bool=true},
+ xexp=#'XSeqExp'{os = <<"kalle">>,bool=true}}),
+ roundtrip('SeqTagExpX', #'SeqTagExpX'{xnt=#'XSeqNT'{os = <<"kalle">>,bool=true},
+ ximp=#'XSeqImp'{os = <<"kalle">>,bool=true},
+ xexp=#'XSeqExp'{os = <<"kalle">>,bool=true}}),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSeqTypeRefCho.erl b/lib/asn1/test/testSeqTypeRefCho.erl
index b008bc46b8..1a921c6f38 100644
--- a/lib/asn1/test/testSeqTypeRefCho.erl
+++ b/lib/asn1/test/testSeqTypeRefCho.erl
@@ -28,10 +28,10 @@
main(_Rules) ->
roundtrip('SeqTRcho',
- #'SeqTRcho'{'seqCho' = {choOs,"A string 1"},
- 'seqChoE' = {choOs,"A string 3"},
- 'seqCho-E' = {choOs,"A string 7"},
- 'seqChoE-E' = {choOs,"A string 9"}}),
+ #'SeqTRcho'{'seqCho' = {choOs,<<"A string 1">>},
+ 'seqChoE' = {choOs,<<"A string 3">>},
+ 'seqCho-E' = {choOs,<<"A string 7">>},
+ 'seqChoE-E' = {choOs,<<"A string 9">>}}),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSeqTypeRefPrim.erl b/lib/asn1/test/testSeqTypeRefPrim.erl
index b63882ae99..d66d1ebcfe 100644
--- a/lib/asn1/test/testSeqTypeRefPrim.erl
+++ b/lib/asn1/test/testSeqTypeRefPrim.erl
@@ -26,15 +26,15 @@
main(_Rules) ->
roundtrip('SeqTR',
- #'SeqTR'{'octStr' = "A string 1",
- 'octStrI' = "A string 2",
- 'octStrE' = "A string 3",
- 'octStr-I' = "A string 4",
- 'octStrI-I' = "A string 5",
- 'octStrE-I' = "A string 6",
- 'octStr-E' = "A string 7",
- 'octStrI-E' = "A string 8",
- 'octStrE-E' = "A string 9"}),
+ #'SeqTR'{'octStr' = <<"A string 1">>,
+ 'octStrI' = <<"A string 2">>,
+ 'octStrE' = <<"A string 3">>,
+ 'octStr-I' = <<"A string 4">>,
+ 'octStrI-I' = <<"A string 5">>,
+ 'octStrE-I' = <<"A string 6">>,
+ 'octStr-E' = <<"A string 7">>,
+ 'octStrI-E' = <<"A string 8">>,
+ 'octStrE-E' = <<"A string 9">>}),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSeqTypeRefSeq.erl b/lib/asn1/test/testSeqTypeRefSeq.erl
index fc2e0a67c9..3288511f0a 100644
--- a/lib/asn1/test/testSeqTypeRefSeq.erl
+++ b/lib/asn1/test/testSeqTypeRefSeq.erl
@@ -71,15 +71,15 @@ main(_Rules) ->
seqS2=#'SeqSTag_seqS2'{b2=true,i2=22},
seqS3=#'SeqSTag_seqS3'{b3=true,i3=33}}),
roundtrip('SeqTRseq',
- #'SeqTRseq'{seqSeq=#'SeqSeq'{seqInt=2,seqOs="A1"},
- seqSeqI=#'SeqSeq'{seqInt=2,seqOs="A2"},
- seqSeqE=#'SeqSeq'{seqInt=2,seqOs="A3"},
- 'seqSeq-I'=#'SeqSeqImp'{seqInt=2,seqOs="A4"},
- 'seqSeqI-I'=#'SeqSeqImp'{seqInt=2,seqOs="A5"},
- 'seqSeqE-I'=#'SeqSeqImp'{seqInt=2,seqOs="A6"},
- 'seqSeq-E'=#'SeqSeqExp'{seqInt=2,seqOs="A7"},
- 'seqSeqI-E'=#'SeqSeqExp'{seqInt=2,seqOs="A8"},
- 'seqSeqE-E'=#'SeqSeqExp'{seqInt=2,seqOs="A9"}}),
+ #'SeqTRseq'{seqSeq=#'SeqSeq'{seqInt=2,seqOs = <<"A1">>},
+ seqSeqI=#'SeqSeq'{seqInt=2,seqOs = <<"A2">>},
+ seqSeqE=#'SeqSeq'{seqInt=2,seqOs = <<"A3">>},
+ 'seqSeq-I'=#'SeqSeqImp'{seqInt=2,seqOs = <<"A4">>},
+ 'seqSeqI-I'=#'SeqSeqImp'{seqInt=2,seqOs = <<"A5">>},
+ 'seqSeqE-I'=#'SeqSeqImp'{seqInt=2,seqOs = <<"A6">>},
+ 'seqSeq-E'=#'SeqSeqExp'{seqInt=2,seqOs = <<"A7">>},
+ 'seqSeqI-E'=#'SeqSeqExp'{seqInt=2,seqOs = <<"A8">>},
+ 'seqSeqE-E'=#'SeqSeqExp'{seqInt=2,seqOs = <<"A9">>}}),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSeqTypeRefSet.erl b/lib/asn1/test/testSeqTypeRefSet.erl
index 911a4b7a47..d73423284b 100644
--- a/lib/asn1/test/testSeqTypeRefSet.erl
+++ b/lib/asn1/test/testSeqTypeRefSet.erl
@@ -32,15 +32,15 @@
main(_Rules) ->
roundtrip('SeqTRset',
- #'SeqTRset'{seqSet=#'SeqSet'{setInt=2,setOs="A1"},
- seqSetI=#'SeqSet'{setInt=2,setOs="A2"},
- seqSetE=#'SeqSet'{setInt=2,setOs="A3"},
- 'seqSet-I'=#'SeqSetImp'{setInt=2,setOs="A4"},
- 'seqSetI-I'=#'SeqSetImp'{setInt=2,setOs="A5"},
- 'seqSetE-I'=#'SeqSetImp'{setInt=2,setOs="A6"},
- 'seqSet-E'=#'SeqSetExp'{setInt=2,setOs="A7"},
- 'seqSetI-E'=#'SeqSetExp'{setInt=2,setOs="A8"},
- 'seqSetE-E'=#'SeqSetExp'{setInt=2,setOs="A9"}}),
+ #'SeqTRset'{seqSet=#'SeqSet'{setInt=2,setOs = <<"A1">>},
+ seqSetI=#'SeqSet'{setInt=2,setOs = <<"A2">>},
+ seqSetE=#'SeqSet'{setInt=2,setOs = <<"A3">>},
+ 'seqSet-I'=#'SeqSetImp'{setInt=2,setOs = <<"A4">>},
+ 'seqSetI-I'=#'SeqSetImp'{setInt=2,setOs = <<"A5">>},
+ 'seqSetE-I'=#'SeqSetImp'{setInt=2,setOs = <<"A6">>},
+ 'seqSet-E'=#'SeqSetExp'{setInt=2,setOs = <<"A7">>},
+ 'seqSetI-E'=#'SeqSetExp'{setInt=2,setOs = <<"A8">>},
+ 'seqSetE-E'=#'SeqSetExp'{setInt=2,setOs = <<"A9">>}}),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSetExternal.erl b/lib/asn1/test/testSetExternal.erl
index e17d7053aa..626adc5822 100644
--- a/lib/asn1/test/testSetExternal.erl
+++ b/lib/asn1/test/testSetExternal.erl
@@ -28,15 +28,15 @@
-record('SetXSeq3',{bool, int, seq}).
main(_Rules) ->
- roundtrip('XNTNT', #'XSetNT'{os="kalle",bool=true}),
- roundtrip('XImpNT', #'XSetNT'{os="kalle",bool=true}),
- roundtrip('XExpNT', #'XSetNT'{os="kalle",bool=true}),
- roundtrip('XNTImp', #'XSetImp'{os="kalle",bool=true}),
- roundtrip('XImpImp', #'XSetImp'{os="kalle",bool=true}),
- roundtrip('XExpImp', #'XSetImp'{os="kalle",bool=true}),
- roundtrip('XNTExp', #'XSetExp'{os="kalle",bool=true}),
- roundtrip('XImpExp', #'XSetExp'{os="kalle",bool=true}),
- roundtrip('XExpExp', #'XSetExp'{os="kalle",bool=true}),
+ roundtrip('XNTNT', #'XSetNT'{os = <<"kalle">>,bool=true}),
+ roundtrip('XImpNT', #'XSetNT'{os = <<"kalle">>,bool=true}),
+ roundtrip('XExpNT', #'XSetNT'{os = <<"kalle">>,bool=true}),
+ roundtrip('XNTImp', #'XSetImp'{os = <<"kalle">>,bool=true}),
+ roundtrip('XImpImp', #'XSetImp'{os = <<"kalle">>,bool=true}),
+ roundtrip('XExpImp', #'XSetImp'{os = <<"kalle">>,bool=true}),
+ roundtrip('XNTExp', #'XSetExp'{os = <<"kalle">>,bool=true}),
+ roundtrip('XImpExp', #'XSetExp'{os = <<"kalle">>,bool=true}),
+ roundtrip('XExpExp', #'XSetExp'{os = <<"kalle">>,bool=true}),
roundtrip('SetXSeq1', #'SetXSeq1'{seq=#'XSeq1'{bool1=true,int1=77,
seq1=#'XSeqIn'{boolIn=false,intIn=88}},
bool=true,int=66}),
diff --git a/lib/asn1/test/testSetOf.erl b/lib/asn1/test/testSetOf.erl
index 54c42c1f21..0f82a14625 100644
--- a/lib/asn1/test/testSetOf.erl
+++ b/lib/asn1/test/testSetOf.erl
@@ -121,9 +121,9 @@ main(_Rules) ->
#'SetIn'{boolIn=false,intIn=125},
#'SetIn'{boolIn=false,intIn=225}]}),
- roundtrip('SetOs', ["First","Second","Third"]),
- roundtrip('SetOsImp', ["First","Second","Third"]),
- roundtrip('SetOsExp', ["First","Second","Third"]),
+ roundtrip('SetOs', [<<"First">>,<<"Second">>,<<"Third">>]),
+ roundtrip('SetOsImp', [<<"First">>,<<"Second">>,<<"Third">>]),
+ roundtrip('SetOsExp', [<<"First">>,<<"Second">>,<<"Third">>]),
roundtrip('SetEmp', #'SetEmp'{set1=[#'Empty'{}]}),
ok.
diff --git a/lib/asn1/test/testSetOfExternal.erl b/lib/asn1/test/testSetOfExternal.erl
index a380ba5ac1..cc5fe10710 100644
--- a/lib/asn1/test/testSetOfExternal.erl
+++ b/lib/asn1/test/testSetOfExternal.erl
@@ -28,24 +28,42 @@
-record('Exp',{os, bool}).
main(_Rules) ->
- roundtrip('NTNT', [#'NT'{os="kalle",bool=true},#'NT'{os="kalle",bool=true}]),
- roundtrip('ImpNT', [#'NT'{os="kalle",bool=true},#'NT'{os="kalle",bool=true}]),
- roundtrip('ExpNT', [#'NT'{os="kalle",bool=true},#'NT'{os="kalle",bool=true}]),
- roundtrip('NTImp', [#'Imp'{os="kalle",bool=true},#'Imp'{os="kalle",bool=true}]),
- roundtrip('ImpImp', [#'Imp'{os="kalle",bool=true},#'Imp'{os="kalle",bool=true}]),
- roundtrip('ExpImp', [#'Imp'{os="kalle",bool=true},#'Imp'{os="kalle",bool=true}]),
- roundtrip('NTExp', [#'Exp'{os="kalle",bool=true},#'Exp'{os="kalle",bool=true}]),
- roundtrip('ImpExp', [#'Exp'{os="kalle",bool=true},#'Exp'{os="kalle",bool=true}]),
- roundtrip('ExpExp', [#'Exp'{os="kalle",bool=true},#'Exp'{os="kalle",bool=true}]),
- roundtrip('XNTNT', [#'XSetNT'{os="kalle",bool=true},#'XSetNT'{os="kalle",bool=true}]),
- roundtrip('XImpNT', [#'XSetNT'{os="kalle",bool=true},#'XSetNT'{os="kalle",bool=true}]),
- roundtrip('XExpNT', [#'XSetNT'{os="kalle",bool=true},#'XSetNT'{os="kalle",bool=true}]),
- roundtrip('XNTImp', [#'XSetImp'{os="kalle",bool=true},#'XSetImp'{os="kalle",bool=true}]),
- roundtrip('XImpImp', [#'XSetImp'{os="kalle",bool=true},#'XSetImp'{os="kalle",bool=true}]),
- roundtrip('XExpImp', [#'XSetImp'{os="kalle",bool=true},#'XSetImp'{os="kalle",bool=true}]),
- roundtrip('XNTExp', [#'XSetExp'{os="kalle",bool=true},#'XSetExp'{os="kalle",bool=true}]),
- roundtrip('XImpExp', [#'XSetExp'{os="kalle",bool=true},#'XSetExp'{os="kalle",bool=true}]),
- roundtrip('XExpExp', [#'XSetExp'{os="kalle",bool=true},#'XSetExp'{os="kalle",bool=true}]),
+ roundtrip('NTNT', [#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]),
+ roundtrip('ImpNT', [#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]),
+ roundtrip('ExpNT', [#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]),
+ roundtrip('NTImp', [#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('ImpImp', [#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('ExpImp', [#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('NTExp', [#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('ImpExp', [#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('ExpExp', [#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('XNTNT', [#'XSetNT'{os = <<"kalle">>,bool=true},
+ #'XSetNT'{os = <<"kalle">>,bool=true}]),
+ roundtrip('XImpNT', [#'XSetNT'{os = <<"kalle">>,bool=true},
+ #'XSetNT'{os = <<"kalle">>,bool=true}]),
+ roundtrip('XExpNT', [#'XSetNT'{os = <<"kalle">>,bool=true},
+ #'XSetNT'{os = <<"kalle">>,bool=true}]),
+ roundtrip('XNTImp', [#'XSetImp'{os = <<"kalle">>,bool=true},
+ #'XSetImp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('XImpImp', [#'XSetImp'{os = <<"kalle">>,bool=true},
+ #'XSetImp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('XExpImp', [#'XSetImp'{os = <<"kalle">>,bool=true},
+ #'XSetImp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('XNTExp', [#'XSetExp'{os = <<"kalle">>,bool=true},
+ #'XSetExp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('XImpExp', [#'XSetExp'{os = <<"kalle">>,bool=true},
+ #'XSetExp'{os = <<"kalle">>,bool=true}]),
+ roundtrip('XExpExp', [#'XSetExp'{os = <<"kalle">>,bool=true},
+ #'XSetExp'{os = <<"kalle">>,bool=true}]),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSetOfTag.erl b/lib/asn1/test/testSetOfTag.erl
index 81bc467abb..0d656f05a6 100644
--- a/lib/asn1/test/testSetOfTag.erl
+++ b/lib/asn1/test/testSetOfTag.erl
@@ -42,42 +42,42 @@
-record('Exp',{os, bool}).
main(_Rules) ->
- roundtrip('SetTagNt', #'SetTagNt'{nt=[#'NT'{os="kalle",bool=true},
- #'NT'{os="kalle",bool=true}]}),
- roundtrip('SetTagNtI', #'SetTagNtI'{imp=[#'Imp'{os="kalle",bool=true},
- #'Imp'{os="kalle",bool=true}]}),
- roundtrip('SetTagNtE', #'SetTagNtE'{exp=[#'Exp'{os="kalle",bool=true},
- #'Exp'{os="kalle",bool=true}]}),
- roundtrip('SetTagI', #'SetTagI'{nt=[#'NT'{os="kalle",bool=true},
- #'NT'{os="kalle",bool=true}]}),
- roundtrip('SetTagII', #'SetTagII'{imp=[#'Imp'{os="kalle",bool=true},
- #'Imp'{os="kalle",bool=true}]}),
- roundtrip('SetTagIE', #'SetTagIE'{exp=[#'Exp'{os="kalle",bool=true},
- #'Exp'{os="kalle",bool=true}]}),
- roundtrip('SetTagE', #'SetTagE'{nt=[#'NT'{os="kalle",bool=true},
- #'NT'{os="kalle",bool=true}]}),
- roundtrip('SetTagEI', #'SetTagEI'{imp=[#'Imp'{os="kalle",bool=true},
- #'Imp'{os="kalle",bool=true}]}),
- roundtrip('SetTagEE', #'SetTagEE'{exp=[#'Exp'{os="kalle",bool=true},
- #'Exp'{os="kalle",bool=true}]}),
- roundtrip('SetTagXNt', #'SetTagXNt'{xnt=[#'XSetNT'{os="kalle",bool=true},
- #'XSetNT'{os="kalle",bool=true}]}),
- roundtrip('SetTagXI', #'SetTagXI'{ximp=[#'XSetImp'{os="kalle",bool=true},
- #'XSetImp'{os="kalle",bool=true}]}),
- roundtrip('SetTagXE', #'SetTagXE'{xexp=[#'XSetExp'{os="kalle",bool=true},
- #'XSetExp'{os="kalle",bool=true}]}),
- roundtrip('SetTagImpX', #'SetTagImpX'{xnt=[#'XSetNT'{os="kalle",bool=true},
- #'XSetNT'{os="kalle",bool=true}],
- ximp=[#'XSetImp'{os="kalle",bool=true},
- #'XSetImp'{os="kalle",bool=true}],
- xexp=[#'XSetExp'{os="kalle",bool=true},
- #'XSetExp'{os="kalle",bool=true}]}),
- roundtrip('SetTagExpX', #'SetTagExpX'{xnt=[#'XSetNT'{os="kalle",bool=true},
- #'XSetNT'{os="kalle",bool=true}],
- ximp=[#'XSetImp'{os="kalle",bool=true},
- #'XSetImp'{os="kalle",bool=true}],
- xexp=[#'XSetExp'{os="kalle",bool=true},
- #'XSetExp'{os="kalle",bool=true}]}),
+ roundtrip('SetTagNt', #'SetTagNt'{nt=[#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagNtI', #'SetTagNtI'{imp=[#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagNtE', #'SetTagNtE'{exp=[#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagI', #'SetTagI'{nt=[#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagII', #'SetTagII'{imp=[#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagIE', #'SetTagIE'{exp=[#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagE', #'SetTagE'{nt=[#'NT'{os = <<"kalle">>,bool=true},
+ #'NT'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagEI', #'SetTagEI'{imp=[#'Imp'{os = <<"kalle">>,bool=true},
+ #'Imp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagEE', #'SetTagEE'{exp=[#'Exp'{os = <<"kalle">>,bool=true},
+ #'Exp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagXNt', #'SetTagXNt'{xnt=[#'XSetNT'{os = <<"kalle">>,bool=true},
+ #'XSetNT'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagXI', #'SetTagXI'{ximp=[#'XSetImp'{os = <<"kalle">>,bool=true},
+ #'XSetImp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagXE', #'SetTagXE'{xexp=[#'XSetExp'{os = <<"kalle">>,bool=true},
+ #'XSetExp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagImpX', #'SetTagImpX'{xnt=[#'XSetNT'{os = <<"kalle">>,bool=true},
+ #'XSetNT'{os = <<"kalle">>,bool=true}],
+ ximp=[#'XSetImp'{os = <<"kalle">>,bool=true},
+ #'XSetImp'{os = <<"kalle">>,bool=true}],
+ xexp=[#'XSetExp'{os = <<"kalle">>,bool=true},
+ #'XSetExp'{os = <<"kalle">>,bool=true}]}),
+ roundtrip('SetTagExpX', #'SetTagExpX'{xnt=[#'XSetNT'{os = <<"kalle">>,bool=true},
+ #'XSetNT'{os = <<"kalle">>,bool=true}],
+ ximp=[#'XSetImp'{os = <<"kalle">>,bool=true},
+ #'XSetImp'{os = <<"kalle">>,bool=true}],
+ xexp=[#'XSetExp'{os = <<"kalle">>,bool=true},
+ #'XSetExp'{os = <<"kalle">>,bool=true}]}),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSetTag.erl b/lib/asn1/test/testSetTag.erl
index 5863a149b9..fa1d84f50d 100644
--- a/lib/asn1/test/testSetTag.erl
+++ b/lib/asn1/test/testSetTag.erl
@@ -34,24 +34,24 @@
-record('Exp',{os, bool}).
main(_Rules) ->
- roundtrip('SetTag', #'SetTag'{nt=#'NT'{os="kalle",bool=true},
- imp=#'Imp'{os="kalle",bool=true},
- exp=#'Exp'{os="kalle",bool=true}}),
- roundtrip('SetTagImp', #'SetTagImp'{nt=#'NT'{os="kalle",bool=true},
- imp=#'Imp'{os="kalle",bool=true},
- exp=#'Exp'{os="kalle",bool=true}}),
- roundtrip('SetTagExp', #'SetTagExp'{nt=#'NT'{os="kalle",bool=true},
- imp=#'Imp'{os="kalle",bool=true},
- exp=#'Exp'{os="kalle",bool=true}}),
- roundtrip('SetTagX', #'SetTagX'{xnt=#'XSetNT'{os="kalle",bool=true},
- ximp=#'XSetImp'{os="kalle",bool=true},
- xexp=#'XSetExp'{os="kalle",bool=true}}),
- roundtrip('SetTagImpX', #'SetTagImpX'{xnt=#'XSetNT'{os="kalle",bool=true},
- ximp=#'XSetImp'{os="kalle",bool=true},
- xexp=#'XSetExp'{os="kalle",bool=true}}),
- roundtrip('SetTagExpX', #'SetTagExpX'{xnt=#'XSetNT'{os="kalle",bool=true},
- ximp=#'XSetImp'{os="kalle",bool=true},
- xexp=#'XSetExp'{os="kalle",bool=true}}),
+ roundtrip('SetTag', #'SetTag'{nt=#'NT'{os = <<"kalle">>,bool=true},
+ imp=#'Imp'{os = <<"kalle">>,bool=true},
+ exp=#'Exp'{os = <<"kalle">>,bool=true}}),
+ roundtrip('SetTagImp', #'SetTagImp'{nt=#'NT'{os = <<"kalle">>,bool=true},
+ imp=#'Imp'{os = <<"kalle">>,bool=true},
+ exp=#'Exp'{os = <<"kalle">>,bool=true}}),
+ roundtrip('SetTagExp', #'SetTagExp'{nt=#'NT'{os = <<"kalle">>,bool=true},
+ imp=#'Imp'{os = <<"kalle">>,bool=true},
+ exp=#'Exp'{os = <<"kalle">>,bool=true}}),
+ roundtrip('SetTagX', #'SetTagX'{xnt=#'XSetNT'{os = <<"kalle">>,bool=true},
+ ximp=#'XSetImp'{os = <<"kalle">>,bool=true},
+ xexp=#'XSetExp'{os = <<"kalle">>,bool=true}}),
+ roundtrip('SetTagImpX', #'SetTagImpX'{xnt=#'XSetNT'{os = <<"kalle">>,bool=true},
+ ximp=#'XSetImp'{os = <<"kalle">>,bool=true},
+ xexp=#'XSetExp'{os = <<"kalle">>,bool=true}}),
+ roundtrip('SetTagExpX', #'SetTagExpX'{xnt=#'XSetNT'{os = <<"kalle">>,bool=true},
+ ximp=#'XSetImp'{os = <<"kalle">>,bool=true},
+ xexp=#'XSetExp'{os = <<"kalle">>,bool=true}}),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSetTypeRefCho.erl b/lib/asn1/test/testSetTypeRefCho.erl
index 8d62f45bfa..97bbd557e0 100644
--- a/lib/asn1/test/testSetTypeRefCho.erl
+++ b/lib/asn1/test/testSetTypeRefCho.erl
@@ -29,10 +29,10 @@
main(_Rules) ->
roundtrip('SetTRcho',
- #'SetTRcho'{'setCho' = {choOs,"A string 1"},
- 'setChoE' = {choOs,"A string 3"},
- 'setCho-E' = {choOs,"A string 7"},
- 'setChoE-E' = {choOs,"A string 9"}}),
+ #'SetTRcho'{'setCho' = {choOs,<<"A string 1">>},
+ 'setChoE' = {choOs,<<"A string 3">>},
+ 'setCho-E' = {choOs,<<"A string 7">>},
+ 'setChoE-E' = {choOs,<<"A string 9">>}}),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSetTypeRefPrim.erl b/lib/asn1/test/testSetTypeRefPrim.erl
index cc2e157e68..d441fb789d 100644
--- a/lib/asn1/test/testSetTypeRefPrim.erl
+++ b/lib/asn1/test/testSetTypeRefPrim.erl
@@ -28,15 +28,15 @@
main(_Rules) ->
roundtrip('SetTR',
- #'SetTR'{'octStr' = "A string 1",
- 'octStrI' = "A string 2",
- 'octStrE' = "A string 3",
- 'octStr-I' = "A string 4",
- 'octStrI-I' = "A string 5",
- 'octStrE-I' = "A string 6",
- 'octStr-E' = "A string 7",
- 'octStrI-E' = "A string 8",
- 'octStrE-E' = "A string 9"}),
+ #'SetTR'{'octStr' = <<"A string 1">>,
+ 'octStrI' = <<"A string 2">>,
+ 'octStrE' = <<"A string 3">>,
+ 'octStr-I' = <<"A string 4">>,
+ 'octStrI-I' = <<"A string 5">>,
+ 'octStrE-I' = <<"A string 6">>,
+ 'octStr-E' = <<"A string 7">>,
+ 'octStrI-E' = <<"A string 8">>,
+ 'octStrE-E' = <<"A string 9">>}),
ok.
roundtrip(T, V) ->
diff --git a/lib/asn1/test/testSetTypeRefSeq.erl b/lib/asn1/test/testSetTypeRefSeq.erl
index 17af5c2922..a2b5f5745e 100644
--- a/lib/asn1/test/testSetTypeRefSeq.erl
+++ b/lib/asn1/test/testSetTypeRefSeq.erl
@@ -30,23 +30,23 @@
main(_Rules) ->
roundtrip('SetTRseq',
- #'SetTRseq'{'setSeq' = #'SetSeq'{seqOs = "A1",
+ #'SetTRseq'{'setSeq' = #'SetSeq'{seqOs = <<"A1">>,
seqInt = 2},
- 'setSeqI' = #'SetSeq'{seqOs = "A2",
+ 'setSeqI' = #'SetSeq'{seqOs = <<"A2">>,
seqInt = 2},
- 'setSeqE' = #'SetSeq'{seqOs = "A3",
+ 'setSeqE' = #'SetSeq'{seqOs = <<"A3">>,
seqInt = 2},
- 'setSeq-I' = #'SetSeqImp'{seqOs = "A4",
+ 'setSeq-I' = #'SetSeqImp'{seqOs = <<"A4">>,
seqInt = 2},
- 'setSeqI-I' = #'SetSeqImp'{seqOs = "A5",
+ 'setSeqI-I' = #'SetSeqImp'{seqOs = <<"A5">>,
seqInt = 2},
- 'setSeqE-I' = #'SetSeqImp'{seqOs = "A6",
+ 'setSeqE-I' = #'SetSeqImp'{seqOs = <<"A6">>,
seqInt = 2},
- 'setSeq-E' = #'SetSeqExp'{seqOs = "A7",
+ 'setSeq-E' = #'SetSeqExp'{seqOs = <<"A7">>,
seqInt = 2},
- 'setSeqI-E' = #'SetSeqExp'{seqOs = "A8",
+ 'setSeqI-E' = #'SetSeqExp'{seqOs = <<"A8">>,
seqInt = 2},
- 'setSeqE-E' = #'SetSeqExp'{seqOs = "A9",
+ 'setSeqE-E' = #'SetSeqExp'{seqOs = <<"A9">>,
seqInt = 2}}),
ok.
diff --git a/lib/asn1/test/testSetTypeRefSet.erl b/lib/asn1/test/testSetTypeRefSet.erl
index 8786e0fb4d..80a6be58c9 100644
--- a/lib/asn1/test/testSetTypeRefSet.erl
+++ b/lib/asn1/test/testSetTypeRefSet.erl
@@ -71,15 +71,15 @@ main(_Rules) ->
setS2=#'SetSTag_setS2'{b2=true,i2=22},
setS3=#'SetSTag_setS3'{b3=true,i3=33}}),
roundtrip('SetTRset',
- #'SetTRset'{setSet=#'SetSet'{setInt=2,setOs="A1"},
- setSetI=#'SetSet'{setInt=2,setOs="A2"},
- setSetE=#'SetSet'{setInt=2,setOs="A3"},
- 'setSet-I'=#'SetSetImp'{setInt=2,setOs="A4"},
- 'setSetI-I'=#'SetSetImp'{setInt=2,setOs="A5"},
- 'setSetE-I'=#'SetSetImp'{setInt=2,setOs="A6"},
- 'setSet-E'=#'SetSetExp'{setInt=2,setOs="A7"},
- 'setSetI-E'=#'SetSetExp'{setInt=2,setOs="A8"},
- 'setSetE-E'=#'SetSetExp'{setInt=2,setOs="A9"}}),
+ #'SetTRset'{setSet=#'SetSet'{setInt=2,setOs = <<"A1">>},
+ setSetI=#'SetSet'{setInt=2,setOs = <<"A2">>},
+ setSetE=#'SetSet'{setInt=2,setOs = <<"A3">>},
+ 'setSet-I'=#'SetSetImp'{setInt=2,setOs = <<"A4">>},
+ 'setSetI-I'=#'SetSetImp'{setInt=2,setOs = <<"A5">>},
+ 'setSetE-I'=#'SetSetImp'{setInt=2,setOs = <<"A6">>},
+ 'setSet-E'=#'SetSetExp'{setInt=2,setOs = <<"A7">>},
+ 'setSetI-E'=#'SetSetExp'{setInt=2,setOs = <<"A8">>},
+ 'setSetE-E'=#'SetSetExp'{setInt=2,setOs = <<"A9">>}}),
ok.
diff --git a/lib/asn1/test/testTimer.erl b/lib/asn1/test/testTimer.erl
index 0f02bab6e0..89bc2b463d 100644
--- a/lib/asn1/test/testTimer.erl
+++ b/lib/asn1/test/testTimer.erl
@@ -18,163 +18,141 @@
%%
%%
-module(testTimer).
--export([go/2]).
+-export([go/0]).
-include_lib("test_server/include/test_server.hrl").
-define(times, 5000).
val() ->
- _Value = {'H323-UserInformation',{'H323-UU-PDU',
- {callProceeding,
- {'CallProceeding-UUIE',
- {0,8,222},
- {'EndpointType',
- {'NonStandardParameter',
- {object,{0,9,237}},
- "O"},
- {'VendorIdentifier',
- {'H221NonStandard',62,63,16282},
- "OC",
- "OC"},
- {'GatekeeperInfo',
- {'NonStandardParameter',
- {object,{0,10,260}},
- "O"}},
- {'GatewayInfo',
- [{h320,
- {'H320Caps',
- {'NonStandardParameter',
- {object,{0,11,282}},
- "O"},
- [{'DataRate',
- {'NonStandardParameter',
- {object,
- {0,11,295}},
- "O"},
- 1290470518,
- 78}],
- [{'SupportedPrefix',
- {'NonStandardParameter',
- {object,
- {0,12,312}},
- "O"},
- {'h323-ID',"BM"}}]}}],
- {'NonStandardParameter',
- {object,{0,13,326}},
- "O"}},
- {'McuInfo',
- {'NonStandardParameter',
- {object,{1,13,340,340}},
- "OC"}},
- {'TerminalInfo',
- {'NonStandardParameter',
- {object,{1,14,353,354}},
- "OC"}},
- true,
- true},
- {ipxAddress,
- {'TransportAddress_ipxAddress',
- "OCTET ",
- "OCTE",
- "OC"}},
- {'CallIdentifier',"OCTET STRINGOCTE"},
- {noSecurity,'NULL'},
- [{'ClearToken',
- 1667517741,
- "BM",
- {'DHset',[1],[1],[1]},
- "OCTET STR",
- -26430296,
- {'TypedCertificate',
- {1,16,405,406},
- "OC"},
- "BMP",
- {'NonStandardParameter',
- {1,16,414,415},
- "OC"}},
- {'ClearToken',
- 1817656756,
- "BMP",
- {'DHset',[1],[1],[1]},
- "OCTET STRI",
- -16356110,
- {'TypedCertificate',
- {1,17,442,443},
- "OC"},
- "BMP",
- {'NonStandardParameter',
- {1,18,452,452},
- "OC"}}],
- [{cryptoGKPwdEncr,
- {'CryptoH323Token_cryptoGKPwdEncr',
- {1,18,467,467},
- {'Params',-7477016,"OCTET ST"},
- "OC"}},
- {cryptoGKPwdEncr,
- {'CryptoH323Token_cryptoGKPwdEncr',
- {1,19,486,486},
- {'Params',-2404513,"OCTET ST"},
- []}}],
- []}},
- {'NonStandardParameter',{object,{0,3,84}},[]},
- [],
- true,
- [],
- []},
- {'H323-UserInformation_user-data',24,"O"}}.
+ {'H323-UserInformation',{'H323-UU-PDU',
+ {callProceeding,
+ {'CallProceeding-UUIE',
+ {0,8,222},
+ {'EndpointType',
+ {'NonStandardParameter',
+ {object,{0,9,237}},
+ <<"O">>},
+ {'VendorIdentifier',
+ {'H221NonStandard',62,63,16282},
+ <<"OC">>,
+ <<"OC">>},
+ {'GatekeeperInfo',
+ {'NonStandardParameter',
+ {object,{0,10,260}},
+ <<"O">>}},
+ {'GatewayInfo',
+ [{h320,
+ {'H320Caps',
+ {'NonStandardParameter',
+ {object,{0,11,282}},
+ <<"O">>},
+ [{'DataRate',
+ {'NonStandardParameter',
+ {object,
+ {0,11,295}},
+ <<"O">>},
+ 1290470518,
+ 78}],
+ [{'SupportedPrefix',
+ {'NonStandardParameter',
+ {object,
+ {0,12,312}},
+ <<"O">>},
+ {'h323-ID',"BM"}}]}}],
+ {'NonStandardParameter',
+ {object,{0,13,326}},
+ <<"O">>}},
+ {'McuInfo',
+ {'NonStandardParameter',
+ {object,{1,13,340,340}},
+ <<"OC">>}},
+ {'TerminalInfo',
+ {'NonStandardParameter',
+ {object,{1,14,353,354}},
+ <<"OC">>}},
+ true,
+ true},
+ {ipxAddress,
+ {'TransportAddress_ipxAddress',
+ <<"OCTET ">>,
+ <<"OCTE">>,
+ <<"OC">>}},
+ {'CallIdentifier',<<"OCTET STRINGOCTE">>},
+ {noSecurity,'NULL'},
+ [{'ClearToken',
+ 1667517741,
+ "BM",
+ {'DHset',<<1:1>>,<<1:1>>,<<1:1>>},
+ <<"OCTET STR">>,
+ -26430296,
+ {'TypedCertificate',
+ {1,16,405,406},
+ <<"OC">>},
+ "BMP",
+ {'NonStandardParameter',
+ {1,16,414,415},
+ <<"OC">>}},
+ {'ClearToken',
+ 1817656756,
+ "BMP",
+ {'DHset',<<1:1>>,<<1:1>>,<<1:1>>},
+ <<"OCTET STRI">>,
+ -16356110,
+ {'TypedCertificate',
+ {1,17,442,443},
+ <<"OC">>},
+ "BMP",
+ {'NonStandardParameter',
+ {1,18,452,452},
+ <<"OC">>}}],
+ [{cryptoGKPwdEncr,
+ {'CryptoH323Token_cryptoGKPwdEncr',
+ {1,18,467,467},
+ {'Params',-7477016,<<"OCTET ST">>},
+ <<"OC">>}},
+ {cryptoGKPwdEncr,
+ {'CryptoH323Token_cryptoGKPwdEncr',
+ {1,19,486,486},
+ {'Params',-2404513,<<"OCTET ST">>},
+ <<>>}}],
+ []}},
+ {'NonStandardParameter',{object,{0,3,84}},<<>>},
+ [],
+ true,
+ [],
+ []},
+ {'H323-UserInformation_user-data',24,<<"O">>}}.
-go(Config, _Enc) ->
- ?line true = code:add_patha(?config(priv_dir,Config)),
-
+go() ->
Module = 'H323-MESSAGES',
Type = 'H323-UserInformation',
Value = val(),
- {ok,Bytes} = asn1rt:encode(Module,Type,Value),
+ Bytes = Module:encode(Type, Value),
+ Value = Module:decode(Type, Bytes),
- CompileOptions = compile_options(),
-
{ValWr,done} = timer:tc(fun() -> encode(?times, Module, Type, Value) end),
- ?line io:format("ASN1 encode ~p: ~p micro~n", [CompileOptions, ValWr / ?times]),
+ io:format("ASN.1 encoding: ~p micro~n", [ValWr / ?times]),
done = decode(2, Module, Type, Bytes),
{ValRead,done} = timer:tc(fun() -> decode(?times, Module, Type, Bytes) end),
- ?line io:format("ASN1 decode ~p: ~p micro~n", [CompileOptions, ValRead /?times]),
-
+ io:format("ASN.1 decoding: ~p micro~n", [ValRead /?times]),
- ?line Comment = "encode: "++integer_to_list(round(ValWr/?times))++
- " micro, decode: "++integer_to_list(round(ValRead /?times))++
- " micro. " ++ CompileOptions,
+ Comment = "encode: "++integer_to_list(round(ValWr/?times)) ++
+ " micro, decode: "++integer_to_list(round(ValRead /?times)) ++
+ " micro. [" ++ atom_to_list(Module:encoding_rule()) ++ "]",
{comment,Comment}.
encode(0, _Module,_Type,_Value) ->
done;
encode(N, Module,Type,Value) ->
- ?line {ok,B} = asn1rt:encode(Module,Type,Value),
- _B2 = if
- is_list(B) -> list_to_binary(B);
- true -> B
- end,
- encode(N-1, Module,Type,Value).
+ Module:encode(Type, Value),
+ encode(N-1, Module, Type, Value).
decode(0, _Module, _Type, _Value) ->
done;
decode(N, Module, Type, Value) ->
- {ok,_B} = asn1rt:decode(Module, Type, Value),
+ Module:decode(Type, Value),
decode(N-1, Module, Type, Value).
-
-compile_options() ->
- {ok,Info} = asn1rt:info('H323-MESSAGES'),
- case lists:keyfind(options, 1, Info) of
- {_,Opts0} ->
- Opts1 = [X || X <- Opts0,
- (X =:= ber orelse
- X =:= per orelse
- X =:= uper)],
- lists:flatten(io_lib:format("~p", [Opts1]));
- _ ->
- "[]"
- end.
-
diff --git a/lib/asn1/test/testTypeValueNotation.erl b/lib/asn1/test/testTypeValueNotation.erl
index b46d7177f5..2b5f3f74c1 100644
--- a/lib/asn1/test/testTypeValueNotation.erl
+++ b/lib/asn1/test/testTypeValueNotation.erl
@@ -24,7 +24,7 @@
-record('Seq', {octstr, int, bool, enum, bitstr, null, oid, vstr}).
main(_Rule, _Option) ->
- Value = #'Seq'{octstr = [1, 2, 3, 4],
+ Value = #'Seq'{octstr = <<1,2,3,4>>,
int = 12,
bool = true,
enum = a,
diff --git a/lib/megaco/src/binary/depend.mk b/lib/megaco/src/binary/depend.mk
index b9b86d3183..4225bc69dc 100644
--- a/lib/megaco/src/binary/depend.mk
+++ b/lib/megaco/src/binary/depend.mk
@@ -28,7 +28,7 @@
# This means that the ASN.1 runtime library will be inlined.
#
-ASN1_CT_OPTS += +noobj
+ASN1_CT_OPTS += +noobj +legacy_erlang_types
ifeq ($(MEGACO_INLINE_ASN1_RT),true)
# We need atleast version 1.4.6 of the ANS.1 application
ASN1_CT_OPTS += +inline