Improve coverage in flow/controller/node 37/31837/3
authorkurczews <krzysztof.kurczewski@nokia.com>
Thu, 15 Feb 2018 13:51:07 +0000 (14:51 +0100)
committerPatrick Brady <pb071s@att.com>
Fri, 16 Feb 2018 20:33:58 +0000 (20:33 +0000)
* Extract separate class for property loading
* Extract separate class for extracting uri
* Add coverage for changes above

Change-Id: Ibffa09c96aef2764188cba69bf8cb559c8a9c10e
Issue-ID: APPC-440
Signed-off-by: kurczews <krzysztof.kurczewski@nokia.com>
appc-config/appc-flow-controller/provider/src/main/java/org/onap/appc/flow/controller/node/FlowControlNode.java
appc-config/appc-flow-controller/provider/src/main/java/org/onap/appc/flow/controller/node/JsonParsingNode.java
appc-config/appc-flow-controller/provider/src/main/java/org/onap/appc/flow/controller/node/PropertiesLoader.java [new file with mode: 0644]
appc-config/appc-flow-controller/provider/src/main/java/org/onap/appc/flow/controller/node/ResourceUriExtractor.java [new file with mode: 0644]
appc-config/appc-flow-controller/provider/src/main/java/org/onap/appc/flow/controller/node/RestServiceNode.java
appc-config/appc-flow-controller/provider/src/main/java/org/onap/appc/flow/controller/utils/FlowControllerConstants.java
appc-config/appc-flow-controller/provider/src/test/java/org/onap/appc/flow/controller/node/PropertiesLoaderTest.java [new file with mode: 0644]
appc-config/appc-flow-controller/provider/src/test/java/org/onap/appc/flow/controller/node/ResourceUriExtractorTest.java [new file with mode: 0644]
appc-config/appc-flow-controller/provider/src/test/java/org/onap/appc/flow/controller/node/TestRestServiceNode.java [moved from appc-config/appc-flow-controller/provider/src/test/java/org/onap/appc/flow/executor/node/TestRestServiceNode.java with 95% similarity]
appc-config/appc-flow-controller/provider/src/test/java/org/onap/appc/flow/executor/node/FlowControlNodeTest.java
appc-config/appc-flow-controller/provider/src/test/resources/properties_loader.properties [new file with mode: 0644]

