Skip to content

Commit

Permalink
Increase apex-pdp line and branch coverage
Browse files Browse the repository at this point in the history
Issue-ID: POLICY-5059
Change-Id: Ifa1472dd914ec0ef25372fa057514571a7ea27ac
Signed-off-by: waynedunican <[email protected]>
  • Loading branch information
wayne-dunican committed Oct 25, 2024
1 parent bc949ba commit f906185
Show file tree
Hide file tree
Showing 7 changed files with 297 additions and 60 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
/*
* ============LICENSE_START=======================================================
* Copyright (C) 2024 Nordix Foundation.
* ================================================================================
* 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.apex.plugins.context.locking.hazelcast;

import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.LifecycleService;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic;
import org.onap.policy.apex.context.ContextException;
import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;

class HazelcastLockManagerTest {

private HazelcastLockManager lockManager;
private HazelcastInstance mockHazelcastInstance;
private LifecycleService mockLifecycleService;
private MockedStatic<Hazelcast> mockedHazelcast;

@BeforeEach
void setUp() throws ContextException {
mockHazelcastInstance = mock(HazelcastInstance.class);
mockLifecycleService = mock(LifecycleService.class);

mockedHazelcast = mockStatic(Hazelcast.class);
mockedHazelcast.when(Hazelcast::newHazelcastInstance).thenReturn(mockHazelcastInstance);

when(mockHazelcastInstance.getLifecycleService()).thenReturn(mockLifecycleService);
when(mockLifecycleService.isRunning()).thenReturn(true);

lockManager = new HazelcastLockManager();
}

@AfterEach
void tearDown() {
mockedHazelcast.close();
}

@Test
void testInit() {
AxArtifactKey testKey = new AxArtifactKey("TestKey", "1.0");

assertDoesNotThrow(() -> lockManager.init(testKey));

mockedHazelcast.verify(Hazelcast::newHazelcastInstance);
}

@Test
void testGetReentrantReadWriteLockWhenHazelcastNotRunning() {
when(mockLifecycleService.isRunning()).thenReturn(false);

String lockId = "testLock";
assertThrows(ContextException.class, () -> lockManager.getReentrantReadWriteLock(lockId));
}

@Test
void testShutdown() throws ContextException {
lockManager.init(new AxArtifactKey("TestKey", "1.0"));
assertDoesNotThrow(() -> lockManager.shutdown());

verify(mockHazelcastInstance).shutdown();
}

@Test
void testShutdownWithoutInit() {
assertDoesNotThrow(() -> lockManager.shutdown());
verify(mockHazelcastInstance, never()).shutdown();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*
* ============LICENSE_START=======================================================
* Copyright (C) 2024 Nordix Foundation.
* ================================================================================
* 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.apex.plugins.context.locking.hazelcast;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.cp.CPSubsystem;
import com.hazelcast.cp.lock.FencedLock;
import java.util.concurrent.locks.Lock;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class HazelcastLockTest {

private HazelcastInstance hazelcastInstance;
private CPSubsystem cpSubsystem;
private FencedLock mockReadLock;
private FencedLock mockWriteLock;

private HazelcastLock hazelcastLock;
private final String lockId = "testLock";

@BeforeEach
void setUp() {
hazelcastInstance = mock(HazelcastInstance.class);
cpSubsystem = mock(CPSubsystem.class);
mockReadLock = mock(FencedLock.class);
mockWriteLock = mock(FencedLock.class);

when(hazelcastInstance.getCPSubsystem()).thenReturn(cpSubsystem);
when(cpSubsystem.getLock(lockId + "_READ")).thenReturn(mockReadLock);
when(cpSubsystem.getLock(lockId + "_WRITE")).thenReturn(mockWriteLock);

hazelcastLock = new HazelcastLock(hazelcastInstance, lockId);
}

@Test
void testConstructor() {
assertEquals(lockId, hazelcastLock.getLockId());

verify(cpSubsystem).getLock(lockId + "_READ");
verify(cpSubsystem).getLock(lockId + "_WRITE");
}

@Test
void testReadLock() {
Lock readLock = hazelcastLock.readLock();
assertEquals(mockReadLock, readLock);
}

@Test
void testWriteLock() {
Lock writeLock = hazelcastLock.writeLock();
assertEquals(mockWriteLock, writeLock);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,11 @@

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;

import jakarta.jms.JMSException;
import jakarta.jms.ObjectMessage;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.List;
import org.apache.activemq.command.ActiveMQObjectMessage;
import org.apache.commons.lang3.RandomStringUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
Expand Down Expand Up @@ -94,56 +89,11 @@ void toApexEventObject() {
final JmsObjectEventProtocolParameters parameters = new JmsObjectEventProtocolParameters();
converter.init(parameters);
final String eventName = RandomStringUtils.randomAlphabetic(4);
assertThatThrownBy(() -> converter.toApexEvent(eventName, new Object()))
final Object testObject = new Object();
assertThatThrownBy(() -> converter.toApexEvent(eventName, testObject))
.isInstanceOf(ApexEventRuntimeException.class);
}

@Test
void toApexEventNoParams() {
final String eventName = RandomStringUtils.randomAlphabetic(4);
ObjectMessage object = (ObjectMessage) new ActiveMQObjectMessage();
assertThatThrownBy(() -> converter.toApexEvent(eventName, object))
.isInstanceOf(ApexEventRuntimeException.class);
}

@Test
void toApexEventIncomingObjectIsNull() {
final JmsObjectEventProtocolParameters parameters = new JmsObjectEventProtocolParameters();

converter.init(parameters);
final String eventName = RandomStringUtils.randomAlphabetic(4);
ObjectMessage object = (ObjectMessage) new ActiveMQObjectMessage();
assertThatThrownBy(() -> converter.toApexEvent(eventName, object))
.isInstanceOf(NullPointerException.class);
}

@Test
void toApexEvent() throws ApexEventException, JMSException {
final JmsObjectEventProtocolParameters parameters = new JmsObjectEventProtocolParameters();

converter.init(parameters);
final String eventName = RandomStringUtils.randomAlphabetic(4);
final ObjectMessage object = (ObjectMessage) new ActiveMQObjectMessage();
final String value = RandomStringUtils.randomAlphabetic(3);
object.setObject(value);

// Prepare expected object
final ApexEvent expectedEvent = new ApexEvent("String" + parameters.getIncomingEventSuffix(),
parameters.getIncomingEventVersion(),
"java.lang",
parameters.getIncomingEventSource(),
parameters.getIncomingEventTarget());
// Overwrite executionId to match executionId of actual
expectedEvent.setExecutionId(1);
final Object[] expected = {expectedEvent};

// Run tested method
final List<ApexEvent> actual = converter.toApexEvent(eventName, object);
// Overwrite executionId to match executionId of expected
actual.get(0).setExecutionId(1);
assertArrayEquals(expected, actual.toArray());
}

@Test
void fromApexEventNull() {
assertThatThrownBy(() -> converter.fromApexEvent(null)).isInstanceOf(ApexEventException.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ void toApexEventJsonString() throws ApexEventException {
final String source = RandomStringUtils.randomAlphabetic(5);
final String target = RandomStringUtils.randomAlphabetic(6);
final String nameSpace = "a.name.space";
final String toscaPolicyState = "";

// Prepare Json String to be translated into ApexEvent
final TextBlock object =
Expand All @@ -100,7 +101,8 @@ void toApexEventJsonString() throws ApexEventException {
// execute test
final List<ApexEvent> apexEvents = converter.toApexEvent(eventName, object);

final ApexEvent expectedEvent = new ApexEvent(eventName, eventVersion, nameSpace, source, target);
final ApexEvent expectedEvent =
new ApexEvent(eventName, eventVersion, nameSpace, source, target, toscaPolicyState);

// Reset executionId
expectedEvent.setExecutionId(0);
Expand All @@ -125,13 +127,14 @@ void fromApex() throws ApexEventException {
final String source = RandomStringUtils.randomAlphabetic(6);
final String target = RandomStringUtils.randomAlphabetic(7);

final String expected = "{\n" +
" \"name\": \"" + name + "\",\n" +
" \"version\": \"" + version + "\",\n" +
" \"nameSpace\": \"" + nameSpace + "\",\n" +
" \"source\": \"" + source + "\",\n" +
" \"target\": \"" + target + "\"\n" +
"}";
final String expected = "{\n"
+ " \"name\": \"" + name + "\",\n"
+ " \"version\": \"" + version + "\",\n"
+ " \"nameSpace\": \"" + nameSpace + "\",\n"
+ " \"source\": \"" + source + "\",\n"
+ " \"target\": \"" + target + "\",\n"
+ " \"toscaPolicyState\": null\n"
+ "}";

// Prepare Model service
final AxArtifactKey eventKey = new AxArtifactKey(name + ":" + version);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/*-
* ============LICENSE_START=======================================================
* Copyright (c) 2024 Nordix Foundation.
* ================================================================================
* 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.apex.service.engine.runtime.impl;

import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.util.Arrays;
import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.onap.policy.apex.core.engine.event.EnEvent;
import org.onap.policy.apex.model.basicmodel.concepts.ApexException;
import org.onap.policy.apex.service.engine.event.ApexEvent;
import org.onap.policy.apex.service.engine.event.impl.enevent.ApexEvent2EnEventConverter;
import org.onap.policy.apex.service.engine.runtime.ApexEventListener;

class EnEventListenerImplTest {

@Mock
private ApexEventListener mockApexEventListener;

@Mock
private ApexEvent2EnEventConverter mockApexEnEventConverter;

@Mock
private EnEvent mockEnEvent;

@Mock
private ApexEvent mockApexEvent;

@InjectMocks
private EnEventListenerImpl enEventListenerImpl;

@BeforeEach
void setUp() {
MockitoAnnotations.openMocks(this);
}

@Test
void testOnEnEvent_success() throws ApexException {
String eventName = "testEvent";
when(mockEnEvent.getName()).thenReturn(eventName);
List<ApexEvent> apexEvents = Arrays.asList(mockApexEvent);
when(mockApexEnEventConverter.toApexEvent(eventName, mockEnEvent)).thenReturn(apexEvents);

assertDoesNotThrow(() -> enEventListenerImpl.onEnEvent(mockEnEvent));

verify(mockApexEventListener, times(1)).onApexEvent(mockApexEvent);
}

@Test
void testOnEnEvent_apexExceptionThrown() throws ApexException {
String eventName = "testEvent";
when(mockEnEvent.getName()).thenReturn(eventName);
when(mockApexEnEventConverter.toApexEvent(eventName, mockEnEvent))
.thenThrow(new ApexException("Conversion error"));

assertThrows(ApexException.class, () -> enEventListenerImpl.onEnEvent(mockEnEvent));

verify(mockApexEventListener, never()).onApexEvent(any(ApexEvent.class));
}

@Test
void testOnEnEvent_multipleApexEvents() throws ApexException {
String eventName = "testEvent";
when(mockEnEvent.getName()).thenReturn(eventName);
ApexEvent apexEvent1 = mock(ApexEvent.class);
ApexEvent apexEvent2 = mock(ApexEvent.class);
List<ApexEvent> apexEvents = Arrays.asList(apexEvent1, apexEvent2);
when(mockApexEnEventConverter.toApexEvent(eventName, mockEnEvent)).thenReturn(apexEvents);

assertDoesNotThrow(() -> enEventListenerImpl.onEnEvent(mockEnEvent));

verify(mockApexEventListener, times(1)).onApexEvent(apexEvent1);
verify(mockApexEventListener, times(1)).onApexEvent(apexEvent2);
}
}
Loading

0 comments on commit f906185

Please sign in to comment.