%%-----------------------------------------------------------------
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1997-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(event_channel_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").
%%-----------------------------------------------------------------
%% Macros
%%-----------------------------------------------------------------
-define(default_timeout, test_server:minutes(5)).
-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 ######~n~p~n",
[AcTuAlReS]),
exit(AcTuAlReS)
end
end()).
%%-----------------------------------------------------------------
%% External exports
%%-----------------------------------------------------------------
-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2,
event_objects_api/1, events_api/1, events_sync_api/1,
cases/0, init_per_suite/1, end_per_suite/1,
init_per_testcase/2, end_per_testcase/2, app_test/1]).
%%-----------------------------------------------------------------
%% Internal exports
%%-----------------------------------------------------------------
suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
cases().
groups() ->
[].
init_per_group(_GroupName, Config) ->
Config.
end_per_group(_GroupName, Config) ->
Config.
cases() ->
[events_api, events_sync_api, event_objects_api,
app_test].
%%-----------------------------------------------------------------
%% Init and cleanup functions.
%%-----------------------------------------------------------------
init_per_testcase(_Case, Config) ->
Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
end_per_testcase(_Case, Config) ->
Dog = proplist:get_value(watchdog, Config),
test_server:timetrap_cancel(Dog),
ok.
init_per_suite(Config) when is_list(Config) ->
Path = code:which(?MODULE),
code:add_pathz(filename:join(filename:dirname(Path), "idl_output")),
mnesia:delete_schema([node()]),
mnesia:create_schema([node()]),
orber:install([node()]),
application:start(mnesia),
application:start(orber),
cosEventApp:install(),
cosEventApp:start(),
oe_event_test_server:oe_register(),
Config.
end_per_suite(Config) when is_list(Config) ->
oe_event_test_server:oe_unregister(),
cosEventApp:stop(),
cosEventApp:uninstall(),
application:stop(orber),
application:stop(mnesia),
mnesia:delete_schema([node()]),
Path = code:which(?MODULE),
code:del_path(filename:join(filename:dirname(Path), "idl_output")),
Config.
%%-----------------------------------------------------------------
%% Tests app file
%%-----------------------------------------------------------------
app_test(doc) -> [];
app_test(suite) -> [];
app_test(_Config) ->
ok=test_server:app_test(cosEvent),
ok.
%% Testing the CosEvent API to setup a complete service
event_objects_api(_Config) ->
Ch = ?match({_,key,_,_,_,_}, cosEventApp:start_channel([{typecheck, true},
{pull_interval, 300}])),
AC=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_EventChannel':for_consumers(Ch)),
AS=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_EventChannel':for_suppliers(Ch)),
PPushS=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_ConsumerAdmin':obtain_push_supplier(AC)),
PPullS=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_ConsumerAdmin':obtain_pull_supplier(AC)),
PPushC=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_SupplierAdmin':obtain_push_consumer(AS)),
PPullC=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_SupplierAdmin':obtain_pull_consumer(AS)),
PushC=?match({_,key,_,_,_,_},
'event_test_PushC':oe_create([])),
PullC=?match({_,key,_,_,_,_},
'event_test_PullC':oe_create(PPullC)),
PushS=?match({_,key,_,_,_,_},
'event_test_PushS':oe_create(PPushC)),
PullS=?match({_,key,_,_,_,_},
'event_test_PullS':oe_create([])),
NIL = corba:create_nil_objref(),
?match({'EXCEPTION',{'BAD_PARAM',_,_,_}},
'CosEventChannelAdmin_ProxyPushSupplier':connect_push_consumer(PPushS, NIL)),
?match({'EXCEPTION',{'BAD_PARAM',_,_,_}},
'CosEventChannelAdmin_ProxyPushSupplier':connect_push_consumer(PPushS, PullS)),
?match(ok, 'CosEventChannelAdmin_ProxyPushSupplier':connect_push_consumer(PPushS, PushC)),
?match({'EXCEPTION',{'CosEventChannelAdmin_AlreadyConnected',_}},
'CosEventChannelAdmin_ProxyPushSupplier':connect_push_consumer(PPushS, PushC)),
?match(ok, 'CosEventChannelAdmin_ProxyPullSupplier':connect_pull_consumer(PPullS, NIL)),
?match({'EXCEPTION',{'BAD_PARAM',_,_,_}},
'CosEventChannelAdmin_ProxyPullSupplier':connect_pull_consumer(PPullS, PullS)),
?match(ok, 'CosEventChannelAdmin_ProxyPullSupplier':connect_pull_consumer(PPullS, PullC)),
?match({'EXCEPTION',{'CosEventChannelAdmin_AlreadyConnected',_}},
'CosEventChannelAdmin_ProxyPullSupplier':connect_pull_consumer(PPullS, PullC)),
?match(ok, 'CosEventChannelAdmin_ProxyPushConsumer':connect_push_supplier(PPushC, NIL)),
?match({'EXCEPTION',{'BAD_PARAM',_,_,_}},
'CosEventChannelAdmin_ProxyPushConsumer':connect_push_supplier(PPushC, PullS)),
?match(ok, 'CosEventChannelAdmin_ProxyPushConsumer':connect_push_supplier(PPushC, PushS)),
?match({'EXCEPTION',{'CosEventChannelAdmin_AlreadyConnected',_}},
'CosEventChannelAdmin_ProxyPushConsumer':connect_push_supplier(PPushC, PushS)),
?match({'EXCEPTION',{'BAD_PARAM',_,_,_}},
'CosEventChannelAdmin_ProxyPullConsumer':connect_pull_supplier(PPullC, NIL)),
?match({'EXCEPTION',{'BAD_PARAM',_,_,_}},
'CosEventChannelAdmin_ProxyPullConsumer':connect_pull_supplier(PPullC, PushS)),
?match(ok, 'CosEventChannelAdmin_ProxyPullConsumer':connect_pull_supplier(PPullC, PullS)),
?match({'EXCEPTION',{'CosEventChannelAdmin_AlreadyConnected',_}},
'CosEventChannelAdmin_ProxyPullConsumer':connect_pull_supplier(PPullC, PullS)),
catch corba:dispose(AC),
%% Wait a couple of seconds to be sure all data removed from DB.
timer:sleep(2000),
%% Since we terminated ConsumerAdmin only the Supplier Proxies should be terminated.
?match(true, corba_object:non_existent(AC)),
?match(true, corba_object:non_existent(PPushS)),
?match(true, corba_object:non_existent(PPullS)),
?match(false, corba_object:non_existent(Ch)),
?match(false, corba_object:non_existent(AS)),
?match(false, corba_object:non_existent(PPullC)),
?match(false, corba_object:non_existent(PPushC)),
%% Terminate a proxy and check that its admin is unaffected.
catch corba:dispose(PPullC),
timer:sleep(2000),
?match(false, corba_object:non_existent(AS)),
?match(true, corba_object:non_existent(PPullC)),
catch corba:dispose(Ch),
timer:sleep(2000),
?match(true, corba_object:non_existent(Ch)),
?match(true, corba_object:non_existent(AS)),
?match(true, corba_object:non_existent(PPullC)),
?match(true, corba_object:non_existent(PPushC)),
%% The client should be notified; wait for a couple of seconds and check it.
timer:sleep(2000),
?match(true, corba_object:non_existent(PushC)),
?match(true, corba_object:non_existent(PullC)),
?match(true, corba_object:non_existent(PushS)),
?match(true, corba_object:non_existent(PullS)),
ok.
%% Testing the CosEvent API for sending events asynchronous
events_api(_Config) ->
Ch = ?match({_,key,_,_,_,_}, cosEventApp:start_channel([{typecheck, true},
{pull_interval, 2},
{blocking, false}])),
event_sender(Ch).
%% Testing the CosEvent API for sending events synchronous
events_sync_api(_Config) ->
Ch = ?match({_,key,_,_,_,_}, cosEventApp:start_channel([{typecheck, true},
{pull_interval, 2},
{blocking, true}])),
event_sender(Ch).
event_sender(Ch) ->
Event1 = #any{typecode=tk_long, value = 1},
Event2 = #any{typecode=tk_long, value = 2},
Event3 = #any{typecode=tk_long, value = 3},
Event4 = #any{typecode=tk_long, value = 4},
Event5 = #any{typecode=tk_long, value = 5},
Event6 = #any{typecode=tk_long, value = 6},
AC=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_EventChannel':for_consumers(Ch)),
AS=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_EventChannel':for_suppliers(Ch)),
PPushS=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_ConsumerAdmin':obtain_push_supplier(AC)),
PPullS=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_ConsumerAdmin':obtain_pull_supplier(AC)),
PPushC=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_SupplierAdmin':obtain_push_consumer(AS)),
PPullC=?match({_,key,_,_,_,_},
'CosEventChannelAdmin_SupplierAdmin':obtain_pull_consumer(AS)),
PushC=?match({_,key,_,_,_,_}, 'event_test_PushC':oe_create([])),
PullC=?match({_,key,_,_,_,_}, 'event_test_PullC':oe_create(PPullS)),
PushS=?match({_,key,_,_,_,_}, 'event_test_PushS':oe_create(PPushC)),
PullS=?match({_,key,_,_,_,_}, 'event_test_PullS':oe_create([])),
?match(ok, 'CosEventChannelAdmin_ProxyPushSupplier':connect_push_consumer(PPushS, PushC)),
?match(ok, 'CosEventChannelAdmin_ProxyPullSupplier':connect_pull_consumer(PPullS, PullC)),
?match(ok, 'CosEventChannelAdmin_ProxyPushConsumer':connect_push_supplier(PPushC, PushS)),
?match(ok, 'CosEventChannelAdmin_ProxyPullConsumer':connect_pull_supplier(PPullC, PullS)),
%% No events should be available at the consumer side at this point.
?match({_, false}, event_test_PullC:do_try_pull(PullC)),
?match([], event_test_PushC:get_data(PushC)),
%% Push an event and wait to be sure it have reached the destination.
?match(ok, event_test_PushS:do_push(PushS, Event1)),
?match(ok, event_test_PushS:do_push(PushS, Event2)),
?match(ok, event_test_PushS:do_push(PushS, Event3)),
timer:sleep(2000),
?match({Event1, true}, event_test_PullC:do_try_pull(PullC)),
?match({Event2, true}, event_test_PullC:do_try_pull(PullC)),
?match({Event3, true}, event_test_PullC:do_try_pull(PullC)),
?match({_, false}, event_test_PullC:do_try_pull(PullC)),
?match([Event1, Event2, Event3], event_test_PushC:get_data(PushC)),
?match(ok, event_test_PullS:add_event(PullS, Event4)),
?match(ok, event_test_PullS:add_event(PullS, Event5)),
?match(ok, event_test_PullS:add_event(PullS, Event6)),
%% Since the pull operation is blocking we do not need to "sleep".
%% The ProxyPullConsumer will pull for events according to the pull_interval
%% parameter given when started the channel.
?match(Event4, event_test_PullC:do_pull(PullC)),
?match(Event5, event_test_PullC:do_pull(PullC)),
?match(Event6, event_test_PullC:do_pull(PullC)),
timer:sleep(2000),
?match([Event4, Event5, Event6], event_test_PushC:get_data(PushC)),
catch corba:dispose(Ch),
%% The client should be notified; wait for a couple of seconds and check it.
timer:sleep(2000),
?match(true, corba_object:non_existent(PushC)),
?match(true, corba_object:non_existent(PullC)),
?match(true, corba_object:non_existent(PushS)),
?match(true, corba_object:non_existent(PullS)),
ok.