%%----------------------------------------------------------------- %% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2001-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_domain_SUITE). -include_lib("common_test/include/ct.hrl"). -include_lib("orber/include/corba.hrl"). -include_lib("cosNotification/include/CosNotifyChannelAdmin.hrl"). -include_lib("cosNotification/include/CosNotification.hrl"). -include_lib("cosEventDomain/include/CosEventDomainAdmin.hrl"). -include_lib("cosEventDomain/src/cosEventDomainApp.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_domain_api/1, event_domain_factory_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() -> [event_domain_api, event_domain_factory_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 = proplists:get_value(watchdog, Config), test_server:timetrap_cancel(Dog), ok. init_per_suite(Config) when is_list(Config) -> mnesia:delete_schema([node()]), mnesia:create_schema([node()]), ok = corba:orb_init([{flags, 16#02}, {orber_debug_level, 10}]), orber:install([node()]), application:start(mnesia), application:start(orber), cosEventApp:install(), cosEventApp:start(), cosNotificationApp:install(), cosNotificationApp:start(), cosEventDomainApp:install(), cosEventDomainApp:start(), Config. end_per_suite(Config) when is_list(Config) -> cosEventDomainApp:stop(), cosEventDomainApp:uninstall(), cosNotificationApp:stop(), cosNotificationApp:uninstall(), cosEventApp:stop(), cosEventApp:uninstall(), application:stop(orber), application:stop(mnesia), mnesia:delete_schema([node()]), Config. %%----------------------------------------------------------------- %% Tests app file %%----------------------------------------------------------------- app_test(_Config) -> ok=test_server:app_test(cosEventDomain), ok. %% Testing the CosEventDomain Domain API event_domain_api(_Config) -> %% We will setup a cluster looking like: %% 7-8---> %% / %% 2 - 4 6-> %% \ / %% 5---9-1-3 %% 2-4 %% 4-1 %% 1-3 %% 3-6 %% 5-9 %% 9-1 %% 4-7 %% 7-8 ChFac = ?match({_,key,_,_,_,_}, cosNotificationApp:start_global_factory([{pullInterval,1}])), {Ch0,_} = ?match({{_,key,_,_,_,_}, _}, 'CosNotifyChannelAdmin_EventChannelFactory':create_channel(ChFac, [], [])), Fac = ?match({_,key,_,_,_,_}, cosEventDomainApp:start_factory()), {ED, _} = ?match({{_,key,_,_,_,_}, _}, 'CosEventDomainAdmin_EventDomainFactory':create_event_domain(Fac, [], [])), ID0 = 'CosEventDomainAdmin_EventDomain':add_channel(ED, Ch0), ?match(Ch0, 'CosEventDomainAdmin_EventDomain':get_channel(ED, ID0)), ?match([0], 'CosEventDomainAdmin_EventDomain':get_all_channels(ED)), ?match({'EXCEPTION',{'CosNotifyChannelAdmin_ChannelNotFound',_}}, 'CosEventDomainAdmin_EventDomain':get_channel(ED, 100)), ?match({'EXCEPTION',{'CosNotifyChannelAdmin_ChannelNotFound',_}}, 'CosEventDomainAdmin_EventDomain':remove_channel(ED, 100)), ?match(ok, 'CosEventDomainAdmin_EventDomain':remove_channel(ED, 0)), ?match([], 'CosEventDomainAdmin_EventDomain':get_all_channels(ED)), ?match({'EXCEPTION',{'CosNotifyChannelAdmin_ChannelNotFound',_}}, 'CosEventDomainAdmin_EventDomain':remove_channel(ED, 0)), %% Create a new event channel. {Ch1,_} = ?match({{_,key,_,_,_,_}, _}, 'CosNotifyChannelAdmin_EventChannelFactory':create_channel(ChFac, [], [])), {Ch2,_} = ?match({{_,key,_,_,_,_}, _}, 'CosNotifyChannelAdmin_EventChannelFactory':create_channel(ChFac, [], [])), {Ch3,_} = ?match({{_,key,_,_,_,_}, _}, 'CosNotifyChannelAdmin_EventChannelFactory':create_channel(ChFac, [], [])), {Ch4,_} = ?match({{_,key,_,_,_,_}, _}, 'CosNotifyChannelAdmin_EventChannelFactory':create_channel(ChFac, [], [])), {Ch5,_} = ?match({{_,key,_,_,_,_}, _}, 'CosNotifyChannelAdmin_EventChannelFactory':create_channel(ChFac, [], [])), {Ch6,_} = ?match({{_,key,_,_,_,_}, _}, 'CosNotifyChannelAdmin_EventChannelFactory':create_channel(ChFac, [], [])), {Ch7,_} = ?match({{_,key,_,_,_,_}, _}, 'CosNotifyChannelAdmin_EventChannelFactory':create_channel(ChFac, [], [])), {Ch8,_} = ?match({{_,key,_,_,_,_}, _}, 'CosNotifyChannelAdmin_EventChannelFactory':create_channel(ChFac, [], [])), {Ch9,_} = ?match({{_,key,_,_,_,_}, _}, 'CosNotifyChannelAdmin_EventChannelFactory':create_channel(ChFac, [], [])), ID1 = 'CosEventDomainAdmin_EventDomain':add_channel(ED, Ch1), ID2 = 'CosEventDomainAdmin_EventDomain':add_channel(ED, Ch2), ID3 = 'CosEventDomainAdmin_EventDomain':add_channel(ED, Ch3), ID4 = 'CosEventDomainAdmin_EventDomain':add_channel(ED, Ch4), ID5 = 'CosEventDomainAdmin_EventDomain':add_channel(ED, Ch5), ID6 = 'CosEventDomainAdmin_EventDomain':add_channel(ED, Ch6), ID7 = 'CosEventDomainAdmin_EventDomain':add_channel(ED, Ch7), ID8 = 'CosEventDomainAdmin_EventDomain':add_channel(ED, Ch8), ID9 = 'CosEventDomainAdmin_EventDomain':add_channel(ED, Ch9), ?match([_,_,_,_,_,_,_,_,_], 'CosEventDomainAdmin_EventDomain':get_all_channels(ED)), ?match([], 'CosEventDomainAdmin_EventDomain':get_all_connections(ED)), C1 = #'CosEventDomainAdmin_Connection'{supplier_id=ID2, consumer_id=ID4, ctype='STRUCTURED_EVENT', notification_style='Pull'}, C2 = #'CosEventDomainAdmin_Connection'{supplier_id=ID4, consumer_id=ID1, ctype='ANY_EVENT', notification_style='Push'}, C3 = #'CosEventDomainAdmin_Connection'{supplier_id=ID1, consumer_id=ID3, ctype='ANY_EVENT', notification_style='Pull'}, C4 = #'CosEventDomainAdmin_Connection'{supplier_id=ID3, consumer_id=ID6, ctype='STRUCTURED_EVENT', notification_style='Push'}, C5 = #'CosEventDomainAdmin_Connection'{supplier_id=ID5, consumer_id=ID9, ctype='ANY_EVENT', notification_style='Pull'}, C6 = #'CosEventDomainAdmin_Connection'{supplier_id=ID9, consumer_id=ID1, ctype='ANY_EVENT', notification_style='Push'}, C7 = #'CosEventDomainAdmin_Connection'{supplier_id=ID4, consumer_id=ID7, ctype='STRUCTURED_EVENT', notification_style='Pull'}, C8 = #'CosEventDomainAdmin_Connection'{supplier_id=ID7, consumer_id=ID8, ctype='ANY_EVENT', notification_style='Push'}, C9 = #'CosEventDomainAdmin_Connection'{supplier_id=ID8, consumer_id=ID4, ctype='ANY_EVENT', notification_style='Pull'}, C10 = #'CosEventDomainAdmin_Connection'{supplier_id=ID5, consumer_id=ID4, ctype='ANY_EVENT', notification_style='Pull'}, C11 = #'CosEventDomainAdmin_Connection'{supplier_id=ID4, consumer_id=ID6, ctype='ANY_EVENT', notification_style='Pull'}, C12 = #'CosEventDomainAdmin_Connection'{supplier_id=ID8, consumer_id=ID6, ctype='ANY_EVENT', notification_style='Pull'}, CID1 = 'CosEventDomainAdmin_EventDomain':add_connection(ED, C1), ?match([CID1], 'CosEventDomainAdmin_EventDomain':get_all_connections(ED)), _CID2 = 'CosEventDomainAdmin_EventDomain':add_connection(ED, C2), ?match([_,_], 'CosEventDomainAdmin_EventDomain':get_all_connections(ED)), _CID3 = 'CosEventDomainAdmin_EventDomain':add_connection(ED, C3), ?match([_,_,_], 'CosEventDomainAdmin_EventDomain':get_all_connections(ED)), _CID4 = 'CosEventDomainAdmin_EventDomain':add_connection(ED, C4), ?match([_,_,_,_], 'CosEventDomainAdmin_EventDomain':get_all_connections(ED)), _CID5 = 'CosEventDomainAdmin_EventDomain':add_connection(ED, C5), ?match([_,_,_,_,_], 'CosEventDomainAdmin_EventDomain':get_all_connections(ED)), _CID6 = 'CosEventDomainAdmin_EventDomain':add_connection(ED, C6), ?match([_,_,_,_,_,_], 'CosEventDomainAdmin_EventDomain':get_all_connections(ED)), CID7 = 'CosEventDomainAdmin_EventDomain':add_connection(ED, C7), ?match([_,_,_,_,_,_,_], 'CosEventDomainAdmin_EventDomain':get_all_connections(ED)), _CID8 = 'CosEventDomainAdmin_EventDomain':add_connection(ED, C8), ?match([_,_,_,_,_,_,_,_], 'CosEventDomainAdmin_EventDomain':get_all_connections(ED)), ?match({'EXCEPTION',{'CosEventDomainAdmin_AlreadyExists', _}}, 'CosEventDomainAdmin_EventDomain':add_connection(ED, C8)), %% No cycles should exist. ?match([], 'CosEventDomainAdmin_EventDomain':get_cycles(ED)), ?match([_, _], 'CosEventDomainAdmin_EventDomain':get_qos(ED)), AllowCyclic = #'CosNotification_Property'{name=?CycleDetection, value=any:create(orber_tc:short(), ?AuthorizeCycles)}, ?match({'EXCEPTION',{'CosNotification_UnsupportedQoS',_,_}}, 'CosEventDomainAdmin_EventDomain':set_qos(ED, [AllowCyclic])), ForbidCyclic = #'CosNotification_Property'{name=?CycleDetection, value=any:create(orber_tc:short(), ?ForbidCycles)}, %% The same as before; must work. ?match(ok, 'CosEventDomainAdmin_EventDomain':set_qos(ED, [ForbidCyclic])), AllowDiamonds = #'CosNotification_Property'{name=?DiamondDetection, value=any:create(orber_tc:short(), ?AuthorizeDiamonds)}, %% Since no diamonds allowed before this is always ok. ?match(ok, 'CosEventDomainAdmin_EventDomain':set_qos(ED, [AllowDiamonds])), ?match([_, _], 'CosEventDomainAdmin_EventDomain':get_qos(ED)), ForbidDiamonds = #'CosNotification_Property'{name=?DiamondDetection, value=any:create(orber_tc:short(), ?ForbidDiamonds)}, %% No diamonds created before. Hence, will work. ?match(ok, 'CosEventDomainAdmin_EventDomain':set_qos(ED, [ForbidDiamonds])), ?match([_, _], 'CosEventDomainAdmin_EventDomain':get_qos(ED)), ?match({ok, [_]}, 'CosEventDomainAdmin_EventDomain':validate_qos(ED, [ForbidDiamonds, ForbidCyclic])), %% No diamonds exists, hence, this is ok. ?match({ok, [_]}, 'CosEventDomainAdmin_EventDomain':validate_qos(ED, [AllowDiamonds, ForbidCyclic])), ?match({'EXCEPTION',{'CosNotification_UnsupportedQoS',_,_}}, 'CosEventDomainAdmin_EventDomain':validate_qos(ED, [ForbidDiamonds, AllowCyclic])), %% Since the ED is started is asyclic we may not succeed with this invokation. ?match({'EXCEPTION',{'CosEventDomainAdmin_CycleCreationForbidden',_,_}}, 'CosEventDomainAdmin_EventDomain':add_connection(ED, C9)), ?match([], 'CosEventDomainAdmin_EventDomain':get_offer_channels(ED, ID2)), ?match([2], 'CosEventDomainAdmin_EventDomain':get_offer_channels(ED, ID4)), ?match([_,_,_], 'CosEventDomainAdmin_EventDomain':get_offer_channels(ED, ID8)), ?match({'EXCEPTION',{'CosNotifyChannelAdmin_ChannelNotFound',_}}, 'CosEventDomainAdmin_EventDomain':get_offer_channels(ED, 100)), ?match([], 'CosEventDomainAdmin_EventDomain':get_subscription_channels(ED, ID8)), ?match([_,_,_,_,_], 'CosEventDomainAdmin_EventDomain':get_subscription_channels(ED, ID4)), ?match([_,_,_,_,_,_], 'CosEventDomainAdmin_EventDomain':get_subscription_channels(ED, ID2)), ?match({'EXCEPTION',{'CosNotifyChannelAdmin_ChannelNotFound',_}}, 'CosEventDomainAdmin_EventDomain':get_subscription_channels(ED, 100)), Nil = corba:create_nil_objref(), P2=?match({_,key,_,_,_,_}, 'CosEventDomainAdmin_EventDomain':connect_push_supplier_with_id(ED, Nil, ID2)), P7=?match({_,key,_,_,_,_}, 'CosEventDomainAdmin_EventDomain':connect_push_supplier_with_id(ED, Nil, ID7)), P8=?match({_,key,_,_,_,_}, 'CosEventDomainAdmin_EventDomain':connect_pull_consumer_with_id(ED, Nil, ID8)), P6=?match({_,key,_,_,_,_}, 'CosEventDomainAdmin_EventDomain':connect_pull_consumer_with_id(ED, Nil, ID6)), E1 = #any{typecode=tk_long, value=1}, E2 = #any{typecode=tk_long, value=2}, ?match(ok, 'CosNotifyChannelAdmin_ProxyPushConsumer':push(P2, E1)), ?match(E1, 'CosNotifyChannelAdmin_ProxyPullSupplier':pull(P8)), ?match(E1, 'CosNotifyChannelAdmin_ProxyPullSupplier':pull(P6)), ?match(ok, 'CosNotifyChannelAdmin_ProxyPushConsumer':push(P7, E2)), ?match(E2, 'CosNotifyChannelAdmin_ProxyPullSupplier':pull(P8)), timer:sleep(10000), ?match({_,false}, 'CosNotifyChannelAdmin_ProxyPullSupplier':try_pull(P6)), ?match(ok, 'CosEventDomainAdmin_EventDomain':remove_connection(ED, CID7)), ?match({'EXCEPTION',{'CosEventDomainAdmin_ConnectionNotFound',_}}, 'CosEventDomainAdmin_EventDomain':remove_connection(ED, CID7)), ?match({'EXCEPTION',{'CosEventDomainAdmin_ConnectionNotFound',_}}, 'CosEventDomainAdmin_EventDomain':remove_connection(ED, 100)), ?match([], 'CosEventDomainAdmin_EventDomain':get_offer_channels(ED, ID7)), ?match([2], 'CosEventDomainAdmin_EventDomain':get_offer_channels(ED, ID4)), ?match([8], 'CosEventDomainAdmin_EventDomain':get_subscription_channels(ED, ID7)), ?match([_,_,_], 'CosEventDomainAdmin_EventDomain':get_subscription_channels(ED, ID4)), CID10 = ?match(8, 'CosEventDomainAdmin_EventDomain':add_connection(ED, C7)), %% Now we'll check diamond management. %% Currently it should not be possible to create a diamond (due to QoS-setting). ?match({'EXCEPTION',{'CosEventDomainAdmin_DiamondCreationForbidden',_,_}}, 'CosEventDomainAdmin_EventDomain':add_connection(ED, C11)), ?match({'EXCEPTION',{'CosEventDomainAdmin_DiamondCreationForbidden',_,_}}, 'CosEventDomainAdmin_EventDomain':add_connection(ED, C10)), ?match({'EXCEPTION',{'CosEventDomainAdmin_DiamondCreationForbidden',_,_}}, 'CosEventDomainAdmin_EventDomain':add_connection(ED, C12)), ?match(ok, 'CosEventDomainAdmin_EventDomain':set_qos(ED, [AllowDiamonds])), CID11 = ?match(9, 'CosEventDomainAdmin_EventDomain':add_connection(ED, C10)), ?match([_,_,_,_,_,_,_,_,_], 'CosEventDomainAdmin_EventDomain':get_all_connections(ED)), ?match([_], 'CosEventDomainAdmin_EventDomain':get_diamonds(ED)), CID12 = ?match(10, 'CosEventDomainAdmin_EventDomain':add_connection(ED, C11)), ?match([_, _, _], 'CosEventDomainAdmin_EventDomain':get_diamonds(ED)), CID13 = ?match(11, 'CosEventDomainAdmin_EventDomain':add_connection(ED, C12)), ?match([_, _, _], 'CosEventDomainAdmin_EventDomain':get_diamonds(ED)), ?match({'EXCEPTION',{'CosNotification_UnsupportedQoS',_,_}}, 'CosEventDomainAdmin_EventDomain':set_qos(ED, [ForbidDiamonds])), ?match(ok, 'CosEventDomainAdmin_EventDomain':remove_connection(ED, CID10)), ?match(ok, 'CosEventDomainAdmin_EventDomain':remove_connection(ED, CID11)), ?match(ok, 'CosEventDomainAdmin_EventDomain':remove_connection(ED, CID12)), ?match(ok, 'CosEventDomainAdmin_EventDomain':remove_connection(ED, CID13)), ?match(ok, 'CosEventDomainAdmin_EventDomain':set_qos(ED, [ForbidDiamonds])), ?match([_, _], 'CosEventDomainAdmin_EventDomain':get_qos(ED)), ?match({'EXCEPTION',{'CosEventDomainAdmin_DiamondCreationForbidden',_,_}}, 'CosEventDomainAdmin_EventDomain':add_connection(ED, C10)), ?match(ok, 'CosEventDomainAdmin_EventDomain':destroy(ED)), ok. %% Testing the CosEventDomain Factory API event_domain_factory_api(_Config) -> Cyclic = #'CosNotification_Property'{name=?CycleDetection, value=any:create(orber_tc:short(), ?ForbidCycles)}, BadProp = #'CosNotification_Property'{name="Wrong", value=any:create(orber_tc:short(), ?ForbidCycles)}, BadQoSVal = #'CosNotification_Property'{name=?CycleDetection, value=any:create(orber_tc:short(), 10)}, Fac = ?match({_,key,_,_,_,_}, cosEventDomainApp:start_factory()), ?match([], 'CosEventDomainAdmin_EventDomainFactory':get_all_domains(Fac)), ?match({'EXCEPTION',{'CosEventDomainAdmin_DomainNotFound',_}}, 'CosEventDomainAdmin_EventDomainFactory':get_event_domain(Fac, 0)), {ED,_} = 'CosEventDomainAdmin_EventDomainFactory':create_event_domain(Fac, [Cyclic], []), ?match([0], 'CosEventDomainAdmin_EventDomainFactory':get_all_domains(Fac)), ED = 'CosEventDomainAdmin_EventDomainFactory':get_event_domain(Fac, 0), ?match({'EXCEPTION',{'CosEventDomainAdmin_DomainNotFound',_}}, 'CosEventDomainAdmin_EventDomainFactory':get_event_domain(Fac, 1)), corba:dispose(ED), timer:sleep(3000), ?match([], 'CosEventDomainAdmin_EventDomainFactory':get_all_domains(Fac)), ?match({'EXCEPTION',{'CosEventDomainAdmin_DomainNotFound',_}}, 'CosEventDomainAdmin_EventDomainFactory':get_event_domain(Fac, 0)), {ED2,_} = ?match({{_,key,_,_,_,_}, _}, 'CosEventDomainAdmin_EventDomainFactory':create_event_domain(Fac, [], [])), ?match([1], 'CosEventDomainAdmin_EventDomainFactory':get_all_domains(Fac)), ?match(ED2, 'CosEventDomainAdmin_EventDomainFactory':get_event_domain(Fac, 1)), corba:dispose(ED2), ?match({'EXCEPTION', {'CosNotification_UnsupportedQoS',_,_}}, 'CosEventDomainAdmin_EventDomainFactory':create_event_domain(Fac, [BadProp], [])), ?match({'EXCEPTION',{'CosNotification_UnsupportedAdmin',_,_}}, 'CosEventDomainAdmin_EventDomainFactory':create_event_domain(Fac, [], [BadProp])), ?match({'EXCEPTION',{'CosNotification_UnsupportedQoS',_,_}}, 'CosEventDomainAdmin_EventDomainFactory':create_event_domain(Fac, [BadQoSVal], [])), ?match({'EXCEPTION',{'CosNotification_UnsupportedAdmin',_,_}}, 'CosEventDomainAdmin_EventDomainFactory':create_event_domain(Fac, [], [BadQoSVal])), corba:dispose(Fac), ok.