2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018-2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.drools.system.internal;
23 import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertFalse;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertTrue;
29 import static org.mockito.Matchers.any;
30 import static org.mockito.Mockito.mock;
31 import static org.mockito.Mockito.never;
32 import static org.mockito.Mockito.times;
33 import static org.mockito.Mockito.verify;
34 import static org.mockito.Mockito.when;
36 import java.util.Arrays;
37 import java.util.List;
38 import java.util.Properties;
39 import java.util.function.BiConsumer;
40 import java.util.function.Consumer;
41 import org.junit.Before;
42 import org.junit.Test;
43 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
44 import org.onap.policy.common.endpoints.event.comm.TopicEndpoint;
45 import org.onap.policy.common.endpoints.event.comm.TopicSink;
46 import org.onap.policy.common.endpoints.event.comm.TopicSource;
47 import org.onap.policy.drools.controller.DroolsController;
48 import org.onap.policy.drools.controller.DroolsControllerFactory;
49 import org.onap.policy.drools.features.PolicyControllerFeatureAPI;
50 import org.onap.policy.drools.persistence.SystemPersistence;
51 import org.onap.policy.drools.protocol.configuration.DroolsConfiguration;
53 public class AggregatedPolicyControllerTest {
55 private static final String AGG_NAME = "agg-name";
56 private static final String SINK_TOPIC1 = "sink-a";
57 private static final String SINK_TOPIC2 = "sink-b";
58 private static final String SOURCE_TOPIC1 = "source-a";
59 private static final String SOURCE_TOPIC2 = "source-b";
61 private static final String EXPECTED = "expected exception";
63 private static final String MY_EVENT = "my-event";
65 private static final String ARTIFACT1 = "artifact-a";
66 private static final String GROUP1 = "group-a";
67 private static final String VERSION1 = "version-a";
69 private static final String ARTIFACT2 = "artifact-b";
70 private static final String GROUP2 = "group-b";
71 private static final String VERSION2 = "version-b";
73 private Properties properties;
74 private TopicEndpoint endpointMgr;
75 private List<TopicSource> sources;
76 private TopicSource source1;
77 private TopicSource source2;
78 private List<TopicSink> sinks;
79 private TopicSink sink1;
80 private TopicSink sink2;
81 private SystemPersistence persist;
82 private DroolsControllerFactory droolsFactory;
83 private DroolsController drools;
84 private DroolsConfiguration config;
85 private List<PolicyControllerFeatureAPI> providers;
86 private PolicyControllerFeatureAPI prov1;
87 private PolicyControllerFeatureAPI prov2;
88 private AggregatedPolicyController apc;
91 * Initializes the object to be tested.
95 properties = new Properties();
97 source1 = mock(TopicSource.class);
98 source2 = mock(TopicSource.class);
99 when(source1.getTopic()).thenReturn(SOURCE_TOPIC1);
100 when(source2.getTopic()).thenReturn(SOURCE_TOPIC2);
102 sink1 = mock(TopicSink.class);
103 sink2 = mock(TopicSink.class);
104 when(sink1.getTopic()).thenReturn(SINK_TOPIC1);
105 when(sink2.getTopic()).thenReturn(SINK_TOPIC2);
107 sources = Arrays.asList(source1, source2);
108 sinks = Arrays.asList(sink1, sink2);
110 endpointMgr = mock(TopicEndpoint.class);
111 when(endpointMgr.addTopicSources(any())).thenReturn(sources);
112 when(endpointMgr.addTopicSinks(any())).thenReturn(sinks);
114 persist = mock(SystemPersistence.class);
116 drools = mock(DroolsController.class);
117 when(drools.start()).thenReturn(true);
118 when(drools.stop()).thenReturn(true);
119 when(drools.offer(any(), any())).thenReturn(true);
120 when(drools.deliver(any(), any())).thenReturn(true);
121 when(drools.lock()).thenReturn(true);
122 when(drools.unlock()).thenReturn(true);
123 when(drools.getArtifactId()).thenReturn(ARTIFACT1);
124 when(drools.getGroupId()).thenReturn(GROUP1);
125 when(drools.getVersion()).thenReturn(VERSION1);
127 config = mock(DroolsConfiguration.class);
128 when(config.getArtifactId()).thenReturn(ARTIFACT2);
129 when(config.getGroupId()).thenReturn(GROUP2);
130 when(config.getVersion()).thenReturn(VERSION2);
132 droolsFactory = mock(DroolsControllerFactory.class);
133 when(droolsFactory.build(any(), any(), any())).thenReturn(drools);
135 prov1 = mock(PolicyControllerFeatureAPI.class);
136 prov2 = mock(PolicyControllerFeatureAPI.class);
138 providers = Arrays.asList(prov1, prov2);
140 apc = new AggregatedPolicyControllerImpl(AGG_NAME, properties);
144 public void testFactory() {
145 apc = new AggregatedPolicyController(AGG_NAME, properties);
146 assertNotNull(apc.getDroolsFactory());
147 assertNotNull(apc.getEndpointManager());
148 assertNotNull(apc.getProviders());
149 assertNotNull(apc.getPersistenceManager());
153 public void testAggregatedPolicyController_() {
154 verify(persist).storeController(AGG_NAME, properties);
157 @Test(expected = IllegalArgumentException.class)
158 public void testInitDrools_Ex() {
159 new AggregatedPolicyControllerImpl(AGG_NAME, properties) {
161 protected DroolsControllerFactory getDroolsFactory() {
162 throw new RuntimeException(EXPECTED);
167 @Test(expected = IllegalArgumentException.class)
168 public void testInitDrools_Error() {
169 new AggregatedPolicyControllerImpl(AGG_NAME, properties) {
171 protected DroolsControllerFactory getDroolsFactory() {
172 throw new LinkageError(EXPECTED);
178 public void testUpdateDrools_ConfigVariations() {
180 // config should return same values as current controller
181 when(config.getArtifactId()).thenReturn(ARTIFACT1.toUpperCase());
182 when(config.getGroupId()).thenReturn(GROUP1.toUpperCase());
183 when(config.getVersion()).thenReturn(VERSION1.toUpperCase());
185 assertTrue(apc.updateDrools(config));
187 // number of times store should have been called
190 // invoked once during construction, but shouldn't be invoked during update
191 verify(persist, times(++count)).storeController(any(), any());
194 // different artifact
195 when(config.getArtifactId()).thenReturn(ARTIFACT2);
197 assertTrue(apc.updateDrools(config));
199 // should be invoked during update
200 verify(persist, times(++count)).storeController(any(), any());
204 when(config.getArtifactId()).thenReturn(ARTIFACT1);
205 when(config.getGroupId()).thenReturn(GROUP2);
207 assertTrue(apc.updateDrools(config));
209 // should be invoked during update
210 verify(persist, times(++count)).storeController(any(), any());
214 when(config.getGroupId()).thenReturn(GROUP1);
215 when(config.getVersion()).thenReturn(VERSION2);
217 assertTrue(apc.updateDrools(config));
219 // should be invoked during update
220 verify(persist, times(++count)).storeController(any(), any());
226 when(drools.lock()).thenThrow(new IllegalArgumentException(EXPECTED));
227 when(drools.unlock()).thenThrow(new IllegalArgumentException(EXPECTED));
229 assertFalse(apc.updateDrools(config));
233 public void testUpdateDrools_LockVariations() {
235 apc.updateDrools(config);
236 verify(drools, never()).lock();
237 verify(drools).unlock();
242 apc.updateDrools(config);
243 verify(drools, times(2)).lock();
244 verify(drools, never()).unlock();
248 public void testUpdateDrools_AliveVariations() {
250 apc.updateDrools(config);
251 verify(drools, never()).start();
252 verify(drools).stop();
257 apc.updateDrools(config);
258 verify(drools, times(2)).start();
259 verify(drools, never()).stop();
263 public void testGetName() {
264 assertEquals(AGG_NAME, apc.getName());
268 public void testStart() {
269 // arrange for first provider to throw exceptions
270 when(prov1.beforeStart(any())).thenThrow(new RuntimeException(EXPECTED));
271 when(prov1.afterStart(any())).thenThrow(new RuntimeException(EXPECTED));
273 // arrange for first sink to throw exception
274 when(sink1.start()).thenThrow(new RuntimeException(EXPECTED));
277 assertTrue(apc.start());
279 assertTrue(apc.isAlive());
281 verify(prov1).beforeStart(apc);
282 verify(prov2).beforeStart(apc);
284 verify(source1).register(apc);
285 verify(source2).register(apc);
287 verify(sink1).start();
288 verify(sink2).start();
290 verify(prov1).afterStart(apc);
291 verify(prov2).afterStart(apc);
294 (prov, flag) -> when(prov.beforeStart(apc)).thenReturn(flag),
295 (prov, flag) -> when(prov.afterStart(apc)).thenReturn(flag),
297 prov -> verify(prov).beforeStart(apc),
298 () -> verify(source1).register(apc),
299 prov -> verify(prov).afterStart(apc));
303 public void testStart_AlreadyStarted() {
307 assertTrue(apc.start());
309 assertTrue(apc.isAlive());
311 // these should now have been called twice
312 verify(prov1, times(2)).beforeStart(apc);
313 verify(prov2, times(2)).beforeStart(apc);
315 // these should still only have been called once
316 verify(source1).register(apc);
317 verify(sink1).start();
318 verify(prov1).afterStart(apc);
322 public void testStart_Locked() {
326 assertThatIllegalStateException().isThrownBy(() -> apc.start());
328 assertFalse(apc.isAlive());
330 // should call beforeStart(), but stop after that
331 verify(prov1).beforeStart(apc);
332 verify(prov2).beforeStart(apc);
334 verify(source1, never()).register(apc);
335 verify(sink1, never()).start();
336 verify(prov1, never()).afterStart(apc);
340 public void testStop() {
341 // arrange for first provider to throw exceptions
342 when(prov1.beforeStop(any())).thenThrow(new RuntimeException(EXPECTED));
343 when(prov1.afterStop(any())).thenThrow(new RuntimeException(EXPECTED));
349 assertTrue(apc.stop());
351 assertFalse(apc.isAlive());
353 verify(prov1).beforeStop(apc);
354 verify(prov2).beforeStop(apc);
356 verify(source1).unregister(apc);
357 verify(source2).unregister(apc);
359 verify(prov1).afterStop(apc);
360 verify(prov2).afterStop(apc);
362 // ensure no shutdown operations were called
363 verify(prov1, never()).beforeShutdown(apc);
364 verify(droolsFactory, never()).shutdown(drools);
365 verify(prov2, never()).afterShutdown(apc);
368 (prov, flag) -> when(prov.beforeStop(apc)).thenReturn(flag),
369 (prov, flag) -> when(prov.afterStop(apc)).thenReturn(flag),
374 prov -> verify(prov).beforeStop(apc),
375 () -> verify(source1).unregister(apc),
376 prov -> verify(prov).afterStop(apc));
380 public void testStop_AlreadyStopped() {
385 assertTrue(apc.stop());
388 verify(prov1, times(2)).beforeStop(apc);
389 verify(prov2, times(2)).beforeStop(apc);
391 // should NOT be called again
392 verify(source1).unregister(apc);
393 verify(prov1).afterStop(apc);
397 public void testShutdown() {
398 // arrange for first provider to throw exceptions
399 when(prov1.beforeShutdown(any())).thenThrow(new RuntimeException(EXPECTED));
400 when(prov1.afterShutdown(any())).thenThrow(new RuntimeException(EXPECTED));
408 verify(prov1).beforeShutdown(apc);
409 verify(prov2).beforeShutdown(apc);
411 assertFalse(apc.isAlive());
413 verify(prov1).afterStop(apc);
414 verify(prov2).afterStop(apc);
416 verify(droolsFactory).shutdown(drools);
418 verify(prov1).afterShutdown(apc);
419 verify(prov2).afterShutdown(apc);
421 // ensure no halt operation was called
422 verify(prov1, never()).beforeHalt(apc);
425 (prov, flag) -> when(prov.beforeShutdown(apc)).thenReturn(flag),
426 (prov, flag) -> when(prov.afterShutdown(apc)).thenReturn(flag),
431 prov -> verify(prov).beforeShutdown(apc),
432 () -> verify(source1).unregister(apc),
433 prov -> verify(prov).afterShutdown(apc));
437 public void testHalt() {
438 // arrange for first provider to throw exceptions
439 when(prov1.beforeHalt(any())).thenThrow(new RuntimeException(EXPECTED));
440 when(prov1.afterHalt(any())).thenThrow(new RuntimeException(EXPECTED));
448 verify(prov1).beforeHalt(apc);
449 verify(prov2).beforeHalt(apc);
451 assertFalse(apc.isAlive());
453 verify(prov1).beforeStop(apc);
454 verify(prov2).beforeStop(apc);
456 verify(droolsFactory).destroy(drools);
457 verify(persist).deleteController(AGG_NAME);
459 verify(prov1).afterHalt(apc);
460 verify(prov2).afterHalt(apc);
462 // ensure no shutdown operation was called
463 verify(prov1, never()).beforeShutdown(apc);
466 (prov, flag) -> when(prov.beforeHalt(apc)).thenReturn(flag),
467 (prov, flag) -> when(prov.afterHalt(apc)).thenReturn(flag),
472 prov -> verify(prov).beforeHalt(apc),
473 () -> verify(source1).unregister(apc),
474 prov -> verify(prov).afterHalt(apc));
478 public void testOnTopicEvent() {
479 // arrange for first provider to throw exceptions
480 when(prov1.beforeOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT))
481 .thenThrow(new RuntimeException(EXPECTED));
482 when(prov1.afterOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT, true))
483 .thenThrow(new RuntimeException(EXPECTED));
489 apc.onTopicEvent(CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT);
491 verify(prov1).beforeOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT);
492 verify(prov2).beforeOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT);
494 verify(drools).offer(SOURCE_TOPIC1, MY_EVENT);
496 verify(prov1).afterOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT, true);
497 verify(prov2).afterOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT, true);
500 (prov, flag) -> when(prov.beforeOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT))
502 (prov, flag) -> when(
503 prov.afterOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT, true))
507 apc.onTopicEvent(CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT);
509 prov -> verify(prov).beforeOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT),
510 () -> verify(drools).offer(SOURCE_TOPIC1, MY_EVENT),
511 prov -> verify(prov).afterOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT, true));
515 public void testOnTopicEvent_Locked() {
522 apc.onTopicEvent(CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT);
524 verify(prov1).beforeOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT);
525 verify(prov2).beforeOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT);
527 // never gets this far
528 verify(drools, never()).offer(SOURCE_TOPIC1, MY_EVENT);
529 verify(prov1, never()).afterOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT, true);
533 public void testOnTopicEvent_NotStarted() {
536 apc.onTopicEvent(CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT);
538 verify(prov1).beforeOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT);
539 verify(prov2).beforeOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT);
541 // never gets this far
542 verify(drools, never()).offer(SOURCE_TOPIC1, MY_EVENT);
543 verify(prov1, never()).afterOffer(apc, CommInfrastructure.NOOP, SOURCE_TOPIC1, MY_EVENT, true);
547 public void testDeliver_testInitSinks() {
548 // arrange for first provider to throw exceptions
549 when(prov1.beforeDeliver(apc, CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT))
550 .thenThrow(new RuntimeException(EXPECTED));
551 when(prov1.afterDeliver(apc, CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT, true))
552 .thenThrow(new RuntimeException(EXPECTED));
558 assertTrue(apc.deliver(CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT));
560 verify(prov1).beforeDeliver(apc, CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT);
561 verify(prov2).beforeDeliver(apc, CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT);
563 verify(drools).deliver(sink1, MY_EVENT);
564 verify(drools, never()).deliver(sink2, MY_EVENT);
566 verify(prov1).afterDeliver(apc, CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT, true);
567 verify(prov2).afterDeliver(apc, CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT, true);
569 // offer to the other topic
570 assertTrue(apc.deliver(CommInfrastructure.NOOP, SINK_TOPIC2, MY_EVENT));
572 // now both topics should show one message delivered
573 verify(drools).deliver(sink1, MY_EVENT);
574 verify(drools).deliver(sink2, MY_EVENT);
577 (prov, flag) -> when(prov.beforeDeliver(apc, CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT))
579 (prov, flag) -> when(
580 prov.afterDeliver(apc, CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT, true))
584 apc.deliver(CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT);
586 prov -> verify(prov).beforeDeliver(apc, CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT),
587 () -> verify(drools).deliver(sink1, MY_EVENT),
588 prov -> verify(prov).afterDeliver(apc, CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT, true));
591 @Test(expected = IllegalArgumentException.class)
592 public void testDeliver_NullTopic() {
594 apc.deliver(CommInfrastructure.NOOP, null, MY_EVENT);
597 @Test(expected = IllegalArgumentException.class)
598 public void testDeliver_EmptyTopic() {
600 apc.deliver(CommInfrastructure.NOOP, "", MY_EVENT);
603 @Test(expected = IllegalArgumentException.class)
604 public void testDeliver_NullEvent() {
606 apc.deliver(CommInfrastructure.NOOP, SINK_TOPIC1, null);
609 @Test(expected = IllegalStateException.class)
610 public void testDeliver_NotStarted() {
612 apc.deliver(CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT);
615 @Test(expected = IllegalStateException.class)
616 public void testDeliver_Locked() {
619 apc.deliver(CommInfrastructure.NOOP, SINK_TOPIC1, MY_EVENT);
622 @Test(expected = IllegalArgumentException.class)
623 public void testDeliver_UnknownTopic() {
625 apc.deliver(CommInfrastructure.NOOP, "unknown-topic", MY_EVENT);
629 public void testIsAlive() {
630 assertFalse(apc.isAlive());
633 assertTrue(apc.isAlive());
636 assertFalse(apc.isAlive());
640 public void testLock() {
641 // arrange for first provider to throw exceptions
642 when(prov1.beforeLock(any())).thenThrow(new RuntimeException(EXPECTED));
643 when(prov1.afterLock(any())).thenThrow(new RuntimeException(EXPECTED));
649 assertTrue(apc.lock());
651 verify(prov1).beforeLock(apc);
652 verify(prov2).beforeLock(apc);
654 assertTrue(apc.isLocked());
656 verify(drools).lock();
658 verify(prov1).afterLock(apc);
659 verify(prov2).afterLock(apc);
662 (prov, flag) -> when(prov.beforeLock(apc)).thenReturn(flag),
663 (prov, flag) -> when(prov.afterLock(apc)).thenReturn(flag),
668 prov -> verify(prov).beforeLock(apc),
669 () -> verify(drools).lock(),
670 prov -> verify(prov).afterLock(apc));
674 public void testLock_AlreadyLocked() {
679 assertTrue(apc.lock());
681 // these should be invoked a second time
682 verify(prov1, times(2)).beforeLock(apc);
683 verify(prov2, times(2)).beforeLock(apc);
685 assertTrue(apc.isLocked());
687 // these shouldn't be invoked a second time
688 verify(drools).lock();
689 verify(prov1).afterLock(apc);
693 public void testUnlock() {
694 // arrange for first provider to throw exceptions
695 when(prov1.beforeUnlock(any())).thenThrow(new RuntimeException(EXPECTED));
696 when(prov1.afterUnlock(any())).thenThrow(new RuntimeException(EXPECTED));
703 assertTrue(apc.unlock());
705 verify(prov1).beforeUnlock(apc);
706 verify(prov2).beforeUnlock(apc);
708 assertFalse(apc.isLocked());
710 verify(drools).unlock();
712 verify(prov1).afterUnlock(apc);
713 verify(prov2).afterUnlock(apc);
716 (prov, flag) -> when(prov.beforeUnlock(apc)).thenReturn(flag),
717 (prov, flag) -> when(prov.afterUnlock(apc)).thenReturn(flag),
723 prov -> verify(prov).beforeUnlock(apc),
724 () -> verify(drools).unlock(),
725 prov -> verify(prov).afterUnlock(apc));
729 public void testUnlock_NotLocked() {
733 assertTrue(apc.unlock());
735 verify(prov1).beforeUnlock(apc);
736 verify(prov2).beforeUnlock(apc);
738 assertFalse(apc.isLocked());
740 // these shouldn't be invoked
741 verify(drools, never()).unlock();
742 verify(prov1, never()).afterLock(apc);
746 public void testIsLocked() {
747 assertFalse(apc.isLocked());
750 assertTrue(apc.isLocked());
753 assertFalse(apc.isLocked());
757 public void testGetTopicSources() {
758 assertEquals(sources, apc.getTopicSources());
762 public void testGetTopicSinks() {
763 assertEquals(sinks, apc.getTopicSinks());
767 public void testGetDrools() {
768 assertEquals(drools, apc.getDrools());
772 public void testGetProperties() {
773 assertEquals(properties, apc.getProperties());
777 public void testToString() {
778 assertTrue(apc.toString().startsWith("AggregatedPolicyController ["));
782 * Performs an operation that has a beforeXxx method and an afterXxx method. Tries
783 * combinations where beforeXxx and afterXxx return {@code true} and {@code false}.
785 * @param setBefore function to set the return value of a provider's beforeXxx method
786 * @param setAfter function to set the return value of a provider's afterXxx method
787 * @param action invokes the operation
788 * @param verifyBefore verifies that a provider's beforeXxx method was invoked
789 * @param verifyMiddle verifies that the action occurring between the beforeXxx loop
790 * and the afterXxx loop was invoked
791 * @param verifyAfter verifies that a provider's afterXxx method was invoked
793 private void checkBeforeAfter(BiConsumer<PolicyControllerFeatureAPI, Boolean> setBefore,
794 BiConsumer<PolicyControllerFeatureAPI, Boolean> setAfter, Runnable action,
795 Consumer<PolicyControllerFeatureAPI> verifyBefore, Runnable verifyMiddle,
796 Consumer<PolicyControllerFeatureAPI> verifyAfter) {
798 checkBeforeAfter_FalseFalse(setBefore, setAfter, action, verifyBefore, verifyMiddle, verifyAfter);
799 checkBeforeAfter_FalseTrue(setBefore, setAfter, action, verifyBefore, verifyMiddle, verifyAfter);
800 checkBeforeAfter_TrueFalse(setBefore, setAfter, action, verifyBefore, verifyMiddle, verifyAfter);
802 // don't need to test true-true, as it's behavior is a subset of true-false
806 * Performs an operation that has a beforeXxx method and an afterXxx method. Tries the
807 * case where both the beforeXxx and afterXxx methods return {@code false}.
809 * @param setBefore function to set the return value of a provider's beforeXxx method
810 * @param setAfter function to set the return value of a provider's afterXxx method
811 * @param action invokes the operation
812 * @param verifyBefore verifies that a provider's beforeXxx method was invoked
813 * @param verifyMiddle verifies that the action occurring between the beforeXxx loop
814 * and the afterXxx loop was invoked
815 * @param verifyAfter verifies that a provider's afterXxx method was invoked
817 private void checkBeforeAfter_FalseFalse(BiConsumer<PolicyControllerFeatureAPI, Boolean> setBefore,
818 BiConsumer<PolicyControllerFeatureAPI, Boolean> setAfter, Runnable action,
819 Consumer<PolicyControllerFeatureAPI> verifyBefore, Runnable verifyMiddle,
820 Consumer<PolicyControllerFeatureAPI> verifyAfter) {
824 // configure for the test
825 setBefore.accept(prov1, false);
826 setBefore.accept(prov2, false);
828 setAfter.accept(prov1, false);
829 setAfter.accept(prov2, false);
834 // verify that various methods were invoked
835 verifyBefore.accept(prov1);
836 verifyBefore.accept(prov2);
840 verifyAfter.accept(prov1);
841 verifyAfter.accept(prov2);
845 * Performs an operation that has a beforeXxx method and an afterXxx method. Tries the
846 * case where the first provider's afterXxx returns {@code true}, while the others
847 * return {@code false}.
849 * @param setBefore function to set the return value of a provider's beforeXxx method
850 * @param setAfter function to set the return value of a provider's afterXxx method
851 * @param action invokes the operation
852 * @param verifyBefore verifies that a provider's beforeXxx method was invoked
853 * @param verifyMiddle verifies that the action occurring between the beforeXxx loop
854 * and the afterXxx loop was invoked
855 * @param verifyAfter verifies that a provider's afterXxx method was invoked
857 private void checkBeforeAfter_FalseTrue(BiConsumer<PolicyControllerFeatureAPI, Boolean> setBefore,
858 BiConsumer<PolicyControllerFeatureAPI, Boolean> setAfter, Runnable action,
859 Consumer<PolicyControllerFeatureAPI> verifyBefore, Runnable verifyMiddle,
860 Consumer<PolicyControllerFeatureAPI> verifyAfter) {
864 // configure for the test
865 setBefore.accept(prov1, false);
866 setBefore.accept(prov2, false);
868 setAfter.accept(prov1, true);
869 setAfter.accept(prov2, false);
874 // verify that various methods were invoked
875 verifyBefore.accept(prov1);
876 verifyBefore.accept(prov2);
880 verifyAfter.accept(prov1);
881 assertThatThrownBy(() -> verifyAfter.accept(prov2)).isInstanceOf(AssertionError.class);
885 * Performs an operation that has a beforeXxx method and an afterXxx method. Tries the
886 * case where the first provider's beforeXxx returns {@code true}, while the others
887 * return {@code false}.
889 * @param setBefore function to set the return value of a provider's beforeXxx method
890 * @param setAfter function to set the return value of a provider's afterXxx method
891 * @param action invokes the operation
892 * @param verifyBefore verifies that a provider's beforeXxx method was invoked
893 * @param verifyMiddle verifies that the action occurring between the beforeXxx loop
894 * and the afterXxx loop was invoked
895 * @param verifyAfter verifies that a provider's afterXxx method was invoked
897 private void checkBeforeAfter_TrueFalse(BiConsumer<PolicyControllerFeatureAPI, Boolean> setBefore,
898 BiConsumer<PolicyControllerFeatureAPI, Boolean> setAfter, Runnable action,
899 Consumer<PolicyControllerFeatureAPI> verifyBefore, Runnable verifyMiddle,
900 Consumer<PolicyControllerFeatureAPI> verifyAfter) {
904 // configure for the test
905 setBefore.accept(prov1, true);
906 setBefore.accept(prov2, false);
908 setAfter.accept(prov1, false);
909 setAfter.accept(prov2, false);
914 // verify that various methods were invoked
915 verifyBefore.accept(prov1);
917 // remaining methods should not have been invoked
918 assertThatThrownBy(() -> verifyBefore.accept(prov2)).isInstanceOf(AssertionError.class);
920 assertThatThrownBy(() -> verifyMiddle.run()).isInstanceOf(AssertionError.class);
922 assertThatThrownBy(() -> verifyAfter.accept(prov1)).isInstanceOf(AssertionError.class);
923 assertThatThrownBy(() -> verifyAfter.accept(prov2)).isInstanceOf(AssertionError.class);
927 * Controller with overrides.
929 private class AggregatedPolicyControllerImpl extends AggregatedPolicyController {
931 public AggregatedPolicyControllerImpl(String name, Properties properties) {
932 super(name, properties);
936 protected SystemPersistence getPersistenceManager() {
941 protected TopicEndpoint getEndpointManager() {
946 protected DroolsControllerFactory getDroolsFactory() {
947 return droolsFactory;
951 protected List<PolicyControllerFeatureAPI> getProviders() {