aboutsummaryrefslogblamecommitdiffstats
path: root/lib/eldap/test/eldap_connections_SUITE.erl
blob: c5460fef0912de7117ceb5f6945b81432a0677fd (plain) (tree)




























                                                                         





























                                                                              




                                 
 



                                       









                                                                      

                                      
                                                                      






                                                                   


                                                     

                                                  
                                                            





                                                                           
 
 





                                                                   










                                                                           
                                                                                

























                                                                                              
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2012-2014. 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(eldap_connections_SUITE).

-compile(export_all).

-include_lib("common_test/include/ct.hrl").
%-include_lib("eldap/include/eldap.hrl").


all() ->
    [
     {group, v4},
     {group, v6}
    ].

     
init_per_group(v4, Config) ->
    [{listen_opts,  []},
     {listen_host,  "localhost"},
     {connect_opts, []}
     |  Config];
init_per_group(v6, Config) ->
    {ok, Hostname} = inet:gethostname(),
    case lists:member(list_to_atom(Hostname), ct:get_config(ipv6_hosts,[])) of
	true -> 
	    [{listen_opts,  [inet6]},
	     {listen_host,  "::"},
	     {connect_opts, [{tcpopts,[inet6]}]}
	     |  Config];
	false -> 
	    {skip, io_lib:format("~p is not an ipv6_host",[Hostname])}
    end.


end_per_group(_GroupName, Config) ->
    Config.


groups() ->
    [{v4, [], [tcp_connection, tcp_connection_option]},
     {v6, [], [tcp_connection, tcp_connection_option]}
    ].


init_per_suite(Config) -> Config.


end_per_suite(_Config) -> ok.


init_per_testcase(_TestCase, Config) ->
    case gen_tcp:listen(0, proplists:get_value(listen_opts,Config)) of
	{ok,LSock} ->
	    {ok,{_,Port}} = inet:sockname(LSock),
	    [{listen_socket,LSock},
	     {listen_port,Port}
	     | Config];
	Other ->
	    {fail, Other}
    end.


end_per_testcase(_TestCase, Config) ->
    catch gen_tcp:close( proplists:get_value(listen_socket, Config) ).

%%%================================================================
%%%
%%% Test cases
%%% 
%%%----------------------------------------------------------------
tcp_connection(Config) ->
    Host = proplists:get_value(listen_host, Config),
    Port = proplists:get_value(listen_port, Config),
    Opts = proplists:get_value(connect_opts, Config),
    case eldap:open([Host], [{port,Port}|Opts]) of
	{ok,_H} ->
	    Sl = proplists:get_value(listen_socket, Config),
	    case gen_tcp:accept(Sl,1000) of
		{ok,_S} -> ok;
		{error,timeout} -> ct:fail("server side accept timeout",[])
	    end;
	Other -> ct:fail("eldap:open failed: ~p",[Other])
    end.


%%%----------------------------------------------------------------
tcp_connection_option(Config) -> 
    Host = proplists:get_value(listen_host, Config),
    Port = proplists:get_value(listen_port, Config),
    Opts = proplists:get_value(connect_opts, Config),
    Sl = proplists:get_value(listen_socket, Config),

    %% Make an option value to test.  The option must be implemented on all
    %% platforms that we test on.  Must check what the default value is
    %% so we don't happen to choose that particular value.
    {ok,[{linger,DefaultLinger}]} = inet:getopts(Sl, [linger]),
    TestLinger = case DefaultLinger of
		     {false,_} -> {true,5};
		     {true,_} -> {false,0}
		 end,

    case catch eldap:open([Host], 
			  [{port,Port},{tcpopts,[{linger,TestLinger}]}|Opts]) of
	{ok,H} ->
	    case gen_tcp:accept(Sl,1000) of
		{ok,_} -> 
		    case eldap:getopts(H, [{tcpopts,[linger]}]) of
			{ok,[{tcpopts,[{linger,ActualLinger}]}]} ->
			    case ActualLinger of
				TestLinger -> 
				    ok;
				DefaultLinger ->
				    ct:fail("eldap:getopts: 'linger' didn't change,"
					    " got ~p (=default) expected ~p",
					    [ActualLinger,TestLinger]);
				_ ->
				    ct:fail("eldap:getopts: bad 'linger', got ~p expected ~p",
					    [ActualLinger,TestLinger])
			    end;
			Other ->
			    ct:fail("eldap:getopts: bad result ~p",[Other])
		    end;
		{error,timeout} -> 
		    ct:fail("server side accept timeout",[])
	    end;

	Other ->
	    ct:fail("eldap:open failed: ~p",[Other])
    end.