aboutsummaryrefslogtreecommitdiffstats
path: root/feature-lifecycle/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'feature-lifecycle/src/test')
-rw-r--r--feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java191
-rw-r--r--feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStatePassiveTest.java221
-rw-r--r--feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateSafeTest.java52
-rw-r--r--feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateTerminatedTest.java178
-rw-r--r--feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateTestTest.java52
-rw-r--r--feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateUnsupportedTest.java108
-rw-r--r--feature-lifecycle/src/test/resources/echo.drl36
-rw-r--r--feature-lifecycle/src/test/resources/echo.kmodule26
-rw-r--r--feature-lifecycle/src/test/resources/echo.pom29
-rw-r--r--feature-lifecycle/src/test/resources/feature-lifecycle.properties26
10 files changed, 919 insertions, 0 deletions
diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java
new file mode 100644
index 00000000..eb83bc61
--- /dev/null
+++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateActiveTest.java
@@ -0,0 +1,191 @@
+/*
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * =============LICENSE_END========================================================
+ */
+
+package org.onap.policy.drools.lifecycle;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.awaitility.Awaitility.await;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.drools.persistence.SystemPersistence;
+import org.onap.policy.drools.utils.logging.LoggerUtil;
+import org.onap.policy.models.pdp.concepts.PdpStateChange;
+import org.onap.policy.models.pdp.concepts.PdpStatus;
+import org.onap.policy.models.pdp.enums.PdpMessageType;
+import org.onap.policy.models.pdp.enums.PdpState;
+
+/**
+ * Lifecycle State Active Test.
+ */
+public class LifecycleStateActiveTest {
+
+ private LifecycleFsm fsm;
+
+ @BeforeClass
+ public static void setUp() {
+ SystemPersistence.manager.setConfigurationDir("src/test/resources");
+ LoggerUtil.setLevel("org.onap.policy.common.endpoints", "WARN");
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ SystemPersistence.manager.setConfigurationDir(null);
+ }
+
+ /**
+ * Start tests in the Active state.
+ */
+ @Before
+ public void startActive() throws CoderException {
+ fsm = new LifecycleFsm();
+ fsm.setStatusTimerSeconds(15);
+ assertTrue(fsm.start());
+
+ goActive();
+ assertActive();
+ }
+
+ private void goActive() throws CoderException {
+ PdpStateChange change = new PdpStateChange();
+ change.setPdpGroup("A");
+ change.setPdpSubgroup("a");
+ change.setState(PdpState.ACTIVE);
+ change.setName("test");
+
+ fsm.source.offer(new StandardCoder().encode(change));
+ }
+
+ @Test
+ public void constructor() {
+ assertThatIllegalArgumentException().isThrownBy(() -> new LifecycleStateActive(null));
+ fsm.shutdown();
+ }
+
+ @Test
+ public void start() {
+ assertActive();
+ assertFalse(fsm.start());
+ assertActive();
+
+ fsm.shutdown();
+ }
+
+ private void assertActive() {
+ assertEquals(PdpState.ACTIVE, fsm.state());
+ assertEquals("A", fsm.getPdpGroup());
+ assertEquals("a", fsm.getPdpSubgroup());
+ assertTrue(fsm.isAlive());
+ await().atMost(fsm.getStatusTimerSeconds() + 1, TimeUnit.SECONDS).until(isStatus(PdpState.ACTIVE));
+ }
+
+ @Test
+ public void stop() {
+ assertTrue(fsm.stop());
+ assertBasicTerminated();
+
+ fsm.shutdown();
+ }
+
+ private void assertBasicTerminated() {
+ assertEquals(PdpState.TERMINATED, fsm.state());
+ assertFalse(fsm.isAlive());
+ assertFalse(fsm.state.isAlive());
+ await().atMost(1, TimeUnit.SECONDS).until(isStatus(PdpState.TERMINATED));
+ }
+
+ @Test
+ public void shutdown() {
+ fsm.shutdown();
+
+ assertBasicTerminated();
+
+ assertTrue(fsm.statusTask.isCancelled());
+ assertTrue(fsm.statusTask.isDone());
+ }
+
+ private Callable<Boolean> isStatus(PdpState state) {
+ return () -> {
+ if (fsm.client.getSink().getRecentEvents().length == 0) {
+ return false;
+ }
+
+ List<String> events = Arrays.asList(fsm.client.getSink().getRecentEvents());
+ PdpStatus status =
+ new StandardCoder().decode(events.get(events.size() - 1), PdpStatus.class);
+
+ return status.getMessageName() == PdpMessageType.PDP_STATUS && state == status.getState();
+ };
+ }
+
+ @Test
+ public void status() {
+ await().atMost(fsm.getStatusTimerSeconds() + 1, TimeUnit.SECONDS).until(isStatus(PdpState.ACTIVE));
+ int preCount = fsm.client.getSink().getRecentEvents().length;
+
+ assertTrue(fsm.status());
+ assertEquals(preCount + 1, fsm.client.getSink().getRecentEvents().length);
+
+ fsm.shutdown();
+ }
+
+ @Test
+ public void stateChange() throws CoderException {
+ assertActive();
+
+ /* dup */
+ PdpStateChange change = new PdpStateChange();
+ change.setPdpGroup("B");
+ change.setPdpSubgroup("b");
+ change.setState(PdpState.ACTIVE);
+ change.setName("test");
+
+ fsm.source.offer(new StandardCoder().encode(change));
+ assertEquals(PdpState.ACTIVE, fsm.state());
+ assertEquals("B", fsm.getPdpGroup());
+ assertEquals("b", fsm.getPdpSubgroup());
+
+ change.setState(PdpState.SAFE);
+ fsm.source.offer(new StandardCoder().encode(change));
+ assertEquals(PdpState.ACTIVE, fsm.state());
+
+ change.setState(PdpState.TERMINATED);
+ fsm.source.offer(new StandardCoder().encode(change));
+ assertEquals(PdpState.ACTIVE, fsm.state());
+
+ change.setState(PdpState.PASSIVE);
+ fsm.source.offer(new StandardCoder().encode(change));
+ assertEquals(PdpState.PASSIVE, fsm.state());
+ await().atMost(fsm.getStatusTimerSeconds() + 1, TimeUnit.SECONDS).until(isStatus(PdpState.PASSIVE));
+
+ fsm.shutdown();
+ }
+}
diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStatePassiveTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStatePassiveTest.java
new file mode 100644
index 00000000..fbc2eeba
--- /dev/null
+++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStatePassiveTest.java
@@ -0,0 +1,221 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.drools.lifecycle;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.awaitility.Awaitility.await;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+import org.awaitility.core.ConditionTimeoutException;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.network.NetworkUtil;
+import org.onap.policy.drools.persistence.SystemPersistence;
+import org.onap.policy.drools.utils.logging.LoggerUtil;
+import org.onap.policy.models.pdp.concepts.PdpStateChange;
+import org.onap.policy.models.pdp.concepts.PdpStatus;
+import org.onap.policy.models.pdp.enums.PdpHealthStatus;
+import org.onap.policy.models.pdp.enums.PdpMessageType;
+import org.onap.policy.models.pdp.enums.PdpState;
+
+/**
+ * Lifecycle State Passive Tests.
+ */
+public class LifecycleStatePassiveTest {
+
+ private LifecycleFsm fsm;
+
+ @BeforeClass
+ public static void setUp() {
+ SystemPersistence.manager.setConfigurationDir("src/test/resources");
+ LoggerUtil.setLevel("org.onap.policy.common.endpoints", "WARN");
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ SystemPersistence.manager.setConfigurationDir(null);
+ }
+
+ /**
+ * Start tests in the Passive state.
+ */
+ @Before
+ public void startPassive() {
+ /* start every test in passive mode */
+ fsm = new LifecycleFsm();
+ fsm.setStatusTimerSeconds(15L);
+ simpleStart();
+
+ assertEquals(0, fsm.client.getSink().getRecentEvents().length);
+ }
+
+ @Test
+ public void constructor() {
+ assertThatIllegalArgumentException().isThrownBy(() -> new LifecycleStatePassive(null));
+ fsm.shutdown();
+ }
+
+ @Test
+ public void start() {
+ assertEquals(0, fsm.client.getSink().getRecentEvents().length);
+ assertFalse(fsm.start());
+ assertBasicPassive();
+
+ fsm.shutdown();
+ }
+
+ private Callable<Boolean> isStatus(PdpState state, int count) {
+ return () -> {
+ if (!fsm.client.getSink().isAlive()) {
+ return false;
+ }
+
+ if (fsm.client.getSink().getRecentEvents().length != count) {
+ return false;
+ }
+
+ String[] events = fsm.client.getSink().getRecentEvents();
+ PdpStatus status =
+ new StandardCoder().decode(events[events.length - 1], PdpStatus.class);
+
+ return status.getMessageName() == PdpMessageType.PDP_STATUS && state == status.getState();
+ };
+ }
+
+ @Test
+ public void stop() {
+ simpleStop();
+ assertBasicTerminated();
+ }
+
+ private void simpleStart() {
+ assertTrue(fsm.start());
+ assertBasicPassive();
+ }
+
+ private void simpleStop() {
+ assertTrue(fsm.stop());
+ assertBasicTerminated();
+ }
+
+ @Test
+ public void shutdown() throws CoderException {
+ simpleStop();
+
+ fsm.shutdown();
+ assertExtendedTerminated();
+ }
+
+ @Test
+ public void status() {
+ status(PdpState.PASSIVE);
+ fsm.shutdown();
+ }
+
+ private void status(PdpState state) {
+ await()
+ .atMost(5, TimeUnit.SECONDS)
+ .until(isStatus(state, 1));
+
+ await()
+ .atMost(fsm.statusTimerSeconds + 2, TimeUnit.SECONDS)
+ .until(isStatus(state, 2));
+
+ await()
+ .atMost(fsm.statusTimerSeconds + 2, TimeUnit.SECONDS)
+ .until(isStatus(state, 3));
+
+ assertTrue(fsm.status());
+ await()
+ .atMost(200, TimeUnit.MILLISECONDS)
+ .until(isStatus(state, 4));
+ }
+
+ @Test
+ public void update() {
+ // TODO
+ fsm.shutdown();
+ }
+
+ @Test
+ public void stateChange() throws CoderException {
+ PdpStateChange change = new PdpStateChange();
+ change.setPdpGroup("A");
+ change.setPdpSubgroup("a");
+ change.setState(PdpState.ACTIVE);
+ change.setName("test");
+
+ fsm.source.offer(new StandardCoder().encode(change));
+ assertEquals(PdpState.ACTIVE, fsm.state.state());
+ assertEquals("A", fsm.pdpGroup);
+ assertEquals("a", fsm.pdpSubgroup);
+
+ fsm.shutdown();
+ }
+
+ private void assertBasicTerminated() {
+ assertEquals(PdpState.TERMINATED, fsm.state.state());
+ assertFalse(fsm.isAlive());
+ assertFalse(fsm.state.isAlive());
+ }
+
+ private void assertExtendedTerminated() throws CoderException {
+ assertBasicTerminated();
+ assertTrue(fsm.statusTask.isCancelled());
+ assertTrue(fsm.statusTask.isDone());
+
+ assertEquals(1, fsm.client.getSink().getRecentEvents().length);
+ PdpStatus status = new StandardCoder().decode(fsm.client.getSink().getRecentEvents()[0], PdpStatus.class);
+ assertEquals("drools", status.getPdpType());
+ assertEquals(PdpState.TERMINATED, status.getState());
+ assertEquals(PdpHealthStatus.HEALTHY, status.getHealthy());
+ assertEquals(NetworkUtil.getHostname(), status.getInstance());
+ assertEquals(PdpMessageType.PDP_STATUS, status.getMessageName());
+
+ assertThatThrownBy( () -> await()
+ .atMost(fsm.statusTimerSeconds + 5, TimeUnit.SECONDS)
+ .until(isStatus(PdpState.TERMINATED, 2))).isInstanceOf(ConditionTimeoutException.class);
+ }
+
+ private void assertBasicPassive() {
+ assertEquals(PdpState.PASSIVE, fsm.state.state());
+ assertNotNull(fsm.source);
+ assertNotNull(fsm.client);
+ assertNotNull(fsm.statusTask);
+
+ assertTrue(fsm.isAlive());
+ assertTrue(fsm.source.isAlive());
+ assertTrue(fsm.client.getSink().isAlive());
+
+ assertFalse(fsm.statusTask.isCancelled());
+ assertFalse(fsm.statusTask.isDone());
+ }
+}
diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateSafeTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateSafeTest.java
new file mode 100644
index 00000000..81ce85f1
--- /dev/null
+++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateSafeTest.java
@@ -0,0 +1,52 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.drools.lifecycle;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.onap.policy.models.pdp.enums.PdpState;
+
+/**
+ * TEST State Junits.
+ */
+public class LifecycleStateSafeTest extends LifecycleStateUnsupportedTest {
+
+ public LifecycleStateSafeTest() {
+ super(new LifecycleStateSafe(new LifecycleFsm()));
+ }
+
+ @Override
+ public LifecycleState create(LifecycleFsm fsm) {
+ return new LifecycleStateSafe(fsm);
+ }
+
+ @Test
+ public void constructor() {
+ super.constructor();
+ assertEquals(PdpState.SAFE, new LifecycleStateSafe(new LifecycleFsm()).state());
+ }
+
+ @Test
+ public void state() {
+ assertEquals(PdpState.SAFE, state.state());
+ }
+} \ No newline at end of file
diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateTerminatedTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateTerminatedTest.java
new file mode 100644
index 00000000..b77fdcd9
--- /dev/null
+++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateTerminatedTest.java
@@ -0,0 +1,178 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.drools.lifecycle;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.drools.persistence.SystemPersistence;
+import org.onap.policy.drools.utils.logging.LoggerUtil;
+import org.onap.policy.models.pdp.concepts.PdpStateChange;
+import org.onap.policy.models.pdp.enums.PdpState;
+
+/**
+ * Lifecycle State Terminated Tests.
+ */
+public class LifecycleStateTerminatedTest {
+ private LifecycleFsm fsm = new LifecycleFsm();
+
+ @BeforeClass
+ public static void setUp() {
+ SystemPersistence.manager.setConfigurationDir("src/test/resources");
+ LoggerUtil.setLevel("org.onap.policy.common.endpoints", "WARN");
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ SystemPersistence.manager.setConfigurationDir(null);
+ }
+
+ @Test
+ public void constructor() {
+ assertThatIllegalArgumentException().isThrownBy(() -> new LifecycleStateTerminated(null));
+
+ LifecycleState state = new LifecycleStateTerminated(new LifecycleFsm());
+ assertNull(state.fsm.source);
+ assertNull(state.fsm.client);
+ assertNull(state.fsm.statusTask);
+
+ assertEquals(PdpState.TERMINATED, state.state());
+ assertEquals(PdpState.TERMINATED, state.fsm.state.state());
+ assertFalse(state.isAlive());
+ }
+
+ @Test
+ public void stop() {
+ assertEquals(PdpState.TERMINATED, fsm.state.state());
+ assertFalse(fsm.isAlive());
+
+ simpleStop();
+ }
+
+ private void simpleStart() {
+ assertTrue(fsm.start());
+ assertBasicPassive();
+ }
+
+ private void simpleStop() {
+ assertTrue(fsm.stop());
+ assertBasicTerminated();
+ }
+
+ @Test
+ public void bounce() {
+ assertBasicTerminated();
+ simpleStart();
+ simpleStop();
+
+ assertFalse(fsm.source.isAlive());
+ assertFalse(fsm.client.getSink().isAlive());
+ assertExtendedTerminated();
+ }
+
+ @Test
+ public void doubleBounce() {
+ bounce();
+ bounce();
+ }
+
+ @Test
+ public void doubleStartBounce() {
+ simpleStart();
+ assertFalse(fsm.start());
+ assertBasicPassive();
+ simpleStop();
+ }
+
+ @Test
+ public void shutdown() {
+ assertBasicTerminated();
+ fsm.shutdown();
+ assertBasicTerminated();
+
+ fsm = new LifecycleFsm();
+ }
+
+ @Test
+ public void status() {
+ assertBasicTerminated();
+ assertFalse(fsm.status());
+ assertBasicTerminated();
+ }
+
+ @Test
+ public void changeState() {
+ assertFalse(fsm.state.transitionToState(new LifecycleStateTerminated(fsm)));
+ assertEquals(PdpState.TERMINATED, fsm.state.state());
+ }
+
+ @Test
+ public void update() {
+ // TODO
+ }
+
+ @Test
+ public void stateChange() {
+ PdpStateChange change = new PdpStateChange();
+ change.setPdpGroup("A");
+ change.setPdpSubgroup("a");
+ change.setState(PdpState.ACTIVE);
+ change.setName("test");
+
+ fsm.stateChange(change);
+
+ assertEquals(PdpState.TERMINATED, fsm.state.state());
+ }
+
+ private void assertBasicTerminated() {
+ assertEquals(PdpState.TERMINATED, fsm.state.state());
+ assertFalse(fsm.isAlive());
+ assertFalse(fsm.state.isAlive());
+ }
+
+ private void assertExtendedTerminated() {
+ assertBasicTerminated();
+ assertTrue(fsm.statusTask.isCancelled());
+ assertTrue(fsm.statusTask.isDone());
+ assertFalse(fsm.scheduler.isShutdown());
+ }
+
+ private void assertBasicPassive() {
+ assertEquals(PdpState.PASSIVE, fsm.state.state());
+ assertNotNull(fsm.source);
+ assertNotNull(fsm.client);
+ assertNotNull(fsm.statusTask);
+
+ assertTrue(fsm.isAlive());
+ assertTrue(fsm.source.isAlive());
+ assertTrue(fsm.client.getSink().isAlive());
+
+ assertFalse(fsm.statusTask.isCancelled());
+ assertFalse(fsm.statusTask.isDone());
+ }
+} \ No newline at end of file
diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateTestTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateTestTest.java
new file mode 100644
index 00000000..c086dfb4
--- /dev/null
+++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateTestTest.java
@@ -0,0 +1,52 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.drools.lifecycle;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.onap.policy.models.pdp.enums.PdpState;
+
+/**
+ * TEST State Junits.
+ */
+public class LifecycleStateTestTest extends LifecycleStateUnsupportedTest {
+
+ public LifecycleStateTestTest() {
+ super(new LifecycleStateTest(new LifecycleFsm()));
+ }
+
+ @Override
+ public LifecycleState create(LifecycleFsm fsm) {
+ return new LifecycleStateTest(fsm);
+ }
+
+ @Test
+ public void constructor() {
+ super.constructor();
+ assertEquals(PdpState.TEST, new LifecycleStateTest(new LifecycleFsm()).state());
+ }
+
+ @Test
+ public void state() {
+ assertEquals(PdpState.TEST, state.state());
+ }
+} \ No newline at end of file
diff --git a/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateUnsupportedTest.java b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateUnsupportedTest.java
new file mode 100644
index 00000000..01efca32
--- /dev/null
+++ b/feature-lifecycle/src/test/java/org/onap/policy/drools/lifecycle/LifecycleStateUnsupportedTest.java
@@ -0,0 +1,108 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.drools.lifecycle;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.assertj.core.api.Java6Assertions.assertThatThrownBy;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.onap.policy.drools.persistence.SystemPersistence;
+import org.onap.policy.models.pdp.concepts.PdpStateChange;
+import org.onap.policy.models.pdp.concepts.PdpUpdate;
+
+/**
+ * Lifecycle State Unsupported Test.
+ */
+public abstract class LifecycleStateUnsupportedTest {
+
+ protected final LifecycleState state;
+
+ @BeforeClass
+ public static void setUp() {
+ SystemPersistence.manager.setConfigurationDir("src/test/resources");
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ SystemPersistence.manager.setConfigurationDir(null);
+ }
+
+ public LifecycleStateUnsupportedTest(LifecycleState state) {
+ this.state = state;
+ }
+
+ public abstract LifecycleState create(LifecycleFsm fsm);
+
+ @Test
+ public void constructor() {
+ assertThatIllegalArgumentException().isThrownBy(() -> create(null));
+ }
+
+ @Test
+ public void start() {
+ assertThatThrownBy(() -> state.start())
+ .isInstanceOf(UnsupportedOperationException.class);
+ }
+
+ @Test
+ public void stop() {
+ assertThatThrownBy(() -> state.stop())
+ .isInstanceOf(UnsupportedOperationException.class);
+ }
+
+ @Test
+ public void shutdown() {
+ assertThatThrownBy(() -> state.shutdown())
+ .isInstanceOf(UnsupportedOperationException.class);
+ }
+
+ @Test
+ public void isAlive() {
+ assertThatThrownBy(() -> state.isAlive())
+ .isInstanceOf(UnsupportedOperationException.class);
+ }
+
+ @Test
+ public void status() {
+ assertThatThrownBy(() -> state.status())
+ .isInstanceOf(UnsupportedOperationException.class);
+ }
+
+ @Test
+ public void update() {
+ assertThatThrownBy(() -> state.update(new PdpUpdate()))
+ .isInstanceOf(UnsupportedOperationException.class);
+ }
+
+ @Test
+ public void stateChange() {
+ assertThatThrownBy(() -> state.stateChange(new PdpStateChange()))
+ .isInstanceOf(UnsupportedOperationException.class);
+ }
+
+ @Test
+ public void changeState() {
+ assertThatThrownBy(() -> state.transitionToState(new LifecycleStateActive(new LifecycleFsm())))
+ .isInstanceOf(UnsupportedOperationException.class);
+ }
+}
diff --git a/feature-lifecycle/src/test/resources/echo.drl b/feature-lifecycle/src/test/resources/echo.drl
new file mode 100644
index 00000000..c044f2cb
--- /dev/null
+++ b/feature-lifecycle/src/test/resources/echo.drl
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.drools.test;
+
+rule "INIT"
+lock-on-active
+when
+then
+ insert("hello, I am up!");
+end
+
+rule "ECHO"
+when
+ $o : Object();
+then
+ System.out.println("ECHO: " + $o);
+ retract($o);
+end
diff --git a/feature-lifecycle/src/test/resources/echo.kmodule b/feature-lifecycle/src/test/resources/echo.kmodule
new file mode 100644
index 00000000..1019bd3d
--- /dev/null
+++ b/feature-lifecycle/src/test/resources/echo.kmodule
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ feature-controller-logging
+ ================================================================================
+ Copyright (C) 2019 AT&T Intellectual Property. 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.
+ ============LICENSE_END=========================================================
+ -->
+
+<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
+ <kbase name="controller-logs">
+ <ksession name="test" />
+ </kbase>
+</kmodule>
diff --git a/feature-lifecycle/src/test/resources/echo.pom b/feature-lifecycle/src/test/resources/echo.pom
new file mode 100644
index 00000000..7e654793
--- /dev/null
+++ b/feature-lifecycle/src/test/resources/echo.pom
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START=======================================================
+ Copyright (C) 2019 AT&T Intellectual Property. 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.
+ ============LICENSE_END=========================================================
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.onap.policy.drools.test</groupId>
+ <artifactId>echo</artifactId>
+ <version>1.4.0-SNAPSHOT</version>
+
+</project>
diff --git a/feature-lifecycle/src/test/resources/feature-lifecycle.properties b/feature-lifecycle/src/test/resources/feature-lifecycle.properties
new file mode 100644
index 00000000..a972016f
--- /dev/null
+++ b/feature-lifecycle/src/test/resources/feature-lifecycle.properties
@@ -0,0 +1,26 @@
+# ============LICENSE_START=======================================================
+# ONAP
+# ================================================================================
+# Copyright (C) 2019 AT&T Intellectual Property. 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.
+# ============LICENSE_END=========================================================
+
+noop.source.topics=POLICY-PDP-PAP
+noop.sink.topics=POLICY-PDP-PAP
+
+noop.source.topics.POLICY-PDP-PAP.servers=noop
+noop.source.topics.POLICY-PDP-PAP.managed=false
+
+noop.sink.topics.POLICY-PDP-PAP.servers=noop
+noop.sink.topics.POLICY-PDP-PAP.managed=false