%% %% %CopyrightBegin% %% %% Copyright Ericsson AB 1997-2017. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% %% %CopyrightEnd% %% %% -module(testPrim). -export([bool/1]). -export([int/1]). -export([enum/1]). -export([obj_id/1]). -export([rel_oid/1]). -export([null/1]). -export([real/1]). -include_lib("common_test/include/ct.hrl"). bool(Rules) -> Types = ['Bool','BoolCon','BoolPri','BoolApp', 'BoolExpCon','BoolExpPri','BoolExpApp'], [roundtrip(T, V) || T <- Types, V <- [true,false]], Tag = case Rules of ber -> encode_boolean; _ -> illegal_boolean end, [{Tag,517} = enc_error(T, 517) || T <- Types], ok. int(Rules) -> %% OTP-2666: encoding should use minimum number of octets; x.690 8.3.2 Bytes0 = roundtrip('Int', -128), case Rules of ber -> <<_,1,128>> = Bytes0; _ -> ok end, Values = [0,2,3,4,127,128,254,255,256,257,444, 16383,16384,16385,65534,65535,65536,65537, 123456789,12345678901234567890, -1,-2,-3,-4,-100,-127,-255,-256,-257, -1234567890,-2147483648], Types = ['Int','IntCon','IntPri','IntApp', 'IntExpCon','IntExpPri','IntExpApp'], _ = [roundtrip(T, V) || T <- Types, V <- [1|Values]], Tag = case Rules of ber -> encode_integer; _ -> illegal_integer end, _ = [{Tag,V} = enc_error(T, V) || T <- Types, V <- [atom,42.0,{a,b,c}]], case Rules of ber -> ok; _ -> _ = [{Tag,V} = enc_error('IntConstrained', V) || V <- [atom,-1,256,42.0]] end, %%========================================================== %% IntEnum ::= INTEGER {first(1),last(31)} %%========================================================== [roundtrip('IntEnum', V) || V <- Values], roundtrip('IntEnum', first), roundtrip('IntEnum', last), roundtrip('ASeq', {'ASeq',true,254,false,255,true,256,true,68789}), roundtrip('ASeq', {'ASeq',false,250,true,200,true,199,true,77788}), roundtrip('ASeq', {'ASeq',true,0,false,0,true,0,true,68789}), %%========================================================== %% Longitude ::= INTEGER { %% oneMicrodegreeEast(10), %% oneMicrodegreeWest(-10), %% unavailable(1800000001) %% } (-1799999999..1800000001) %%========================================================== Enc10 = encoding(Rules, oneMicrodegreeEast), Enc10 = roundtrip('Longitude', oneMicrodegreeEast), Enc10 = roundtrip('Longitude', 10, oneMicrodegreeEast), Enc20 = encoding(Rules, oneMicrodegreeWest), Enc20 = roundtrip('Longitude', oneMicrodegreeWest), Enc20 = roundtrip('Longitude', -10, oneMicrodegreeWest), Enc30 = roundtrip('Longitude', unavailable), Enc30 = roundtrip('Longitude', 1800000001, unavailable), ok. encoding(Rules, Type) -> asn1_test_lib:hex_to_bin(encoding_1(Rules, Type)). encoding_1(ber, oneMicrodegreeEast) -> "02010A"; encoding_1(per, oneMicrodegreeEast) -> "C06B49D2 09"; encoding_1(uper, oneMicrodegreeEast) -> "6B49D209"; encoding_1(ber, oneMicrodegreeWest) -> "0201F6"; encoding_1(per, oneMicrodegreeWest) -> "C06B49D1 F5"; encoding_1(uper, oneMicrodegreeWest) -> "6B49D1F5". enum(Rules) -> %%========================================================== %% Enum ::= ENUMERATED {monday(1),tuesday(2),wednesday(3),thursday(4), %% friday(5),saturday(6),sunday(7)} %%========================================================== roundtrip('Enum', monday), roundtrip('Enum', thursday), Tag = case Rules of ber -> enumerated_not_in_range; _ -> illegal_enumerated end, {Tag,4} = enc_error('Enum', 4), case Rules of Per when Per =:= per; Per =:= uper -> <<0>> = roundtrip('SingleEnumVal', true), <<0>> = roundtrip('SingleEnumValExt', true); ber -> ok end, roundtrip('NegEnumVal', neg), roundtrip('NegEnumVal', zero), roundtrip('EnumVal128', val), ok. obj_id(_) -> %%========================================================== %% ObjId ::= OBJECT IDENTIFIER %%========================================================== [roundtrip('ObjId', V) || V <- [{0,22,3},{1,39,3},{2,100,3},{2,16303,3},{2,16304,3}]], ok. rel_oid(_Rules) -> %%========================================================== %% RelOid ::= RELATIVE-OID %%========================================================== [roundtrip('RelOid', V) || V <- [{0,22,3},{1,39,3},{2,100,3},{2,16303,3}, {2,16304,3},{8,16304,16#ffff}]], ok. null(_Rules) -> %%========================================================== %% Null ::= NULL %%========================================================== roundtrip('Null', monday, 'NULL'), ok. roundtrip(T, V) -> roundtrip(T, V, V). roundtrip(Type, Value, ExpectedValue) -> case get(no_ok_wrapper) of false -> asn1_test_lib:roundtrip_enc('Prim', Type, Value, ExpectedValue); true -> M = 'Prim', Enc = M:encode(Type, Value), ExpectedValue = M:decode(Type, Enc), Enc end. enc_error(T, V) -> case get(no_ok_wrapper) of false -> {error,{asn1,{Reason,Stk}}} = 'Prim':encode(T, V), [{_,_,_,_}|_] = Stk, Reason; true -> try 'Prim':encode(T, V) of _ -> ?t:fail() catch _:{error,{asn1,Reason}} -> Reason end end. real(_Rules) -> %%========================================================== %% AngleInRadians ::= REAL %%========================================================== %% Base 2 real_roundtrip('AngleInRadians', {1,2,1}), real_roundtrip('AngleInRadians', {129,2,1}), real_roundtrip('AngleInRadians', {128,2,1}, {1,2,8}), real_roundtrip('AngleInRadians', {128,2,-7}, {1,2,0}), real_roundtrip('AngleInRadians', {16#f1f1f1,2,128}), %% Base 10, tuple format real_roundtrip('AngleInRadians', {1,10,1}, "1.E1"), real_roundtrip('AngleInRadians', {100,10,1}, "1.E3"), real_roundtrip('AngleInRadians', {-100,10,1}, "-1.E3"), real_roundtrip('AngleInRadians', {2,10,1}, "2.E1"), real_roundtrip('AngleInRadians', {123000,10,0}, "123.E3"), real_roundtrip('AngleInRadians', {123456789,10,123456789}, "123456789.E123456789" ), real_roundtrip('AngleInRadians', {-12345,10,-12345}, "-12345.E-12345"), %% Base 10, string format NR3 real_roundtrip('AngleInRadians', "123.123E123", "123123.E120"), real_roundtrip('AngleInRadians', "0.0E0", "0.E+0"), real_roundtrip('AngleInRadians', "0.0123", "123.E-4"), real_roundtrip('AngleInRadians', "0", "0.E+0"), real_roundtrip('AngleInRadians', "-123.45", "-12345.E-2"), real_roundtrip('AngleInRadians', "123456789E123456789", "123456789.E123456789"), real_roundtrip('AngleInRadians', "01.000E1", "1.E1"), real_roundtrip('AngleInRadians', "120.0001", "1200001.E-4"), ok. real_roundtrip(T, V) -> real_roundtrip(T, V, V). real_roundtrip(Type, Value, ExpectedValue) -> case get(no_ok_wrapper) of false -> asn1_test_lib:roundtrip('Real', Type, Value, ExpectedValue); true -> M = 'Real', ExpectedValue = M:decode(Type, M:encode(Type, Value)), ok end.