index b8ace76..baca94b 100644 (file)
@@ -73,7 +73,7 @@ public class FlowControlNode implements SvcLogicJavaPlugin {
 
     public void processFlow(Map<String, String> inParams, SvcLogicContext ctx) throws SvcLogicException {
         log.debug("Received processParamKeys call with params : " + inParams);
-        String responsePrefix = inParams.get(FlowControllerConstants.INPUT_PARAM_RESPONSE_PRIFIX);
+        String responsePrefix = inParams.get(FlowControllerConstants.INPUT_PARAM_RESPONSE_PREFIX);
         try {
             responsePrefix = StringUtils.isNotBlank(responsePrefix) ? (responsePrefix + ".") : "";
             SvcLogicContext localContext = new SvcLogicContext();
index 6a987df..42f38ba 100644 (file)
@@ -44,7 +44,7 @@ public class JsonParsingNode implements SvcLogicJavaPlugin {
     public void parse(Map<String, String> inParams, SvcLogicContext ctx) throws SvcLogicException {
         String fn = "RestServiceNode.sendRequest";
         log.info("Received processParamKeys call with params : " + inParams);
-        String responsePrefix = inParams.get(FlowControllerConstants.INPUT_PARAM_RESPONSE_PRIFIX);
+        String responsePrefix = inParams.get(FlowControllerConstants.INPUT_PARAM_RESPONSE_PREFIX);
         responsePrefix = StringUtils.isNotBlank(responsePrefix) ? (responsePrefix + ".") : "";
         try {
             //Remove below for Block
diff --git a/appc-config/appc-flow-controller/provider/src/main/java/org/onap/appc/flow/controller/node/PropertiesLoader.java b/appc-config/appc-flow-controller/provider/src/main/java/org/onap/appc/flow/controller/node/PropertiesLoader.java
new file mode 100644 (file)
index 0000000..28792bb
--- /dev/null
@@ -0,0 +1,20 @@
+package org.onap.appc.flow.controller.node;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+class PropertiesLoader {
+
+  private PropertiesLoader() {}
+
+  static Properties load(String path) throws IOException {
+    Properties props = new Properties();
+    try (InputStream propStream = new FileInputStream(path)) {
+      props.load(propStream);
+    }
+    return props;
+  }
+
+}
diff --git a/appc-config/appc-flow-controller/provider/src/main/java/org/onap/appc/flow/controller/node/ResourceUriExtractor.java b/appc-config/appc-flow-controller/provider/src/main/java/org/onap/appc/flow/controller/node/ResourceUriExtractor.java
new file mode 100644 (file)
index 0000000..3cfea31
--- /dev/null
@@ -0,0 +1,72 @@
+package org.onap.appc.flow.controller.node;
+
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.HTTP;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_CONTEXT;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_HOST_IP_ADDRESS;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_PORT_NUMBER;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_REQUEST_ACTION;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_SUB_CONTEXT;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_URL;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import java.util.Properties;
+import org.apache.commons.lang.StringUtils;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+
+/**
+ * Helper class for RestServiceNode
+ */
+class ResourceUriExtractor {
+
+  private static final EELFLogger log = EELFManager.getInstance().getLogger(RestServiceNode.class);
+
+  private ResourceUriExtractor() {
+  }
+
+  static String extractResourceUri(SvcLogicContext ctx, Properties prop) throws Exception {
+    String resourceUri = ctx.getAttribute(INPUT_URL);
+
+    if (StringUtils.isBlank(resourceUri)) {
+      resourceUri = getAddress(ctx);
+      log.info("resourceUri= " + resourceUri);
+      resourceUri += getContext(ctx, prop);
+      log.info("resourceUri= " + resourceUri);
+      resourceUri += getSubContext(ctx, prop);
+    }
+    log.info("resourceUri= " + resourceUri);
+
+    return resourceUri;
+  }
+
+  private static String getAddress(SvcLogicContext ctx) {
+    String address = ctx.getAttribute(INPUT_HOST_IP_ADDRESS);
+    String port = ctx.getAttribute(INPUT_PORT_NUMBER);
+    return HTTP + address + ":" + port;
+  }
+
+  private static String getContext(SvcLogicContext ctx, Properties prop) {
+    String context;
+    if (StringUtils.isNotBlank(ctx.getAttribute(INPUT_CONTEXT))) {
+      context = "/" + ctx.getAttribute(INPUT_CONTEXT);
+    } else if (prop.getProperty(ctx.getAttribute(INPUT_REQUEST_ACTION) + ".context") != null) {
+      context = "/" + prop.getProperty(ctx.getAttribute(INPUT_REQUEST_ACTION) + ".context");
+    } else {
+      throw new IllegalArgumentException("Could Not found the context for operation " + ctx.getAttribute(INPUT_REQUEST_ACTION));
+    }
+    return context;
+  }
+
+  private static String getSubContext(SvcLogicContext ctx, Properties prop) {
+    String subContext;
+    if (StringUtils.isNotBlank(ctx.getAttribute(INPUT_SUB_CONTEXT))) {
+      subContext = "/" + ctx.getAttribute(INPUT_SUB_CONTEXT);
+    } else if (prop.getProperty(ctx.getAttribute(INPUT_REQUEST_ACTION) + ".sub-context") != null) {
+      subContext = "/" + prop.getProperty(ctx.getAttribute(INPUT_REQUEST_ACTION) + ".sub-context");
+    } else {
+      throw new IllegalArgumentException("Could Not found the sub context for operation " + ctx.getAttribute(INPUT_REQUEST_ACTION));
+    }
+    return subContext;
+  }
+
+}
index d931e47..9d7f6e8 100644 (file)
 
 package org.onap.appc.flow.controller.node;
 
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.APPC_FLOW_CONTROLLER;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_PARAM_RESPONSE_PREFIX;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_REQUEST_ACTION;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_REQUEST_ACTION_TYPE;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.OUTPUT_PARAM_ERROR_MESSAGE;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.OUTPUT_PARAM_STATUS;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.OUTPUT_STATUS_FAILURE;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.OUTPUT_STATUS_MESSAGE;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.OUTPUT_STATUS_SUCCESS;
+
 import com.att.eelf.configuration.EELFLogger;
 import com.att.eelf.configuration.EELFManager;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.Map;
 import java.util.Properties;
 import org.apache.commons.lang3.StringUtils;
 import org.onap.appc.flow.controller.data.Transaction;
 import org.onap.appc.flow.controller.executorImpl.RestExecutor;
-import org.onap.appc.flow.controller.utils.FlowControllerConstants;
 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
 import org.onap.ccsdk.sli.core.sli.SvcLogicException;
 import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
 
 public class RestServiceNode implements SvcLogicJavaPlugin {
 
-    private static final  EELFLogger log = EELFManager.getInstance().getLogger(RestServiceNode.class);
-    private static final String SDNC_CONFIG_DIR_VAR = "SDNC_CONFIG_DIR";
-
-    public void sendRequest(Map<String, String> inParams, SvcLogicContext ctx) throws SvcLogicException {
-        String fn = "RestServiceNode.sendRequest";
-        log.info("Received processParamKeys call with params : " + inParams);
-        String responsePrefix = inParams.get(FlowControllerConstants.INPUT_PARAM_RESPONSE_PRIFIX);
-        try {
-            responsePrefix = StringUtils.isNotBlank(responsePrefix) ? (responsePrefix + ".") : "";
-            //Remove below for Block
-            for (Object key : ctx.getAttributeKeySet()) {
-                String parmName = (String) key;
-                String parmValue = ctx.getAttribute(parmName);
-                log.info(fn  + "Getting Key = "  + parmName + "and Value = " +  parmValue);
-            }
-            
-            send(ctx, inParams);
-            ctx.setAttribute(responsePrefix + FlowControllerConstants.OUTPUT_PARAM_STATUS,
-                FlowControllerConstants.OUTPUT_STATUS_SUCCESS);
-            
-        } catch (Exception e) {
-            ctx.setAttribute(responsePrefix + FlowControllerConstants.OUTPUT_PARAM_STATUS,
-                FlowControllerConstants.OUTPUT_STATUS_FAILURE);
-            ctx.setAttribute(responsePrefix + FlowControllerConstants.OUTPUT_PARAM_ERROR_MESSAGE,
-                e.getMessage());
-            log.error("Error Message : "  + e.getMessage(), e);
-            throw new SvcLogicException(e.getMessage());
-        }
+  private static final EELFLogger log = EELFManager.getInstance().getLogger(RestServiceNode.class);
+  private static final String SDNC_CONFIG_DIR_VAR = "SDNC_CONFIG_DIR";
+
+  public void sendRequest(Map<String, String> inParams, SvcLogicContext ctx)
+      throws SvcLogicException {
+    String fn = "RestServiceNode.sendRequest";
+    log.info("Received processParamKeys call with params : " + inParams);
+    String responsePrefix = inParams.get(INPUT_PARAM_RESPONSE_PREFIX);
+    try {
+      responsePrefix = StringUtils.isNotBlank(responsePrefix) ? (responsePrefix + ".") : "";
+      //Remove below for Block
+      for (Object key : ctx.getAttributeKeySet()) {
+        String parmName = (String) key;
+        String parmValue = ctx.getAttribute(parmName);
+        log.info(fn + "Getting Key = " + parmName + "and Value = " + parmValue);
+      }
+
+      send(ctx, inParams);
+      ctx.setAttribute(responsePrefix + OUTPUT_PARAM_STATUS, OUTPUT_STATUS_SUCCESS);
+
+    } catch (Exception e) {
+      ctx.setAttribute(responsePrefix + OUTPUT_PARAM_STATUS, OUTPUT_STATUS_FAILURE);
+      ctx.setAttribute(responsePrefix + OUTPUT_PARAM_ERROR_MESSAGE, e.getMessage());
+      log.error("Error Message : " + e.getMessage(), e);
+      throw new SvcLogicException(e.getMessage());
     }
-
-    private void send(SvcLogicContext ctx, Map<String, String> inParams) throws Exception {
-        try {
-            Properties prop = loadProperties();
-            log.info("Loaded Properties " + prop.toString());
-            String responsePrefix = inParams.get(FlowControllerConstants.INPUT_PARAM_RESPONSE_PRIFIX);
-            String resourceUri = "";
-            if (ctx.getAttribute(FlowControllerConstants.INPUT_URL) != null
-                && !(ctx.getAttribute(FlowControllerConstants.INPUT_URL).isEmpty())) {
-                resourceUri = ctx.getAttribute(FlowControllerConstants.INPUT_URL);
-
-            } else {
-                resourceUri = resourceUri.concat(FlowControllerConstants.HTTP);
-                log.info("resourceUri=  " + resourceUri );
-                resourceUri = resourceUri.concat(ctx.getAttribute(FlowControllerConstants.INPUT_HOST_IP_ADDRESS));
-                resourceUri = resourceUri.concat(":");
-                resourceUri = resourceUri.concat(ctx.getAttribute(FlowControllerConstants.INPUT_PORT_NUMBER));
-
-                if (ctx.getAttribute(FlowControllerConstants.INPUT_CONTEXT) != null
-                    && !ctx.getAttribute(FlowControllerConstants.INPUT_CONTEXT).isEmpty()) {
-                    resourceUri = resourceUri
-                        .concat("/")
-                        .concat(ctx.getAttribute(FlowControllerConstants.INPUT_CONTEXT));
-                    log.info("resourceUri= " + resourceUri );
-
-                } else if (prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                    .concat(".context")) != null ) {
-                    log.info("resourceUri = " + resourceUri );
-                    resourceUri = resourceUri
-                        .concat("/")
-                        .concat(prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                            .concat(".context")));
-
-                } else {
-                    throw new Exception("Could Not found the context for operation "
-                        + ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION));
-                }
-
-                if (ctx.getAttribute(FlowControllerConstants.INPUT_SUB_CONTEXT) != null
-                    && !ctx.getAttribute(FlowControllerConstants.INPUT_SUB_CONTEXT).isEmpty()) {
-                    resourceUri = resourceUri
-                        .concat("/")
-                        .concat(ctx.getAttribute(FlowControllerConstants.INPUT_SUB_CONTEXT));
-                    log.info("resourceUri" + resourceUri );
-
-                } else if (prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                    .concat(".sub-context")) != null ) {
-                    resourceUri = resourceUri
-                        .concat("/")
-                        .concat(prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                            .concat(".sub-context")));
-                    log.info("resourceUri" + resourceUri );
-                }
-            }
-            log.info("Rest Constructed URL : " + resourceUri);
-
-            Transaction transaction = new Transaction();
-            transaction.setExecutionEndPoint(resourceUri);
-            transaction.setExecutionRPC(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION_TYPE));
-            transaction.setAction(FlowControllerConstants.INPUT_REQUEST_ACTION);
-            if (ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION_TYPE) == null
-                || ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION_TYPE).isEmpty()) {
-                throw new Exception("Dont know REST operation for Action " + transaction.getExecutionRPC());
-            }
-            if (ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION) == null
-                || ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION).isEmpty()) {
-                throw new Exception("Dont know request-action " + transaction.getAction());
-            }
-
-            //This code need to get changed to get the UserID and pass from a common place.
-            if (transaction.getuId() == null) {
-                transaction.setuId(prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                    .concat(".default-rest-user")));
-            }
-            if (transaction.getPswd() == null) {
-                transaction.setPswd(prop.getProperty(ctx.getAttribute(FlowControllerConstants.INPUT_REQUEST_ACTION)
-                    .concat(".default-rest-pass")));
-            }
-
-            RestExecutor restRequestExecutor = new RestExecutor();
-            Map<String, String> output = restRequestExecutor.execute(transaction, ctx);
-
-            if (isValidJson(output.get("restResponse")) != null) {
-                ctx.setAttribute(responsePrefix + "." + FlowControllerConstants.OUTPUT_STATUS_MESSAGE,
-                    output.get("restResponse"));
+  }
+
+  private void send(SvcLogicContext ctx, Map<String, String> inParams) throws Exception {
+    try {
+      Properties prop = loadProperties();
+      log.info("Loaded Properties " + prop.toString());
+      String responsePrefix = inParams.get(INPUT_PARAM_RESPONSE_PREFIX);
+      String resourceUri = ResourceUriExtractor.extractResourceUri(ctx, prop);
+      log.info("Rest Constructed URL : " + resourceUri);
+
+      Transaction transaction = new Transaction();
+      transaction.setExecutionEndPoint(resourceUri);
+      transaction
+          .setExecutionRPC(ctx.getAttribute(INPUT_REQUEST_ACTION_TYPE));
+      transaction.setAction(INPUT_REQUEST_ACTION);
+      if (ctx.getAttribute(INPUT_REQUEST_ACTION_TYPE) == null
+          || ctx.getAttribute(INPUT_REQUEST_ACTION_TYPE).isEmpty()) {
+        throw new Exception("Dont know REST operation for Action " + transaction.getExecutionRPC());
+      }
+      if (ctx.getAttribute(INPUT_REQUEST_ACTION) == null
+          || ctx.getAttribute(INPUT_REQUEST_ACTION).isEmpty()) {
+        throw new Exception("Dont know request-action " + transaction.getAction());
+      }
+
+      //This code need to get changed to get the UserID and pass from a common place.
+      if (transaction.getuId() == null) {
+        transaction
+            .setuId(prop.getProperty(ctx.getAttribute(INPUT_REQUEST_ACTION)
+                .concat(".default-rest-user")));
+      }
+      if (transaction.getPswd() == null) {
+        transaction
+            .setPswd(prop.getProperty(ctx.getAttribute(INPUT_REQUEST_ACTION)
+                .concat(".default-rest-pass")));
+      }
+
+      RestExecutor restRequestExecutor = new RestExecutor();
+      Map<String, String> output = restRequestExecutor.execute(transaction, ctx);
+
+      if (isValidJson(output.get("restResponse")) != null) {
+        ctx.setAttribute(responsePrefix + "." + OUTPUT_STATUS_MESSAGE,
+            output.get("restResponse"));
 //                JsonNode restResponse = isValidJson(output.get("restResponse"));
 //                for (String key : inParams.keySet()) {
 //                    if(key !=null &&  key.startsWith("output-")){
@@ -169,46 +130,38 @@ public class RestServiceNode implements SvcLogicJavaPlugin {
 //                                 ctx.setAttribute(responsePrefix + "." + key, null);
 //                    }
 //                }                
-            }
-            log.info("Response from Rest :" );
+      }
+      log.info("Response from Rest :");
 
-        } catch(Exception e) {
-            log.error("Error Message: " + e.getMessage(), e);
-            throw e;
-        }
+    } catch (Exception e) {
+      log.error("Error Message: " + e.getMessage(), e);
+      throw e;
     }
