add robotframework to integration tests 76/107876/12
authorJulienBe <julien.bertozzi@intl.att.com>
Thu, 14 May 2020 15:40:52 +0000 (17:40 +0200)
committerJulienBe <julien.bertozzi@intl.att.com>
Fri, 3 Jul 2020 12:40:56 +0000 (14:40 +0200)
Issue-ID: CLAMP-844
Signed-off-by: JulienBe <julien.bertozzi@intl.att.com>
Change-Id: Ie5c40477f42fcf26f5fef6c1742e34a2eee7f73d

pom.xml
src/test/java/org/onap/clamp/clds/it/RobotItCase.java [new file with mode: 0644]
src/test/resources/robotframework/Dockerfile [new file with mode: 0644]
src/test/resources/robotframework/requirements.txt [new file with mode: 0644]
src/test/resources/robotframework/robotframework-test.properties [new file with mode: 0644]
src/test/resources/robotframework/tests/01_healthcheck.robot [new file with mode: 0644]

diff --git a/pom.xml b/pom.xml
index e8b4ba0..245bae0 100644 (file)
--- a/pom.xml
+++ b/pom.xml
                        <version>2.0.4</version>
                        <scope>test</scope>
                </dependency>
+               <dependency>
+                       <groupId>com.github.docker-java</groupId>
+                       <artifactId>docker-java-core</artifactId>
+                       <version>3.2.1</version>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>com.github.docker-java</groupId>
+                       <artifactId>docker-java</artifactId>
+                       <version>3.2.1</version>
+                       <scope>test</scope>
+               </dependency>
        </dependencies>
 
        <build>
                                                                <portName>docker.mariadb.port.host</portName>
                                                                <portName>docker.http-cache.port.host</portName>
                                                                <portName>clamp.it.tests.http-redirected</portName>
