aboutsummaryrefslogtreecommitdiffstats
path: root/appc-sdc-listener
diff options
context:
space:
mode:
Diffstat (limited to 'appc-sdc-listener')
-rw-r--r--appc-sdc-listener/appc-sdc-listener-bundle/pom.xml6
-rw-r--r--appc-sdc-listener/appc-sdc-listener-bundle/src/test/java/org/onap/appc/sdc/listener/SdcCallbackTest.java231
-rw-r--r--appc-sdc-listener/appc-sdc-listener-bundle/src/test/java/org/onap/appc/sdc/listener/SdcListenerTest.java156
3 files changed, 393 insertions, 0 deletions
diff --git a/appc-sdc-listener/appc-sdc-listener-bundle/pom.xml b/appc-sdc-listener/appc-sdc-listener-bundle/pom.xml
index 2c9685a43..7d3f6ca93 100644
--- a/appc-sdc-listener/appc-sdc-listener-bundle/pom.xml
+++ b/appc-sdc-listener/appc-sdc-listener-bundle/pom.xml
@@ -69,6 +69,12 @@ limitations under the License.
<artifactId>powermock-api-mockito</artifactId>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.javassist</groupId>
+ <artifactId>javassist</artifactId>
+ <version>3.22.0-GA</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.onap.sdc.sdc-distribution-client</groupId>
diff --git a/appc-sdc-listener/appc-sdc-listener-bundle/src/test/java/org/onap/appc/sdc/listener/SdcCallbackTest.java b/appc-sdc-listener/appc-sdc-listener-bundle/src/test/java/org/onap/appc/sdc/listener/SdcCallbackTest.java
new file mode 100644
index 000000000..2dcdb4d1c
--- /dev/null
+++ b/appc-sdc-listener/appc-sdc-listener-bundle/src/test/java/org/onap/appc/sdc/listener/SdcCallbackTest.java
@@ -0,0 +1,231 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.appc.sdc.listener;
+
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Matchers;
+import org.mockito.Mockito;
+import org.onap.appc.adapter.message.EventSender;
+import org.onap.appc.sdc.artifacts.helper.ArtifactStorageService;
+import org.onap.appc.sdc.artifacts.helper.DependencyModelGenerator;
+import org.onap.appc.sdc.artifacts.impl.ArtifactProcessorFactory;
+import org.onap.appc.sdc.artifacts.impl.ToscaCsarArtifactProcessor;
+import org.onap.appc.sdc.artifacts.object.SDCArtifact;
+import org.onap.appc.sdc.artifacts.object.SDCReference;
+import org.onap.sdc.api.IDistributionClient;
+import org.onap.sdc.api.consumer.INotificationCallback;
+import org.onap.sdc.api.notification.IArtifactInfo;
+import org.onap.sdc.api.notification.INotificationData;
+import org.onap.sdc.api.notification.IResourceInstance;
+import org.onap.sdc.api.results.IDistributionClientDownloadResult;
+import org.onap.sdc.impl.DistributionClientDownloadResultImpl;
+import org.onap.sdc.utils.DistributionActionResultEnum;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.powermock.reflect.Whitebox;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.mockito.Matchers.anyObject;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({IDistributionClient.class,
+ EventSender.class,
+ ArtifactStorageService.class,
+ ToscaCsarArtifactProcessor.class,
+ ArtifactProcessorFactory.class,
+ DependencyModelGenerator.class})
+public class SdcCallbackTest {
+
+ private INotificationCallback sdcCallback;
+ private ArtifactStorageService storageService;
+ private ToscaCsarArtifactProcessor artifactProcessor;
+ private String resourceContent;
+
+
+ @Before
+ public void setup() throws Exception {
+ IDistributionClient client = PowerMockito.mock(IDistributionClient.class);
+ EventSender eventSender = PowerMockito.mock(EventSender.class);
+ sdcCallback = new SdcCallback(null, client);
+ resourceContent=readInput("/output/resource-ResourceAppc-template.yml").replaceAll(System.lineSeparator(),"");
+ artifactProcessor = Mockito.spy(new ToscaCsarArtifactProcessor(client, eventSender, getNotificationData(), getResources().get(0)
+ , getServiceArtifacts().get(0), null));
+ storageService = PowerMockito.mock(ArtifactStorageService.class);
+ Whitebox.setInternalState(artifactProcessor,"artifactStorageService", storageService);
+ DependencyModelGenerator dependencyModelGeneratorMock=PowerMockito.mock(DependencyModelGenerator.class);
+ PowerMockito.when(dependencyModelGeneratorMock.getDependencyModel(Matchers.anyString(),Matchers.anyString()))
+ .thenReturn("Dependency_model");
+ Whitebox.setInternalState(artifactProcessor,"dependencyModelGenerator",dependencyModelGeneratorMock);
+
+ PowerMockito.doCallRealMethod().when(artifactProcessor).processArtifact(anyObject());
+ PowerMockito.doCallRealMethod().when(artifactProcessor).run();
+
+ //PowerMockito.mockStatic(ArtifactProcessorFactory.class);
+ ArtifactProcessorFactory artifactProcessorFactory=PowerMockito.mock(ArtifactProcessorFactory.class);
+ PowerMockito.when(artifactProcessorFactory.getArtifactProcessor(anyObject(), anyObject(),
+ anyObject(), anyObject(),
+ anyObject(), anyObject())).thenReturn(artifactProcessor);
+
+ Whitebox.setInternalState(sdcCallback,"eventSender", eventSender);
+ PowerMockito.doReturn(readDownloadResult()).when(client).download(anyObject());
+ PowerMockito.doReturn(null).when(client).sendDownloadStatus(anyObject());
+
+ PowerMockito.doReturn(null).when(storageService).retrieveSDCArtifact(Matchers.anyString(),
+ Matchers.anyString(),Matchers.anyString());
+
+ PowerMockito.doAnswer(invocationOnMock -> {
+ System.out.print(invocationOnMock.getArguments()[0].toString());
+ return null;
+ }).when(storageService).storeSDCArtifact(anyObject());
+ }
+
+ private IDistributionClientDownloadResult readDownloadResult() throws IOException, URISyntaxException {
+ DistributionClientDownloadResultImpl downloadResult = new DistributionClientDownloadResultImpl
+ (DistributionActionResultEnum.SUCCESS,"Download success");
+ File file = new File(this.getClass().getResource("/csar/service-ServiceAppc-csar.csar").toURI());
+
+ byte[] bFile = new byte[(int) file.length()];
+ FileInputStream fileInputStream = new FileInputStream(file);
+ fileInputStream.read(bFile);
+ fileInputStream.close();
+
+ downloadResult.setArtifactPayload(bFile);
+ return downloadResult;
+ }
+
+
+ @Test
+ public void testSDCListener() throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
+ INotificationData notificationData = getNotificationData();
+ sdcCallback.activateCallback(notificationData);
+ pause();
+ }
+
+ @Test
+ public void testArtifacts() throws Exception {
+ PowerMockito.doAnswer(invocationOnMock -> {
+ SDCArtifact artifact =(SDCArtifact)invocationOnMock.getArguments()[0];
+ SDCReference reference=(SDCReference)invocationOnMock.getArguments()[1];
+ Assert.assertEquals("abcd-efgh-ijkl",artifact.getArtifactUUID());
+ Assert.assertEquals("Resource-APPC",reference.getVnfType());
+ Assert.assertEquals(resourceContent.trim(),artifact.getArtifactContent().replaceAll(System.lineSeparator(),""));
+ return null;
+ }).doAnswer(invocation -> {
+ SDCArtifact artifact =(SDCArtifact)invocation.getArguments()[0];
+ SDCReference reference=(SDCReference)invocation.getArguments()[1];
+ Assert.assertEquals("Resource-APPC",reference.getVnfType());
+ Assert.assertEquals("tosca_dependency_model",reference.getFileCategory());
+ Assert.assertEquals("Dependency_model",artifact.getArtifactContent());
+ Assert.assertEquals("Resource-APPC",artifact.getResourceName());
+ return null;
+ }).when(storageService).storeSDCArtifactWithReference(anyObject(),anyObject());
+
+ artifactProcessor.processArtifact(readDownloadResult());
+ }
+
+ private void pause(){
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ }
+ }
+
+ private String readInput(String inputFile) throws URISyntaxException {
+ File file = new File(this.getClass().getResource(inputFile).toURI());
+ byte[] bFile = new byte[(int) file.length()];
+ try(FileInputStream fileInputStream = new FileInputStream(file)){
+ fileInputStream.read(bFile);
+ } catch (Exception e){
+ e.printStackTrace();
+ }
+ return new String(bFile);
+ }
+
+ private INotificationData getNotificationData() throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
+
+ INotificationData notificationData = (INotificationData)getObject("org.onap.sdc.impl.NotificationDataImpl");
+
+ List<IArtifactInfo> serviceArtifacts = getServiceArtifacts();
+
+ invokeMethod(notificationData, "setServiceArtifacts", serviceArtifacts);
+ return notificationData;
+ }
+
+ private List<IResourceInstance> getResources() throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException {
+ List<IResourceInstance> resources = new ArrayList<>();
+ IResourceInstance resource = (IResourceInstance)getObject("org.onap.sdc.impl.JsonContainerResourceInstance");
+
+ List<IArtifactInfo> serviceArtifacts = getServiceArtifacts();
+ invokeMethod(resource,"setArtifacts",serviceArtifacts);
+ invokeMethod(resource,"setResourceName","Vnf");
+ invokeMethod(resource,"setResourceVersion","1.0");
+
+ resources.add(resource);
+ return resources;
+ }
+
+ private void invokeMethod(Object object, String methodName,Object... arguments) throws IllegalAccessException, InvocationTargetException {
+ Method[] methods = object.getClass().getDeclaredMethods();
+ for(Method method:methods){
+ if(methodName.equalsIgnoreCase(method.getName())){
+ method.setAccessible(true);
+ method.invoke(object,arguments);
+ }
+ }
+ }
+
+ private Object getObject(String fqcn) throws ClassNotFoundException, InstantiationException, IllegalAccessException, InvocationTargetException {
+ Constructor constructor = Arrays.asList(Class.forName(fqcn).getDeclaredConstructors())
+ .stream()
+ .filter(constructor1 -> constructor1.getParameterCount()==0)
+ .collect(Collectors.toList())
+ .get(0);
+ constructor.setAccessible(true);
+ return constructor.newInstance();
+ }
+
+ private List<IArtifactInfo> getServiceArtifacts() throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException {
+ List<IArtifactInfo> serviceArtifacts = new ArrayList<>();
+ IArtifactInfo artifactInfo = (IArtifactInfo)getObject("org.onap.sdc.impl.ArtifactInfoImpl");
+ invokeMethod(artifactInfo,"setArtifactType","TOSCA_CSAR");
+ invokeMethod(artifactInfo,"setArtifactUUID","abcd-efgh-ijkl");
+ serviceArtifacts.add(artifactInfo);
+ return serviceArtifacts;
+ }
+}
diff --git a/appc-sdc-listener/appc-sdc-listener-bundle/src/test/java/org/onap/appc/sdc/listener/SdcListenerTest.java b/appc-sdc-listener/appc-sdc-listener-bundle/src/test/java/org/onap/appc/sdc/listener/SdcListenerTest.java
new file mode 100644
index 000000000..2e10065e5
--- /dev/null
+++ b/appc-sdc-listener/appc-sdc-listener-bundle/src/test/java/org/onap/appc/sdc/listener/SdcListenerTest.java
@@ -0,0 +1,156 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Copyright (C) 2017 Amdocs
+ * =============================================================================
+ * 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.appc.sdc.listener;
+
+import com.att.eelf.configuration.EELFLogger;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.onap.sdc.api.IDistributionClient;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.powermock.reflect.Whitebox;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(Thread.class)
+public class SdcListenerTest {
+ private SdcListener sdcListener;
+ private EELFLogger mockLogger = mock(EELFLogger.class);
+
+ @Before
+ public void setUp() throws Exception {
+ sdcListener = new SdcListener();
+
+ // to avoid operation on logger fail, mock up the logger
+ Whitebox.setInternalState(sdcListener, "logger", mockLogger);
+ }
+
+ @Test
+ public void testStart() throws Exception {
+ sdcListener.start();
+ Assert.assertTrue("Should created startThread",
+ Whitebox.getInternalState(sdcListener, "startThread") != null);
+ }
+
+ @Test
+ public void testStop() throws Exception {
+ // test interrupt thread and other null case
+ MockThread mockThread = spy(new MockThread());
+ mockThread.setNewState(Thread.State.TIMED_WAITING);
+ Whitebox.setInternalState(sdcListener, "startThread", mockThread);
+
+ sdcListener.stop();
+ Mockito.verify(mockThread, times(1)).interrupt();
+ Assert.assertTrue("Should reset startThread",
+ Whitebox.getInternalState(sdcListener, "startThread") == null);
+
+ // test other non-null case and thread null case
+ IDistributionClient mockClient = mock(IDistributionClient.class);
+ Whitebox.setInternalState(sdcListener, "client", mockClient);
+ SdcCallback mockCallback = mock(SdcCallback.class);
+ Whitebox.setInternalState(sdcListener, "callback", mockCallback);
+ CountDownLatch mockLatch = mock(CountDownLatch.class);
+ Whitebox.setInternalState(sdcListener, "latch", mockLatch);
+
+ sdcListener.stop();
+
+ Mockito.verify(mockLatch, times(1)).await(10, TimeUnit.SECONDS);
+ Mockito.verify(mockCallback, times(1)).stop();
+ Mockito.verify(mockClient, times(1)).stop();
+ Assert.assertTrue("Should reset latch",
+ Whitebox.getInternalState(sdcListener, "latch") == null);
+ Assert.assertTrue("Should reset callback",
+ Whitebox.getInternalState(sdcListener, "callback") == null);
+ Assert.assertTrue("Should reset client",
+ Whitebox.getInternalState(sdcListener, "client") == null);
+ }
+
+ @Test
+ public void testStopStartThread() throws Exception {
+ // null case
+ sdcListener.stopStartThread(123);
+ //Mockito.verify(mockLogger, times(0)).debug(String.valueOf(any()));
+
+ MockThread mockThread = spy(new MockThread());
+
+ // thread terminated case
+ Whitebox.setInternalState(sdcListener, "startThread", mockThread);
+ mockThread.setNewState(Thread.State.TERMINATED);
+ sdcListener.stopStartThread(123);
+ Mockito.verify(mockThread, times(0)).interrupt();
+ //Mockito.verify(mockLogger, times(1)).debug(String.valueOf(any()));
+ Assert.assertTrue("Should reset startThread",
+ Whitebox.getInternalState(sdcListener, "startThread") == null);
+
+ // thread not termianted case
+ int timesCallThread = 0;
+ int timesCallLogger = 1;
+ for(Thread.State state : Thread.State.values()) {
+ if (state == Thread.State.TERMINATED) {
+ continue;
+ }
+ Whitebox.setInternalState(sdcListener, "startThread", mockThread);
+ mockThread.setNewState(state);
+ sdcListener.stopStartThread(123);
+ Mockito.verify(mockThread, times(++ timesCallThread)).interrupt();
+ //Mockito.verify(mockLogger, times(timesCallLogger += 2)).debug(String.valueOf(any()));
+ Assert.assertTrue("Should reset startThread",
+ Whitebox.getInternalState(sdcListener, "startThread") == null);
+ }
+ }
+
+ /*
+ * I have used the following PowerMockito (due to Thread.getName() is a final method)
+ * try to mock up the thread behavior. But the mock Thread.getName() always returns null
+ * which works in intelliJ Junit test, but not Jenkins build:
+ * Thread mockThread = PowerMockito.mock(Thread.class);
+ * PowerMockito.doReturn(Thread.State.TERMINATED).when(mockThread).getState();
+ * PowerMockito.doReturn("testing").when(mockThread).getName();
+ * Hence, here goes the MockThread class to override Thread to my expected behavior.
+ */
+ class MockThread extends Thread {
+ private State state;
+
+ private MockThread() {
+ super.setName("testing");
+ }
+
+ void setNewState(State newState) {
+ state = newState;
+ }
+
+ @Override
+ public State getState() {
+ return state;
+ }
+ }
+}