+  }
 
-    private Properties loadProperties() throws Exception {
-        Properties props = new Properties();
-        String propDir = System.getenv(SDNC_CONFIG_DIR_VAR);
-        if (propDir == null) {
-            throw new Exception("Cannot find Property file -" + SDNC_CONFIG_DIR_VAR);
-        }
-        String propFile = propDir + FlowControllerConstants.APPC_FLOW_CONTROLLER;
-        try (InputStream propStream = new FileInputStream(propFile)) {
-
-            props.load(propStream);
-        }
-        catch (Exception e) {
-            throw new Exception("Could not load properties file " + propFile, e);
-        }
-        return props;
+  private Properties loadProperties() throws Exception {
+    String directory = System.getenv(SDNC_CONFIG_DIR_VAR);
+    if (directory == null) {
+      throw new Exception("Cannot find Property file: " + SDNC_CONFIG_DIR_VAR);
     }
-
-    private JsonNode isValidJson(String json) throws IOException {
-        JsonNode output;
-        log.info("Received response from Interface " + json);
-        if (json == null  || json.isEmpty()) {
-            return null;
-        }
-        try {
-            ObjectMapper objectMapper = new ObjectMapper();
-            output = objectMapper.readTree(json);
-        } catch(JsonProcessingException e) {
-            log.warn("Response received from interface is not a valid JSON block" + json, e);
-            return null;
-        }
-        log.info("state is " + output.findValue("state"));
-        return output;
+    String path = directory + APPC_FLOW_CONTROLLER;
+    return PropertiesLoader.load(path);
+  }
+
+  private JsonNode isValidJson(String json) throws IOException {
+    JsonNode output;
+    log.info("Received response from Interface " + json);
+    if (json == null || json.isEmpty()) {
+      return null;
+    }
+    try {
+      ObjectMapper objectMapper = new ObjectMapper();
+      output = objectMapper.readTree(json);
+    } catch (JsonProcessingException e) {
+      log.warn("Response received from interface is not a valid JSON block" + json, e);
+      return null;
     }
+    log.info("state is " + output.findValue("state"));
+    return output;
+  }
 }
index b67f193..502438c 100644 (file)
@@ -32,7 +32,7 @@ public class FlowControllerConstants {
     public static final String DATA_TYPE_XML = "XML";
     public static final String DATA_TYPE_SQL = "SQL";
 
-    public static final String INPUT_PARAM_RESPONSE_PRIFIX = "responsePrefix";
+    public static final String INPUT_PARAM_RESPONSE_PREFIX = "responsePrefix";
 
     public static final String OUTPUT_PARAM_STATUS = "status";
     public static final String OUTPUT_PARAM_ERROR_MESSAGE = "error-message";
diff --git a/appc-config/appc-flow-controller/provider/src/test/java/org/onap/appc/flow/controller/node/PropertiesLoaderTest.java b/appc-config/appc-flow-controller/provider/src/test/java/org/onap/appc/flow/controller/node/PropertiesLoaderTest.java
new file mode 100644 (file)
index 0000000..66bf802
--- /dev/null
@@ -0,0 +1,29 @@
+package org.onap.appc.flow.controller.node;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Properties;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class PropertiesLoaderTest {
+
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  @Test
+  public void should_load_property_file() throws IOException {
+    Properties properties = PropertiesLoader.load("src/test/resources/properties_loader.properties");
+
+    Assert.assertEquals("OK", properties.getProperty("test"));
+  }
+
+  @Test
+  public void should_throw_if_file_does_not_exists() throws IOException {
+    expectedException.expect(FileNotFoundException.class);
+    PropertiesLoader.load("src/test/resources/non_existent.properties");
+  }
+
+}
\ No newline at end of file
diff --git a/appc-config/appc-flow-controller/provider/src/test/java/org/onap/appc/flow/controller/node/ResourceUriExtractorTest.java b/appc-config/appc-flow-controller/provider/src/test/java/org/onap/appc/flow/controller/node/ResourceUriExtractorTest.java
new file mode 100644 (file)
index 0000000..d7a853d
--- /dev/null
@@ -0,0 +1,90 @@
+package org.onap.appc.flow.controller.node;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_CONTEXT;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_HOST_IP_ADDRESS;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_PORT_NUMBER;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_REQUEST_ACTION;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_SUB_CONTEXT;
+import static org.onap.appc.flow.controller.utils.FlowControllerConstants.INPUT_URL;
+
+import java.util.Properties;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+
+public class ResourceUriExtractorTest {
+
+  private Properties prop;
+
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  @Before
+  public void setUp() {
+    prop = new Properties();
+  }
+
+  @Test
+  public void should_return_input_url_if_exist() throws Exception {
+    SvcLogicContext ctx = mock(SvcLogicContext.class);
+    when(ctx.getAttribute(INPUT_URL)).thenReturn("test resource uri");
+
+    String resourceUri = ResourceUriExtractor.extractResourceUri(ctx, prop);
+
+    Assert.assertEquals("test resource uri", resourceUri);
+  }
+
+  @Test
+  public void should_extract_url_input_if_context_input_provided() throws Exception {
+    SvcLogicContext ctx = mock(SvcLogicContext.class);
+
+    when(ctx.getAttribute(INPUT_URL)).thenReturn("");
+    when(ctx.getAttribute(INPUT_HOST_IP_ADDRESS)).thenReturn("localhost");
+    when(ctx.getAttribute(INPUT_PORT_NUMBER)).thenReturn("8080");
+
+    when(ctx.getAttribute(INPUT_CONTEXT)).thenReturn("input-context");
+    when(ctx.getAttribute(INPUT_SUB_CONTEXT)).thenReturn("input-sub-context");
+
+    String resourceUri = ResourceUriExtractor.extractResourceUri(ctx, prop);
+
+    Assert.assertEquals("http://localhost:8080/input-context/input-sub-context", resourceUri);
+  }
+
+  @Test
+  public void should_extract_url_input_if_request_action_provided() throws Exception {
+    SvcLogicContext ctx = mock(SvcLogicContext.class);
+
+    when(ctx.getAttribute(INPUT_URL)).thenReturn("");
+    when(ctx.getAttribute(INPUT_HOST_IP_ADDRESS)).thenReturn("localhost");
+    when(ctx.getAttribute(INPUT_PORT_NUMBER)).thenReturn("8080");
+
+    when(ctx.getAttribute(INPUT_REQUEST_ACTION)).thenReturn("request-action");
+    when(ctx.getAttribute(INPUT_REQUEST_ACTION)).thenReturn("request-action");
+
+    prop.put("request-action.context", "ra-context");
+    prop.put("request-action.sub-context", "ra-sub-context");
+
+    String resourceUri = ResourceUriExtractor.extractResourceUri(ctx, prop);
+
+    Assert.assertEquals("http://localhost:8080/ra-context/ra-sub-context", resourceUri);
+  }
+
+  @Test
+  public void should_throw_exception_if_missing_context() throws Exception {
+    SvcLogicContext ctx = mock(SvcLogicContext.class);
+
+    when(ctx.getAttribute(INPUT_URL)).thenReturn("");
+    when(ctx.getAttribute(INPUT_HOST_IP_ADDRESS)).thenReturn("localhost");
+    when(ctx.getAttribute(INPUT_PORT_NUMBER)).thenReturn("8080");
+
+    expectedException.expect(Exception.class);
+    expectedException.expectMessage("Could Not found the context for operation null");
+    ResourceUriExtractor.extractResourceUri(ctx, prop);
+  }
+
+}
\ No newline at end of file
  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
  * ============LICENSE_END=========================================================
  */
-package org.onap.appc.flow.executor.node;
+package org.onap.appc.flow.controller.node;
 
+import java.util.HashMap;
+import java.util.Map;
 import org.junit.Test;
 import org.onap.appc.flow.controller.data.Transaction;
 import org.onap.appc.flow.controller.executorImpl.RestExecutor;
-import org.onap.appc.flow.controller.node.FlowControlNode;
-import org.onap.appc.flow.controller.node.RestServiceNode;
 import org.onap.appc.flow.controller.utils.FlowControllerConstants;
 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
 
-import java.util.HashMap;
-import java.util.Map;
-
 public class TestRestServiceNode {
 
     @Test(expected=Exception.class)
index f29628d..c948169 100644 (file)
-/*-\r
- * ============LICENSE_START=======================================================\r
- * ONAP : APPC\r
- * ================================================================================\r
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.\r
- * ================================================================================\r
- * Copyright (C) 2017 Amdocs\r
- * =============================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *      http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- *\r
- * ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
- * ============LICENSE_END=========================================================\r
- */\r
-\r
-package org.onap.appc.flow.executor.node;\r
-\r
-import static org.mockito.Mockito.doReturn;\r
-import static org.mockito.Mockito.verify;\r
-\r
-import java.io.FileInputStream;\r
-import java.io.InputStream;\r
-import java.util.HashMap;\r
-import java.util.Map;\r
-import java.util.Properties;\r
-\r
-import org.junit.After;\r
-import org.junit.AfterClass;\r
-import org.junit.Before;\r
-import org.junit.BeforeClass;\r
-import org.junit.Ignore;\r
-import org.junit.Test;\r
-import org.mockito.Mock;\r
-import org.mockito.Mockito;\r
-import org.onap.appc.flow.controller.data.Transaction;\r
-import org.onap.appc.flow.controller.data.Transactions;\r
-import org.onap.appc.flow.controller.dbervices.FlowControlDBService;\r
-import org.onap.appc.flow.controller.node.FlowControlNode;\r
-import org.onap.appc.flow.controller.utils.FlowControllerConstants;\r
-import org.onap.ccsdk.sli.core.sli.SvcLogicContext;\r
-import org.onap.ccsdk.sli.core.sli.SvcLogicException;\r
-import org.powermock.api.mockito.PowerMockito;\r
-import org.powermock.reflect.Whitebox;\r
-\r
-public class FlowControlNodeTest {\r
-       @Mock\r
-       FlowControlDBService dbservice = FlowControlDBService.initialise();\r
-       @Mock\r
-       FlowControlNode f = new FlowControlNode();\r
-       \r
-       Properties props = new Properties();\r
-       private static final String SDNC_CONFIG_DIR_VAR = "SDNC_CONFIG_DIR";\r
-       @Before\r
-       public void setUp() throws Exception \r
-\r
-       {\r
-               FlowControlDBService dbservice = FlowControlDBService.initialise();\r
-       }\r
-       @Ignore("Test is taking 60 seconds")\r
-       @Test(expected=Exception.class)\r
-       public final void testProcessFlow() throws Exception {\r
-               SvcLogicContext  ctx = new SvcLogicContext();\r
-               \r
-               ctx.setAttribute("request-id","test");\r
-               ctx.setAttribute("vnf-type","test");\r
-               ctx.setAttribute("action-level","HealthCheck");\r
-                               ctx.setAttribute("request-action","HealthCheck");\r
-                               ctx.setAttribute("response-prefix","response-prefix");\r
-               \r
-               Map<String, String> inParams = new HashMap<String, String>();\r
-               inParams.put("responsePrefix", "responsePrefix");\r
-               \r
-\r
-               Whitebox.invokeMethod(f, "processFlow",inParams, ctx);\r
-               /*Properties props = new Properties();\r
-               PowerMockito.spy(FlowControlNode.class);\r
-             Transactions trans =null;\r
-             HashMap<Integer, Transaction> transactionMap = null;\r
-                String  artifact_content="{‘PlaybookName’:’service_start’,‘EnvParameters’:{‘vnf_instance’:’$vnf_instance’},’Timeout’:600}";\r
-                       String capabilitiesData = "SUCCESS";\r
-             System.out.println("End Test when");*/\r
-             \r
-             \r
-       }\r
-       @Test \r
-       public void testgetInventoryInfo() throws Exception \r
-       {\r
-               SvcLogicContext  ctx = new SvcLogicContext();\r
-                String  vnfid = "test";\r
-             ctx.setAttribute( " tmp.vnfInfo.vnf.vnf-name","test");\r
-             ctx.setAttribute("tmp.vnfInfo.vm-count", "0");\r
-             ctx.setAttribute( " tmp.vnfInfo.vnf.vnf-type","test");\r
-             ctx.setAttribute( "tmp.vnfInfo.vm[0 ].vserverId","test" );\r
-             ctx.setAttribute( "tmp.vnfInfo.vm[0 ].vnfc-name","test" );\r
-             ctx.setAttribute( "tmp.vnfInfo.vm[0].vnfc-type","test" );\r
-             ctx.setAttribute( " tmp.vnfInfo.vm[0].vnfc-count","1");\r
-            \r
-               Whitebox.invokeMethod(f, "getInventoryInfo", ctx, vnfid);\r
-               \r
-       }\r
-       @Ignore("Test is taking 60 seconds")\r
-       @Test(expected=Exception.class)\r
-       public void testprocessFlowSequence() throws Exception \r
-       {\r
-               Map<String, String> inparams = new HashMap<String,String>();\r
-               SvcLogicContext  ctx = new SvcLogicContext();\r
-             ctx.setAttribute( " SEQUENCE-TYPE","test");\r
-             ctx.setAttribute("flow-sequence", "1");\r
-             ctx.setAttribute( "DesignTime","test");\r
-             ctx.setAttribute( "vnf-type","test" );\r
-            \r
-               Whitebox.invokeMethod(f, "processFlowSequence",inparams, ctx, ctx);\r
-               \r
-       }\r
-       @Test\r
-       public void testexeuteAllTransaction() throws Exception \r
-       {\r
-               Map<Integer, Transaction> transactionMap = new HashMap<Integer,Transaction>();\r
-               SvcLogicContext  ctx = new SvcLogicContext();\r
-               Whitebox.invokeMethod(f, "exeuteAllTransaction",transactionMap, ctx);\r
-               \r
-       }\r
-       @Test\r
-       public void testexeutepreProcessor() throws Exception \r
-       {\r
-       Map<Integer, Transaction> transactionMap = new HashMap<Integer,Transaction>();\r
-       Transaction transaction = new Transaction();\r
-       Whitebox.invokeMethod(f, "preProcessor",transactionMap, transaction);\r
-       \r
-       }\r
-               @Test(expected=Exception.class)\r
-       public void testcollectInputParams() throws Exception \r
-       {\r
-       SvcLogicContext  ctx = new SvcLogicContext();\r
-\r
-       Transaction transaction = new Transaction();\r
-       Whitebox.invokeMethod(f, "collectInputParams",ctx, transaction);\r
-       \r
-       }\r
-       @Ignore("Test is taking 60 seconds")\r
-       @Test(expected=Exception.class)\r
-       public void testgetDependencyInfo() throws Exception\r
-       {\r
-               SvcLogicContext  ctx = new SvcLogicContext();\r
-               Whitebox.invokeMethod(f, "getDependencyInfo",ctx);\r
-               \r
-       }\r
-       public void testgetCapabilitesDatass() throws Exception\r
-       {\r
-               SvcLogicContext  ctx = new SvcLogicContext();\r
-               Whitebox.invokeMethod(f, "getDependencyInfo",ctx);\r
-               \r
-       }\r
-       \r
-       \r
-}\r
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP : APPC
+ * ================================================================================
+ * Copyright (C) 2017 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.
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.appc.flow.executor.node;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.verify;
+
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.onap.appc.flow.controller.data.Transaction;
+import org.onap.appc.flow.controller.data.Transactions;
+import org.onap.appc.flow.controller.dbervices.FlowControlDBService;
+import org.onap.appc.flow.controller.node.FlowControlNode;
+import org.onap.appc.flow.controller.utils.FlowControllerConstants;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.reflect.Whitebox;
+
+public class FlowControlNodeTest {
+  @Mock
+  FlowControlDBService dbservice = FlowControlDBService.initialise();
+  @Mock
+  FlowControlNode f = new FlowControlNode();
+
+  Properties props = new Properties();
+  private static final String SDNC_CONFIG_DIR_VAR = "SDNC_CONFIG_DIR";
+  @Before
+  public void setUp() throws Exception
+
+  {
+    FlowControlDBService dbservice = FlowControlDBService.initialise();
+  }
+  @Ignore("Test is taking 60 seconds")
+  @Test(expected=Exception.class)
+  public final void testProcessFlow() throws Exception {
+    SvcLogicContext  ctx = new SvcLogicContext();
+
+    ctx.setAttribute("request-id","test");
+    ctx.setAttribute("vnf-type","test");
+    ctx.setAttribute("action-level","HealthCheck");
+    ctx.setAttribute("request-action","HealthCheck");
+    ctx.setAttribute("response-prefix","response-prefix");
+
+    Map<String, String> inParams = new HashMap<String, String>();
+    inParams.put("responsePrefix", "responsePrefix");
+
+
+    Whitebox.invokeMethod(f, "processFlow",inParams, ctx);
+               /*Properties props = new Properties();
+               PowerMockito.spy(FlowControlNode.class);
+             Transactions trans =null;
+             HashMap<Integer, Transaction> transactionMap = null;
+                String  artifact_content="{‘PlaybookName’:’service_start’,‘EnvParameters’:{‘vnf_instance’:’$vnf_instance’},’Timeout’:600}";
+                       String capabilitiesData = "SUCCESS";
+             System.out.println("End Test when");*/
+
+
+  }
+  @Test
+  public void testgetInventoryInfo() throws Exception
+  {
+    SvcLogicContext  ctx = new SvcLogicContext();
+    String  vnfid = "test";
+    ctx.setAttribute( " tmp.vnfInfo.vnf.vnf-name","test");
+    ctx.setAttribute("tmp.vnfInfo.vm-count", "0");
+    ctx.setAttribute( " tmp.vnfInfo.vnf.vnf-type","test");
+    ctx.setAttribute( "tmp.vnfInfo.vm[0 ].vserverId","test" );
+    ctx.setAttribute( "tmp.vnfInfo.vm[0 ].vnfc-name","test" );
+    ctx.setAttribute( "tmp.vnfInfo.vm[0].vnfc-type","test" );
+    ctx.setAttribute( " tmp.vnfInfo.vm[0].vnfc-count","1");
+
+    Whitebox.invokeMethod(f, "getInventoryInfo", ctx, vnfid);
+
+  }
+  @Ignore("Test is taking 60 seconds")
+  @Test(expected=Exception.class)
+  public void testprocessFlowSequence() throws Exception
+  {
+    Map<String, String> inparams = new HashMap<String,String>();
+    SvcLogicContext  ctx = new SvcLogicContext();
+    ctx.setAttribute( " SEQUENCE-TYPE","test");
+    ctx.setAttribute("flow-sequence", "1");
+    ctx.setAttribute( "DesignTime","test");
+    ctx.setAttribute( "vnf-type","test" );
+
+    Whitebox.invokeMethod(f, "processFlowSequence",inparams, ctx, ctx);
+
+  }
+  @Test
+  public void testexeuteAllTransaction() throws Exception
+  {
+    Map<Integer, Transaction> transactionMap = new HashMap<Integer,Transaction>();
+    SvcLogicContext  ctx = new SvcLogicContext();
+    Whitebox.invokeMethod(f, "exeuteAllTransaction",transactionMap, ctx);
+
+  }
+  @Test
+  public void testexeutepreProcessor() throws Exception
+  {
+    Map<Integer, Transaction> transactionMap = new HashMap<Integer,Transaction>();
+    Transaction transaction = new Transaction();
+    Whitebox.invokeMethod(f, "preProcessor",transactionMap, transaction);
+
+  }
+  @Test(expected=Exception.class)
+  public void testcollectInputParams() throws Exception
+  {
+    SvcLogicContext  ctx = new SvcLogicContext();
+
+    Transaction transaction = new Transaction();
+    Whitebox.invokeMethod(f, "collectInputParams",ctx, transaction);
+
+  }
+  @Ignore("Test is taking 60 seconds")
+  @Test(expected=Exception.class)
+  public void testgetDependencyInfo() throws Exception
+  {
+    SvcLogicContext  ctx = new SvcLogicContext();
+    Whitebox.invokeMethod(f, "getDependencyInfo",ctx);
+
+  }
+  public void testgetCapabilitesDatass() throws Exception
+  {
+    SvcLogicContext  ctx = new SvcLogicContext();
+    Whitebox.invokeMethod(f, "getDependencyInfo",ctx);
+
+  }
+
+
+}
diff --git a/appc-config/appc-flow-controller/provider/src/test/resources/properties_loader.properties b/appc-config/appc-flow-controller/provider/src/test/resources/properties_loader.properties
new file mode 100644 (file)
index 0000000..fc0aee0
--- /dev/null
@@ -0,0 +1 @@
+test = OK
\ No newline at end of file