Add unit tests for sli 63/38263/9
authorTimoney, Dan (dt5972) <dt5972@att.com>
Sat, 24 Mar 2018 23:11:10 +0000 (19:11 -0400)
committerTimoney, Dan (dt5972) <dt5972@att.com>
Tue, 27 Mar 2018 18:58:43 +0000 (14:58 -0400)
Added unit tests for ccsdk/sli/core/sli

Change-Id: I0d2408c43b9e56a78f3e01e87985aedb6cad5953
Issue-ID: CCSDK-213
Signed-off-by: Timoney, Dan (dt5972) <dt5972@att.com>
32 files changed:
.gitignore
dblib/provider/src/main/java/org/onap/ccsdk/sli/core/dblib/CachedDataSource.java
filters/provider/pom.xml
filters/provider/src/main/java/org/onap/ccsdk/sli/core/filters/RequestResponseDbLoggingFilter.java
filters/provider/src/test/java/org/onap/ccsdk/sli/core/filters/TestLogFilter.java [new file with mode: 0644]
filters/provider/src/test/java/org/onap/ccsdk/sli/core/filters/TestRequestResponseLoggingFilter.java [new file with mode: 0644]
sli/common/pom.xml
sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/MessageWriter.java
sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicDblibStore.java
sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicJdbcStore.java
sli/common/src/main/java/org/onap/ccsdk/sli/core/sli/SvcLogicParser.java
sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/ITCaseSvcLogicParser.java
sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/PrintYangToPropTest.java
sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/TestMetricLogger.java [new file with mode: 0644]
sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/TestSvcLogicLoader.java [new file with mode: 0644]
sli/common/src/test/resources/dblib.properties [new file with mode: 0755]
sli/common/src/test/resources/graphs/sliapi/graph.versions [new file with mode: 0644]
sli/common/src/test/resources/graphs/sliapi/sli_healthcheck.xml [new file with mode: 0644]
sli/common/src/test/resources/l3sdn_logic_v10.xml [new file with mode: 0644]
sli/common/src/test/resources/parser-good.tests
sli/common/src/test/resources/svclogic.properties
sli/common/src/test/resources/svclogic.xsd
sli/provider/pom.xml
sli/provider/src/test/java/org/onap/ccsdk/sli/core/sli/provider/ITCaseSvcLogicGraphExecutor.java
sli/provider/src/test/resources/executor.tests
sli/provider/src/test/resources/l3sdn_logic_v10.xml
sli/provider/src/test/resources/svclogic.properties
sliapi/provider/pom.xml
sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java
sliapi/provider/src/test/java/org/onap/ccsdk/sli/core/sliapi/TestSliapiProvider.java [new file with mode: 0644]
sliapi/provider/src/test/resources/sli_healthcheck.xml [new file with mode: 0644]
sliapi/provider/src/test/resources/svclogic.properties [moved from sli/provider/src/main/resources/svclogic.properties with 91% similarity]

index a36bed3..a5a0d80 100755 (executable)
@@ -44,3 +44,5 @@ sdnc-core_bdio.jsonld
 blackDuckHubProjectName.txt
 blackDuckHubProjectVersionName.txt
 
