%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2001-2010. 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(testTimer).

-compile(export_all).
%%-export([Function/Arity, ...]).

-include_lib("test_server/include/test_server.hrl").

-define(times, 5000).

compile(Config,Enc,Options) ->
    ?line DataDir = ?config(data_dir,Config),
    ?line OutDir = ?config(priv_dir,Config),
    ok = asn1ct:compile(DataDir++"H235-SECURITY-MESSAGES",[Enc,{outdir,OutDir}]++Options),
    ok = asn1ct:compile(DataDir++"H323-MESSAGES",[Enc,{outdir,OutDir}]++Options).

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"}}.
    

go(Config,Enc) ->
    ?line true = code:add_patha(?config(priv_dir,Config)),

    Module = 'H323-MESSAGES',
    Type = 'H323-UserInformation',
    Value = val(),
%%    ok = asn1ct:compile(HelpModule,[Enc]),

%%    ok = asn1ct:compile(Module,[Enc]),
    ?line {ok,B} = asn1rt:encode(Module,Type,Value),
    Bytes = case Enc of
		ber_bin ->
		    list_to_binary(B);
		per_bin when is_list(B) ->
		    list_to_binary(B);
		per_bin ->
		    B;
		uper_bin ->
		    B;
		_ ->
		    %%lists:flatten(B)
		    list_to_binary(B)
	    end,

    CompileOptions = compile_options(),
    
    ?line {ValWr, done} = timer:tc(?MODULE, encode, [?times, Module, Type, Value]),
    ?line io:format("ASN1 encode ~p: ~p micro~n", [CompileOptions, ValWr / ?times]),

    ?line done = decode(2,Module,Type,Bytes,Enc),

    ?line {ValRead, done} = timer:tc(?MODULE, decode, [?times, Module, 
						 Type, Bytes,Enc]),
    ?line io:format("ASN1 decode ~p: ~p micro~n", [CompileOptions, ValRead /?times]),


    ?line Comment = "encode: "++integer_to_list(round(ValWr/?times))++
	" micro, decode: "++integer_to_list(round(ValRead /?times))++
	" micro.  " ++ CompileOptions,
    {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).

decode(0, _Module,_Type,_Value,_Erule) ->
    done;
decode(N, Module,Type,Value,Erule) ->
    case Erule of
	ber ->
	    ?line {ok,_B} = asn1rt:decode(Module,Type,binary_to_list(Value));
	per ->
	    ?line {ok,_B} = asn1rt:decode(Module,Type,binary_to_list(Value));
	_ ->
	    ?line {ok,_B} = asn1rt:decode(Module,Type,Value)
    end,
    decode(N-1, Module,Type,Value,Erule).

compile_options() ->
    ?line {ok,Info} = asn1rt:info('H323-MESSAGES'),
    case lists:keysearch(options,1,Info) of
	{_,{_,Opts}} ->
	    Opts2 = 
		case lists:member(ber_bin_v2,Opts) of
		    true ->
			[ber_bin,optimize] ++ lists:delete(optimize,Opts);
		    _ ->
			Opts
		end,
	    Opts3 = [X||X <- Opts2,
			(X == ber orelse
			 X == ber_bin orelse
			 X == per orelse
			 X == per_bin orelse
			 X == optimize orelse
			 X == driver)],
	    lists:flatten(io_lib:format("~p",[Opts3]));
	_ ->
	    "[]"
    end.
    