+                                                               <portName>clamp.it.tests.robotframework.http</portName>
                                                                <portName>clamp.it.tests.https</portName>
                                                                <portName>clamp.it.tests.http</portName>
                                                        </portNames>
                                                                <include>**/*ItCase.java</include>
                                                        </includes>
                                                        <forkCount>1C</forkCount>
-                                                       <reuseForks>true</reuseForks>
+                                                       <reuseForks>false</reuseForks>
                                                        <useSystemClassLoader>false</useSystemClassLoader>
                                                        <argLine>${failsafeArgLine}</argLine>
                                                </configuration>
diff --git a/src/test/java/org/onap/clamp/clds/it/RobotItCase.java b/src/test/java/org/onap/clamp/clds/it/RobotItCase.java
new file mode 100644 (file)
index 0000000..b386d9b
--- /dev/null
@@ -0,0 +1,114 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights
+ *                             reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ *
+ */
+
+package org.onap.clamp.clds.it;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.command.BuildImageResultCallback;
+import com.github.dockerjava.api.command.CreateContainerResponse;
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.github.dockerjava.api.command.LogContainerCmd;
+import com.github.dockerjava.api.model.AccessMode;
+import com.github.dockerjava.api.model.Bind;
+import com.github.dockerjava.api.model.BuildResponseItem;
+import com.github.dockerjava.api.model.Frame;
+import com.github.dockerjava.api.model.Volume;
+import com.github.dockerjava.core.DockerClientBuilder;
+import com.github.dockerjava.core.command.LogContainerResultCallback;
+import com.github.dockerjava.netty.NettyDockerCmdExecFactory;
+import java.io.File;
+import java.util.Objects;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
+@TestPropertySource(locations = "classpath:robotframework/robotframework-test.properties")
+public class RobotItCase {
+
+    @Value("${server.port}")
+    private String httpPort;
+    private static final int TIMEOUT_S = 150;
+    protected static final EELFLogger logger = EELFManager.getInstance().getLogger(RobotItCase.class);
+
+    @Test
+    public void robotTests() throws Exception {
+        File robotFolder = new File(getClass().getClassLoader().getResource("robotframework").getFile());
+        Volume testsVolume = new Volume("/opt/robotframework/tests");
+        DockerClient client = DockerClientBuilder
+                .getInstance()
+                .withDockerCmdExecFactory(new NettyDockerCmdExecFactory())
+                .build();
+
+
+        BuildImageResultCallback callback = new BuildImageResultCallback() {
+            @Override
+            public void onNext(BuildResponseItem item) {
+                System.out.println("XXX ITEM " + item);
+                super.onNext(item);
+            }
+        };
+
+        String imageId = client.buildImageCmd(robotFolder).exec(callback).awaitImageId();
+        CreateContainerResponse createContainerResponse = client.createContainerCmd(imageId)
+                .withVolumes(testsVolume)
+                .withBinds(
+                        new Bind(robotFolder.getAbsolutePath() + "/tests/", testsVolume, AccessMode.rw))
+                .withEnv("CLAMP_PORT=" + httpPort)
+                .withStopTimeout(TIMEOUT_S)
+                .withNetworkMode("host")
+                .exec();
+        String id = createContainerResponse.getId();
+        client.startContainerCmd(id).exec();
+        InspectContainerResponse exec;
+
+        int tries = 0;
+        do {
+            Thread.sleep(1000);
+            exec = client.inspectContainerCmd(id).exec();
+            tries++;
+        } while (exec.getState().getRunning() && tries < TIMEOUT_S);
+        Assert.assertEquals(exec.getState().getError(), 0L,
+                Objects.requireNonNull(exec.getState().getExitCodeLong()).longValue());
+        LogContainerCmd logContainerCmd = client.logContainerCmd(id);
+        logContainerCmd.withStdOut(true).withStdErr(true);
+        try {
+            logContainerCmd.exec(new LogContainerResultCallback() {
+                @Override
+                public void onNext(Frame item) {
+                    logger.info(item.toString());
+                }
+            }).awaitCompletion();
+        } catch (InterruptedException e) {
+            throw new Exception("Failed to retrieve logs of container " + id, e);
+        }
+        client.stopContainerCmd(id);
+    }
+}
diff --git a/src/test/resources/robotframework/Dockerfile b/src/test/resources/robotframework/Dockerfile
new file mode 100644 (file)
index 0000000..4ae0820
--- /dev/null
@@ -0,0 +1,9 @@
+#FROM robotframework/rfdocker
+#
+#### Uncomment following two lines if having external test libraries:
+##COPY --chown=robot:robot requirements.txt .
+#RUN pip3 install --no-cache-dir -r requirements.txt
+#COPY *.robot /home/robot/atest
+FROM  ppodgorsek/robot-framework:3.0.3
+COPY requirements.txt .
+RUN pip install -r requirements.txt
\ No newline at end of file
diff --git a/src/test/resources/robotframework/requirements.txt b/src/test/resources/robotframework/requirements.txt
new file mode 100644 (file)
index 0000000..2ae8f45
--- /dev/null
@@ -0,0 +1,6 @@
+certifi
+chardet
+idna
+requests
+urllib3
+robotframework-extendedrequestslibrary
diff --git a/src/test/resources/robotframework/robotframework-test.properties b/src/test/resources/robotframework/robotframework-test.properties
new file mode 100644 (file)
index 0000000..4ec6573
--- /dev/null
@@ -0,0 +1,173 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017-2018 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============================================
+# ===================================================================
+#
+###
+
+### Set the port for HTTP or HTTPS protocol (Controlled by Spring framework, only one at a time).
+### (See below for the parameter 'server.http.port' if you want to have both enabled)
+### To have only HTTP, keep the lines server.ssl.* commented
+### To have only HTTPS enabled, uncomment the server.ssl.* lines and specify a right keystore location
+server.port=${clamp.it.tests.robotframework.http}
+### Settings for HTTPS (this automatically enables the HTTPS on the port 'server.port')
+#server.ssl.key-store=file:/tmp/mykey.jks
+#server.ssl.key-store-password=pass
+#server.ssl.key-password=pass
+
+### In order to be user friendly when HTTPS is enabled,
+### you can add another HTTP port that will be automatically redirected to HTTPS
+### by enabling this parameter (server.http.port) and set it to another port (80 or 8080, 8090, etc ...)
+#server.http-to-https-redirection.port=8090
+
+### HTTP Example:
+###--------------
+### server.port=8080
+
+### HTTPS Example:
+### --------------
+### server.port=8443
+### server.ssl.key-store=file:/tmp/mykey.jks
+### server.ssl.key-store-password=mypass
+### server.ssl.key-password=mypass
+
+### HTTP (Redirected to HTTPS) and HTTPS Example:
+### --------------------------------------------
+### server.port=8443           <-- The HTTPS port
+### server.ssl.key-store=file:/tmp/mykey.jks
+### server.ssl.key-store-password=mypass
+### server.ssl.key-password=mypass
+### server.http-to-https-redirection.port=8090  <-- The HTTP port
+
+server.servlet.context-path=/
+#Modified engine-rest applicationpath
+spring.profiles.active=clamp-default,clamp-default-user
+spring.http.converters.preferred-json-mapper=gson
+
+#The max number of active threads in this pool
+server.tomcat.max-threads=200
+#The minimum number of threads always kept alive
+server.tomcat.min-Spare-Threads=25
+#The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less or equal to minSpareThreads
+server.tomcat.max-idle-time=60000
+
+#Servlet context parameters
+server.context_parameters.p-name=value #context parameter with p-name as key and value as value.
+
+camel.springboot.consumer-template-cache-size=1000
+camel.springboot.producer-template-cache-size=1000
+# JMX enabled to have Camel Swagger runtime working
+camel.springboot.jmx-enabled=true
+camel.defaultthreadpool.poolsize=10
+camel.defaultthreadpool.maxpoolsize=20
+camel.defaultthreadpool.maxqueuesize=1000
+camel.defaultthreadpool.keepaliveTime=60
+camel.defaultthreadpool.rejectpolicy=CallerRuns
+#camel.springboot.xmlRoutes = false
+camel.springboot.xmlRoutes=classpath:/clds/camel/routes/*.xml
+camel.springboot.xmlRests=classpath:/clds/camel/rest/*.xml
+#camel.springboot.typeConversion = false
+
+#clds datasource connection details
+spring.datasource.driverClassName=org.mariadb.jdbc.Driver
+spring.datasource.url=jdbc:mariadb:sequential://localhost:3306,localhost:${docker.mariadb.port.host}/cldsdb4?autoReconnect=true&connectTimeout=10000&socketTimeout=10000&retriesAllDown=3
+spring.datasource.username=clds
+spring.datasource.password=sidnnd83K
+spring.datasource.validationQuery=SELECT 1
+spring.datasource.validationQueryTimeout=20000
+spring.datasource.validationInterval=30000
+spring.datasource.testWhileIdle = true
+spring.datasource.minIdle = 0
+spring.datasource.initialSize=0
+# Automatically test whether a connection provided is good or not
+spring.datasource.testOnBorrow=true
+spring.datasource.ignoreExceptionOnPreLoad=true
+
+spring.jpa.properties.javax.persistence.schema-generation.database.action=none
+#spring.jpa.properties.javax.persistence.schema-generation.create-source=metadata
+#spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
+#spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=create.sql
+# disable Hibernate DDL generation because the schema will be generated from a sql script
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
+spring.jpa.properties.hibernate.ddl-auto=validate
+spring.jpa.properties.hibernate.hbm2ddl.delimiter=;
+spring.jpa.properties.hibernate.format_sql=true
+spring.jpa.properties.hibernate.use-new-id-generator-mappings=true
+
+# Whether to enable logging of SQL statements.
+#spring.jpa.show-sql=true
+
+#Async Executor default Parameters
+async.core.pool.size=10
+async.max.pool.size=20
+async.queue.capacity=500
+
+#For EELF logback file
+#com.att.eelf.logging.path=
+clamp.config.logback.filename=logback-default.xml
+#The log folder that will be used in logback.xml file
+clamp.config.log.path=log
+clamp.config.files.systemProperties=classpath:/system.properties
+clamp.config.files.cldsUsers=classpath:/clds/clds-users.json
+clamp.config.files.globalProperties=classpath:/clds/templates/globalProperties.json
+clamp.config.files.sdcController=classpath:/clds/sdc-controllers-config.json
+
+#
+# Configuration Settings for Policy Engine Components
+clamp.config.policy.api.url=http4://localhost:${docker.http-cache.port.host}
+clamp.config.policy.api.userName=healthcheck
+clamp.config.policy.api.password=zb!XztG34
+clamp.config.policy.pap.url=http4://localhost:${docker.http-cache.port.host}
+clamp.config.policy.pap.userName=healthcheck
+clamp.config.policy.pap.password=zb!XztG34
+
+# Sdc service properties
+#
+clamp.config.sdc.csarFolder = ${project.build.directory}/sdc-tests
+
+#DCAE Inventory Url Properties
+clamp.config.dcae.inventory.url=http4://localhost:${docker.http-cache.port.host}
+clamp.config.dcae.intentory.retry.interval=100
+clamp.config.dcae.intentory.retry.limit=1
+
+#DCAE Deployment Url Properties
+clamp.config.dcae.deployment.url=http4://localhost:${docker.http-cache.port.host}
+clamp.config.dcae.deployment.userName=test
+clamp.config.dcae.deployment.password=test
+
+#Define user permission related parameters, the permission type can be changed but MUST be redefined in clds-users.properties in that case !
+clamp.config.security.permission.type.cl=permission-type-cl
+clamp.config.security.permission.type.cl.manage=permission-type-cl-manage
+clamp.config.security.permission.type.cl.event=permission-type-cl-event
+clamp.config.security.permission.type.filter.vf=permission-type-filter-vf
+clamp.config.security.permission.type.template=permission-type-template
+clamp.config.security.permission.type.tosca=permission-type-tosca
+#This one indicates the type of instances (dev|prod|perf...), this must be set accordingly in clds-users.properties
+clamp.config.security.permission.instance=dev
+clamp.config.security.authentication.class=org.onap.aaf.cadi.principal.X509Principal
+
+# Configuration settings for CDS
+clamp.config.cds.url=http4://localhost:${docker.http-cache.port.host}
+clamp.config.cds.userName=ccsdkapps
+clamp.config.cds.password=ccsdkapps
+
+## Tosca converter
+clamp.config.tosca.converter.json.schema.templates=classpath:/clds/tosca-converter/templates.json
+clamp.config.tosca.converter.default.datatypes=classpath:/clds/tosca-converter/default-tosca-types.yaml
+clamp.config.tosca.converter.dictionary.support.enabled=true
\ No newline at end of file
diff --git a/src/test/resources/robotframework/tests/01_healthcheck.robot b/src/test/resources/robotframework/tests/01_healthcheck.robot
new file mode 100644 (file)
index 0000000..f192667
--- /dev/null
@@ -0,0 +1,19 @@
+*** Settings ***
+Library     Collections
+Library     RequestsLibrary
+Library     OperatingSystem
+Library     json
+Library     OperatingSystem
+*** Variables ***
+${login}                     admin
+${passw}                     password
+*** Keywords ***
+Create the sessions
+*** Test Cases ***
+Get Requests health check ok
+    ${port} =    Get Environment Variable   CLAMP_PORT
+    ${auth}=    Create List     ${login}    ${passw}
+    Create Session   clamp  http://localhost:${port}   auth=${auth}   disable_warnings=1
+    Set Global Variable     ${clamp_session}      clamp
+    ${resp}=    Get Request    ${clamp_session}   /restservices/clds/v1/healthcheck
+    Should Be Equal As Strings  ${resp.status_code}     200
\ No newline at end of file