%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1999-2016. 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(multi_ORB_SUITE).
-include_lib("common_test/include/ct.hrl").
-include_lib("orber/include/corba.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming.hrl").
-include_lib("orber/src/orber_iiop.hrl").
-include_lib("orber/src/ifr_objects.hrl").
-include("idl_output/orber_test_server.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming_NamingContextExt.hrl").
-include_lib("orber/COSS/CosNaming/CosNaming_NamingContext.hrl").
-define(default_timeout, test_server:minutes(15)).
-define(match(ExpectedRes,Expr),
fun() ->
AcTuAlReS = (catch (Expr)),
case AcTuAlReS of
ExpectedRes ->
io:format("------ CORRECT RESULT ------~n~p~n",
[AcTuAlReS]),
AcTuAlReS;
_ ->
io:format("###### ERROR ERROR ######~nRESULT: ~p~n",
[AcTuAlReS]),
exit(AcTuAlReS)
end
end()).
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2, cases/0,
init_per_suite/1, end_per_suite/1, basic_PI_api/1, multi_orber_api/1,
init_per_testcase/2, end_per_testcase/2, multi_pseudo_orber_api/1,
light_orber_api/1, light_orber2_api/1,
ssl_1_multi_orber_api/1, ssl_2_multi_orber_api/1, ssl_reconfigure_api/1,
iiop_timeout_api/1, iiop_timeout_added_api/1, setup_connection_timeout_api/1,
setup_multi_connection_timeout_api/1, setup_multi_connection_timeout_random_api/1,
setup_multi_connection_timeout_attempts_api/1,
fragments_server_api/1, fragments_max_server_api/1,
fragments_max_server_added_api/1, fragments_client_api/1,
light_ifr_api/1, max_requests_api/1, max_requests_added_api/1,
max_connections_api/1, max_packet_size_exceeded_api/1,
max_packet_size_ok_api/1, proxy_interface_api/1, proxy_interface_ipv6_api/1,
multiple_accept_api/1, implicit_context_api/1,
pseudo_implicit_context_api/1, pseudo_two_implicit_context_api/1,
oneway_implicit_context_api/1, implicit_context_roundtrip_api/1,
oneway_pseudo_implicit_context_api/1, flags_added_api/1,
oneway_pseudo_two_implicit_context_api/1,
local_interface_api/1, local_interface_ctx_override_api/1,
local_interface_acl_override_api/1, bad_giop_header_api/1,
bad_fragment_id_client_api/1, bad_id_cancel_request_api/1,
close_connections_api/1, close_connections_local_interface_api/1,
close_connections_local_interface_ctx_override_api/1,
ssl_1_multi_orber_generation_3_api/1, ssl_2_multi_orber_generation_3_api/1,
ssl_reconfigure_generation_3_api/1,
close_connections_alt_iiop_addr_api/1, close_connections_multiple_profiles_api/1]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
-export([pseudo_calls/2, pseudo_casts/2, create_fake_server_ORB/5, do_connect/3]).
%%-----------------------------------------------------------------
%% Func: all/1
%% Args:
%% Returns:
%%-----------------------------------------------------------------
suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
cases().
groups() ->
[].
init_per_group(_GroupName, Config) ->
Config.
end_per_group(_GroupName, Config) ->
Config.
%% NOTE - the fragment test cases must be first since we explicitly set a request
%% id. Otherwise, the request-id counter would be increased and we cannot know
%% what it is.
cases() ->
[fragments_server_api, fragments_max_server_api,
fragments_max_server_added_api, fragments_client_api,
flags_added_api, bad_fragment_id_client_api,
bad_giop_header_api, bad_id_cancel_request_api,
implicit_context_api, pseudo_implicit_context_api,
pseudo_two_implicit_context_api,
implicit_context_roundtrip_api,
oneway_implicit_context_api,
oneway_pseudo_implicit_context_api,
oneway_pseudo_two_implicit_context_api,
proxy_interface_api, proxy_interface_ipv6_api,
local_interface_api, local_interface_ctx_override_api,
local_interface_acl_override_api, close_connections_api,
close_connections_local_interface_api,
close_connections_local_interface_ctx_override_api,
close_connections_alt_iiop_addr_api,
close_connections_multiple_profiles_api,
multiple_accept_api, max_requests_api,
max_requests_added_api, max_connections_api,
max_packet_size_exceeded_api, max_packet_size_ok_api,
light_ifr_api, multi_pseudo_orber_api, multi_orber_api,
light_orber_api, light_orber2_api, basic_PI_api,
iiop_timeout_api, iiop_timeout_added_api,
setup_connection_timeout_api,
setup_multi_connection_timeout_api,
setup_multi_connection_timeout_attempts_api,
setup_multi_connection_timeout_random_api,
ssl_1_multi_orber_api,
ssl_1_multi_orber_generation_3_api,
ssl_2_multi_orber_api,
ssl_2_multi_orber_generation_3_api,
ssl_reconfigure_api,
ssl_reconfigure_generation_3_api].
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
init_per_testcase(TC,Config)
when TC =:= ssl_1_multi_orber_api;
TC =:= ssl_2_multi_orber_api;
TC =:= ssl_reconfigure_api ->
init_ssl(Config);
init_per_testcase(TC,Config)
when TC =:= ssl_1_multi_orber_generation_3_api;
TC =:= ssl_2_multi_orber_generation_3_api;
TC =:= ssl_reconfigure_generation_3_api ->
init_ssl_3(Config);
init_per_testcase(_Case, Config) ->
init_all(Config).
init_ssl(Config) ->
case proplists:get_value(crypto_started, Config) of
true ->
case orber_test_lib:ssl_version() of
no_ssl ->
{skip, "SSL is not installed!"};
_ ->
init_all(Config)
end;
false ->
{skip, "Crypto did not start"}
end.
init_ssl_3(Config) ->
case proplists:get_value(crypto_started, Config) of
true ->
case orber_test_lib:ssl_version() of
3 ->
init_all(Config);
2 ->
{skip, "Could not find the correct SSL version!"};
no_ssl ->
{skip, "SSL is not installed!"}
end;
false ->
{skip, "Crypto did not start"}
end.
init_all(Config) ->
Path = code:which(?MODULE),
code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
Dog=test_server:timetrap(?default_timeout),
orber:jump_start(0),
oe_orber_test_server:oe_register(),
[{watchdog, Dog}|Config].
end_per_testcase(_Case, Config) ->
oe_orber_test_server:oe_unregister(),
orber:jump_stop(),
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Dog = proplists:get_value(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
init_per_suite(Config) ->
if
is_list(Config) ->
try crypto:start() of
ok ->
[{crypto_started, true} | Config]
catch _:_ ->
[{crypto_started, false} | Config]
end;
true ->
exit("Config not a list")
end.
end_per_suite(Config) ->
application:stop(crypto),
Config.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB, no security
%%-----------------------------------------------------------------
%% IIOP Implicit Contex tests
implicit_context_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, ?ORB_ENV_LOCAL_INTERFACE},
{ip_address, IP}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
%% Create a remote server
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
IOR = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaname::1.2@"++IP++":"++integer_to_list(ServerPort)++"/NameService#mamba")),
Relay = ?match({_,_,_,_,_,_}, orber_test_server:oe_create([])),
?match(ok,
orber_test_server:
relay_call(Relay,
[{context,
[#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface,
Loopback}}]}],
IOR)),
?match([_,_], orber:iiop_connections(out)),
Conns = ?match([_,_],
orber_test_lib:remote_apply(ServerNode, orber, iiop_connections, [in])),
?match(true, lists:keymember(Loopback, 1, Conns)),
ok.
%% IIOP Implicit Contex roundtrip tests
implicit_context_roundtrip_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, ?ORB_ENV_LOCAL_INTERFACE},
{ip_address, IP}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
%% Create a remote server
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
Relay = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaname::1.2@"++IP++":"++integer_to_list(ServerPort)++"/NameService#mamba")),
IOR = ?match({_,_,_,_,_,_}, orber_test_server:oe_create([], [])),
?match(ok,
orber_test_server:
relay_call(Relay,
[{context,
[#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface,
Loopback}}]}],
IOR)),
?match([_,_], orber:iiop_connections(out)),
Conns = ?match([_,_],
orber_test_lib:remote_apply(ServerNode, orber, iiop_connections, [in])),
?match(true, lists:keymember(Loopback, 1, Conns)),
ok.
%% IIOP Implicit Contex oneway tests
oneway_implicit_context_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, ?ORB_ENV_LOCAL_INTERFACE},
{ip_address, IP}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
%% Create a remote server
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
IOR = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaname::1.2@"++IP++":"++integer_to_list(ServerPort)++"/NameService#mamba")),
Relay = ?match({_,_,_,_,_,_}, orber_test_server:oe_create([])),
?match(ok,
orber_test_server:
relay_cast(Relay,
[{context,
[#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface,
Loopback}}]}],
IOR)),
%% We must wait for a few seconds for the client to be able to set up the
%% connection (since it's a oneway operation).
timer:sleep(5000),
?match([_,_], orber:iiop_connections(out)),
Conns = ?match([_,_],
orber_test_lib:remote_apply(ServerNode, orber, iiop_connections, [in])),
?match(true, lists:keymember(Loopback, 1, Conns)),
ok.
%% IIOP Implicit Contex tests (via pseudo object)
pseudo_implicit_context_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, ?ORB_ENV_LOCAL_INTERFACE},
{ip_address, IP}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
%% Create a remote server
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
IOR = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaname::1.2@"++IP++":"++integer_to_list(ServerPort)++"/NameService#mamba")),
Relay = ?match({_,_,_,_,_,_}, orber_test_server:oe_create([], [{pseudo,true}])),
?match(ok,
orber_test_server:
relay_call(Relay,
[{context,
[#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface,
Loopback}}]}],
IOR)),
?match([_,_], orber:iiop_connections(out)),
Conns = ?match([_,_],
orber_test_lib:remote_apply(ServerNode, orber, iiop_connections, [in])),
?match(true, lists:keymember(Loopback, 1, Conns)),
ok.
%% IIOP two Implicit Contex tests (via pseudo object)
pseudo_two_implicit_context_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, ?ORB_ENV_LOCAL_INTERFACE},
{ip_address, IP}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
%% Create a remote server
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
IOR = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaname::1.2@"++IP++":"++integer_to_list(ServerPort)++"/NameService#mamba")),
Relay = ?match({_,_,_,_,_,_}, orber_test_server:oe_create([], [{pseudo,true}])),
put(oe_server_in_context,
[#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface,
IP}}]),
?match(ok,
orber_test_server:
relay_call(Relay,
[{context,
[#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface,
Loopback}}]}],
IOR)),
?match([_,_], orber:iiop_connections(out)),
Conns = ?match([_,_],
orber_test_lib:remote_apply(ServerNode, orber, iiop_connections, [in])),
?match(true, lists:keymember(Loopback, 1, Conns)),
ok.
%% IIOP Implicit Contex tests (via pseudo object oneway)
oneway_pseudo_implicit_context_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, ?ORB_ENV_LOCAL_INTERFACE},
{ip_address, IP}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
%% Create a remote server
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
IOR = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaname::1.2@"++IP++":"++integer_to_list(ServerPort)++"/NameService#mamba")),
Relay = ?match({_,_,_,_,_,_}, orber_test_server:oe_create([], [{pseudo,true}])),
?match(ok,
orber_test_server:
relay_cast(Relay,
[{context,
[#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface,
Loopback}}]}],
IOR)),
?match([_,_], orber:iiop_connections(out)),
Conns = ?match([_,_],
orber_test_lib:remote_apply(ServerNode, orber, iiop_connections, [in])),
?match(true, lists:keymember(Loopback, 1, Conns)),
ok.
%% IIOP two Implicit Contex tests (via pseudo object oneway)
oneway_pseudo_two_implicit_context_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, ?ORB_ENV_LOCAL_INTERFACE},
{ip_address, IP}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
%% Create a remote server
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
IOR = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaname::1.2@"++IP++":"++integer_to_list(ServerPort)++"/NameService#mamba")),
Relay = ?match({_,_,_,_,_,_}, orber_test_server:oe_create([], [{pseudo,true}])),
%% Add incoming implicit context which must be removed.
put(oe_server_in_context,
[#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface,
IP}}]),
?match(ok,
orber_test_server:
relay_cast(Relay,
[{context,
[#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface,
Loopback}}]}],
IOR)),
?match([_,_], orber:iiop_connections(out)),
Conns = ?match([_,_],
orber_test_lib:remote_apply(ServerNode, orber, iiop_connections, [in])),
?match(true, lists:keymember(Loopback, 1, Conns)),
ok.
%% IIOP Multiple Accept tests
multiple_accept_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, ?ORB_ENV_LOCAL_INTERFACE},
{ip_address, IP}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
%% The server ORB doesn't listen to 127.0.0.1
?match({'EXCEPTION',_},
corba:string_to_object("corbaloc::1.2@" ++Loopback++":"++integer_to_list(ServerPort)++"/NameService")),
?match([], orber:iiop_connections(out)),
IOR1 = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaloc::1.2@"++IP++":"++integer_to_list(ServerPort)++"/NameService")),
?match({'external', {IP, ServerPort, _ObjectKey, _Counter, _TP, _NewHD}},
iop_ior:get_key(IOR1)),
?match([_], orber:iiop_connections(out)),
{ok, Ref1} = ?match({ok, _},
orber_test_lib:remote_apply(ServerNode, orber,
add_listen_interface,
[Loopback, normal])),
IOR2 = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaloc::1.2@"++Loopback++":"++integer_to_list(ServerPort)++"/NameService")),
?match({'external', {Loopback, ServerPort, _ObjectKey, _Counter, _TP, _NewHD}},
iop_ior:get_key(IOR2)),
?match([_,_], orber:iiop_connections(out)),
{ok, Ref2} = ?match({ok, _},
orber_test_lib:remote_apply(ServerNode, orber,
add_listen_interface,
[Loopback, normal, 9543])),
?match({error, eaddrinuse},
orber_test_lib:remote_apply(ServerNode, orber,
add_listen_interface,
[Loopback, normal, 9543])),
IOR3 = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaloc::1.2@"++Loopback++":9543/NameService")),
?match({'external', {Loopback, 9543, _ObjectKey, _Counter, _TP, _NewHD}},
iop_ior:get_key(IOR3)),
?match([_,_,_], orber:iiop_connections(out)),
?match(ok,
orber_test_lib:remote_apply(ServerNode, orber,
remove_listen_interface, [Ref1])),
%% Wait a few seconds to be sure that the connections really has been removed.
timer:sleep(4000),
?match([_,_], orber:iiop_connections(out)),
?match(ok,
orber_test_lib:remote_apply(ServerNode, orber,
remove_listen_interface, [Ref2])),
%% Wait a few seconds to be sure that the connections really has been removed.
timer:sleep(4000),
?match([_], orber:iiop_connections(out)),
?match({'EXCEPTION',_},
corba:string_to_object("corbaloc::1.2@"++Loopback++":9543/NameService")),
?match({'EXCEPTION',_},
corba:string_to_object("corbaloc::1.2@"++Loopback++":"++integer_to_list(ServerPort)++"/NameService")),
IOR4 = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaloc::1.2@"++IP++":"++integer_to_list(ServerPort)++"/NameService")),
?match({'external', {IP, ServerPort, _ObjectKey, _Counter, _TP, _NewHD}},
iop_ior:get_key(IOR4)),
ok.
%% IIOP Proxy Interface tests
%% This case test if the server ORB use the correct
%% interface when exporting IOR:s
proxy_interface_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, ?ORB_ENV_LOCAL_INTERFACE}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
IOR1 = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaloc::1.2@"++IP++":"++integer_to_list(ServerPort)++"/NameService")),
?match({'external', {IP, ServerPort, _ObjectKey, _Counter, _TP, _NewHD}},
iop_ior:get_key(IOR1)),
IOR2 = ?match(#'IOP_IOR'{},
corba:string_to_object("corbaloc::1.2@"++Loopback++":"++integer_to_list(ServerPort)++"/NameService")),
?match({'external', {Loopback, ServerPort, _ObjectKey, _Counter, _TP, _NewHD}},
iop_ior:get_key(IOR2)),
ok.
%% IIOP Proxy Interface tests
%% This case test if the server ORB use the correct
%% IPv6 interface when exporting IOR:s
proxy_interface_ipv6_api(_Config) ->
case orber_test_lib:version_ok() of
true ->
proxy_interface_ipv6_api2();
Reason ->
Reason
end.
proxy_interface_ipv6_api2() ->
Loopback = orber_test_lib:get_loopback_interface(inet6),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, (?ORB_ENV_USE_IPV6 bor
?ORB_ENV_LOCAL_INTERFACE)}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, ?ORB_ENV_USE_IPV6}])),
IP = orber_test_lib:remote_apply(ClientNode, orber_test_lib, get_host, []),
IOR1 = ?match(#'IOP_IOR'{},
orber_test_lib:remote_apply(ClientNode, corba, string_to_object,
["corbaloc::1.2@["++IP++"]:"++integer_to_list(ServerPort)++"/NameService"])),
?match({'external', {IP, ServerPort, _ObjectKey, _Counter, _TP, _NewHD}},
orber_test_lib:remote_apply(ClientNode, iop_ior, get_key, [IOR1])),
IOR2 = ?match(#'IOP_IOR'{},
orber_test_lib:remote_apply(ClientNode, corba, string_to_object,
["corbaloc::1.2@["++Loopback++"]:"++integer_to_list(ServerPort)++"/NameService"])),
?match({'external', {Loopback, ServerPort, _ObjectKey, _Counter, _TP, _NewHD}},
orber_test_lib:remote_apply(ClientNode, iop_ior, get_key, [IOR2])),
ok.
%% IIOP Local Interface tests
%% This case test if the server ORB use the correct
%% local interface when connecting to another ORB
local_interface_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node([{ip_address_local, Loopback}])),
Port = orber:iiop_port(),
?match(#'IOP_IOR'{},
orber_test_lib:remote_apply(ClientNode, corba, string_to_object,
["corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService"])),
[{Loopback, RemotePort}] =
?match([{Loopback,_RemotePort}], orber:iiop_connections(in)),
?match([{IP, Port}],
orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [out])),
?match([{IP, Port}], orber:find_sockname_by_peername(Loopback,RemotePort)),
?match([{Loopback, RemotePort}], orber:find_peername_by_sockname(IP, Port)),
?match([{Loopback, RemotePort}],
orber_test_lib:remote_apply(ClientNode, orber,
find_sockname_by_peername,
[IP, Port])),
?match([{IP, Port}],
orber_test_lib:remote_apply(ClientNode, orber,
find_peername_by_sockname,
[Loopback,RemotePort])),
ok.
%% IIOP Local Interface tests
%% This case test if the server ORB use the correct
%% local interface when connecting to another ORB
local_interface_ctx_override_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node([{ip_address_local, IP}])),
Port = orber:iiop_port(),
?match(#'IOP_IOR'{},
orber_test_lib:remote_apply(ClientNode, corba, string_to_object,
["corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService",
[#'IOP_ServiceContext'
{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface, Loopback}}]])),
[{Loopback, RemotePort}] =
?match([{Loopback,_RemotePort}], orber:iiop_connections(in)),
?match([{IP, Port, Loopback}],
orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [out])),
?match([{IP, Port}], orber:find_sockname_by_peername(Loopback,RemotePort)),
?match([{Loopback, RemotePort}], orber:find_peername_by_sockname(IP, Port)),
?match([{Loopback, RemotePort}],
orber_test_lib:remote_apply(ClientNode, orber,
find_sockname_by_peername,
[IP, Port])),
?match([{IP, Port}],
orber_test_lib:remote_apply(ClientNode, orber,
find_peername_by_sockname,
[Loopback,RemotePort])),
ok.
%% IIOP Local Interface tests
%% This case test if the server ORB use the correct
%% local interface when connecting to another ORB
local_interface_acl_override_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
ACL = [{tcp_out, IP ++ "/18", [Loopback]}],
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node([{ip_address_local, IP},
{iiop_acl, ACL},
{flags, ?ORB_ENV_USE_ACL_OUTGOING}])),
Port = orber:iiop_port(),
?match(#'IOP_IOR'{},
orber_test_lib:remote_apply(ClientNode, corba, string_to_object,
["corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService",
[#'IOP_ServiceContext'
{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface, IP}}]])),
?match([{Loopback,_RemotePort}], orber:iiop_connections(in)),
?match(#'IOP_IOR'{},
orber_test_lib:remote_apply(ClientNode, corba, string_to_object,
["corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService"])),
[{Loopback, RemotePort}] =
?match([{Loopback,_RemotePort}], orber:iiop_connections(in)),
?match([{IP, Port, IP}], orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [out])),
?match([{IP, Port}], orber:find_sockname_by_peername(Loopback,RemotePort)),
?match([{Loopback, RemotePort}], orber:find_peername_by_sockname(IP, Port)),
?match([{Loopback, RemotePort}],
orber_test_lib:remote_apply(ClientNode, orber,
find_sockname_by_peername,
[IP, Port])),
?match([{IP, Port}],
orber_test_lib:remote_apply(ClientNode, orber,
find_peername_by_sockname,
[Loopback,RemotePort])),
ok.
%% IIOP TIMEOUT API tests
%% This case test if timeout configuration behaves correctly
iiop_timeout_api(_Config) ->
%% Install two secure orber.
{ok, ClientNode, ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node([{iiop_timeout, 6},
{iiop_connection_timeout, 3},
{iiop_in_connection_timeout, 3}])),
ClientPort = orber_test_lib:remote_apply(ClientNode, orber, iiop_port, []),
{ok, ServerNode, ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{iiop_timeout, 6},
{iiop_connection_timeout, 3},
{iiop_in_connection_timeout, 12}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[timeout])),
%% Tell client_orb to interoperate with server_orb.
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib,
lookup,
[ServerHost, ServerPort])),
%% Interop worked fine, perform delay tests.
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib,
timeouts,
[ServerHost, ServerPort, 6000])),
%% Create a connection to the "client_orb", which will now act as server.
?match({'IOP_IOR',_,_},
corba:string_to_object("corbaloc::1.2@"++ClientHost++":"++integer_to_list(ClientPort)++"/NameService")),
%% Check that the connection is established.
?match([{_, ClientPort}], orber:iiop_connections(out)),
%% Wait >3 seconds (i.e. iiop_in_connection_timeout) and check if the connection
%% have been closed.
timer:sleep(8000),
?match([], orber:iiop_connections(out)),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
uninstall_test_data,
[timeout])),
ok.
%% IIOP TIMEOUT API tests
%% This case test if timeout configuration behaves correctly
iiop_timeout_added_api(_Config) ->
IP = orber_test_lib:get_host(),
{ok, Node, _Host} = ?match({ok,_,_}, orber_test_lib:js_node([])),
Port = 1 + orber_test_lib:remote_apply(Node, orber, iiop_port, []),
?match({ok, _},
orber_test_lib:remote_apply(Node, orber,
add_listen_interface,
[IP, normal,
[{iiop_in_connection_timeout, 3},
{flags, ?ORB_ENV_LOCAL_INTERFACE},
{iiop_port, Port}]])),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
install_test_data,
[timeout])),
?match({'IOP_IOR',_,_},
corba:string_to_object("corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService")),
%% Check that the connection is established.
?match([{_, Port}], orber:iiop_connections(out)),
%% Wait >3 seconds (i.e. iiop_in_connection_timeout) and check if the connection
%% have been closed.
timer:sleep(8000),
?match([], orber:iiop_connections(out)),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
uninstall_test_data,
[timeout])),
ok.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB using pseudo call/cast, no security
%%-----------------------------------------------------------------
%% MULTI ORB PSEUDO API tests
%% This case test if data encode/decode (IIOP) for pseudo objects
%% produce the correct result, i.e., the test_server echos
%% the input parameter or an exception is raised (MARSHAL)
multi_pseudo_orber_api(_Config) ->
%% --- Create a slave-node ---
{ok, Node, Host} =
?match({ok,_,_}, orber_test_lib:js_node()),
Port = orber_test_lib:remote_apply(Node, orber, iiop_port, []),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
install_test_data,
[pseudo])),
NSR = ?match({'IOP_IOR',"IDL:omg.org/CosNaming/NamingContextExt:1.0",_},
corba:string_to_object("corbaloc::1.1@"++Host++":"++
integer_to_list(Port)++"/NameService")),
Obj =
?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
'CosNaming_NamingContext':resolve(NSR, lname:new(["mamba"]))),
orber_test_lib:corba_object_tests(Obj, NSR),
%% Can we even contact the object?
?match(ok, orber_test_server:print(Obj)),
%% Invoke one blocking call followed by several invokations.
spawn(?MODULE, pseudo_calls, [5, Obj]),
?match({ok, 10000}, orber_test_server:pseudo_call_delay(Obj, 10000)),
spawn(?MODULE, pseudo_casts, [5, Obj]),
?match(ok, orber_test_server:pseudo_cast_delay(Obj, 10000)),
%%--- Testing code and decode arguments ---
orber_test_lib:test_coding(Obj),
%% Test if exit is handled properly.
?match({'EXCEPTION',{'TRANSIENT',_,_,_}},
orber_test_server:stop_brutal(Obj)),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
uninstall_test_data,
[pseudo])),
ok.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB with local flags definition set.
%%-----------------------------------------------------------------
%% MULTI ORB PSEUDO with local flags definition set
flags_added_api(_Config) ->
%% --- Create a slave-node ---
IP = orber_test_lib:get_host(),
{ok, Node, _Host} =
?match({ok,_,_}, orber_test_lib:js_node([])),
Port = 1 + orber_test_lib:remote_apply(Node, orber, iiop_port, []),
?match({ok, _},
orber_test_lib:remote_apply(Node, orber,
add_listen_interface,
[IP, normal,
[{flags, (?ORB_ENV_LOCAL_INTERFACE bor
?ORB_ENV_EXCLUDE_CODESET_COMPONENT)},
{iiop_port, Port}]])),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
install_test_data,
[pseudo])),
Obj = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.1@"++IP++":"++
integer_to_list(Port)++"/NameService#mamba")),
?match({'external', {IP, Port, _ObjectKey, _Counter,
#'IOP_TaggedProfile'{tag=?TAG_INTERNET_IOP,
profile_data=
#'IIOP_ProfileBody_1_1'{components=[]}},
_NewHD}},
iop_ior:get_key(Obj)),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
uninstall_test_data,
[pseudo])),
ok.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB with limited concurrent requests
%%-----------------------------------------------------------------
%% MULTI ORB PSEUDO with limited concurrent requests tests
max_requests_api(_Config) ->
%% --- Create a slave-node ---
{ok, Node, Host} =
?match({ok,_,_}, orber_test_lib:js_node([{iiop_max_in_requests, 1}])),
Port = orber_test_lib:remote_apply(Node, orber, iiop_port, []),
max_requests(Node, Host, Port).
%% MULTI ORB PSEUDO with limited concurrent requests tests
max_requests_added_api(_Config) ->
%% --- Create a slave-node ---
[IP] = ?match([_], orber:host()),
{ok, Node, _Host} =
?match({ok,_,_}, orber_test_lib:js_node([])),
Port = 1 + orber_test_lib:remote_apply(Node, orber, iiop_port, []),
?match({ok, _},
orber_test_lib:remote_apply(Node, orber,
add_listen_interface,
[IP, normal,
[{iiop_max_in_requests, 1},
{flags, ?ORB_ENV_LOCAL_INTERFACE},
{iiop_port, Port}]])),
max_requests(Node, IP, Port).
max_requests(Node, Host, Port) ->
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
install_test_data,
[pseudo])),
Obj = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.1@"++Host++":"++
integer_to_list(Port)++"/NameService#mamba")),
%% Can we even contact the object?
?match(ok, orber_test_server:print(Obj)),
%% Invoke one blocking call followed by several invokations.
spawn(orber_test_server, pseudo_call_delay, [Obj, 15000]),
%% Wait for a second to be sure that the previous request has been sent
timer:sleep(1000),
{MegaSecsB, Before, _} = erlang:timestamp(),
pseudo_calls(5, Obj),
{MegaSecsA, After, _} = erlang:timestamp(),
%% Normally we we can perform hundreds of pseudo-calls per second. Hence,
%% if we add 8 seconds to 'Before' it should still be less since we only
%% allow one request at a time to the target ORB.
?match(true, (MegaSecsB + (Before+8)*1000000) < (MegaSecsA + After*1000000)),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
uninstall_test_data,
[pseudo])),
ok.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB with limited concurrent connections
%%-----------------------------------------------------------------
%% MULTI ORB PSEUDO with limited concurrent connections tests
max_connections_api(_Config) ->
%% --- Create a slave-node ---
{ok, ServerNode, ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{iiop_backlog, 0},
{iiop_max_in_connections, 2}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
%% Claim connection 1 & 2
Obj = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.2@"++ServerHost++":"++
integer_to_list(ServerPort)++"/NameService#mamba")),
%% Claim backlog
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node()),
spawn(ClientNode, orber_test_server, print, [Obj]),
timer:sleep(5000),
?match([_], orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [])),
%% Try to connect. Should fail. Due to the behavior of different TCP stacks, backlog 1
%% might not be the precise value. Hence, we also need to define the iiop_timeout. Otherwise
%% this test case will fail. For the same reason we must GC this connection.
{ok, ClientNodeII, _ClientHostII} =
?match({ok,_,_}, orber_test_lib:js_node([{iiop_setup_connection_timeout, 5},
{iiop_timeout, 5},
{iiop_connection_timeout, 8}])),
?match({'EXCEPTION', _},
orber_test_lib:remote_apply(ClientNodeII, orber_test_server,
testing_iiop_string, [Obj, "Fail"])),
%% Remove 2 connections. We need to wait a moment so that both sides has detected it.
timer:sleep(5000),
?match([_,_], orber:iiop_connections()),
?match(ok, orber_iiop_pm:close_connection([{ServerHost, ServerPort}])),
timer:sleep(5000),
[{Host, Port}] = ?match([_], orber:iiop_connections()),
?match(ok, orber_iiop_pm:close_connection([{Host, Port}])),
timer:sleep(5000),
?match([], orber:iiop_connections()),
?match([_], orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [])),
?match([], orber_test_lib:remote_apply(ClientNodeII, orber,
iiop_connections, [])),
?match({ok, "OK"},
orber_test_lib:remote_apply(ClientNodeII, orber_test_server,
testing_iiop_string, [Obj, "OK"])),
timer:sleep(4000),
?match([_], orber_test_lib:remote_apply(ClientNodeII, orber,
iiop_connections, [])),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
uninstall_test_data,
[pseudo])),
ok.
%%-----------------------------------------------------------------
%% API tests for terminating connection by using an IOR.
%%-----------------------------------------------------------------
%% Close outgoing connection
close_connections_api(_Config) ->
%% --- Create a slave-node ---
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{ip_address, IP}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
IP = orber_test_lib:get_host(),
%% Create a connection
Obj = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.2@"++IP++":"++
integer_to_list(ServerPort)++"/NameService#mamba")),
%% Check that it's up.
?match([{IP, ServerPort}], orber:iiop_connections(out)),
%% Try to close using the wronge interface.
?match(ok, orber:close_connection(Obj, Loopback)),
%% Should still be up.
?match([{IP, ServerPort}], orber:iiop_connections(out)),
%% Try to close it properly
?match(ok, orber:close_connection(Obj)),
%% Wait a moment so that both sides has detected it.
timer:sleep(5000),
%% Worked?
?match([], orber:iiop_connections(out)),
ok.
%% IIOP Local Interface disconnect tests
%% This case test if the server ORB use the correct
%% local interface when connecting to another ORB
close_connections_local_interface_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node([{ip_address_local, Loopback}])),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{ip_address, IP}])),
Port = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
IOR = ?match(#'IOP_IOR'{},
orber_test_lib:remote_apply(ClientNode, corba, string_to_object,
["corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService"])),
%% Check that the connnection is up and running using the default interface
?match([{Loopback,_RemotePort}], orber_test_lib:remote_apply(ServerNode, orber,
iiop_connections, [in])),
?match([{IP, Port}],
orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [out])),
%% Try to close the connection
?match(ok, orber_test_lib:remote_apply(ClientNode, orber,
close_connection, [IOR])),
%% Wait a moment so that both sides has detected it.
timer:sleep(5000),
%% Now the connection shall be gone.
?match([], orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [out])),
?match([], orber_test_lib:remote_apply(ServerNode, orber,
iiop_connections, [in])),
ok.
%% IIOP Local Interface disconnect tests
%% This case test if the server ORB use the correct
%% local interface when connecting to another ORB
close_connections_local_interface_ctx_override_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node([{ip_address_local, IP},
{ip_address, IP}])),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{ip_address, IP}])),
Port = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
IOR = ?match(#'IOP_IOR'{},
orber_test_lib:remote_apply(ClientNode, corba, string_to_object,
["corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService",
[#'IOP_ServiceContext'
{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface, Loopback}}]])),
timer:sleep(2000),
%% Check that the connnection is up and running using the default interface
?match([{Loopback,_RemotePort}], orber_test_lib:remote_apply(ServerNode, orber,
iiop_connections, [in])),
?match([{IP, Port, Loopback}],
orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [out])),
%% Try to close not supplying the interface.
?match(ok, orber_test_lib:remote_apply(ClientNode, orber,
close_connection, [IOR])),
timer:sleep(2000),
%% The connection shall still be up and running
?match([{Loopback,_RemotePort}], orber_test_lib:remote_apply(ServerNode, orber,
iiop_connections, [in])),
?match([{IP, Port, Loopback}],
orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [out])),
%% Try to close not supplying the interface.
?match(ok, orber_test_lib:remote_apply(ClientNode, orber,
close_connection, [IOR, IP])),
timer:sleep(2000),
%% The connection shall still be up and running
?match([{Loopback,_RemotePort}], orber_test_lib:remote_apply(ServerNode, orber,
iiop_connections, [in])),
?match([{IP, Port, Loopback}],
orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [out])),
%% Try to close supplying the correct interface.
?match(ok, orber_test_lib:remote_apply(ClientNode, orber,
close_connection, [IOR, Loopback])),
%% Wait a moment so that both sides has detected it.
timer:sleep(5000),
%% Now the connection shall be gone.
?match([], orber_test_lib:remote_apply(ServerNode, orber,
iiop_connections, [in])),
?match([], orber_test_lib:remote_apply(ClientNode, orber,
iiop_connections, [out])),
ok.
%% IIOP alternate address disconnect tests
%% This case test if the server ORB use the correct
%% local interface when connecting to another ORB
close_connections_alt_iiop_addr_api(_Config) ->
%% --- Create a slave-node ---
Loopback = orber_test_lib:get_loopback_interface(),
IP = orber_test_lib:get_host(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{giop_version, {1, 2}},
{ip_address, {multiple, [IP, Loopback]}}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[{nameservice, Loopback, ServerPort}])),
%% Create two connections
Obj = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.2@"++IP++":"++
integer_to_list(ServerPort)++"/NameService#mamba")),
?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.2@"++Loopback++":"++
integer_to_list(ServerPort)++"/NameService#mamba")),
timer:sleep(2000),
%% The connection shall still be up and running
?match([{_,_}, {_,_}], orber:iiop_connections(out)),
?match([{_,_}, {_,_}],
orber_test_lib:remote_apply(ServerNode, orber,
iiop_connections, [in])),
%% Try to close the connection
?match(ok, orber:close_connection(Obj)),
%% Wait a moment so that both sides has detected it.
timer:sleep(5000),
%% Now the connections shall be gone.
?match([], orber:iiop_connections(out)),
?match([], orber_test_lib:remote_apply(ServerNode, orber,
iiop_connections, [in])),
ok.
%% IIOP alternate address disconnect tests
%% This case test if the server ORB use the correct
%% local interface when connecting to another ORB
close_connections_multiple_profiles_api(_Config) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
%% --- Create a slave-node ---
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{ip_address,
{multiple, [Loopback, IP]}}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data, [nameservice])),
%% Create two connections
Obj = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.2@"++IP++":"++
integer_to_list(ServerPort)++"/NameService#mamba")),
?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.2@"++Loopback++":"++
integer_to_list(ServerPort)++"/NameService#mamba")),
%% The connection shall still be up and running
?match([{_,_}, {_,_}], orber:iiop_connections(out)),
?match([{_,_}, {_,_}],
orber_test_lib:remote_apply(ServerNode, orber,
iiop_connections, [in])),
%% Try to close the connection
?match(ok, orber:close_connection(Obj)),
%% Wait a moment so that both sides has detected it.
timer:sleep(5000),
%% Now the connections shall be gone.
?match([], orber:iiop_connections(out)),
?match([], orber_test_lib:remote_apply(ServerNode, orber,
iiop_connections, [in])),
ok.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB with iiop_packet_size set
%%-----------------------------------------------------------------
%% Exceed the maximum request size
max_packet_size_exceeded_api(_Config) ->
case catch gen_tcp:listen(0, [{packet,cdr}, {packet_size, 14}]) of
{'EXIT',badarg} ->
{skipped, "The inet option {packet_size, Max} not supported"};
{ok, LS} ->
(catch gen_tcp:close(LS)),
%% --- Create a slave-node ---
{ok, ServerNode, ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{iiop_packet_size, 1}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber,
iiop_port, []),
?match({'EXCEPTION', #'CosNaming_NamingContextExt_InvalidAddress'{}},
corba:string_to_object("corbaloc::1.2@"++ServerHost++":"++integer_to_list(ServerPort)++"/NameService")),
ok
end.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB with iiop_packet_size set
%%-----------------------------------------------------------------
%% Not exceed the maximum request size
max_packet_size_ok_api(_Config) ->
case catch gen_tcp:listen(0, [{packet,cdr}, {packet_size, 14}]) of
{'EXIT',badarg} ->
{skipped, "The inet option {packet_size, Max} not supported"};
{ok, LS} ->
(catch gen_tcp:close(LS)),
%% --- Create a slave-node ---
{ok, ServerNode, ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{iiop_packet_size, 5000}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber,
iiop_port, []),
?match({'IOP_IOR',_,_},
corba:string_to_object("corbaloc::1.2@"++ServerHost++":"++integer_to_list(ServerPort)++"/NameService")),
ok
end.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB, no security
%%-----------------------------------------------------------------
%% LIGHT IFR ORB API tests
light_ifr_api(_Config) ->
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, 128}])),
?match([_,_,_,_], orber_test_lib:remote_apply(ClientNode, orber, get_tables, [])),
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib,
install_test_data,
[nameservice])),
{ok, ServerNode, ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{flags, 128}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
?match([_,_,_,_], orber_test_lib:remote_apply(ServerNode, orber, get_tables, [])),
Obj = ?match({'IOP_IOR',_,_},
corba:string_to_object("corbaname::1.2@"++ServerHost++":"++integer_to_list(ServerPort)++"/NameService#mamba")),
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib, test_coding, [Obj])),
?match(0, orber_test_lib:remote_apply(ClientNode, orber_diagnostics, missing_modules, [])),
?match(ok, orber_test_lib:remote_apply(ClientNode, mnesia, dirty_write,
[#orber_light_ifr{id = "FakeId1",
module=non_existing,
type=?IFR_StructDef}])),
?match(ok, orber_test_lib:remote_apply(ClientNode, mnesia, dirty_write,
[#orber_light_ifr{id = "FakeId2",
module=non_existing,
type=?IFR_UnionDef}])),
?match(ok, orber_test_lib:remote_apply(ClientNode, mnesia, dirty_write,
[#orber_light_ifr{id = "FakeId3",
module=non_existing,
type=?IFR_ExceptionDef}])),
?match(ok, orber_test_lib:remote_apply(ClientNode, mnesia, dirty_write,
[#orber_light_ifr{id = "FakeId4",
module=non_existing,
type=?IFR_InterfaceDef}])),
?match(ok, orber_test_lib:remote_apply(ClientNode, mnesia, dirty_write,
[#orber_light_ifr{id = "FakeId5",
module=orber_test_lib,
type=?IFR_InterfaceDef}])),
?match(5, orber_test_lib:remote_apply(ClientNode, orber_diagnostics, missing_modules, [])),
?match(ok, mnesia:dirty_write(#ir_UnionDef{ir_Internal_ID = "FakedIId1",
absolute_name="::Module::NonExisting"})),
?match(ok, mnesia:dirty_write(#ir_StructDef{ir_Internal_ID = "FakedIId2",
absolute_name="::Module::NonExisting"})),
?match(ok, mnesia:dirty_write(#ir_ExceptionDef{ir_Internal_ID = "FakedIId3",
absolute_name="::Module::NonExisting"})),
?match(ok, mnesia:dirty_write(#ir_InterfaceDef{ir_Internal_ID = "FakedIId4",
absolute_name="::Module::NonExisting"})),
?match(ok, mnesia:dirty_write(#ir_InterfaceDef{ir_Internal_ID = "FakedIId5",
absolute_name="::orber::test::lib"})),
?match(5, orber_diagnostics:missing_modules()),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
uninstall_test_data,
[nameservice])),
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib,
uninstall_test_data,
[nameservice])),
ok.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB, no security
%%-----------------------------------------------------------------
%% LIGHT ORB API tests
%% This case test if a light Orber can communicate correctly
%% with an fully installed Orber.
light_orber_api(_Config) ->
%% --- Create a slave-node ---
LocalHost = net_adm:localhost(),
{ok, Node, _Host} =
?match({ok,_,_}, orber_test_lib:js_node([{lightweight, ["iiop://"++LocalHost++":"++integer_to_list(orber:iiop_port())]}],
lightweight)),
?match(ok, orber:info(io)),
?match([_], orber_test_lib:remote_apply(Node, orber_env, get_lightweight_nodes,[])),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
install_test_data,
[light])),
Obj1=(catch orber_test_server:oe_create(state,[{pseudo,true}])),
?match({_,pseudo,orber_test_server_impl, _,_, _}, Obj1),
Obj2=(catch orber_test_server:oe_create(state,[])),
?match({_,key,_, _,_, _}, Obj2),
NS = corba:resolve_initial_references("NameService"),
'CosNaming_NamingContext':bind(NS, lname:new(["mamba"]), Obj1),
'CosNaming_NamingContext':bind(NS, lname:new(["viper"]), Obj2),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
light_tests,
[LocalHost,
orber:iiop_port(), "viper"])),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
light_tests,
[LocalHost,
orber:iiop_port(), "mamba"])),
%% Clean up.
catch corba:dispose(Obj1),
catch corba:dispose(Obj2),
catch 'CosNaming_NamingContext':destroy(NS),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
uninstall_test_data,
[light])),
ok.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB, no security
%%-----------------------------------------------------------------
%% LIGHT ORB API tests
%% This case test if a light Orber can communicate correctly
%% with an fully installed Orber. This case test if we can
%% start as lightweight without first setting the environment
%% variable
light_orber2_api(_Config) ->
%% --- Create a slave-node ---
LocalHost = net_adm:localhost(),
{ok, Node, _Host} =
?match({ok,_,_}, orber_test_lib:js_node([],
{lightweight, ["iiop://"++LocalHost++":"++integer_to_list(orber:iiop_port())]})),
?match(ok, orber:info(io)),
?match([_], orber_test_lib:remote_apply(Node, orber_env, get_lightweight_nodes,[])),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
install_test_data,
[light])),
Obj1=(catch orber_test_server:oe_create(state,[{pseudo,true}])),
?match({_,pseudo,orber_test_server_impl, _,_, _}, Obj1),
Obj2=(catch orber_test_server:oe_create(state,[])),
?match({_,key,_, _,_, _}, Obj2),
NS = corba:resolve_initial_references("NameService"),
'CosNaming_NamingContext':bind(NS, lname:new(["mamba"]), Obj1),
'CosNaming_NamingContext':bind(NS, lname:new(["viper"]), Obj2),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
light_tests,
[LocalHost,
orber:iiop_port(), "viper"])),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
light_tests,
[LocalHost,
orber:iiop_port(), "mamba"])),
%% Clean up.
catch corba:dispose(Obj1),
catch corba:dispose(Obj2),
catch 'CosNaming_NamingContext':destroy(NS),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
uninstall_test_data,
[light])),
ok.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB, no security
%%-----------------------------------------------------------------
%% MULTI ORB API tests
%% This case test if data encode/decode (IIOP)
%% produce the correct result, i.e., the test_server echos
%% the input parameter or an exception is raised (MARSHAL).
multi_orber_api(_Config) ->
NewICObj1 = ?match({_,_,_,_,_,_}, orber_test_server:oe_create([])),
NewICObj2 = ?match({_,_,_,_,_,_}, orber_test_server:oe_create([], [{regname, {local, newic2}}])),
NewICObj3 = ?match({_,_,_,_,_,_}, orber_test_server:oe_create([], [{regname, {global, newic3}}])),
?match(ok, orber_test_server:print(NewICObj1)),
?match(ok, orber_test_server:print(NewICObj2)),
?match(ok, orber_test_server:print(NewICObj3)),
catch corba:dispose(NewICObj1),
catch corba:dispose(NewICObj2),
catch corba:dispose(NewICObj3),
%% --- Create a slave-node ---
{ok, Node, Host} =
?match({ok,_,_}, orber_test_lib:js_node()),
Port = orber_test_lib:remote_apply(Node, orber, iiop_port, []),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
install_test_data,
[nameservice])),
NSR = ?match({'IOP_IOR',"IDL:omg.org/CosNaming/NamingContextExt:1.0",_},
corba:string_to_object("corbaloc::1.2@"++Host++":"++
integer_to_list(Port)++"/NameService")),
?match({'EXCEPTION',{'CosNaming_NamingContext_NotFound',_,_,_}},
'CosNaming_NamingContext':resolve(NSR, lname:new(["not_exist"]))),
Obj = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
'CosNaming_NamingContext':resolve(NSR, lname:new(["mamba"]))),
?match(ok, orber_test_server:print(Obj)),
Obj12B = ?match({'IOP_IOR',_,_},
corba:string_to_object("corbaloc::1.2@"++Host++":"++integer_to_list(Port)++"/Mamba")),
Obj11B = ?match({'IOP_IOR',_,_},
corba:string_to_object("corbaloc::1.1@"++Host++":"++integer_to_list(Port)++"/Mamba")),
Obj10B = ?match({'IOP_IOR',_,_},
corba:string_to_object("corbaloc::1.0@"++Host++":"++integer_to_list(Port)++"/Mamba")),
context_test(Obj12B),
context_test(Obj11B),
?match(ok, orber_test_server:print(Obj12B)),
?match(ok, orber_test_server:print(Obj11B)),
?match(ok, orber_test_server:print(Obj10B)),
?match({'EXCEPTION',{'CosNaming_NamingContextExt_InvalidAddress',_}},
corba:string_to_object("corbaloc::1.0@"++Host++":"++integer_to_list(Port)++"/Wrong")),
?match(ok, orber_test_lib:corba_object_tests(Obj12B, NSR)),
?match(ok, orber_test_lib:corba_object_tests(Obj11B, NSR)),
?match(ok, orber_test_lib:corba_object_tests(Obj10B, NSR)),
%%--- Testing code and decode arguments ---
orber_test_lib:test_coding(Obj),
?match({'EXCEPTION',#'BAD_CONTEXT'{}},
orber_test_server:
print(Obj12B,
[{context,
[#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {interface,
{127,0,0,1}}}]}])),
?match({'EXCEPTION',{'TRANSIENT',_,_,_}},
orber_test_server:stop_brutal(Obj12B)),
?match({'EXCEPTION',{'TRANSIENT',_,_,_}},
orber_test_server:print(Obj12B)),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
uninstall_test_data,
[nameservice])),
ok.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB, no security, using basic interceptors
%%-----------------------------------------------------------------
%% MULTI ORB API tests
%% This case test if data encode/decode (IIOP)
%% produce the correct result when using basic interceptors
%% i.e., the test_server echos the input parameter or
%% an exception is raised (MARSHAL).
basic_PI_api(_Config) ->
%% Change configuration to use Basic Interceptors.
orber:configure_override(interceptors, {native, [orber_test_lib]}),
%% --- Create a slave-node ---
{ok, Node, Host} =
?match({ok,_,_}, orber_test_lib:js_node([{interceptors, {native, [orber_test_lib]}}])),
Port = orber_test_lib:remote_apply(Node, orber, iiop_port, []),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
install_test_data,
[nameservice])),
Obj12 = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.2@"++Host++":"++integer_to_list(Port)++"/NameService#mamba")),
Obj11 = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.1@"++Host++":"++integer_to_list(Port)++"/NameService#mamba")),
Obj10 = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.0@"++Host++":"++integer_to_list(Port)++"/NameService#mamba")),
?match(ok, corba:print_object(Obj12)),
?match(ok, corba:print_object(Obj11, error_report)),
?match(ok, corba:print_object(Obj10, {error_report, "Reason"})),
?match(ok, orber_test_server:print(Obj12)),
?match(ok, orber_test_server:print(Obj11)),
?match(ok, orber_test_server:print(Obj10)),
Obj12B = ?match({'IOP_IOR',_,_},
corba:string_to_object("corbaloc::1.2@"++Host++":"++integer_to_list(Port)++"/Mamba")),
Obj11B = ?match({'IOP_IOR',_,_},
corba:string_to_object("corbaloc::1.1@"++Host++":"++integer_to_list(Port)++"/Mamba")),
Obj10B = ?match({'IOP_IOR',_,_},
corba:string_to_object("corbaloc::1.0@"++Host++":"++integer_to_list(Port)++"/Mamba")),
?match(ok, corba:print_object(Obj12B, info_msg)),
?match(ok, corba:print_object(Obj11B, {info_msg, "Comment"})),
?match([_|_], corba:print_object(Obj10B, string)),
?match(ok, orber_test_server:print(Obj12B)),
?match(ok, orber_test_server:print(Obj11B)),
?match(ok, orber_test_server:print(Obj10B)),
?match({'EXCEPTION',{'CosNaming_NamingContextExt_InvalidAddress',_}},
corba:string_to_object("corbaloc::1.0@"++Host++":"++integer_to_list(Port)++"/Wrong")),
?match(ok, orber_test_lib:alternate_iiop_address(Host, Port)),
context_test(Obj12B),
context_test(Obj11B),
%%--- Testing code and decode arguments ---
orber_test_lib:test_coding(Obj12),
orber_test_lib:test_coding(Obj11),
orber_test_lib:test_coding(Obj10),
application:set_env(orber, interceptors, false),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
uninstall_test_data,
[nameservice])),
ok.
%%-----------------------------------------------------------------
%% API tests for ORB to ORB, ssl security depth 1
%%-----------------------------------------------------------------
%% SECURE MULTI ORB API tests (SSL depth 1)
%% This case set up two secure orbs and test if they can
%% communicate. The case also test to access one of the
%% secure orbs which must raise a NO_PERMISSION exception.
ssl_1_multi_orber_api(_Config) ->
ServerOptions = orber_test_lib:get_options_old(iiop_ssl, server,
1, [{iiop_ssl_port, 0}]),
ClientOptions = orber_test_lib:get_options_old(iiop_ssl, client,
1, [{iiop_ssl_port, 0}]),
ssl_suite(ServerOptions, ClientOptions).
%% SECURE MULTI ORB API tests (SSL depth 1)
%% This case set up two secure orbs and test if they can
%% communicate. The case also test to access one of the
%% secure orbs which must raise a NO_PERMISSION exception.
ssl_1_multi_orber_generation_3_api(_Config) ->
ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
1, [{ssl_generation, 3},
{iiop_ssl_port, 0}]),
ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
1, [{ssl_generation, 3},
{iiop_ssl_port, 0}]),
ssl_suite(ServerOptions, ClientOptions).
%%-----------------------------------------------------------------
%% API tests for ORB to ORB, ssl security depth 2
%%-----------------------------------------------------------------
%% SECURE MULTI ORB API tests (SSL depth 2)
%% These case set up two secure orbs and test if they can
%% communicate. They also test to access one of the
%% secure orbs which must raise a NO_PERMISSION exception.
ssl_2_multi_orber_api(_Config) ->
ServerOptions = orber_test_lib:get_options_old(iiop_ssl, server,
2, [{iiop_ssl_port, 0}]),
ClientOptions = orber_test_lib:get_options_old(iiop_ssl, client,
2, [{iiop_ssl_port, 0}]),
ssl_suite(ServerOptions, ClientOptions).
ssl_2_multi_orber_generation_3_api(_Config) ->
ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
2, [{ssl_generation, 3},
{iiop_ssl_port, 0}]),
ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
2, [{ssl_generation, 3},
{iiop_ssl_port, 0}]),
ssl_suite(ServerOptions, ClientOptions).
%%-----------------------------------------------------------------
%% API tests for ORB to ORB, ssl security depth 2
%%-----------------------------------------------------------------
%% SECURE MULTI ORB API tests (SSL depth 2)
%% These case set up two secure orbs and test if they can
%% communicate. They also test to access one of the
%% secure orbs which must raise a NO_PERMISSION exception.
ssl_reconfigure_api(_Config) ->
ssl_reconfigure_old([]).
% ssl_reconfigure_generation_3_api_old(_Config) ->
% ssl_reconfigure_old([{ssl_generation, 3}]).
ssl_reconfigure_old(ExtraSSLOptions) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_},
orber_test_lib:js_node([{iiop_port, 0},
{flags, ?ORB_ENV_LOCAL_INTERFACE},
{ip_address, IP}|ExtraSSLOptions])),
orber_test_lib:remote_apply(ServerNode, ssl, start, []),
orber_test_lib:remote_apply(ServerNode, crypto, start, []),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[ssl])),
?match({ok, _},
orber_test_lib:remote_apply(ServerNode, orber,
add_listen_interface,
[Loopback, normal, [{iiop_port, 5648},
{iiop_ssl_port, 5649},
{interceptors, {native, [orber_iiop_tracer_silent]}}|ExtraSSLOptions]])),
ServerOptions = orber_test_lib:get_options_old(iiop_ssl, server,
2, [{flags, ?ORB_ENV_LOCAL_INTERFACE},
{iiop_port, 5648},
{iiop_ssl_port, 5649},
{interceptors, {native, [orber_iiop_tracer_silent]}}|ExtraSSLOptions]),
?match({ok, _},
orber_test_lib:remote_apply(ServerNode, orber,
add_listen_interface,
[Loopback, ssl, ServerOptions])),
ClientOptions = orber_test_lib:get_options_old(iiop_ssl, client,
2, [{iiop_ssl_port, 0}|ExtraSSLOptions]),
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node(ClientOptions)),
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib,
install_test_data,
[ssl])),
orber_test_lib:remote_apply(ClientNode, ssl, start, []),
orber_test_lib:remote_apply(ServerNode, crypto, start, []),
Obj = ?match(#'IOP_IOR'{},
orber_test_lib:remote_apply(ClientNode, corba,
string_to_object, ["corbaname:iiop:1.1@"++Loopback++":5648/NameService#mamba",
[{context, [#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {configuration, ClientOptions}}]}]])),
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_server,
print, [Obj])).
ssl_reconfigure_generation_3_api(_Config) ->
ssl_reconfigure([{ssl_generation, 3}]).
ssl_reconfigure(ExtraSSLOptions) ->
IP = orber_test_lib:get_host(),
Loopback = orber_test_lib:get_loopback_interface(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_},
orber_test_lib:js_node([{iiop_port, 0},
{flags, ?ORB_ENV_LOCAL_INTERFACE},
{ip_address, IP}|ExtraSSLOptions])),
orber_test_lib:remote_apply(ServerNode, ssl, start, []),
orber_test_lib:remote_apply(ServerNode, crypto, start, []),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[ssl])),
?match({ok, _},
orber_test_lib:remote_apply(ServerNode, orber,
add_listen_interface,
[Loopback, normal, [{iiop_port, 5648},
{iiop_ssl_port, 5649},
{interceptors, {native, [orber_iiop_tracer_silent]}}|ExtraSSLOptions]])),
ServerOptions = orber_test_lib:get_options(iiop_ssl, server,
2, [{flags, ?ORB_ENV_LOCAL_INTERFACE},
{iiop_port, 5648},
{iiop_ssl_port, 5649},
{interceptors, {native, [orber_iiop_tracer_silent]}}|ExtraSSLOptions]),
?match({ok, _},
orber_test_lib:remote_apply(ServerNode, orber,
add_listen_interface,
[Loopback, ssl, ServerOptions])),
ClientOptions = orber_test_lib:get_options(iiop_ssl, client,
2, [{iiop_ssl_port, 0}|ExtraSSLOptions]),
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node(ClientOptions)),
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib,
install_test_data,
[ssl])),
orber_test_lib:remote_apply(ClientNode, ssl, start, []),
orber_test_lib:remote_apply(ServerNode, crypto, start, []),
Obj = ?match(#'IOP_IOR'{},
orber_test_lib:remote_apply(ClientNode, corba,
string_to_object, ["corbaname:iiop:1.1@"++Loopback++":5648/NameService#mamba",
[{context, [#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {configuration, ClientOptions}}]}]])),
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_server,
print, [Obj])).
%%------------------------------------------------------------
%% function : ssl_suite
%% Arguments: Config
%% Depth
%% Returns : ok
%% Effect :
%%------------------------------------------------------------
ssl_suite(ServerOptions, ClientOptions) ->
{ok, ServerNode, ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node(ServerOptions)),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
SSLServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_ssl_port, []),
{ok, ClientNode, _ClientHost} =
?match({ok,_,_}, orber_test_lib:js_node(ClientOptions)),
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[ssl])),
%% Tell the client to interoperate with the server. The purpose of this
%% operation is to look up, using NameService, an object reference and
%% use it to contact the object.
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib,
lookup,
[ServerHost, ServerPort])),
?match(ok, orber_test_lib:remote_apply(ClientNode, orber_test_lib,
alternate_ssl_iiop_address,
[ServerHost, ServerPort, SSLServerPort])),
%% 'This' node is not secure. Contact the server. Must refuse connection.
NSR = ?match({'IOP_IOR',"IDL:omg.org/CosNaming/NamingContextExt:1.0",_},
corba:string_to_object("corbaloc::1.2@"++ServerHost++":"++
integer_to_list(ServerPort)++"/NameService")),
%% Should be 'NO_PERMISSION'??
?match({'EXCEPTION',{'COMM_FAILURE',_,_,_}},
'CosNaming_NamingContext':resolve(NSR, lname:new(["not_exist"]))),
%% Should be 'NO_PERMISSION'??
?match({'EXCEPTION',{'COMM_FAILURE',_,_,_}},
'CosNaming_NamingContext':resolve(NSR, lname:new(["mamba"]))),
%% Uninstall.
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
uninstall_test_data,
[ssl])),
ok.
%%-----------------------------------------------------------------
%% iiop_setup_connection_timeout API tests for ORB to ORB.
%%-----------------------------------------------------------------
setup_connection_timeout_api(_Config) ->
?match(ok, application:set_env(orber, iiop_backlog, 0)),
%% Wait to be sure that the configuration has kicked in.
timer:sleep(2000),
{ok, Ref, Port} = create_fake_server_ORB(normal, 0, [], listen, []),
?match(ok, orber:configure(iiop_setup_connection_timeout, 5)),
?match(ok, orber:info(io)),
IP = orber_test_lib:get_host(),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
timer:sleep(2000),
Corbaloc = "corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService",
?match({'EXCEPTION', _E}, corba:string_to_object(Corbaloc)),
destroy_fake_ORB(Ref),
?match(ok, application:set_env(orber, iiop_backlog, 5)),
ok.
%%-----------------------------------------------------------------
%% iiop_setup_connection_timeout API tests for ORB to ORB.
%%-----------------------------------------------------------------
setup_multi_connection_timeout_api(_Config) ->
?match(ok, application:set_env(orber, iiop_backlog, 0)),
%% Wait to be sure that the configuration has kicked in.
timer:sleep(2000),
{ok, Ref, Port} = create_fake_server_ORB(normal, 0, [], listen, []),
?match(ok, application:set_env(orber, iiop_out_ports, {6042, 6234})),
?match(ok, orber:configure(iiop_setup_connection_timeout, 5)),
?match(ok, orber:info(io)),
IP = orber_test_lib:get_host(),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
Corbaloc = "corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService",
timer:sleep(2000),
?match({'EXCEPTION', _E}, corba:string_to_object(Corbaloc)),
destroy_fake_ORB(Ref),
?match(ok, application:set_env(orber, iiop_backlog, 5)),
?match(ok, application:set_env(orber, iiop_out_ports, undefined)),
ok.
setup_multi_connection_timeout_attempts_api(_Config) ->
?match(ok, application:set_env(orber, iiop_backlog, 0)),
%% Wait to be sure that the configuration has kicked in.
timer:sleep(2000),
{ok, Ref, Port} = create_fake_server_ORB(normal, 0, [], listen, []),
?match(ok, application:set_env(orber, iiop_out_ports, {6042, 6234})),
?match(ok, application:set_env(orber, iiop_out_ports_attempts, 1)),
?match(ok, orber:configure(iiop_setup_connection_timeout, 5)),
?match(ok, orber:info(io)),
IP = orber_test_lib:get_host(),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
Corbaloc = "corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService",
timer:sleep(2000),
?match({'EXCEPTION', _E}, corba:string_to_object(Corbaloc)),
destroy_fake_ORB(Ref),
?match(ok, application:set_env(orber, iiop_backlog, 5)),
?match(ok, application:set_env(orber, iiop_out_ports, undefined)),
ok.
setup_multi_connection_timeout_random_api(_Config) ->
?match(ok, application:set_env(orber, iiop_backlog, 0)),
%% Wait to be sure that the configuration has kicked in.
timer:sleep(2000),
{ok, Ref, Port} = create_fake_server_ORB(normal, 0, [], listen, []),
?match(ok, application:set_env(orber, iiop_out_ports, {6042, 6234})),
?match(ok, application:set_env(orber, iiop_out_ports_random, true)),
?match(ok, orber:configure(iiop_setup_connection_timeout, 5)),
?match(ok, orber:info(io)),
IP = orber_test_lib:get_host(),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
spawn(?MODULE, do_connect, [IP, Port, [{active, false}]]),
Corbaloc = "corbaloc::1.2@"++IP++":"++integer_to_list(Port)++"/NameService",
timer:sleep(2000),
?match({'EXCEPTION', _E}, corba:string_to_object(Corbaloc)),
destroy_fake_ORB(Ref),
?match(ok, application:set_env(orber, iiop_backlog, 5)),
?match(ok, application:set_env(orber, iiop_out_ports, undefined)),
ok.
%%-----------------------------------------------------------------
%% Sending an incorrect header to the server-side ORB.
%%-----------------------------------------------------------------
bad_giop_header_api(_Config) ->
orber:configure_override(interceptors, {native,[orber_iiop_tracer]}),
orber:configure(orber_debug_level, 10),
?match(ok, orber:info(io)),
{ok, ServerNode, ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node()),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
Req = <<"GIOP",1,2,0,100,0,0,0,5,0,0,0,10,50>> ,
?match(ok, fake_client_ORB(normal, ServerHost, ServerPort, [],
message_error, [Req])),
application:set_env(orber, interceptors, false),
orber:configure(orber_debug_level, 0),
ok.
%%-----------------------------------------------------------------
%% Fragmented IIOP tests (Server-side).
%%-----------------------------------------------------------------
-define(REQUEST_ID, 0).
-define(REPLY_FRAG_1, <<71,73,79,80,1,2,2,1,0,0,0,41,0,0,0,?REQUEST_ID,0,0,0,0,0,0,0,1,78,69,79,0,0,0,0,2,0,10,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,4,49>>).
%% The fragments are identical for requests and replies.
-define(FRAG_2, <<71,73,79,80,1,2,2,7,0,0,0,5,0,0,0,?REQUEST_ID,50>>).
-define(FRAG_3, <<71,73,79,80,1,2,2,7,0,0,0,5,0,0,0,?REQUEST_ID,51>>).
-define(FRAG_4, <<71,73,79,80,1,2,0,7,0,0,0,5,0,0,0,?REQUEST_ID,0>>).
fragments_server_api(_Config) ->
%% --- Create a slave-node ---
{ok, Node, Host} =
?match({ok,_,_}, orber_test_lib:js_node()),
Port = orber_test_lib:remote_apply(Node, orber, iiop_port, []),
?match(ok, orber_test_lib:remote_apply(Node, orber_test_lib,
install_test_data,
[nameservice])),
NSR = ?match({'IOP_IOR',"IDL:omg.org/CosNaming/NamingContextExt:1.0",_},
corba:string_to_object("corbaloc::1.2@"++Host++":"++
integer_to_list(Port)++"/NameService")),
Obj = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
'CosNaming_NamingContext':resolve(NSR, lname:new(["mamba"]))),
Any = #any{typecode = {tk_string,0},
value = "123"},
Target = #'GIOP_TargetAddress'{label = ?GIOP_KeyAddr,
value = iop_ior:get_objkey(Obj)},
%% Fix a request header.
{Hdr, Body, HdrLen, _What, _Flags} =
cdr_encode:enc_request_split(
#giop_env{version = {1,2}, objkey = Target,
request_id = ?REQUEST_ID,
response_expected = true,
op = testing_iiop_any,
parameters = [49], ctx = [],
tc = {tk_void,[tk_char],[]},
host = [orber_test_lib:get_host()],
iiop_port = orber:iiop_port(),
iiop_ssl_port = orber:iiop_ssl_port(),
domain = orber:domain(),
partial_security = orber:partial_security()}),
NewBody =
case size(Body) of
1 ->
<<0,0,0,18,0,0,0,0,0,0,0,4,49>> ;
Size ->
Aligned = Size -1,
<<AligmnetData:Aligned/binary,49>> = Body,
list_to_binary([AligmnetData, <<0,0,0,18,0,0,0,0,0,0,0,4,49>> ])
end,
MessSize = HdrLen+size(NewBody),
ReqFrag = list_to_binary([ <<"GIOP",1:8,2:8,2:8,0:8,
MessSize:32/big-unsigned-integer>> , Hdr |NewBody]),
?match(Any, fake_client_ORB(normal, Host, Port, [], fragments,
[ReqFrag, ?FRAG_2, ?FRAG_3, ?FRAG_4])),
ok.
%%-----------------------------------------------------------------
%% Fragmented IIOP tests (Server-side). Exceeding Maximum.
%%-----------------------------------------------------------------
fragments_max_server_api(_Config) ->
%% --- Create a slave-node ---
IP = orber_test_lib:get_host(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([{iiop_max_fragments, 2},
{ip_address, IP}])),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
fragments_max_server(ServerNode, IP, ServerPort).
fragments_max_server_added_api(_Config) ->
%% --- Create a slave-node ---
IP = orber_test_lib:get_host(),
{ok, ServerNode, _ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node([])),
ServerPort = 1 + orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
?match({ok, _},
orber_test_lib:remote_apply(ServerNode, orber,
add_listen_interface,
[IP, normal,
[{iiop_max_fragments, 2},
{flags, ?ORB_ENV_LOCAL_INTERFACE},
{iiop_port, ServerPort}]])),
fragments_max_server(ServerNode, IP, ServerPort).
fragments_max_server(ServerNode, ServerHost, ServerPort) ->
?match(ok, orber_test_lib:remote_apply(ServerNode, orber_test_lib,
install_test_data,
[nameservice])),
Obj = ?match({'IOP_IOR',"IDL:omg.org/orber_test/server:1.0",_},
corba:string_to_object("corbaname::1.2@"++ServerHost++":"++
integer_to_list(ServerPort)++"/NameService#mamba")),
Target = #'GIOP_TargetAddress'{label = ?GIOP_KeyAddr,
value = iop_ior:get_objkey(Obj)},
%% Fix a request header.
{Hdr, Body, HdrLen, _What, _Flags} =
cdr_encode:enc_request_split(
#giop_env{version = {1,2},
objkey = Target,
request_id = ?REQUEST_ID,
response_expected = true,
op = testing_iiop_any,
parameters = [49], ctx = [],
tc = {tk_void,[tk_char],[]},
host = [orber_test_lib:get_host()],
iiop_port = orber:iiop_port(),
iiop_ssl_port = orber:iiop_ssl_port(),
domain = orber:domain(),
partial_security = orber:partial_security()}),
NewBody =
case size(Body) of
1 ->
<<0,0,0,18,0,0,0,0,0,0,0,4,49>> ;
Size ->
Aligned = Size -1,
<<AligmnetData:Aligned/binary,49>> = Body,
list_to_binary([AligmnetData, <<0,0,0,18,0,0,0,0,0,0,0,4,49>> ])
end,
MessSize = HdrLen+size(NewBody),
ReqFrag = list_to_binary([ <<"GIOP",1:8,2:8,2:8,0:8,
MessSize:32/big-unsigned-integer>> , Hdr |NewBody]),
?match(#'IMP_LIMIT'{},
fake_client_ORB(normal, ServerHost, ServerPort, [], fragments_max,
[ReqFrag, ?FRAG_2, ?FRAG_3, ?FRAG_4])),
ok.
%%-----------------------------------------------------------------
%% Fragmented IIOP tests (Client-side).
%%-----------------------------------------------------------------
fragments_client_api(_Config) ->
Any = #any{typecode = {tk_string,0},
value = "123"},
application:set_env(orber, interceptors, {native,[orber_iiop_tracer]}),
orber:configure(orber_debug_level, 10),
orber:info(),
IOR = ?match({'IOP_IOR',_,_},
iop_ior:create_external({1, 2}, "IDL:FAKE:1.0",
"localhost", 6004, "FAKE", [])),
spawn(?MODULE, create_fake_server_ORB, [normal, 6004, [], fragments,
[?REPLY_FRAG_1, ?FRAG_2,
?FRAG_3, ?FRAG_4]]),
?match({ok, Any}, orber_test_server:testing_iiop_any(IOR, Any)),
application:set_env(orber, interceptors, false),
orber:configure(orber_debug_level, 0),
ok.
bad_fragment_id_client_api(_Config) ->
application:set_env(orber, interceptors, {native,[orber_iiop_tracer]}),
orber:configure(orber_debug_level, 10),
orber:info(),
{ok, ServerNode, ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node()),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
Req = <<71,73,79,80,1,2,2,7,0,0,0,5,0,0,0,100,50>> ,
?match(ok, fake_client_ORB(normal, ServerHost, ServerPort, [],
message_error, [Req])),
application:set_env(orber, interceptors, false),
orber:configure(orber_debug_level, 0),
ok.
%%-----------------------------------------------------------------
%% Non-existing request id
%%-----------------------------------------------------------------
bad_id_cancel_request_api(Config) when is_list(Config) ->
Req10 = cdr_encode:enc_cancel_request(#giop_env{version = {1, 0},
request_id = 556}),
Req11 = cdr_encode:enc_cancel_request(#giop_env{version = {1, 1},
request_id = 556}),
Req12 = cdr_encode:enc_cancel_request(#giop_env{version = {1, 2},
request_id = 556}),
{ok, ServerNode, ServerHost} =
?match({ok,_,_}, orber_test_lib:js_node()),
ServerPort = orber_test_lib:remote_apply(ServerNode, orber, iiop_port, []),
?match(ok, fake_client_ORB(normal, ServerHost, ServerPort, [],
message_error, [Req10])),
?match(ok, fake_client_ORB(normal, ServerHost, ServerPort, [],
message_error, [Req11])),
?match(ok, fake_client_ORB(normal, ServerHost, ServerPort, [],
message_error, [Req12])),
ok.
%%-----------------------------------------------------------------
%% Local functions.
%%-----------------------------------------------------------------
do_connect(Host, Port, Options) ->
gen_tcp:connect(Host, Port, Options),
timer:sleep(20000).
pseudo_calls(0, _) ->
ok;
pseudo_calls(Times, Obj) ->
orber_test_server:pseudo_call(Obj),
New = Times - 1,
pseudo_calls(New, Obj).
pseudo_casts(0, _) ->
ok;
pseudo_casts(Times, Obj) ->
orber_test_server:pseudo_cast(Obj),
New = Times - 1,
pseudo_casts(New, Obj).
context_test(Obj) ->
CodeSetCtx = #'CONV_FRAME_CodeSetContext'{char_data = 65537,
wchar_data = 65801},
FTGrp = #'FT_FTGroupVersionServiceContext'{object_group_ref_version = ?ULONGMAX},
FTReq = #'FT_FTRequestServiceContext'{client_id = "ClientId",
retention_id = ?LONGMAX,
expiration_time = ?ULONGLONGMAX},
IDToken1 = #'CSI_IdentityToken'{label = ?CSI_IdentityTokenType_ITTAbsent,
value = true},
IDToken2 = #'CSI_IdentityToken'{label = ?CSI_IdentityTokenType_ITTAnonymous,
value = false},
IDToken3 = #'CSI_IdentityToken'{label = ?CSI_IdentityTokenType_ITTPrincipalName,
value = [0,255]},
IDToken4 = #'CSI_IdentityToken'{label = ?CSI_IdentityTokenType_ITTX509CertChain,
value = [1,255]},
IDToken5 = #'CSI_IdentityToken'{label = ?CSI_IdentityTokenType_ITTDistinguishedName,
value = [2,255]},
IDToken6 = #'CSI_IdentityToken'{label = ?ULONGMAX,
value = [3,255]},
MTEstablishContext1 = #'CSI_SASContextBody'
{label = ?CSI_MsgType_MTEstablishContext,
value = #'CSI_EstablishContext'{client_context_id = ?ULONGLONGMAX,
authorization_token =
[#'CSI_AuthorizationElement'
{the_type = ?ULONGMAX,
the_element = [0,255]}],
identity_token = IDToken1,
client_authentication_token = [1, 255]}},
MTEstablishContext2 = #'CSI_SASContextBody'
{label = ?CSI_MsgType_MTEstablishContext,
value = #'CSI_EstablishContext'{client_context_id = ?ULONGLONGMAX,
authorization_token =
[#'CSI_AuthorizationElement'
{the_type = ?ULONGMAX,
the_element = [0,255]}],
identity_token = IDToken2,
client_authentication_token = [1, 255]}},
MTEstablishContext3 = #'CSI_SASContextBody'
{label = ?CSI_MsgType_MTEstablishContext,
value = #'CSI_EstablishContext'{client_context_id = ?ULONGLONGMAX,
authorization_token =
[#'CSI_AuthorizationElement'
{the_type = ?ULONGMAX,
the_element = [0,255]}],
identity_token = IDToken3,
client_authentication_token = [1, 255]}},
MTEstablishContext4 = #'CSI_SASContextBody'
{label = ?CSI_MsgType_MTEstablishContext,
value = #'CSI_EstablishContext'{client_context_id = ?ULONGLONGMAX,
authorization_token =
[#'CSI_AuthorizationElement'
{the_type = ?ULONGMAX,
the_element = [0,255]}],
identity_token = IDToken4,
client_authentication_token = [1, 255]}},
MTEstablishContext5 = #'CSI_SASContextBody'
{label = ?CSI_MsgType_MTEstablishContext,
value = #'CSI_EstablishContext'{client_context_id = ?ULONGLONGMAX,
authorization_token =
[#'CSI_AuthorizationElement'
{the_type = ?ULONGMAX,
the_element = [0,255]}],
identity_token = IDToken5,
client_authentication_token = [1, 255]}},
MTEstablishContext6 = #'CSI_SASContextBody'
{label = ?CSI_MsgType_MTEstablishContext,
value = #'CSI_EstablishContext'{client_context_id = ?ULONGLONGMAX,
authorization_token =
[#'CSI_AuthorizationElement'
{the_type = ?ULONGMAX,
the_element = [0,255]}],
identity_token = IDToken6,
client_authentication_token = [1, 255]}},
MTCompleteEstablishContext = #'CSI_SASContextBody'
{label = ?CSI_MsgType_MTCompleteEstablishContext,
value = #'CSI_CompleteEstablishContext'{client_context_id = ?ULONGLONGMAX,
context_stateful = false,
final_context_token = [1, 255]}},
MTContextError = #'CSI_SASContextBody'
{label = ?CSI_MsgType_MTContextError,
value = #'CSI_ContextError'{client_context_id = ?ULONGLONGMAX,
major_status = 1,
minor_status = 2,
error_token = [2,255]}},
MTMessageInContext = #'CSI_SASContextBody'
{label = ?CSI_MsgType_MTMessageInContext,
value = #'CSI_MessageInContext'{client_context_id = ?ULONGLONGMAX,
discard_context = true}},
Ctx = [#'IOP_ServiceContext'{context_id=?IOP_CodeSets,
context_data = CodeSetCtx},
#'IOP_ServiceContext'{context_id=?IOP_FT_GROUP_VERSION,
context_data = FTGrp},
#'IOP_ServiceContext'{context_id=?IOP_FT_REQUEST,
context_data = FTReq},
#'IOP_ServiceContext'{context_id=?IOP_SecurityAttributeService,
context_data = MTEstablishContext1},
#'IOP_ServiceContext'{context_id=?IOP_SecurityAttributeService,
context_data = MTEstablishContext2},
#'IOP_ServiceContext'{context_id=?IOP_SecurityAttributeService,
context_data = MTEstablishContext3},
#'IOP_ServiceContext'{context_id=?IOP_SecurityAttributeService,
context_data = MTEstablishContext4},
#'IOP_ServiceContext'{context_id=?IOP_SecurityAttributeService,
context_data = MTEstablishContext5},
#'IOP_ServiceContext'{context_id=?IOP_SecurityAttributeService,
context_data = MTEstablishContext6},
#'IOP_ServiceContext'{context_id=?IOP_SecurityAttributeService,
context_data = MTCompleteEstablishContext},
#'IOP_ServiceContext'{context_id=?IOP_SecurityAttributeService,
context_data = MTContextError},
#'IOP_ServiceContext'{context_id=?IOP_SecurityAttributeService,
context_data = MTMessageInContext},
#'IOP_ServiceContext'{context_id=?ORBER_GENERIC_CTX_ID,
context_data = {any_kind_of_data, {127,0,0,1}, 4001}}],
?match(ok, orber_test_server:testing_iiop_context(Obj, [{context, Ctx}])).
create_fake_server_ORB(Type, Port, Options, listen, _Data) ->
{ok, _ListenSocket, NewPort} =
orber_socket:listen(Type, Port,
[{backlog, 0}, {active, false}|Options]),
Socket = orber_socket:connect(Type, 'localhost', NewPort, [{active, false}|Options]),
{ok, {Type, Socket}, NewPort};
create_fake_server_ORB(Type, Port, Options, Action, Data) ->
{ok, ListenSocket, _NewPort} =
orber_socket:listen(Type, Port, [{active, false}|Options]),
Socket = orber_socket:accept(Type, ListenSocket),
do_server_action(Type, Socket, Action, Data),
orber_socket:close(Type, Socket),
ok.
destroy_fake_ORB({Type, Socket}) ->
orber_socket:close(Type, Socket);
destroy_fake_ORB(_) ->
ok.
fake_client_ORB(Type, Host, Port, Options, connect, _Data) ->
Socket = orber_socket:connect(Type, Host, Port, [{active, false}|Options]),
{Type, Socket};
fake_client_ORB(Type, Host, Port, Options, Action, Data) ->
Socket = orber_socket:connect(Type, Host, Port, [{active, false}|Options]),
Result = do_client_action(Type, Socket, Action, Data),
orber_socket:close(Type, Socket),
Result.
do_server_action(Type, Socket, fragments, FragList) ->
timer:sleep(3000),
{ok, _B} = gen_tcp:recv(Socket, 0),
ok = send_data(Type, Socket, FragList);
do_server_action(_Type, _Socket, _Action, _Data) ->
ok.
do_client_action(Type, Socket, fragments, FragList) ->
ok = send_data(Type, Socket, FragList),
timer:sleep(3000),
{ok, Bytes} = gen_tcp:recv(Socket, 0),
{#reply_header{request_id = ?REQUEST_ID, reply_status = no_exception}, ok, [Par]} =
cdr_decode:dec_message({tk_void,[tk_any],[tk_any]}, Bytes),
Par;
do_client_action(Type, Socket, fragments_max, FragList) ->
ok = send_data(Type, Socket, FragList),
timer:sleep(3000),
{ok, Bytes} = gen_tcp:recv(Socket, 0),
{#reply_header{request_id = ?REQUEST_ID, reply_status = system_exception}, Exc, []} =
cdr_decode:dec_message({tk_void,[tk_any],[tk_any]}, Bytes),
Exc;
do_client_action(Type, Socket, message_error, Data) ->
ok = send_data(Type, Socket, Data),
timer:sleep(3000),
{ok,Bytes} = gen_tcp:recv(Socket, 0),
'message_error' = cdr_decode:dec_message({tk_void,[tk_any],[tk_any]}, Bytes),
ok;
do_client_action(_Type, _Socket, _Action, _Data) ->
ok.
send_data(_Type, _Socket, []) ->
ok;
send_data(Type, Socket, [H|T]) ->
orber_socket:write(Type, Socket, H),
send_data(Type, Socket, T).