%%-------------------------------------------------------------------- %% %% %CopyrightBegin% %% %% Copyright Ericsson AB 2000-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% %% %% %%-------------------------------------------------------------------- %% File : eventDB_SUITE.erl %% Purpose : %%-------------------------------------------------------------------- -module(eventDB_SUITE). %%--------------- INCLUDES ----------------------------------- -include_lib("orber/include/corba.hrl"). -include_lib("orber/include/ifr_types.hrl"). %% cosEvent files. -include_lib("cosEvent/include/CosEventChannelAdmin.hrl"). %% cosTime files. -include_lib("cosTime/include/TimeBase.hrl"). %% Application files -include_lib("cosNotification/include/CosNotification.hrl"). -include_lib("cosNotification/include/CosNotifyChannelAdmin.hrl"). -include_lib("cosNotification/include/CosNotifyComm.hrl"). -include_lib("cosNotification/include/CosNotifyFilter.hrl"). -include_lib("cosNotification/src/CosNotification_Definitions.hrl"). -include("idl_output/notify_test.hrl"). -include_lib("common_test/include/ct.hrl"). %%--------------- DEFINES ------------------------------------ -define(default_timeout, test_server:minutes(20)). -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()). -define(EVENT1, ?not_CreateSE("","event1","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), 0)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=900000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=900000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="Timeout", value=any:create(orber_tc:unsigned_long_long(), 900000000)}], [], any:create(orber_tc:null(), null))). -define(EVENT2, ?not_CreateSE("","event2","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), 0)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=800000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=800000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="Timeout", value=any:create(orber_tc:unsigned_long_long(), 800000000)}], [], any:create(orber_tc:null(), null))). -define(EVENT3, ?not_CreateSE("","event3","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), 0)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=700000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=700000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="Timeout", value=any:create(orber_tc:unsigned_long_long(), 700000000)}], [], any:create(orber_tc:null(), null))). -define(EVENT4, ?not_CreateSE("","event4","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), 2)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=300000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=300000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="Timeout", value=any:create(orber_tc:unsigned_long_long(), 300000000)}], [], any:create(orber_tc:null(), null))). -define(EVENT5, ?not_CreateSE("","event5","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), 2)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=200000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=200000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="Timeout", value=any:create(orber_tc:unsigned_long_long(), 200000000)}], [], any:create(orber_tc:null(), null))). -define(EVENT6, ?not_CreateSE("","event6","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), 0)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=500000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=500000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="Timeout", value=any:create(orber_tc:unsigned_long_long(), 500000000)}], [], any:create(orber_tc:null(), null))). -define(EVENT7, ?not_CreateSE("","event7","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), -1)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=400000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=400000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="Timeout", value=any:create(orber_tc:unsigned_long_long(), 400000000)}], [], any:create(orber_tc:null(), null))). -define(EVENT8, ?not_CreateSE("","event8","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), -1)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=600000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=600000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="Timeout", value=any:create(orber_tc:unsigned_long_long(), 600000000)}], [], any:create(orber_tc:null(), null))). -define(EVENT9, ?not_CreateSE("","event9","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), 0)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=100000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), #'TimeBase_UtcT' {time=100000000, inacclo=0, inacchi=0, tdf=2})}, #'CosNotification_Property' {name="Timeout", value=any:create(orber_tc:unsigned_long_long(), 100000000)}], [], any:create(orber_tc:null(), null))). -define(EVENTS, [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT4, ?EVENT5, ?EVENT6, ?EVENT7, ?EVENT8, ?EVENT9]). -define(PRIOORDER, [?EVENT4, ?EVENT5, ?EVENT1, ?EVENT2, ?EVENT3, ?EVENT6, ?EVENT9, ?EVENT7, ?EVENT8]). -define(FIFOORDER, ?EVENTS). -define(DEADLINEORDER, [?EVENT9, ?EVENT5, ?EVENT4, ?EVENT7, ?EVENT6, ?EVENT8, ?EVENT3, ?EVENT2, ?EVENT1]). -define(NO_OF_EVENTS, 9). %%----------------------------------------------------------------- %% 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, reorder_api/1, lookup_api/1, discard_api/1, max_events_api/1, gc_api/1, auto_gc_api/1, start_stop_time_api/1, mapping_filter_api/1, persisten_event_api/1, init_per_testcase/2, end_per_testcase/2]). %%----------------------------------------------------------------- %% 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. cases() -> [persisten_event_api, start_stop_time_api, mapping_filter_api, max_events_api, discard_api, reorder_api, lookup_api, gc_api, auto_gc_api]. %%----------------------------------------------------------------- %% 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) -> Path = code:which(?MODULE), code:add_pathz(filename:join(filename:dirname(Path), "idl_output")), orber:jump_start(), cosTime:install_time(), cosTime:start(), if is_list(Config) -> Config; true -> exit("Config not a list") end. end_per_suite(Config) -> Path = code:which(?MODULE), code:del_path(filename:join(filename:dirname(Path), "idl_output")), cosTime:stop(), cosTime:uninstall_time(), orber:jump_stop(), Config. %%----------------------------------------------------------------- %% cosNotification_eventDB lookup API tests %%----------------------------------------------------------------- %% The event DB is used to store events which cannot be %% delivered at once. This case is supposed to test %% that the events are delivered in the correct order %% if a MappingFilter have benn associated. mapping_filter_api(_Config) -> InitQoS = ?not_CreateInitQoS(), InitQoS2 = ?not_SetMaxEventsPerConsumer(InitQoS,100), InitQoS3 = ?not_SetStartTimeSupported(InitQoS2, false), InitQoS4 = ?not_SetStopTimeSupported(InitQoS3, true), QoS = ?not_SetDiscardPolicy(InitQoS4, ?not_AnyOrder), PriorityQoS = ?not_SetOrderPolicy(QoS, ?not_PriorityOrder), DeadlineQoS = ?not_SetOrderPolicy(QoS, ?not_DeadlineOrder), %% "Calculate" data once: %% NOTE! Even though the an Event do not match any of the constarints the %% default value will be used. Hence, the events will not be stored in the %% way described in the definitions above. For example, when using deadline order %% all the events will be stored in FIFO order since the usag of a MappingFilter %% all evnts will have the same deadline (except event6). Events = ?EVENTS, PrioOrder = [?EVENT6, ?EVENT1, ?EVENT2, ?EVENT3, ?EVENT4, ?EVENT5, ?EVENT7, ?EVENT8, ?EVENT9], DeadlineOrder = [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT4, ?EVENT5, ?EVENT7, ?EVENT8, ?EVENT9], FiFac = 'CosNotifyFilter_FilterFactory':oe_create(), ?match({_,key,_,_,_,_}, FiFac), PrioFilter = 'CosNotifyFilter_FilterFactory': create_mapping_filter(FiFac, "EXTENDED_TCL", any:create(orber_tc:short(), 0)), DLFilter = 'CosNotifyFilter_FilterFactory': create_mapping_filter(FiFac, "EXTENDED_TCL", any:create(orber_tc:unsigned_long_long(), 1000000000)), ?match([_], 'CosNotifyFilter_MappingFilter':add_mapping_constraints(PrioFilter, [#'CosNotifyFilter_MappingConstraintPair' {constraint_expression = #'CosNotifyFilter_ConstraintExp' {event_types = [#'CosNotification_EventType' {domain_name = "", type_name = "event6"}], constraint_expr = "2==2"}, result_to_set = any:create(orber_tc:short(), 10)}])), ?match([_], 'CosNotifyFilter_MappingFilter':add_mapping_constraints(DLFilter, [#'CosNotifyFilter_MappingConstraintPair' {constraint_expression = #'CosNotifyFilter_ConstraintExp' {event_types = [#'CosNotification_EventType' {domain_name = "", type_name = "event6"}], constraint_expr = "2==2"}, result_to_set = any:create(orber_tc:unsigned_long_long(), 200000000)}])), do_lookup(PriorityQoS, Events, PrioOrder, "Priority Order", undefined, PrioFilter, 0), do_lookup(DeadlineQoS, Events, DeadlineOrder, "Deadline Order", DLFilter, undefined, 23000), ok. do_lookup(QoS, Events, Return, Txt, DLFilter, PrioFilter, Timeout) -> io:format("#################### ~s ###################~n", [Txt]), Ref = cosNotification_eventDB:create_db(QoS, 60, 50, undefined), create_loop(Events, Ref, DLFilter, PrioFilter), timer:sleep(Timeout), ?match({Return,_}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), cosNotification_eventDB:destroy_db(Ref). %%----------------------------------------------------------------- %% cosNotification_eventDB discard API tests %%----------------------------------------------------------------- %% The event DB is used to store events which cannot be %% delivered at once. If MaxEvents limit is reached there %% different ways we can discard the. This case will test %% all permutations of order and discard policies. discard_api(_Config) -> InitQoS1 = ?not_CreateInitQoS(), InitQoS2 = ?not_SetPriority(InitQoS1, 10), InitQoS3 = ?not_SetStartTimeSupported(InitQoS2, false), QoS = ?not_SetMaxEventsPerConsumer(InitQoS3, 5), %% The different order policies. To each order we must apply every possible %% discard policy to each order policy setting. We also have to test and %% change the policies for each setting. AnyQoS = ?not_SetOrderPolicy(QoS, ?not_AnyOrder), PriorityQoS = ?not_SetOrderPolicy(QoS, ?not_PriorityOrder), FifoQoS = ?not_SetOrderPolicy(QoS, ?not_FifoOrder), DeadlineQoS = ?not_SetOrderPolicy(QoS, ?not_DeadlineOrder), Events = ?EVENTS, %% Test using Any discard policy do_discard(Events, ?not_SetDiscardPolicy(AnyQoS, ?not_AnyOrder), [?EVENT4, ?EVENT5, ?EVENT1, ?EVENT2, ?EVENT3], "Discard and Order eq. Any"), do_discard(Events, ?not_SetDiscardPolicy(PriorityQoS, ?not_AnyOrder), [?EVENT4, ?EVENT5, ?EVENT1, ?EVENT2, ?EVENT3], "Discard Any and Order Priority"), do_discard(Events, ?not_SetDiscardPolicy(FifoQoS, ?not_AnyOrder), [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT4, ?EVENT5], "Discard Any and Order Fifo"), do_discard(Events, ?not_SetDiscardPolicy(DeadlineQoS, ?not_AnyOrder), [?EVENT5, ?EVENT4, ?EVENT3, ?EVENT2, ?EVENT1], "Discard Any and Order Deadline"), %% Test using RejectNewEvents discard policy do_discard(Events, ?not_SetDiscardPolicy(AnyQoS, ?not_RejectNewEvents), [?EVENT4, ?EVENT5, ?EVENT1, ?EVENT2, ?EVENT3], "Discard RejectNewEvents and Order Any"), do_discard(Events, ?not_SetDiscardPolicy(PriorityQoS, ?not_RejectNewEvents), [?EVENT4, ?EVENT5, ?EVENT1, ?EVENT2, ?EVENT3], "Discard RejectNewEvents and Order Priority"), do_discard(Events, ?not_SetDiscardPolicy(FifoQoS, ?not_RejectNewEvents), [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT4, ?EVENT5], "Discard RejectNewEvents and Order Fifo"), do_discard(Events, ?not_SetDiscardPolicy(DeadlineQoS, ?not_RejectNewEvents), [?EVENT5, ?EVENT4, ?EVENT3, ?EVENT2, ?EVENT1], "Discard RejectNewEvents and Order Deadline"), %% Test using Lifo discard policy do_discard(Events, ?not_SetDiscardPolicy(AnyQoS, ?not_LifoOrder), [?EVENT4, ?EVENT5, ?EVENT1, ?EVENT2, ?EVENT3], "Discard Lifo and Order Any"), do_discard(Events, ?not_SetDiscardPolicy(PriorityQoS, ?not_LifoOrder), [?EVENT4, ?EVENT5, ?EVENT1, ?EVENT2, ?EVENT3], "Discard Lifo and Order Priority"), do_discard(Events, ?not_SetDiscardPolicy(FifoQoS, ?not_LifoOrder), [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT4, ?EVENT5], "Discard Lifo and Order Fifo"), do_discard(Events, ?not_SetDiscardPolicy(DeadlineQoS, ?not_LifoOrder), [?EVENT5, ?EVENT4, ?EVENT3, ?EVENT2, ?EVENT1], "Discard Lifo and Order Deadline"), %% Test using Fifo discard policy do_discard(Events, ?not_SetDiscardPolicy(AnyQoS, ?not_FifoOrder), [?EVENT5, ?EVENT6, ?EVENT9, ?EVENT7, ?EVENT8], "Discard Fifo and Order Any"), do_discard(Events, ?not_SetDiscardPolicy(PriorityQoS, ?not_FifoOrder), [?EVENT5, ?EVENT6, ?EVENT9, ?EVENT7, ?EVENT8], "Discard Fifo and Order Priority"), do_discard(Events, ?not_SetDiscardPolicy(FifoQoS, ?not_FifoOrder), [?EVENT5, ?EVENT6, ?EVENT7, ?EVENT8, ?EVENT9], "Discard Fifo and Order Fifo"), do_discard(Events, ?not_SetDiscardPolicy(DeadlineQoS, ?not_FifoOrder), [?EVENT9, ?EVENT5, ?EVENT7, ?EVENT6, ?EVENT8], "Discard Fifo and Order Deadline"), %% Test using Priority discard policy do_discard(Events, ?not_SetDiscardPolicy(AnyQoS, ?not_PriorityOrder), [?EVENT4, ?EVENT5, ?EVENT1, ?EVENT2, ?EVENT3], "Discard Priority and Order Any"), do_discard(Events, ?not_SetDiscardPolicy(PriorityQoS, ?not_PriorityOrder), [?EVENT4, ?EVENT5, ?EVENT1, ?EVENT2, ?EVENT3], "Discard Priority and Order Priority"), do_discard(Events, ?not_SetDiscardPolicy(FifoQoS, ?not_PriorityOrder), [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT4, ?EVENT5], "Discard Priority and Order Fifo"), do_discard(Events, ?not_SetDiscardPolicy(DeadlineQoS, ?not_PriorityOrder), [?EVENT5, ?EVENT4, ?EVENT3, ?EVENT2, ?EVENT1], "Discard Priority and Order Deadline"), %% Test using Deadline discard policy do_discard(Events, ?not_SetDiscardPolicy(AnyQoS, ?not_DeadlineOrder), [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT6, ?EVENT8], "Discard Deadline and Order Any"), do_discard(Events, ?not_SetDiscardPolicy(PriorityQoS, ?not_DeadlineOrder), [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT6, ?EVENT8], "Discard Deadline and Order Priority"), do_discard(Events, ?not_SetDiscardPolicy(FifoQoS, ?not_DeadlineOrder), [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT6, ?EVENT8], "Discard Deadline and Order Fifo"), do_discard(Events, ?not_SetDiscardPolicy(DeadlineQoS, ?not_DeadlineOrder), [?EVENT6, ?EVENT8, ?EVENT3, ?EVENT2, ?EVENT1], "Discard Deadline and Order Deadline"), ok. do_discard(Events, QoS, Reply, Txt) -> io:format("################# ~s #################~n", [Txt]), Ref = cosNotification_eventDB:create_db(QoS, 60, 50, undefined), create_loop(Events, Ref), ?match({Reply,_}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), cosNotification_eventDB:destroy_db(Ref). %%----------------------------------------------------------------- %% cosNotification_eventDB lookup API tests %%----------------------------------------------------------------- %% The event DB is used to store events which cannot be %% delivered at once. This case is supposed to test %% that the events are delivered in the correct order. lookup_api(_Config) -> InitQoS = ?not_CreateInitQoS(), InitQoS2 = ?not_SetMaxEventsPerConsumer(InitQoS,100), InitQoS3 = ?not_SetStartTimeSupported(InitQoS2, false), QoS = ?not_SetDiscardPolicy(InitQoS3, ?not_AnyOrder), AnyQoS = ?not_SetOrderPolicy(QoS, ?not_AnyOrder), PriorityQoS = ?not_SetOrderPolicy(QoS, ?not_PriorityOrder), FifoQoS = ?not_SetOrderPolicy(QoS, ?not_FifoOrder), DeadlineQoS = ?not_SetOrderPolicy(QoS, ?not_DeadlineOrder), %% "Calculate" data once: Events = ?EVENTS, PrioOrder = ?PRIOORDER, FifoOrder = ?FIFOORDER, DeadlineOrder = ?DEADLINEORDER, do_lookup(PriorityQoS, Events, PrioOrder, "Priority Order"), do_lookup(FifoQoS, Events, FifoOrder, "Fifo Order"), do_lookup(DeadlineQoS, Events, DeadlineOrder, "Deadline Order"), do_lookup(AnyQoS, Events, PrioOrder, "Any Order"), ok. do_lookup(QoS, Events, Return, Txt) -> io:format("#################### ~s ###################~n", [Txt]), Ref = cosNotification_eventDB:create_db(QoS, 60, 50, undefined), create_loop(Events, Ref), ?match({Return,_}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), cosNotification_eventDB:destroy_db(Ref). %%----------------------------------------------------------------- %% cosNotification_eventDB max events API tests %%----------------------------------------------------------------- %% The event DB is used to store events which cannot be %% delivered at once. If the MaxEvents QoS is updated we must be %% able to reduce the amount of stored events. max_events_api(_Config) -> QoS1 = ?not_CreateInitQoS(), QoS2 = ?not_SetOrderPolicy(QoS1, ?not_FifoOrder), QoS3 = ?not_SetDiscardPolicy(QoS2, ?not_RejectNewEvents), QoS4 = ?not_SetStartTimeSupported(QoS3, false), QoS_NO_OF_EVENTS = ?not_SetMaxEventsPerConsumer(QoS4, ?NO_OF_EVENTS), QoS_5_EVENTS = ?not_SetMaxEventsPerConsumer(QoS4, 5), Events = ?EVENTS, Events5 = [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT4, ?EVENT5], %% Initiate DB and 'NO_OF_EVENTS' events. Ref1 = cosNotification_eventDB:create_db(QoS_NO_OF_EVENTS, 60, 50, undefined), create_loop(Events, Ref1), %% Reduce the limit to 5 and extract all and see if it's ok. Ref2 = cosNotification_eventDB:update(Ref1, QoS_5_EVENTS), ?match({Events5, true}, cosNotification_eventDB:get_events(Ref2, ?NO_OF_EVENTS)), %% Add 'NO_OF_EVENTS' events. Since the only allow 5 events the DB will only %% contain 5 events. create_loop(Events, Ref2), Ref3 = cosNotification_eventDB:update(Ref2, QoS_NO_OF_EVENTS), ?match({Events5, true}, cosNotification_eventDB:get_events(Ref3, ?NO_OF_EVENTS)), create_loop(Events, Ref3), ?match({Events, true}, cosNotification_eventDB:get_events(Ref3, ?NO_OF_EVENTS)), cosNotification_eventDB:destroy_db(Ref3), ok. %%----------------------------------------------------------------- %% cosNotification_eventDB persisten events API tests %%----------------------------------------------------------------- %% The event DB is used to store events which cannot be %% delivered at once. persisten_event_api(_Config) -> QoS1 = ?not_CreateInitQoS(), QoS2 = ?not_SetOrderPolicy(QoS1, ?not_FifoOrder), QoS3 = ?not_SetDiscardPolicy(QoS2, ?not_RejectNewEvents), QoS4 = ?not_SetStartTimeSupported(QoS3, false), QoS = ?not_SetMaxEventsPerConsumer(QoS4, ?NO_OF_EVENTS), Event1 = ?EVENT1, Ref = cosNotification_eventDB:create_db(QoS, 60, 50, undefined), %% Clean DB, should be empty ?match(0, cosNotification_eventDB:status(Ref, eventCounter)), cosNotification_eventDB:add_event(Ref, Event1), ?match(1, cosNotification_eventDB:status(Ref, eventCounter)), %% Get event without removing it. Should still be one event stored ?match({[Event1], _, _}, cosNotification_eventDB:get_events(Ref, 2, false)), ?match(1, cosNotification_eventDB:status(Ref, eventCounter)), {_, _, Keys} = ?match({Event1, _, _}, cosNotification_eventDB:get_event(Ref, false)), ?match(1, cosNotification_eventDB:status(Ref, eventCounter)), %% Clear the events and check that the DB is empty. cosNotification_eventDB:delete_events(Keys), ?match(0, cosNotification_eventDB:status(Ref, eventCounter)), ?match({[], _, []}, cosNotification_eventDB:get_event(Ref, false)), ?match({[], _, []}, cosNotification_eventDB:get_events(Ref, 2, false)), cosNotification_eventDB:destroy_db(Ref), ok. %%----------------------------------------------------------------- %% cosNotification_eventDB gc API tests %%----------------------------------------------------------------- %% The event DB is used to store events which cannot be %% delivered at once. If Deadline defined the events that %% are older must be discarded. gc_api(_Config) -> QoS1 = ?not_CreateInitQoS(), QoS2 = ?not_SetOrderPolicy(QoS1, ?not_FifoOrder), QoS3 = ?not_SetDiscardPolicy(QoS2, ?not_RejectNewEvents), QoS4 = ?not_SetStartTimeSupported(QoS3, false), QoS_NO_OF_EVENTS = ?not_SetMaxEventsPerConsumer(QoS4, ?NO_OF_EVENTS), Events = ?EVENTS, Events6 = [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT4, ?EVENT6, ?EVENT7, ?EVENT8], %% Initiate DB and 'NO_OF_EVENTS' events. Ref = cosNotification_eventDB:create_db(QoS_NO_OF_EVENTS, 60, 50, undefined), create_loop(Events, Ref), %% Sleep so some events will get 'old'. timer:sleep(23000), %% Reduce the limit to 5 and extract all and see if it's ok. cosNotification_eventDB:gc_events(Ref, high), %% Since gc is done by another process we must wait so it will have a chance %% to complete the job. timer:sleep(2000), ?match({Events6, true}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), create_loop(Events, Ref), timer:sleep(23000), ?match({Events6, true}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), cosNotification_eventDB:destroy_db(Ref), ok. %%----------------------------------------------------------------- %% cosNotification_eventDB gc API tests %%----------------------------------------------------------------- %% The event DB is used to store events which cannot be %% delivered at once. If Deadline defined the events that %% are older must be discarded. auto_gc_api(_Config) -> QoS1 = ?not_CreateInitQoS(), QoS2 = ?not_SetOrderPolicy(QoS1, ?not_FifoOrder), QoS3 = ?not_SetDiscardPolicy(QoS2, ?not_RejectNewEvents), QoS4 = ?not_SetStopTimeSupported(QoS3, true), QoS5 = ?not_SetStartTimeSupported(QoS4, false), QoS_NO_OF_EVENTS = ?not_SetMaxEventsPerConsumer(QoS5, ?NO_OF_EVENTS), Events6 = [?EVENT1, ?EVENT2, ?EVENT3, ?EVENT7, ?EVENT8, ?EVENT9], %% Initiate DB Ref = cosNotification_eventDB:create_db(QoS_NO_OF_EVENTS, 50, 50, undefined), create_loop([?EVENT1, ?EVENT2, ?EVENT3, ?EVENT4, ?EVENT6], Ref), %% Sleep so some events will get 'old'. timer:sleep(60000), create_loop([?EVENT7, ?EVENT8, ?EVENT9], Ref), %% Since gc is done by another process we must wait so it will have a chance %% to complete the job. timer:sleep(2000), ?match({Events6, true}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), cosNotification_eventDB:destroy_db(Ref), ok. %%----------------------------------------------------------------- %% cosNotification_eventDB start- and stop-time API tests %%----------------------------------------------------------------- %% The event DB is used to store events which cannot be %% delivered at once. If Deadline defined the events that %% are older must be discarded. start_stop_time_api(_Config) -> QoS1 = ?not_CreateInitQoS(), QoS2 = ?not_SetOrderPolicy(QoS1, ?not_FifoOrder), QoS3 = ?not_SetDiscardPolicy(QoS2, ?not_RejectNewEvents), QoS4 = ?not_SetStopTimeSupported(QoS3, true), QoS5 = ?not_SetStartTimeSupported(QoS4, true), QoS_NO_OF_EVENTS = ?not_SetMaxEventsPerConsumer(QoS5, ?NO_OF_EVENTS), %% Initiate DB TimeService = cosTime:start_time_service(2, 0), Ref = cosNotification_eventDB:create_db(QoS_NO_OF_EVENTS, 50, 50, TimeService), T1 = 'CosTime_UTO':'_get_utc_time'('CosTime_UTO': absolute_time('CosTime_TimeService': new_universal_time(TimeService, 100000000, 0, 2))), T2 = 'CosTime_UTO':'_get_utc_time'('CosTime_UTO': absolute_time('CosTime_TimeService': new_universal_time(TimeService, 200000000, 0, 2))), T3 = 'CosTime_UTO':'_get_utc_time'('CosTime_UTO': absolute_time('CosTime_TimeService': new_universal_time(TimeService, 300000000, 0, 2))), T4 = 'CosTime_UTO':'_get_utc_time'('CosTime_UTO': absolute_time('CosTime_TimeService': new_universal_time(TimeService, 400000000, 0, 2))), %% Delivered after 10 seconds discarded after 20. EVENT1 = ?not_CreateSE("","event1","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), 1)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), T1)}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), T2)}], [], any:create(orber_tc:null(), null)), %% Delivered after 30 seconds discarded after 10, i.e., always discarded. EVENT2 = ?not_CreateSE("","event2","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), 3)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), T3)}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), T1)}], [], any:create(orber_tc:null(), null)), %% Delivered after 20 seconds discarded after 40 EVENT3 = ?not_CreateSE("","event3","", [#'CosNotification_Property' {name="Priority", value=any:create(orber_tc:short(), 2)}, #'CosNotification_Property' {name="StartTime", value=any:create('TimeBase_UtcT':tc(), T2)}, #'CosNotification_Property' {name="StopTime", value=any:create('TimeBase_UtcT':tc(), T4)}], [], any:create(orber_tc:null(), null)), create_loop([EVENT1, EVENT2, EVENT3], Ref), ?match({[], false}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), %% Sleep so some events will get 'old'. timer:sleep(12000), ?match({[EVENT1], true}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), ?match({[], false}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), timer:sleep(10000), ?match({[EVENT3], true}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), timer:sleep(20000), %% See if EVENT2 really have been discarded. ?match({[], false}, cosNotification_eventDB:get_events(Ref, ?NO_OF_EVENTS)), cosNotification_eventDB:destroy_db(Ref), cosTime:stop_time_service(TimeService), ok. %%----------------------------------------------------------------- %% cosNotification_eventDB order API tests %%----------------------------------------------------------------- %% The event DB is used to store events which cannot be %% delivered at once. If the QoS is updated we must be %% able to change the ordering of events as the discard %% and order policies tells us. reorder_api(_Config) -> %% We need to test switching between: %% * Priority -> Fifo %% * Priority -> Deadline %% * Fifo -> Priority %% * Fifo -> Deadline %% * Deadline -> Priority %% * Deadline -> Fifo QoS = ?not_CreateInitQoS(), QoS2 = ?not_SetMaxEventsPerConsumer(QoS,100), QoS3 = ?not_SetPriority(QoS2, 10), QoS4 = ?not_SetStartTimeSupported(QoS3, false), QoS5 = ?not_SetOrderPolicy(QoS4, ?not_AnyOrder), %% Test all order policies using Any order discard policy. reorder_helper(?not_SetDiscardPolicy(QoS5, ?not_AnyOrder), "Discard Any"), reorder_helper(?not_SetDiscardPolicy(QoS5, ?not_PriorityOrder), "Discard Priority"), reorder_helper(?not_SetDiscardPolicy(QoS5, ?not_DeadlineOrder), "Discard Deadline"), reorder_helper(?not_SetDiscardPolicy(QoS5, ?not_FifoOrder), "Discard Fifo"), reorder_helper(?not_SetDiscardPolicy(QoS5, ?not_LifoOrder), "Discard Lifo"), reorder_helper(?not_SetDiscardPolicy(QoS5, ?not_RejectNewEvents), "Reject New Events"), ok. reorder_helper(QoS, Txt) -> io:format("$$$$$$$$$$$$$$$$$$$$ ~s $$$$$$$$$$$$$$$$$$$~n", [Txt]), %% Create a DB with the above settings. Ref = cosNotification_eventDB:create_db(QoS, 60, 50, undefined), Events = ?EVENTS, PrioOrder = ?PRIOORDER, FifoOrder = ?FIFOORDER, DeadlineOrder = ?DEADLINEORDER, %% Test all order policies using Any order discard policy. Ref2 = do_reorder(Ref, Events, ?not_SetOrderPolicy(QoS, ?not_FifoOrder), FifoOrder, "Priority -> Fifo"), Ref3 = do_reorder(Ref2, Events, ?not_SetOrderPolicy(QoS, ?not_PriorityOrder), PrioOrder, "Fifo -> Priority"), Ref4 = do_reorder(Ref3, Events, ?not_SetOrderPolicy(QoS, ?not_DeadlineOrder), DeadlineOrder, "Priority -> Deadline"), Ref5 = do_reorder(Ref4, Events, ?not_SetOrderPolicy(QoS, ?not_PriorityOrder), PrioOrder, "Deadline -> Priority"), Ref6 = do_reorder(Ref5, Events, ?not_SetOrderPolicy(QoS, ?not_FifoOrder), FifoOrder, "Priority -> Fifo"), Ref7 = do_reorder(Ref6, Events, ?not_SetOrderPolicy(QoS, ?not_DeadlineOrder), DeadlineOrder, "Fifo -> Deadline"), Ref8 = do_reorder(Ref7, Events, ?not_SetOrderPolicy(QoS, ?not_FifoOrder), FifoOrder, "Deadline -> Fifo"), cosNotification_eventDB:destroy_db(Ref8), ok. do_reorder(Ref, Events, QoS, Reply, Txt) -> create_loop(Events, Ref), io:format("################# ~s #################~n", [Txt]), NewRef = cosNotification_eventDB:update(Ref, QoS), ?match({Reply,_}, cosNotification_eventDB:get_events(NewRef, ?NO_OF_EVENTS)), NewRef. %%----------------------------------------------------------------- %% Internal functions %%----------------------------------------------------------------- %% This functions takes as argument a list of structured events. create_loop([], _Ref) -> ok; create_loop([H|T], Ref) -> catch cosNotification_eventDB:add_event(Ref, H), create_loop(T, Ref). create_loop([], _Ref, _Life, _Prio) -> ok; create_loop([H|T], Ref, Life, Prio) -> catch cosNotification_eventDB:add_event(Ref, H, Life, Prio), create_loop(T, Ref, Life, Prio). %%-------------------- End of Module ------------------------------