+# Derby log
+derby.log
index 02cce3c..97380f5 100755 (executable)
@@ -342,11 +342,16 @@ public abstract class CachedDataSource implements DataSource, SQLExecutionMonito
     }
 
     protected boolean testConnection(boolean errorLevel) {
+
+        String testQuery = "SELECT @@global.read_only, @@global.hostname";
+        if (isDerby) {
+            testQuery = "SELECT 'false', 'localhost' FROM SYSIBM.SYSDUMMY1";
+        }
         ResultSet rs = null;
         try (Connection conn = this.getConnection(); Statement stmt = conn.createStatement()) {
             Boolean readOnly;
             String hostname;
-            rs = stmt.executeQuery("SELECT @@global.read_only, @@global.hostname"); // ("SELECT 1 FROM DUAL"); //"select
+            rs = stmt.executeQuery(testQuery); // ("SELECT 1 FROM DUAL"); //"select
                                                                                     // BANNER from SYS.V_$VERSION"
             while (rs.next()) {
                 readOnly = rs.getBoolean(1);
index 4fdd832..a60c0be 100755 (executable)
@@ -19,6 +19,8 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+       <!--  Ignore deprecated classes in coverage counts -->
+       <sonar.coverage.exclusions>**/RequestResponseDbLoggingFilter.java</sonar.coverage.exclusions>
     </properties>
 
     <dependencies>
             <version>${junit.version}</version>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
index 8b67276..3591365 100644 (file)
@@ -8,9 +8,9 @@
  * 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.
@@ -47,6 +47,7 @@ import org.onap.ccsdk.sli.core.sli.MessageWriter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Deprecated
 public class RequestResponseDbLoggingFilter implements Filter {
 
        private static Logger log = LoggerFactory.getLogger(RequestResponseDbLoggingFilter.class);
diff --git a/filters/provider/src/test/java/org/onap/ccsdk/sli/core/filters/TestLogFilter.java b/filters/provider/src/test/java/org/onap/ccsdk/sli/core/filters/TestLogFilter.java
new file mode 100644 (file)
index 0000000..a900b24
--- /dev/null
@@ -0,0 +1,71 @@
+/**
+ *
+ */
+package org.onap.ccsdk.sli.core.filters;
+
+import static org.junit.Assert.*;
+import org.apache.commons.codec.binary.Base64;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import static org.mockito.Mockito.*;
+import java.io.IOException;
+import java.util.UUID;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author dt5972
+ *
+ */
+public class TestLogFilter {
+
+    LogFilter logFilter;
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        logFilter = new LogFilter();
+        logFilter.init(null);
+    }
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @After
+    public void tearDown() throws Exception {
+        logFilter.destroy();
+    }
+
+    /**
+     * Test method for {@link org.onap.ccsdk.sli.core.filters.LogFilter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)}.
+     * @throws ServletException
+     * @throws IOException
+     */
+    @Test
+    public void testDoFilter() throws IOException, ServletException {
+
+        // Test failed request with minimal headers
+        HttpServletRequest servletReq = mock(HttpServletRequest.class);
+        when(servletReq.getRequestURL()).thenReturn(new StringBuffer("SLI-API:healthcheck"));
+        when(servletReq.getPathInfo()).thenReturn("/hello:world");
+        HttpServletResponse servletResp = mock(HttpServletResponse.class);
+        when(servletResp.getStatus()).thenReturn(400);
+        FilterChain filterChain = mock(FilterChain.class);
+        logFilter.doFilter(servletReq, servletResp, filterChain);
+
+        // Test successful request with valid header
+        when(servletReq.getHeader(LogFilter.REQUEST_ID)).thenReturn(UUID.randomUUID().toString());
+        when(servletReq.getHeader("Authorization")).thenReturn("Basic "+Base64.encodeBase64String("username:password".getBytes()));
+        when(servletResp.getStatus()).thenReturn(200);
+        logFilter.doFilter(servletReq, servletResp, filterChain);
+
+
+    }
+
+}
diff --git a/filters/provider/src/test/java/org/onap/ccsdk/sli/core/filters/TestRequestResponseLoggingFilter.java b/filters/provider/src/test/java/org/onap/ccsdk/sli/core/filters/TestRequestResponseLoggingFilter.java
new file mode 100644 (file)
index 0000000..9f36fe1
--- /dev/null
@@ -0,0 +1,129 @@
+/**
+ *
+ */
+package org.onap.ccsdk.sli.core.filters;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.StringBufferInputStream;
+import java.io.StringReader;
+import java.util.LinkedList;
+import java.util.UUID;
+import java.util.Vector;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.apache.commons.codec.binary.Base64;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author dt5972
+ *
+ */
+public class TestRequestResponseLoggingFilter {
+
+    RequestResponseLoggingFilter filter;
+
+    private class DummyServletInputStream extends ServletInputStream {
+
+        InputStream stream;
+
+        public DummyServletInputStream(InputStream stream) {
+            this.stream = stream;
+        }
+
+
+        @Override
+        public void close() throws IOException {
+            super.close();
+            stream.close();
+        }
+
+
+        @Override
+        public int read() throws IOException {
+            return stream.read();
+        }
+
+
+
+    }
+
+    private class DummyServletOutputStream extends ServletOutputStream {
+
+        OutputStream ostr;
+
+        public DummyServletOutputStream(OutputStream ostr) {
+            this.ostr = ostr;
+        }
+
+        @Override
+        public void write(int b) throws IOException {
+            ostr.write(b);
+        }
+
+    }
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        filter = new RequestResponseLoggingFilter();
+        filter.init(null);
+    }
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @After
+    public void tearDown() throws Exception {}
+
+    /**
+     * Test method for {@link org.onap.ccsdk.sli.core.filters.RequestResponseLoggingFilter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)}.
+     * @throws IOException
+     * @throws ServletException
+     */
+    @Test
+    public void testDoFilter() throws IOException, ServletException {
+
+        HttpServletRequest request = mock(HttpServletRequest.class);
+        String msgBody = "hello world";
+        InputStream reqInputStream = new ByteArrayInputStream(msgBody.getBytes());
+        when(request.getInputStream()).thenReturn(new DummyServletInputStream(reqInputStream));
+        when(request.getMethod()).thenReturn("POST");
+        when(request.getRequestURL()).thenReturn(new StringBuffer("/HELLO:world"));
+        when(request.getPathInfo()).thenReturn("/hello:world");
+        Vector<String> headerList = new Vector<>();
+        headerList.add(LogFilter.REQUEST_ID);
+        headerList.add("Authorization");
+        when(request.getHeaderNames()).thenReturn(headerList.elements());
+
+        when(request.getHeader(LogFilter.REQUEST_ID)).thenReturn(UUID.randomUUID().toString());
+        when(request.getHeader("Authorization")).thenReturn("Basic "+Base64.encodeBase64String("username:password".getBytes()));
+
+        HttpServletResponse response = mock(HttpServletResponse.class);
+        OutputStream outStr = new ByteArrayOutputStream();
+        when(response.getOutputStream()).thenReturn(new DummyServletOutputStream(outStr));
+
+        FilterChain filterChain = mock(FilterChain.class);
+
+        filter.doFilter(request, response, filterChain);
+
+
+
+    }
+
+}
index 1d35dfb..c22c1ae 100755 (executable)
     <name>ccsdk-sli-core :: sli :: ${project.artifactId}</name>
     <description>The SLI Common package includes common classes used by the various SLI subcomponents, as well as classes used by clients to interface with the service logic interpreter</description>
 
+    <properties>
+       <!--  Ignore deprecated classes in coverage counts -->
+       <sonar.coverage.exclusions>**/MessageWriter.java</sonar.coverage.exclusions>
+
+    </properties>
+
     <dependencyManagement>
         <dependencies>
             <dependency>
@@ -31,9 +37,9 @@
     </dependencyManagement>
     <dependencies>
         <dependency>
-            <groupId>ch.vorburger.mariaDB4j</groupId>
-            <artifactId>mariaDB4j</artifactId>
-            <version>2.2.3</version>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derby</artifactId>
+            <version>10.11.1.1</version>
             <scope>test</scope>
         </dependency>
         <dependency>
index c75873e..0e39896 100644 (file)
@@ -8,9 +8,9 @@
  * 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.
@@ -38,7 +38,7 @@ import org.osgi.framework.ServiceReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
+@Deprecated
 public class MessageWriter {
 
        private static final Logger LOG = LoggerFactory.getLogger(MessageWriter.class);
index ee3bcca..864652b 100644 (file)
@@ -66,6 +66,19 @@ public class SvcLogicDblibStore implements SvcLogicStore {
                this.dbSvc = dbsvc;
        }
 
+       public SvcLogicDblibStore(Properties props) {
+        try {
+            dbSvc = new DBResourceManager(props);
+            JavaSingleton.setInstance(dbSvc);
+        } catch (Exception e) {
+            LOG.warn("Caught exception trying to create DBResourceManager", e);
+        }
+       }
+
+       public Connection getConnection() throws SQLException {
+           return(dbSvc.getConnection());
+       }
+
        @Override
        public void init(Properties props) throws ConfigurationException {
 
index e2fbdf7..0e7d05a 100644 (file)
@@ -38,7 +38,6 @@ import java.util.Properties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
 public class SvcLogicJdbcStore implements SvcLogicStore {
     private static final Logger LOG = LoggerFactory.getLogger(SvcLogicJdbcStore.class);
 
index 3d9caff..2804f62 100644 (file)
@@ -437,7 +437,7 @@ public class SvcLogicParser {
 
     }
 
-    
+
     public static void load(String xmlfile, SvcLogicStore store) throws SvcLogicException {
         File xmlFile = new File(xmlfile);
         if (!xmlFile.canRead()) {
@@ -531,7 +531,7 @@ public class SvcLogicParser {
 
     }
 
-    private static void activate(String module, String rpc, String version, String mode, SvcLogicStore store) {
+    public static void activate(String module, String rpc, String version, String mode, SvcLogicStore store) {
         String details = "(module:" + module + ", rpc:" + rpc + ", version:" + version + ", mode:" + mode + ")";
 
         try {
@@ -560,7 +560,7 @@ public class SvcLogicParser {
 
         System.exit(1);
     }
-    
+
     protected SAXParser initParser() throws ParserConfigurationException, SAXException {
         URL xsdUrl = null;
         Schema schema = null;
index 368d9f9..6ee18e9 100644 (file)
@@ -32,11 +32,13 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.net.URL;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
 import java.util.Properties;
 
-import ch.vorburger.mariadb4j.DB;
-import ch.vorburger.mariadb4j.DBConfigurationBuilder;
-
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -67,17 +69,9 @@ public class ITCaseSvcLogicParser {
 
                props.load(propStr);
 
+        store = SvcLogicStoreFactory.getSvcLogicStore(props);
 
-               // Start MariaDB4j database
-               DBConfigurationBuilder config = DBConfigurationBuilder.newBuilder();
-               config.setPort(0); // 0 => autom. detect free port
-               DB db = DB.newEmbeddedDB(config.build());
-               db.start();
-
-
-               // Override jdbc URL and database name
-               props.setProperty("org.onap.ccsdk.sli.jdbc.database", "test");
-               props.setProperty("org.onap.ccsdk.sli.jdbc.url", config.getURL("test"));
+        assertNotNull(store);
 
     }
 
@@ -120,8 +114,123 @@ public class ITCaseSvcLogicParser {
                     }
 
                     try {
-                        SvcLogicParser.validate(testCaseUrl.getPath(), store);
+                        SvcLogicParser.load(testCaseUrl.getPath(), store);
                     } catch (Exception e) {
+
+                        fail("Validation failure [" + e.getMessage() + "]");
+                    }
+                }
+            }
+        } catch (SvcLogicParserException e) {
+            fail("Parser error : " + e.getMessage());
+        } catch (Exception e) {
+            LOG.error("", e);
+            fail("Caught exception processing test cases");
+        }
+    }
+
+    @Test
+    public void testDblibLoadValidXml() throws IOException, SQLException, ConfigurationException {
+
+        URL propUrl = ITCaseSvcLogicParser.class.getResource("/dblib.properties");
+
+        InputStream propStr = ITCaseSvcLogicParser.class.getResourceAsStream("/dblib.properties");
+
+        Properties props = new Properties();
+
+        props.load(propStr);
+
+        SvcLogicDblibStore dblibStore = new SvcLogicDblibStore(props);
+
+        Connection dbConn = dblibStore.getConnection();
+
+        String dbName = props.getProperty("org.onap.ccsdk.sli.jdbc.database", "sdnctl");
+
+        DatabaseMetaData dbm;
+
+        try {
+            dbm = dbConn.getMetaData();
+        } catch (SQLException e) {
+
+            throw new ConfigurationException("could not get databse metadata", e);
+        }
+
+        // See if table SVC_LOGIC exists. If not, create it.
+        Statement stmt = null;
+        try {
+
+            ResultSet tables = dbm.getTables(null, null, "SVC_LOGIC", null);
+            if (tables.next()) {
+                LOG.debug("SVC_LOGIC table already exists");
+            } else {
+                String crTableCmd = "CREATE TABLE " + dbName + ".SVC_LOGIC (" + "module varchar(80) NOT NULL,"
+                        + "rpc varchar(80) NOT NULL," + "version varchar(40) NOT NULL," + "mode varchar(5) NOT NULL,"
+                        + "active varchar(1) NOT NULL," + "graph BLOB,"
+                        + "CONSTRAINT P_SVC_LOGIC PRIMARY KEY(module, rpc, version, mode))";
+
+                stmt = dbConn.createStatement();
+                stmt.executeUpdate(crTableCmd);
+            }
+        } catch (Exception e) {
+            throw new ConfigurationException("could not create SVC_LOGIC table", e);
+        } finally {
+            if (stmt != null) {
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    LOG.error("Statement close error ", e);
+                }
+            }
+        }
+
+        // See if NODE_TYPES table exists and, if not, create it
+        stmt = null;
+        try {
+
+            ResultSet tables = dbm.getTables(null, null, "NODE_TYPES", null);
+            if (tables.next()) {
+                LOG.debug("NODE_TYPES table already exists");
+            } else {
+                String crTableCmd = "CREATE TABLE " + dbName + ".NODE_TYPES (" + "nodetype varchar(80) NOT NULL,"
+                        + "CONSTRAINT P_NODE_TYPES PRIMARY KEY(nodetype))";
+
+                stmt = dbConn.createStatement();
+
+                stmt.executeUpdate(crTableCmd);
+            }
+        } catch (Exception e) {
+            throw new ConfigurationException("could not create SVC_LOGIC table", e);
+        } finally {
+            if (stmt != null) {
+                try {
+                    stmt.close();
+                } catch (SQLException e) {
+                    LOG.error("Statement close error ", e);
+                }
+            }
+        }
+
+        try {
+            InputStream testStr = getClass().getResourceAsStream("/parser-good.tests");
+            BufferedReader testsReader = new BufferedReader(new InputStreamReader(testStr));
+            String testCaseFile = null;
+            while ((testCaseFile = testsReader.readLine()) != null) {
+
+                testCaseFile = testCaseFile.trim();
+
+                if (testCaseFile.length() > 0) {
+                    if (!testCaseFile.startsWith("/")) {
+                        testCaseFile = "/" + testCaseFile;
+                    }
+                    URL testCaseUrl = getClass().getResource(testCaseFile);
+                    if (testCaseUrl == null) {
+                        fail("Could not resolve test case file " + testCaseFile);
+                    }
+
+                    try {
+                        SvcLogicParser.load(testCaseUrl.getPath(), dblibStore);
+                    } catch (Exception e) {
+
                         fail("Validation failure [" + e.getMessage() + "]");
                     }
                 }
@@ -152,7 +261,7 @@ public class ITCaseSvcLogicParser {
                 if (testCaseUrl == null) {
                     fail("Could not resolve test case file " + testCaseFile);
                 }
-                SvcLogicParser.load(testCaseUrl.getPath(), store);
+                SvcLogicParser.validate(testCaseUrl.getPath(), store);
             }
         }
     }
index 21d3e59..fb6eaf7 100644 (file)
@@ -15,6 +15,9 @@ import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.Exe
 import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInputBuilder;
 import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.execute.graph.input.SliParameter;
 import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.execute.graph.input.SliParameterBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddressBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefixBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -50,6 +53,22 @@ public class PrintYangToPropTest {
                pBuilder.setIntValue(null);
                pBuilder.setBooleanValue(true);
                pList.add(pBuilder.build());
+               pBuilder.setParameterName("ipaddress-value1");
+               pBuilder.setBooleanValue(null);
+               pBuilder.setIpaddressValue(IpAddressBuilder.getDefaultInstance("127.0.0.1"));
+               pList.add(pBuilder.build());
+               pBuilder.setParameterName("ipaddress-value1");
+               pBuilder.setIpaddressValue(IpAddressBuilder.getDefaultInstance("::1"));
+               pList.add(pBuilder.build());
+               pBuilder.setParameterName("ipprefix-value1");
+               pBuilder.setIpaddressValue(null);
+               pBuilder.setIpprefixValue(IpPrefixBuilder.getDefaultInstance("192.168.0.0/16"));
+               pList.add(pBuilder.build());
+               pBuilder.setParameterName("ipprefix-value2");
+               pBuilder.setIpprefixValue(IpPrefixBuilder.getDefaultInstance("2001:db8:3c4d::/48"));
+               pList.add(pBuilder.build());
+
+
 
                egBuilder.setSliParameter(pList);
 
@@ -64,6 +83,9 @@ public class PrintYangToPropTest {
                        LOG.info("Property {} = {}", propName, props.getProperty(propName));
                }
 
+               // Generate builder from properties just generated
+               PrintYangToProp.toBuilder(props, pBuilder);
+
        }
 
 }
diff --git a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/TestMetricLogger.java b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/TestMetricLogger.java
new file mode 100644 (file)
index 0000000..31a419b
--- /dev/null
@@ -0,0 +1,135 @@
+package org.onap.ccsdk.sli.core.sli;
+
+import static org.junit.Assert.*;
+import java.util.Date;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestMetricLogger {
+
+    MetricLogger logger;
+
+    @Before
+    public void setUp() throws Exception {
+
+        logger = new MetricLogger();
+        logger.resetContext();
+        logger.logRequest("svcInstance1", "svcName", "svcPartner", "targetEntity", "targetServiceName", "targetVirtualEntity", "hello-world");
+        logger.logResponse("200", "200", "SUCCESS");
+
+    }
+
+    @Test
+    public final void testGetBeginTimestamp() {
+        logger.getBeginTimestamp();
+    }
+
+    @Test
+    public final void testGetEndTimestamp() {
+       logger.getEndTimestamp();
+    }
+
+    @Test
+    public final void testGetRequestID() {
+        logger.getRequestID();
+    }
+
+    @Test
+    public final void testGetServiceInstanceID() {
+        logger.getServiceInstanceID();
+    }
+
+    @Test
+    public final void testGetServiceName() {
+        logger.getServiceName();
+    }
+
+    @Test
+    public final void testGetPartnerName() {
+        logger.getPartnerName();
+    }
+
+    @Test
+    public final void testGetTargetEntity() {
+        logger.getTargetEntity();
+    }
+
+    @Test
+    public final void testGetTargetServiceName() {
+        logger.getTargetServiceName();
+    }
+
+    @Test
+    public final void testGetStatusCode() {
+        logger.getStatusCode();
+    }
+
+    @Test
+    public final void testGetResponseCode() {
+       logger.getResponseCode();
+    }
+
+    @Test
+    public final void testGetResponseDescription() {
+        logger.getResponseDescription();
+    }
+
+    @Test
+    public final void testGetInstanceUUID() {
+        logger.getInstanceUUID();
+    }
+
+    @Test
+    public final void testGetCategoryLogLevel() {
+        logger.getCategoryLogLevel();
+    }
+
+    @Test
+    public final void testGetSeverity() {
+        logger.getSeverity();
+    }
+
+    @Test
+    public final void testGetServerIpAddress() {
+        logger.getServerIpAddress();
+    }
+
+    @Test
+    public final void testGetElapsedTime() {
+        logger.getElapsedTime();
+    }
+
+    @Test
+    public final void testGetServer() {
+        logger.getServer();
+    }
+
+    @Test
+    public final void testGetClientIp() {
+        logger.getClientIp();
+    }
+
+    @Test
+    public final void testGetClassName() {
+        logger.getClassName();
+    }
+
+    @Test
+    public final void testGetTargetVirtualEntity() {
+        logger.getTargetVirtualEntity();
+    }
+
+    @Test
+    public final void testAsIso8601Date() {
+        logger.asIso8601(new Date());
+    }
+
+    @Test
+    public final void testAsIso8601Long() {
+        logger.asIso8601(System.currentTimeMillis());
+    }
+
+
+
+
+}
diff --git a/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/TestSvcLogicLoader.java b/sli/common/src/test/java/org/onap/ccsdk/sli/core/sli/TestSvcLogicLoader.java
new file mode 100644 (file)
index 0000000..8998382
--- /dev/null
@@ -0,0 +1,38 @@
+package org.onap.ccsdk.sli.core.sli;
+
+import static org.junit.Assert.*;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Properties;
+import org.junit.Test;
+
+public class TestSvcLogicLoader {
+
+    @Test
+    public void testLoadAndActivate() throws IOException, SvcLogicException {
+        URL propUrl = ITCaseSvcLogicParser.class.getResource("/svclogic.properties");
+
+        InputStream propStr = ITCaseSvcLogicParser.class.getResourceAsStream("/svclogic.properties");
+
+        Properties props = new Properties();
+
+        props.load(propStr);
+
+        SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(props);
+
+        URL graphUrl = TestSvcLogicLoader.class.getClassLoader().getResource("graphs");
+
+        if (graphUrl == null) {
+            fail("Cannot find graphs directory");
+        }
+
+        SvcLogicLoader loader = new SvcLogicLoader(graphUrl.getPath(), store);
+        loader.loadAndActivate();
+
+
+    }
+
+
+
+}
diff --git a/sli/common/src/test/resources/dblib.properties b/sli/common/src/test/resources/dblib.properties
new file mode 100755 (executable)
index 0000000..f08dce7
--- /dev/null
@@ -0,0 +1,14 @@
+org.onap.ccsdk.sli.dbtype=jdbc
+org.onap.ccsdk.sli.jdbc.hosts=sdnctldb01,sdnctldb02
+org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:test;create=true
+org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver
+org.onap.ccsdk.sli.jdbc.database=test
+org.onap.ccsdk.sli.jdbc.user=test
+org.onap.ccsdk.sli.jdbc.password=test
+org.onap.ccsdk.sli.jdbc.connection.name=sdnctldb01
+
+org.onap.ccsdk.sli.jdbc.connection.timeout=50
+org.onap.ccsdk.sli.jdbc.request.timeout=100
+org.onap.ccsdk.sli.jdbc.limit.init=10
+org.onap.ccsdk.sli.jdbc.limit.min=10
+org.onap.ccsdk.sli.jdbc.limit.max=20
diff --git a/sli/common/src/test/resources/graphs/sliapi/graph.versions b/sli/common/src/test/resources/graphs/sliapi/graph.versions
new file mode 100644 (file)
index 0000000..d72920a
--- /dev/null
@@ -0,0 +1 @@
+sli healthcheck 1.0.0 sync
diff --git a/sli/common/src/test/resources/graphs/sliapi/sli_healthcheck.xml b/sli/common/src/test/resources/graphs/sliapi/sli_healthcheck.xml
new file mode 100644 (file)
index 0000000..d512f54
--- /dev/null
@@ -0,0 +1,27 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 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=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd" module='sli' version='1.0.0'><method rpc='healthcheck' mode='sync'>
+<set>
+<parameter name='error-code' value='200' />
+<parameter name='error-message' value='SDN-C is healthy'/>
+<parameter name='ack-final' value='Y'/>
+</set></method></service-logic>
diff --git a/sli/common/src/test/resources/l3sdn_logic_v10.xml b/sli/common/src/test/resources/l3sdn_logic_v10.xml
new file mode 100644 (file)
index 0000000..58a420f
--- /dev/null
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- ============LICENSE_START=======================================================
+    ONAP : CCSDK ================================================================================
+    Copyright (C) 2017 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========================================================= -->
+
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd"
+    module="neutron" version="1.0.0">
+
+    <method rpc="canCreateNetwork" mode="sync">
+        <return status="success">
+            <parameter name="error-code" value="200" />
+        </return>
+    </method>
+
+    <method rpc="switchTester" mode="sync">
+
+        <switch test="`$test-value`">
+            <outcome value="">
+                <return status="success">
+                    <parameter name="visited-outcome" value="empty string" />
+                </return>
+            </outcome>
+            <outcome value="Other">
+                <return status="success">
+                    <parameter name="visited-outcome" value="Other" />
+                </return>
+            </outcome>
+        </switch>
+
+
+    </method>
+
+    <method rpc="forRecordTester" mode="sync">
+        <for index="i" start="0" end="1">
+            <record plugin="org.onap.ccsdk.sli.core.sli.provider.DummyRecorder">
+                <parameter name="level" value="INFO"/>
+                <parameter name="field1" value="`forRecordTester message $i`"/>
+            </record>
+        </for>
+    </method>
+
+    <method rpc="whileNodeTester" mode="sync">
+        <while test="`$test-value`">
+            <break/>
+        </while>
+
+    </method>
+
+    <method rpc="resourceTester" mode="sync">
+        <block>
+            <set>
+                <parameter name='resource-plugin'
+                    value='org.onap.ccsdk.sli.core.sli.provider.DummyResource' />
+            </set>
+
+            <save plugin="`$resource-plugin`" resource="sample" key="sample-key == 'resourceTester.status'">
+               <parameter name="sample-key" value="resourceTester.status"/>
+               <parameter name="sample-value" value="FAILED"/>
+            </save>
+
+            <update plugin="`$resource-plugin`" resource="sample" key="sample-key == 'resourceTester.status'">
+               <parameter name="sample-key" value="resourceTester.status"/>
+               <parameter name="sample-value" value="PASSED"/>
+            </update>
+
+            <get-resource plugin="`$resource-plugin`" resource="sample" key="sample-key == 'resourceTester.status'" pfx="sample"/>
+
+            <exists plugin="`$resource-plugin`" resource="sample" key="sample-key == 'resourceTester.status'"/>
+
+            <is-available plugin="`$resource-plugin`" resource="sample" key="sample-key == 'resourceTester.status'"/>
+
+            <reserve plugin="`$resource-plugin`" resource="sample" key="sample-key == 'resourceTester.status'"/>
+
+            <release plugin="`$resource-plugin`" resource="sample" key="sample-key == 'resourceTester.status'"/>
+
+
+            <reserve plugin="`$resource-plugin`" resource="sample" key="sample-key == 'resourceTester.status'"/>
+
+            <notify plugin="`$resource-plugin`" resource="sample" action="RESERVE"/>
+
+            <delete plugin="`$resource-plugin`" resource="sample" key="sample-key == 'resourceTester.status'"/>
+
+
+
+        </block>
+    </method>
+
+    <method rpc="configureTester" mode="sync">
+        <block>
+            <set>
+                <parameter name='configure-plugin'
+                    value='org.onap.ccsdk.sli.core.sli.provider.DummyAdaptor' />
+            </set>
+            <configure adaptor="`$configure-plugin`" key="dummy" activate="true">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="SUCCESS" activate="true">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="ALREADY_ACTIVE" activate="true">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="NOT_FOUND" activate="true">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="NOT_READY" activate="true">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="FAILURE" activate="true">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="dummy" activate="false">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="SUCCESS" activate="false">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="ALREADY_ACTIVE" activate="false">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="NOT_FOUND" activate="false">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="NOT_READY" activate="false">
+                <parameter name="field1" value="1"/>
+            </configure>
+            <configure adaptor="`$configure-plugin`" key="FAILURE" activate="false">
+                <parameter name="field1" value="1"/>
+            </configure>
+
+       </block>
+    </method>
+
+
+    <method rpc="javaPluginTester" mode="sync">
+        <block>
+            <set>
+                <parameter name='java-plugin'
+                    value='org.onap.ccsdk.sli.core.sli.provider.VoidDummyPlugin' />
+            </set>
+            <execute plugin="`$java-plugin`" method="dummy"/>
+       </block>
+    </method>
+
+    <method rpc="allNodesTester" mode="sync">
+        <block>
+            <set>
+                <parameter name='resource-plugin'
+                    value='org.onap.ccsdk.sli.core.sli.provider.DummyResource' />
+                <parameter name='configure-plugin'
+                    value='org.onap.ccsdk.sli.core.sli.provider.DummyAdaptor' />
+                <parameter name='java-plugin'
+                    value='org.onap.ccsdk.sli.core.sli.provider.VoidDummyPlugin' />
+
+            </set>
+
+            <call rpc="switchTester" mode="sync" />
+
+            <call rpc="forRecordTester" mode="sync"/>
+
+            <call rpc="resourceTester" mode="sync"/>
+
+            <call rpc="configureTester" mode="sync"/>
+
+            <call rpc="javaPluginTester" mode="sync"/>
+
+            <call rpc="whileNodeTester" mode="sync"/>
+
+        </block>
+    </method>
+
+    <method rpc="networkCreated" mode="sync">
+        <switch
+            test="length($network.segment[0].provider-physical-network) >= 5 and substr($network.segment[0].provider-physical-network,0,5) == 'dvspg'">
+            <outcome value="true">
+                <block>
+                    <set>
+                        <parameter name="$vlanlist"
+                            value="$network.segment[0].provider-segmentation-id" />
+                    </set>
+                    <for index="i" start="1" end="$network.num-segments">
+                        <set>
+                            <parameter name="$vlanlist"
+                                value="eval($vlanlist+','+$network.segment[i].provider-segmentation-id)" />
+                        </set>
+                    </for>
+
+                </block>
+            </outcome>
+            <outcome value="Other">
+                <return status="success">
+                    <parameter name="error-code" value="200" />
+                </return>
+            </outcome>
+        </switch>
+    </method>
+
+</service-logic>
index 33d7ae6..426960f 100644 (file)
@@ -20,7 +20,8 @@
 ###
 
 org.onap.ccsdk.sli.dbtype = jdbc
-org.onap.ccsdk.sli.jdbc.url = jdbc:mysql://localhost:3306/test
-org.onap.ccsdk.sli.jdbc.database = test
+org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:sdnctl;create=true
+org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver
+org.onap.ccsdk.sli.jdbc.database = sdnctl
 org.onap.ccsdk.sli.jdbc.user = test
-org.onap.ccsdk.sli.jdbc.password = test123
+org.onap.ccsdk.sli.jdbc.password = test
index a63758f..2704de8 100755 (executable)
@@ -30,6 +30,7 @@
                        <xsd:element ref="call" />\r
                        <xsd:element ref="notify" />\r
                        <xsd:element ref="break" />\r
+                       <xsd:element ref="while" />\r
                </xsd:choice>\r
        </xsd:group>\r
 \r
                <xsd:complexType />\r
        </xsd:element>\r
 \r
+       <xsd:element name="while">\r
+               <xsd:complexType>\r
+                       <xsd:sequence>\r
+                               <xsd:group ref="node" minOccurs="0" maxOccurs="unbounded" />\r
+                       </xsd:sequence>\r
+                       <xsd:attribute name="test" use="required" type="xsd:string" />\r
+                       <xsd:attribute name="do" use="optional" type="xsd:boolean" />\r
+               </xsd:complexType>\r
+       </xsd:element>\r
+\r
 </xsd:schema>\r
index 4a90ae0..1b21b00 100755 (executable)
@@ -1,44 +1,40 @@
 <?xml version="1.0"?>
-<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>
+<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>
 
-   <parent>
+    <parent>
         <groupId>org.onap.ccsdk.parent</groupId>
         <artifactId>binding-parent</artifactId>
         <version>1.0.1-SNAPSHOT</version>
-        <relativePath/>
+        <relativePath />
     </parent>
 
-   <groupId>org.onap.ccsdk.sli.core</groupId>
-   <artifactId>sli-provider</artifactId>
-   <version>0.2.1-SNAPSHOT</version>
-   <packaging>bundle</packaging>
+    <groupId>org.onap.ccsdk.sli.core</groupId>
+    <artifactId>sli-provider</artifactId>
+    <version>0.2.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
 
-   <name>ccsdk-sli-core :: sli :: ${project.artifactId}</name>
-   <description>SLI Provider is the OSGi bundle that exposes the service logic interpreter as a service.</description>
+    <name>ccsdk-sli-core :: sli :: ${project.artifactId}</name>
+    <description>SLI Provider is the OSGi bundle that exposes the service logic interpreter as a service.</description>
 
-   <properties>
+    <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
 
-   <dependencyManagement>
-      <dependencies>
-          <dependency>
-              <groupId>org.opendaylight.controller</groupId>
-              <artifactId>mdsal-artifacts</artifactId>
-              <version>1.6.1</version>
-              <type>pom</type>
-              <scope>import</scope>
-          </dependency>
-      </dependencies>
-  </dependencyManagement>
-   <dependencies>
-        <dependency>
-            <groupId>ch.vorburger.mariaDB4j</groupId>
-            <artifactId>mariaDB4j</artifactId>
-            <version>2.2.3</version>
-            <scope>test</scope>
-        </dependency>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.opendaylight.controller</groupId>
+                <artifactId>mdsal-artifacts</artifactId>
+                <version>1.6.1</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <dependencies>
+
         <dependency>
             <groupId>org.onap.ccsdk.sli.core</groupId>
             <artifactId>sli-model</artifactId>
             <artifactId>slf4j-api</artifactId>
             <version>${slf4j.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>jcl-over-slf4j</artifactId>
-            <version>${slf4j.version}</version>
-        </dependency>
         <dependency>
             <groupId>commons-lang</groupId>
             <artifactId>commons-lang</artifactId>
         </dependency>
 
 
-    <dependency>
-      <groupId>org.opendaylight.controller</groupId>
-      <artifactId>sal-binding-api</artifactId>
-    </dependency>
-
-    <!-- Testing Dependencies -->
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-api</artifactId>
+        </dependency>
 
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <scope>test</scope>
-    </dependency>
+        <!-- Testing Dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
 
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derby</artifactId>
+            <version>10.11.1.1</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
index 4c112ab..0a8bf71 100644 (file)
@@ -24,8 +24,7 @@ package org.onap.ccsdk.sli.core.sli.provider;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
-import ch.vorburger.mariadb4j.DB;
-import ch.vorburger.mariadb4j.DBConfigurationBuilder;
+
 import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -40,6 +39,7 @@ import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.onap.ccsdk.sli.core.dblib.DBResourceManager;
 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
 import org.onap.ccsdk.sli.core.sli.SvcLogicGraph;
 import org.onap.ccsdk.sli.core.sli.SvcLogicParser;
@@ -74,6 +74,7 @@ public class ITCaseSvcLogicGraphExecutor {
             put("set", new SetNodeExecutor());
             put("switch", new SwitchNodeExecutor());
             put("update", new UpdateNodeExecutor());
+            put("while", new WhileNodeExecutor());
 
         }
     };
@@ -88,16 +89,6 @@ public class ITCaseSvcLogicGraphExecutor {
         Properties svcprops = new Properties();
         svcprops.load(propStr);
 
-        // Start MariaDB4j database
-        DBConfigurationBuilder config = DBConfigurationBuilder.newBuilder();
-        config.setPort(0); // 0 => autom. detect free port
-        DB db = DB.newEmbeddedDB(config.build());
-        db.start();
-
-        // Override jdbc URL and database name
-        svcprops.setProperty("org.onap.ccsdk.sli.jdbc.database", "test");
-        svcprops.setProperty("org.onap.ccsdk.sli.jdbc.url", config.getURL("test"));
-
         SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(svcprops);
 
         assertNotNull(store);
@@ -144,18 +135,9 @@ public class ITCaseSvcLogicGraphExecutor {
             Properties svcprops = new Properties();
             svcprops.load(propStr);
 
-            // Start MariaDB4j database
-            DBConfigurationBuilder config = DBConfigurationBuilder.newBuilder();
-            config.setPort(0); // 0 => autom. detect free port
-            DB db = DB.newEmbeddedDB(config.build());
-            db.start();
-
-            // Override jdbc URL and database name
-            svcprops.setProperty("org.onap.ccsdk.sli.jdbc.database", "test");
-            svcprops.setProperty("org.onap.ccsdk.sli.jdbc.url", config.getURL("test"));
-
             SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(svcprops);
 
+
             assertNotNull(store);
 
 
@@ -214,10 +196,13 @@ public class ITCaseSvcLogicGraphExecutor {
                         fail("Could not resolve test case file " + testCaseFile);
                     }
 
+
                     LinkedList<SvcLogicGraph> graphs = parser.parse(testCaseUrl.getPath());
 
                     assertNotNull(graphs);
 
+                    // Load grqphs into db to support call node
+                    parser.load(testCaseUrl.getPath(), store);
                     for (SvcLogicGraph graph : graphs) {
                         if (graph.getRpc().equals(testCaseMethod)) {
                             Properties props = ctx.toProperties();
index e4e6020..5468c8d 100755 (executable)
@@ -1,6 +1,8 @@
 l3sdn_logic_v10.xml:switchTester:test-value=""
 l3sdn_logic_v10.xml:switchTester:test-value="hi"
 l3sdn_logic_v10.xml:forRecordTester
+l3sdn_logic_v10.xml:whileNodeTester
 l3sdn_logic_v10.xml:resourceTester
 l3sdn_logic_v10.xml:configureTester
-l3sdn_logic_v10.xml:javaPluginTester
\ No newline at end of file
+l3sdn_logic_v10.xml:javaPluginTester
+l3sdn_logic_v10.xml:allNodesTester
\ No newline at end of file
index 1386df1..cbb5db1 100644 (file)
         </for>
     </method>
 
+    <method rpc="whileNodeTester" mode="sync">
+        <block>
+            <set>
+                <parameter name="counter" value="0" />
+
+            </set>
+            <while test="`$counter &lt; 10`">
+                <set>
+                    <parameter name="counter" value="`$counter + 1`" />
+                </set>
+
+                <switch test="`$counter > 6`">
+                    <outcome value="true">
+                        <break />
+                    </outcome>
+                </switch>
+            </while>
+        </block>
+
+    </method>
+
     <method rpc="resourceTester" mode="sync">
         <block>
             <set>
 
             <call rpc="javaPluginTester" mode="sync"/>
 
+            <call rpc="whileNodeTester" mode="sync"/>
+
         </block>
     </method>
 
index 49d39ab..426960f 100644 (file)
@@ -19,7 +19,9 @@
 # ============LICENSE_END=========================================================
 ###
 
-org.onap.ccsdk.sli.dbtype = dblib
+org.onap.ccsdk.sli.dbtype = jdbc
 org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:sdnctl;create=true
 org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver
 org.onap.ccsdk.sli.jdbc.database = sdnctl
+org.onap.ccsdk.sli.jdbc.user = test
+org.onap.ccsdk.sli.jdbc.password = test
index cb4dfc8..5650416 100755 (executable)
@@ -1,73 +1,94 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<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>
+<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>
 
-       <parent>
-               <groupId>org.onap.ccsdk.parent</groupId>
-               <artifactId>binding-parent</artifactId>
-               <version>1.0.1-SNAPSHOT</version>
-               <relativePath/>
-       </parent>
+    <parent>
+        <groupId>org.onap.ccsdk.parent</groupId>
+        <artifactId>binding-parent</artifactId>
+        <version>1.0.1-SNAPSHOT</version>
+        <relativePath />
+    </parent>
 
-       <groupId>org.onap.ccsdk.sli.core</groupId>
-       <artifactId>sliapi-provider</artifactId>
-       <version>0.2.1-SNAPSHOT</version>
-       <packaging>bundle</packaging>
+    <groupId>org.onap.ccsdk.sli.core</groupId>
+    <artifactId>sliapi-provider</artifactId>
+    <version>0.2.1-SNAPSHOT</version>
+    <packaging>bundle</packaging>
 
-       <name>ccsdk-sli-core :: sliapi :: ${project.artifactId}</name>
+    <name>ccsdk-sli-core :: sliapi :: ${project.artifactId}</name>
 
-       <dependencyManagement>
-               <dependencies>
-                       <dependency>
-                               <groupId>org.opendaylight.controller</groupId>
-                               <artifactId>mdsal-artifacts</artifactId>
-                               <version>1.6.1</version>
-                               <type>pom</type>
-                               <scope>import</scope>
-                       </dependency>
-               </dependencies>
-       </dependencyManagement>
-       <dependencies>
-               <dependency>
-                       <groupId>org.onap.ccsdk.sli.core</groupId>
-                       <artifactId>sliapi-model</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.opendaylight.controller</groupId>
+                <artifactId>mdsal-artifacts</artifactId>
+                <version>1.6.1</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <dependencies>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.core</groupId>
+            <artifactId>sliapi-model</artifactId>
+            <version>${project.version}</version>
+        </dependency>
 
 
-               <dependency>
-                       <groupId>org.opendaylight.controller</groupId>
-                       <artifactId>sal-binding-config</artifactId>
-               </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-config</artifactId>
+        </dependency>
 
-               <dependency>
-                       <groupId>org.opendaylight.controller</groupId>
-                       <artifactId>sal-binding-api</artifactId>
-               </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-api</artifactId>
+        </dependency>
 
-               <dependency>
-                       <groupId>org.opendaylight.controller</groupId>
-                       <artifactId>sal-common-util</artifactId>
-               </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-common-util</artifactId>
+        </dependency>
 
 
-               <dependency>
-                       <groupId>org.onap.ccsdk.sli.core</groupId>
-                       <artifactId>sli-common</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.onap.ccsdk.sli.core</groupId>
-                       <artifactId>sli-provider</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.opendaylight.controller</groupId>
-                       <artifactId>sal-core-api</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.opendaylight.yangtools</groupId>
-                       <artifactId>yang-data-impl</artifactId>
-               </dependency>
-       </dependencies>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.core</groupId>
+            <artifactId>sli-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onap.ccsdk.sli.core</groupId>
+            <artifactId>sli-provider</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-core-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>yang-data-impl</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>${junit.version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derby</artifactId>
+            <version>10.11.1.1</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
 </project>
index 3ff2f52..e9a2b8e 100644 (file)
@@ -114,14 +114,16 @@ import com.google.common.util.concurrent.Futures;
  */
 public class sliapiProvider implements AutoCloseable, SLIAPIService{
 
-    private final Logger LOG = LoggerFactory.getLogger( sliapiProvider.class );
-    private final String appName = "slitester";
+    private static final Logger LOG = LoggerFactory.getLogger( sliapiProvider.class );
+    private static final String appName = "slitester";
 
     protected DataBroker dataBroker;
     protected DOMDataBroker domDataBroker;
     protected NotificationPublishService notificationService;
     protected RpcProviderRegistry rpcRegistry;
 
+    private SvcLogicService svcLogic;
+
        protected BindingAwareBroker.RpcRegistration<SLIAPIService> rpcRegistration;
 
        private static String SLIAPI_NAMESPACE = "org:onap:ccsdk:sli:core:sliapi";
@@ -142,15 +144,23 @@ public class sliapiProvider implements AutoCloseable, SLIAPIService{
                RESULTS_QNAME = QName.create(TEST_RESULT_QNAME, "results");
        }
 
+    public sliapiProvider(
+            DataBroker dataBroker,
+            NotificationPublishService notificationPublishService,
+            RpcProviderRegistry rpcProviderRegistry) {
+        this(dataBroker, notificationPublishService, rpcProviderRegistry, findSvcLogicService());
+    }
 
     public sliapiProvider(
                        DataBroker dataBroker,
                        NotificationPublishService notificationPublishService,
-                       RpcProviderRegistry rpcProviderRegistry) {
+                       RpcProviderRegistry rpcProviderRegistry,
+                       SvcLogicService svcLogic) {
         this.LOG.info( "Creating provider for " + appName );
         this.dataBroker = dataBroker;
         this.notificationService = notificationPublishService;
         this.rpcRegistry = rpcProviderRegistry;
+        this.svcLogic = svcLogic;
         initialize();
     }
 
@@ -357,6 +367,13 @@ public class sliapiProvider implements AutoCloseable, SLIAPIService{
 
 
        private SvcLogicService getSvcLogicService() {
+           if (svcLogic == null) {
+               svcLogic = findSvcLogicService();
+           }
+
+           return(svcLogic);
+       }
+       private static SvcLogicService findSvcLogicService() {
                BundleContext bctx = FrameworkUtil.getBundle(SvcLogicService.class).getBundleContext();
 
                SvcLogicService svcLogic = null;
diff --git a/sliapi/provider/src/test/java/org/onap/ccsdk/sli/core/sliapi/TestSliapiProvider.java b/sliapi/provider/src/test/java/org/onap/ccsdk/sli/core/sliapi/TestSliapiProvider.java
new file mode 100644 (file)
index 0000000..38cbd40
--- /dev/null
@@ -0,0 +1,171 @@
+/**
+ *
+ */
+package org.onap.ccsdk.sli.core.sliapi;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.*;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.ccsdk.sli.core.sli.SvcLogicParser;
+import org.onap.ccsdk.sli.core.sli.SvcLogicStore;
+import org.onap.ccsdk.sli.core.sli.SvcLogicStoreFactory;
+import org.onap.ccsdk.sli.core.sli.provider.BlockNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.CallNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.ConfigureNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.DeleteNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.ExecuteNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.ExistsNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.ForNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.GetResourceNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.IsAvailableNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.NotifyNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.RecordNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.ReleaseNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.ReserveNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.ReturnNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.SaveNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.SetNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicPropertiesProviderImpl;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicServiceImpl;
+import org.onap.ccsdk.sli.core.sli.provider.SwitchNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.UpdateNodeExecutor;
+import org.onap.ccsdk.sli.core.sli.provider.WhileNodeExecutor;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInput;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInputBuilder;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.SLIAPIService;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.execute.graph.input.SliParameter;
+import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.execute.graph.input.SliParameterBuilder;
+
+/**
+ * @author dt5972
+ *
+ */
+public class TestSliapiProvider {
+
+    private sliapiProvider provider;
+
+    private static final String HEALTHCHECK_DG = "sli_healthcheck.xml";
+
+    private static final Map<String, SvcLogicNodeExecutor> BUILTIN_NODES = new HashMap<String, SvcLogicNodeExecutor>() {
+        {
+            put("block", new BlockNodeExecutor());
+            put("call", new CallNodeExecutor());
+            put("configure", new ConfigureNodeExecutor());
+            put("delete", new DeleteNodeExecutor());
+            put("execute", new ExecuteNodeExecutor());
+            put("exists", new ExistsNodeExecutor());
+            put("for", new ForNodeExecutor());
+            put("get-resource", new GetResourceNodeExecutor());
+            put("is-available", new IsAvailableNodeExecutor());
+            put("notify", new NotifyNodeExecutor());
+            put("record", new RecordNodeExecutor());
+            put("release", new ReleaseNodeExecutor());
+            put("reserve", new ReserveNodeExecutor());
+            put("return", new ReturnNodeExecutor());
+            put("save", new SaveNodeExecutor());
+            put("set", new SetNodeExecutor());
+            put("switch", new SwitchNodeExecutor());
+            put("update", new UpdateNodeExecutor());
+            put("while", new WhileNodeExecutor());
+
+        }
+    };
+
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        DataBroker dataBroker = mock(DataBroker.class);
+        NotificationPublishService notifyService = mock(NotificationPublishService.class);
+        RpcProviderRegistry rpcRegistry = mock(RpcProviderRegistry.class);
+        BindingAwareBroker.RpcRegistration<SLIAPIService> rpcRegistration = (BindingAwareBroker.RpcRegistration<SLIAPIService>) mock(BindingAwareBroker.RpcRegistration.class);
+        when(rpcRegistry.addRpcImplementation(any(Class.class), any(SLIAPIService.class))).thenReturn(rpcRegistration);
+
+
+        // Load svclogic.properties and get a SvcLogicStore
+        InputStream propStr = TestSliapiProvider.class.getResourceAsStream("/svclogic.properties");
+        Properties svcprops = new Properties();
+        svcprops.load(propStr);
+
+        SvcLogicStore store = SvcLogicStoreFactory.getSvcLogicStore(svcprops);
+
+        assertNotNull(store);
+
+        // Load the DG for the healthcheck api
+        URL testCaseUrl = TestSliapiProvider.class.getClassLoader().getResource(HEALTHCHECK_DG);
+        if (testCaseUrl == null) {
+            fail("Cannot find "+HEALTHCHECK_DG);
+        }
+        SvcLogicParser.load(testCaseUrl.getPath(), store);
+        SvcLogicParser.activate("sli", "healthcheck", "1.0.0", "sync", store);
+
+        // Create a ServiceLogicService and initialize it
+        SvcLogicServiceImpl svc = new SvcLogicServiceImpl(new SvcLogicPropertiesProviderImpl());
+        for (String nodeType : BUILTIN_NODES.keySet()) {
+            svc.registerExecutor(nodeType, BUILTIN_NODES.get(nodeType));
+        }
+
+        // Finally ready to create sliapiProvider
+        provider = new sliapiProvider(dataBroker, notifyService, rpcRegistry, svc);
+        provider.setDataBroker(dataBroker);
+        provider.setNotificationService(notifyService);
+        provider.setRpcRegistry(rpcRegistry);
+    }
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @After
+    public void tearDown() throws Exception {
+        provider.close();
+    }
+
+    /**
+     * Test method for {@link org.onap.ccsdk.sli.core.sliapi.sliapiProvider#executeGraph(org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.ExecuteGraphInput)}.
+     */
+    @Test
+    public void testExecuteGraph() {
+        ExecuteGraphInputBuilder inputBuilder = new ExecuteGraphInputBuilder();
+
+        inputBuilder.setMode(ExecuteGraphInput.Mode.Sync);
+        inputBuilder.setModuleName("sli");
+        inputBuilder.setRpcName("healthcheck");
+        List<SliParameter> pList = new LinkedList<>();
+        SliParameterBuilder pBuilder = new SliParameterBuilder();
+        pBuilder.setParameterName("int-parameter");
+        pBuilder.setIntValue(1);
+        pList.add(pBuilder.build());
+        inputBuilder.setSliParameter(pList);
+
+
+
+
+        provider.executeGraph(inputBuilder.build());
+    }
+
+    /**
+     * Test method for {@link org.onap.ccsdk.sli.core.sliapi.sliapiProvider#healthcheck()}.
+     */
+    @Test
+    public void testHealthcheck() {
+        provider.healthcheck();
+    }
+
+}
diff --git a/sliapi/provider/src/test/resources/sli_healthcheck.xml b/sliapi/provider/src/test/resources/sli_healthcheck.xml
new file mode 100644 (file)
index 0000000..d512f54
--- /dev/null
@@ -0,0 +1,27 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 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=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd" module='sli' version='1.0.0'><method rpc='healthcheck' mode='sync'>
+<set>
+<parameter name='error-code' value='200' />
+<parameter name='error-message' value='SDN-C is healthy'/>
+<parameter name='ack-final' value='Y'/>
+</set></method></service-logic>
@@ -19,7 +19,9 @@
 # ============LICENSE_END=========================================================
 ###
 
-org.onap.ccsdk.sli.dbtype = dblib
+org.onap.ccsdk.sli.dbtype = jdbc
 org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:sdnctl;create=true
 org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver
 org.onap.ccsdk.sli.jdbc.database = sdnctl
+org.onap.ccsdk.sli.jdbc.user = test
+org.onap.ccsdk.sli.jdbc.password = test