aboutsummaryrefslogtreecommitdiffstats
path: root/lib/asn1/test/test_inline.erl
diff options
context:
space:
mode:
authorKenneth Lundin <[email protected]>2010-02-19 14:01:57 +0000
committerErlang/OTP <[email protected]>2010-02-19 14:01:57 +0000
commit18bd1239bee04427340a44f57f993ea92c264e41 (patch)
treedbb3031dcd2e446eb457ff7ac5229949517d7557 /lib/asn1/test/test_inline.erl
parent729565dc3f8bcf8829508136498aef6a542840f4 (diff)
downloadotp-18bd1239bee04427340a44f57f993ea92c264e41.tar.gz
otp-18bd1239bee04427340a44f57f993ea92c264e41.tar.bz2
otp-18bd1239bee04427340a44f57f993ea92c264e41.zip
OTP-8463 Support for EXTENSIBILITY IMPLIED and SET/SEQ OF NamedType is
added.
Diffstat (limited to 'lib/asn1/test/test_inline.erl')
-rw-r--r--lib/asn1/test/test_inline.erl285
1 files changed, 285 insertions, 0 deletions
diff --git a/lib/asn1/test/test_inline.erl b/lib/asn1/test/test_inline.erl
new file mode 100644
index 0000000000..aac003baf6
--- /dev/null
+++ b/lib/asn1/test/test_inline.erl
@@ -0,0 +1,285 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2004-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%
+-module(test_inline).
+
+-export([compile/3,main/1,inline1/3,performance/1,performance2/0]).
+-export([mvrasn_inlined_encdec/2,mvrasn_encdec/2,
+ mi_encdec/2,m_encdec/2]).
+
+-include("test_server.hrl").
+-define(times, 5000).
+-define(times2, 50000).
+
+compile(Config,_Rules,Opt) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line true = code:add_patha(DataDir),
+
+ ?line ok=asn1ct:compile(DataDir++"Mvrasn.set.asn",[{inline,mvrasn_inlined},{outdir,OutDir}]++Opt),
+ ?line ok=asn1ct:compile(DataDir++"Mvrasn-11-6.asn",[{outdir,OutDir}]++Opt),
+
+ ?line ok=asn1ct:compile(DataDir++"Mod.set.asn",[{inline,m},{outdir,OutDir}]++Opt),
+ ?line ok=remove_inlined_files(OutDir,[filename:join([OutDir,X])||X<-["m.erl","m.beam"]]),
+ ?line ok=asn1ct:compile(DataDir++"Mod.set.asn",[inline,{outdir,OutDir}]++Opt),
+ ?line ok=remove_inlined_files(OutDir,[]).
+
+inline1(Config,Rule,Opt) ->
+ ?line DataDir = ?config(data_dir,Config),
+ ?line OutDir = ?config(priv_dir,Config),
+
+ ?line ok=asn1ct:compile(DataDir++"P-Record",
+ [{inline,'inlined_P_Record'},
+ {outdir,OutDir}]++Opt),
+ ?line test_inline1(),
+
+ ?line ok=remove_inlined_files2(OutDir,ber_bin_v2),
+
+ case Rule of
+ ber_bin_v2 ->
+ ?line ok=asn1ct:compile(DataDir++"P-Record",
+ [inline,asn1config,ber_bin,optimize,
+ {outdir,OutDir}]++Opt),
+ ?line test_inline2(Rule,'P-Record'),
+ ?line remove_inlined_files3(OutDir,Rule),
+ io:format("compiling ~p~nwith ~p~n",
+ [DataDir ++ "p_record.set.asn",
+ [inline,asn1config,ber_bin,optimize,{outdir,OutDir}]++Opt]),
+ ?line ok = asn1ct:compile(DataDir ++ "p_record.set.asn",
+ [inline,asn1config,ber_bin,optimize,
+ {outdir,OutDir}]++Opt),
+ ?line test_inline2(Rule,'p_record'),
+ ?line remove_inlined_files4(OutDir,Rule);
+ _ ->
+ ok
+ end.
+
+main(_Erule) ->
+ ?line Val = val(),
+ ?line {ok,Bytes}=asn1_wrapper:encode(mvrasn_inlined,'InsertSubscriberDataArg',Val),
+ ?line {ok,_Val2}=asn1_wrapper:decode(mvrasn_inlined,'InsertSubscriberDataArg',Bytes).
+
+test_inline1() ->
+ PRecMsg = {'PersonnelRecord',{'Name',"Sven","S","Svensson"},
+ "manager",123,"20000202",{'Name',"Inga","K","Svensson"},
+ asn1_DEFAULT},
+ ?line {ok,Bytes}=asn1_wrapper:encode('inlined_P_Record','PersonnelRecord',
+ PRecMsg),
+ ?line {ok,_}=asn1_wrapper:decode('inlined_P_Record',
+ 'PersonnelRecord',Bytes).
+
+test_inline2(ber_bin_v2,Mod) ->
+ PRecMsg = {'PersonnelRecord',{'Name',"Sven","S","Svensson"},
+ "manager",123,"20000202",{'Name',"Inga","K","Svensson"},
+ asn1_DEFAULT},
+ ?line {ok,Bytes} = Mod:encode('PersonnelRecord',PRecMsg),
+ ?line {ok,_} = Mod:sel_dec(list_to_binary(Bytes));
+test_inline2(_,_) ->
+ ok.
+
+val() ->
+ ?line {ok,Val} = asn1ct:value('Mvrasn-11-6','InsertSubscriberDataArg'),
+ Val.
+
+performance(Config) ->
+ ?line true = code:add_patha(?config(priv_dir,Config)),
+ ?line true = code:add_patha(?config(data_dir,Config)),
+ ?line Val = val(),
+ %% warm up
+ timer:tc(?MODULE,mvrasn_inlined_encdec,[2,Val]),
+ %% performance test
+ ?line {Time1,ok}=timer:tc(?MODULE,mvrasn_inlined_encdec,[?times,Val]),
+ %% warm up
+ timer:tc(?MODULE,mvrasn_encdec,[2,Val]),
+ %% performance test
+ ?line {Time2,ok}=timer:tc(?MODULE,mvrasn_encdec,[?times,Val]),
+
+ ?line Comment = "inlined_code: "++
+ integer_to_list(round(Time1/?times))++
+ " micro,<br>original_code: "++
+ integer_to_list(round(Time2/?times))++
+% " micro,~ninlined_code[inline]: "++
+% integer_to_list(round(Time3/?times))++
+ " micro",
+ {comment,Comment}.
+
+
+mvrasn_inlined_encdec(0,_) ->
+ ok;
+mvrasn_inlined_encdec(N,V) ->
+ ?line {ok,B}=mvrasn_inlined:encode('InsertSubscriberDataArg',V),
+ ?line {ok,_R}=mvrasn_inlined:decode('InsertSubscriberDataArg',B),
+ mvrasn_inlined_encdec(N-1,V).
+
+mvrasn_encdec(0,_) ->
+ ok;
+mvrasn_encdec(N,V) ->
+ ?line {ok,B}='Mvrasn-11-6':encode('InsertSubscriberDataArg',V),
+ ?line {ok,_R}='Mvrasn-11-6':decode('InsertSubscriberDataArg',B),
+ mvrasn_encdec(N-1,V).
+
+%% mvrasn_inlined_i_encdec(0,_) ->
+%% ok;
+%% mvrasn_inlined_i_encdec(N,V) ->
+%% {ok,B}=mvrasn_inlined_i:encode('InsertSubscriberDataArg',V),
+%% {ok,_R}=mvrasn_inlined_i:decode('InsertSubscriberDataArg',B),
+%% mvrasn_inlined_i_encdec(N-1,V).
+
+performance2() ->
+ Val = mval(),
+ %% warm up
+ timer:tc(?MODULE,mi_encdec,[?times,Val]),
+ %% performance test
+ {Time1,_R1}=timer:tc(?MODULE,mi_encdec,[?times2,Val]),
+ %% warm up
+ timer:tc(?MODULE,m_encdec,[?times,Val]),
+ %% performance test
+ {Time2,_R2}=timer:tc(?MODULE,m_encdec,[?times2,Val]),
+ ?line Comment = "inlined_code: "++
+ integer_to_list(round(Time1/?times2))++
+ " micro,<br>original_code: "++
+ integer_to_list(round(Time2/?times2))++
+ " micro<br>"++
+ "The inlined code was "++
+ integer_to_list(round(((Time2-Time1)/Time2)*100))++
+ " % faster than the original code.",
+ {comment,Comment}.
+
+mi_encdec(0,_) ->
+ ok;
+mi_encdec(N,Val) ->
+ {ok,B}=m:encode('L',Val),
+ {ok,_R}=m:decode('L',B),
+% io:format("a"),
+ mi_encdec(N-1,Val).
+
+m_encdec(0,_) ->
+ ok;
+m_encdec(N,Val) ->
+ {ok,B}='Mod1':encode('L',Val),
+ {ok,_R}='Mod1':decode('L',B),
+ m_encdec(N-1,Val).
+
+
+-record('L', {country, region, name}).
+-record('OtherName', {locationName, thingName}).
+-record('FamilyName', {prefix, secondname}).
+-record('Lang', {l}).
+-record('Inhabitant', {name, country}).
+-record('Country', {name, language}).
+-record('PersonName', {name1, name2}).
+-record('LocName', {region, name}).
+-record('Reg', {name, inhabitants}).
+
+
+mval() ->
+ 'L'().
+'L'() ->
+ #'L'{
+ country='Co'(),
+ region='Reg'(),
+ name='Name'(othername)}.
+'Co'() ->
+ 'Country'().
+'Country'()->
+ #'Country'{name='Name'(othername),
+ language='Lang'()}.
+'Lang'()->
+ #'Lang'{l="englsh"}.
+'Reg'() ->
+ #'Reg'{
+ name='Name'(othername),
+ inhabitants='Inhabitants'()}.
+'Inhabitants'()->
+ lists:duplicate(5,'Inhabitant'()).
+'Inhabitant'()->
+ #'Inhabitant'{name='Name'(person),
+ country='Country'()}.
+'Name'(person) ->
+ {person,'PersonName'()};
+'Name'(othername) ->
+ {othername,'OtherName'()}.
+'PersonName'()->
+ #'PersonName'{name1='FirstName'(firstname),
+ name2='FamilyName'()}.
+'OtherName'()->
+ #'OtherName'{locationName='LocName'(),
+ thingName='ThingName'()}.
+'FirstName'(firstname)->
+ {firstname,"Henry"};
+'FirstName'(nickname) ->
+ {nickname,"nick"}.
+'FamilyName'() ->
+ #'FamilyName'{prefix=none,
+ secondname="Lloyd"}.
+'ThingName'()->
+ "Enkoping".
+'LocName'()->
+ #'LocName'{
+ region=svealand,
+ name="Enkoping"}.
+
+remove_inlined_files(Dir,Files) ->
+ ModList=[filename:join([Dir,X])||X<-["Mod"]],
+ FileList=Files++ mods2files(ModList,".asn1db")++
+ mods2files(ModList,".beam")++
+ mods2files(ModList,".erl")++mods2files(ModList,".hrl"),
+ lists:foreach(fun(X) ->
+ io:format("X: ~p~n",[X]),
+ ?line ok=file:delete(X)
+ end,FileList),
+ ok.
+mods2files(ModList,Extension) ->
+ [X++Extension||X<-ModList].
+
+
+remove_inlined_files2(Dir,Rule) ->
+ ?line ok=remove_inlined_files3(Dir,Rule),
+ TargetErl=filename:join([Dir,"inlined_P_Record.erl"]),
+ TargetBeam=filename:join([Dir,"inlined_P_Record.beam"]),
+ lists:foreach(fun(X) ->
+ ?line ok=file:delete(X)
+ end,[TargetErl,TargetBeam]),
+ ok.
+remove_inlined_files3(Dir,ber_bin_v2) ->
+ Erl=filename:join([Dir,"P-Record.erl"]),
+ Beam=filename:join([Dir,"P-Record.beam"]),
+ Asn1DB=filename:join([Dir,"P-Record.asn1db"]),
+ Hrl=filename:join([Dir,"P-Record.hrl"]),
+ lists:foreach(fun(X) ->
+ ?line ok=file:delete(X)
+ end,[Erl,Beam,Asn1DB,Hrl]),
+ ok;
+remove_inlined_files3(_,_) ->
+ ok.
+
+remove_inlined_files4(Dir,ber_bin_v2) ->
+ Erl=filename:join([Dir,"p_record.erl"]),
+ Beam=filename:join([Dir,"p_record.beam"]),
+ Asn1DB=filename:join([Dir,"p_record.asn1db"]),
+ Hrl=filename:join([Dir,"p_record.hrl"]),
+ ErlBak=filename:join([Dir,"p_record.erl.bak"]),
+ file:delete(ErlBak),
+ lists:foreach(fun(X) ->
+ ?line ok=file:delete(X)
+ end,[Erl,Beam,Asn1DB,Hrl]),
+ ok;
+remove_inlined_files4(_,_) ->
+ ok.