Merge "Add Portal-SDK testcases"
diff --git a/test/csit/plans/portal-sdk/testsuite/.env b/test/csit/plans/portal-sdk/testsuite/.env
new file mode 100644
index 0000000..1e882a0
--- /dev/null
+++ b/test/csit/plans/portal-sdk/testsuite/.env
@@ -0,0 +1,22 @@
+# Environment settings
+# used by docker-compose AND by other shell scripts
+# Host directory with config files
+
+LOGS_DIR=./logs
+PROPS_DIR=./properties
+
+
+# Directory within containers
+WEBAPPS_DIR=/opt/apache-tomcat-8.0.37/webapps
+
+# Following are ALSO used in demo/boot/portal_vm_init.sh
+EP_IMG_NAME=onap/portal-apps
+DB_IMG_NAME=onap/portal-db
+WMS_IMG_NAME=onap/portal-wms
+CLI_IMG_NAME=onap/cli
+
+# Tag all images with this
+PORTAL_TAG=1.3.0
+DOCKER_IMAGE_VERSION=1.3-STAGING-latest
+CLI_DOCKER_VERSION=1.1-STAGING-latest
+NEXUS_DOCKER_REPO=nexus3.onap.org:10003
diff --git a/test/csit/plans/portal-sdk/testsuite/docker-compose.yml b/test/csit/plans/portal-sdk/testsuite/docker-compose.yml
new file mode 100644
index 0000000..b92766f
--- /dev/null
+++ b/test/csit/plans/portal-sdk/testsuite/docker-compose.yml
@@ -0,0 +1,95 @@
+# docker-compose for ONAP portal containers: database, microservice, portal apps.
+# Relies on .env file in current directory.
+# Works in multiple environments; does not pull from a Nexus registry.
+# Exposes the portal apps docker (but not DB nor WMS dockers) on the host network.
+# Images must be pulled from ONAP Nexus registry after logging in like this:
+# docker login -u USER -p PASS nexus3.onap.org:10001
+
+version: '2.0'
+
+services:
+
+  cli:
+    image: ${CLI_IMG_NAME}:${PORTAL_TAG}
+    environment:
+      CLI_MODE: 'daemon'
+    ports:
+      - 8080:80
+      - 9090:8080
+    logging:
+      driver: json-file
+
+  # Config files may use hostname "portal-db"
+  portal-db:
+    image: ${DB_IMG_NAME}:${PORTAL_TAG}
+    environment:
+      MYSQL_ROOT_PASSWORD: 'Aa123456'
+    expose:
+      - 3306
+    volumes:
+      # Just specify a path and let the Engine create a volume
+      - /var/lib/mysql
+    logging:
+      driver: json-file
+
+  # An environment variable here CAN override the database URL;
+  # instead the value in the config file uses hostname from above
+  portal-wms:
+    image: ${WMS_IMG_NAME}:${PORTAL_TAG}
+    expose:
+      - 8082
+    links:
+      - portal-db
+    depends_on:
+      - portal-db
+    volumes:
+      - ${PROPS_DIR}/ECOMPWIDGETMS/application.properties:/application.properties
+    command:
+      - /wait-for.sh
+      - -t
+      - "420"
+      - portal-db:3306
+      - --
+      - /start-wms-cmd.sh
+    logging:
+      driver: json-file
+
+  # Environment variables here CANNOT override the database URL because
+  # two apps use identical configuration keys with different values
+  portal-apps:
+    image: ${EP_IMG_NAME}:${PORTAL_TAG}
+    expose:
+      - 8989
+    ports:
+      - 8989:8080
+      - 8010:8009
+      - 8006:8005
+    links:
+      - portal-db
+      - portal-wms
+    depends_on:
+      - portal-db
+      - portal-wms
+    volumes:
+      - ${PROPS_DIR}/ECOMPPORTALAPP/system.properties:${WEBAPPS_DIR}/ECOMPPORTAL/WEB-INF/conf/system.properties
+      - ${PROPS_DIR}/ECOMPPORTALAPP/fusion.properties:${WEBAPPS_DIR}/ECOMPPORTAL/WEB-INF/fusion/conf/fusion.properties
+      - ${PROPS_DIR}/ECOMPPORTALAPP/portal.properties:${WEBAPPS_DIR}/ECOMPPORTAL/WEB-INF/classes/portal.properties
+      - ${PROPS_DIR}/ECOMPPORTALAPP/openid-connect.properties:${WEBAPPS_DIR}/ECOMPPORTAL/WEB-INF/classes/openid-connect.properties
+      - ${PROPS_DIR}/ECOMPPORTALAPP/logback.xml:${WEBAPPS_DIR}/ECOMPPORTAL/WEB-INF/classes/logback.xml
+      - ${PROPS_DIR}/ECOMPSDKAPP/fusion.properties:${WEBAPPS_DIR}/ECOMPSDKAPP/WEB-INF/fusion/conf/fusion.properties
+      - ${PROPS_DIR}/ECOMPSDKAPP/system.properties:${WEBAPPS_DIR}/ECOMPSDKAPP/WEB-INF/conf/system.properties
+      - ${PROPS_DIR}/ECOMPSDKAPP/portal.properties:${WEBAPPS_DIR}/ECOMPSDKAPP/WEB-INF/classes/portal.properties
+      - ${PROPS_DIR}/ECOMPDBCAPP/system.properties:${WEBAPPS_DIR}/ECOMPDBCAPP/WEB-INF/conf/system.properties
+      - ${PROPS_DIR}/ECOMPDBCAPP/portal.properties:${WEBAPPS_DIR}/ECOMPDBCAPP/WEB-INF/classes/portal.properties
+      - ${PROPS_DIR}/ECOMPDBCAPP/dbcapp.properties:${WEBAPPS_DIR}/ECOMPDBCAPP/WEB-INF/dbcapp/dbcapp.properties
+      - ${PROPS_DIR}/ECOMPDBCAPP/fusion.properties:${WEBAPPS_DIR}/ECOMPDBCAPP/WEB-INF/fusion/conf/fusion.properties
+      - ${LOGS_DIR}:/opt/apache-tomcat-8.0.37/logs
+    command:
+      - /wait-for.sh
+      - -t
+      - "420"
+      - portal-db:3306
+      - --
+      - /start-apps-cmd.sh
+    logging:
+      driver: json-file
diff --git a/test/csit/plans/portal-sdk/testsuite/setup.sh b/test/csit/plans/portal-sdk/testsuite/setup.sh
new file mode 100644
index 0000000..71d1105
--- /dev/null
+++ b/test/csit/plans/portal-sdk/testsuite/setup.sh
@@ -0,0 +1,166 @@
+#!/bin/bash
+# Starts docker containers for ONAP Portal
+# This version for Amsterdam/R1 of Portal, uses docker-compose.
+# Temporarily maintained in portal/deliveries area;
+# replicated from the ONAP demo/boot area due to release concerns.
+
+# Start Xvfb
+echo -e "Starting Xvfb on display ${DISPLAY} with res ${RES}"
+Xvfb ${DISPLAY} -ac -screen 0 ${RES} +extension RANDR &
+XVFBPID=$!
+# Get pid of this spawned process to make sure we kill the correct process later
+
+#Get current IP of VM
+HOST_IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
+export HOST_IP=${HOST_IP}
+
+if ! ifconfig docker0; then
+if ! ifconfig ens3; then
+echo "Could not determine IP address"
+exit 1
+fi
+export DOCKER_IP_IP=`ifconfig ens3 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+else
+export DOCKER_IP=`ifconfig docker0 | awk -F: '/inet addr/ {gsub(/ .*/,"",$2); print $2}'`
+fi
+echo $DOCKER_IP
+
+
+# Pass any variables required by Robot test suites in ROBOT_VARIABLES
+#ROBOT_VARIABLES="-v MOCK_IP:${MOCK_IP} -v IP:${IP} -v POLICY_IP:${POLICY_IP} -v DOCKER_IP:${DOCKER_IP}"
+#export PORTAL_IP=${PORTAL_IP}
+ROBOT_VARIABLES="-v MOCK_IP:${MOCK_IP} -v IP:${IP}  -v DOCKER_IP:${DOCKER_IP}"
+export DOCKER_IP=${DOCKER_IP}
+
+
+# be verbose
+set -x
+
+# Establish environment variables
+NEXUS_USERNAME=docker
+NEXUS_PASSWD=docker
+NEXUS_DOCKER_REPO=nexus3.onap.org:10003
+
+
+
+CURR="$(pwd)"
+git clone http://gerrit.onap.org/r/portal
+
+# Refresh configuration and scripts
+cd portal
+git pull
+cd deliveries
+rm .env
+rm docker-compose.yml
+cp $CURR/.env .
+cp $CURR/docker-compose.yml .
+#cd  properties_rackspace/ECOMPPORTALAPP
+#rm  system.properties
+#cp  $CURR/system.properties .
+#cd ../..
+# Get image names used below from docker-compose environment file
+source $CURR/.env
+
+# Copy property files to new directory
+mkdir -p $PROPS_DIR
+cp -r properties_rackspace/* $PROPS_DIR
+# Also create logs directory
+mkdir -p $LOGS_DIR
+
+
+# Refresh images
+docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWD $NEXUS_DOCKER_REPO
+docker pull $NEXUS_DOCKER_REPO/${DB_IMG_NAME}:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/${EP_IMG_NAME}:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/${WMS_IMG_NAME}:$DOCKER_IMAGE_VERSION
+docker pull $NEXUS_DOCKER_REPO/$CLI_IMG_NAME:$CLI_DOCKER_VERSION
+
+# Tag them as expected by docker-compose file
+docker tag $NEXUS_DOCKER_REPO/${DB_IMG_NAME}:$DOCKER_IMAGE_VERSION $DB_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/${EP_IMG_NAME}:$DOCKER_IMAGE_VERSION $EP_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/${WMS_IMG_NAME}:$DOCKER_IMAGE_VERSION $WMS_IMG_NAME:$PORTAL_TAG
+docker tag $NEXUS_DOCKER_REPO/$CLI_IMG_NAME:$CLI_DOCKER_VERSION $CLI_IMG_NAME:$PORTAL_TAG
+
+
+# compose is not in /usr/bin
+docker-compose down
+docker-compose up -d
+
+#${HOSTNAME}="portal.api.simpledemo.openecomp.org"
+#echo "$HOST_IP ${HOSTNAME}" >> /etc/hosts
+
+#echo "$HOST_IP portal.api.simpledemo.openecomp.org" >> /etc/hosts
+#sudo sed -i "2i$HOST_IP  portal.api.simpledemo.openecomp.org"   /etc/hosts
+
+#HOST="portal.api.simpledemo.openecomp.org"
+#sudo sed -i "/$HOST/ s/.*/$HOST_IP\t$HOST/g" /etc/hosts
+
+# insert/update hosts entry
+ip_address=$HOST_IP
+host_name="portal.api.simpledemo.openecomp.org"
+# find existing instances in the host file and save the line numbers
+matches_in_hosts="$(grep -n $host_name /etc/hosts | cut -f1 -d:)"
+host_entry="${ip_address} ${host_name}"
+
+echo "$host_entry"
+
+if [ ! -z "$matches_in_hosts" ]
+then
+echo "Updating existing hosts entry."
+# iterate over the line numbers on which matches were found
+while read -r line_number; do
+# replace the text of each line with the desired host entry
+sudo sed -i '' "${line_number}s/.*/${host_entry} /" /etc/hosts
+echo "${line_number}   ${host_entry}"
+done <<< "$matches_in_hosts"
+else
+echo "Adding new hosts entry."
+echo "$host_entry" | sudo tee -a /etc/hosts > /dev/null
+fi
+
+sleep 3m
+
+# WAIT 5 minutes maximum and test every 5 seconds if Portal up using HealthCheck API
+TIME_OUT=500
+INTERVAL=20
+TIME=0
+while [ "$TIME" -lt "$TIME_OUT" ]; do
+  response=$(curl --write-out '%{http_code}' --silent --output /dev/null http://portal.api.simpledemo.openecomp.org:8989/ECOMPPORTAL/portalApi/healthCheck); echo $response
+
+  if [ "$response" == "200" ]; then
+    echo Portal and its database well started in $TIME seconds
+    break;
+  fi
+
+  echo Sleep: $INTERVAL seconds before testing if Portal is up. Total wait time up now is: $TIME seconds. Timeout is: $TIME_OUT seconds
+  sleep $INTERVAL
+  TIME=$(($TIME+$INTERVAL))
+done
+
+if [ "$TIME" -ge "$TIME_OUT" ]; then
+   echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+fi
+
+#sleep 3m
+
+
+
+#if [ "$TIME" -ge "$TIME_OUT" ]; then
+#   echo TIME OUT: Docker containers not started in $TIME_OUT seconds... Could cause problems for tests...
+#fi
+
+
+
+
+
+#Get current IP of VM
+HOST_IP=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')
+export HOST_IP=${HOST_IP}
+
+docker logs deliveries_portal-db_1
+docker logs deliveries_portal-apps_1
+docker logs deliveries_portal-wms_1
+
+
+
+
diff --git a/test/csit/plans/portal-sdk/testsuite/teardown.sh b/test/csit/plans/portal-sdk/testsuite/teardown.sh
new file mode 100644
index 0000000..e0431a7
--- /dev/null
+++ b/test/csit/plans/portal-sdk/testsuite/teardown.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Copyright 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.
+#
+
+docker kill $(docker ps -q)
+
+
diff --git a/test/csit/plans/portal-sdk/testsuite/testplan.txt b/test/csit/plans/portal-sdk/testsuite/testplan.txt
new file mode 100644
index 0000000..27f8af3
--- /dev/null
+++ b/test/csit/plans/portal-sdk/testsuite/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration.git]/test/csit/tests/.
+# Place the suites in run order.
+portal-sdk/testsuites
diff --git a/test/csit/tests/portal-sdk/testsuites/__init__.robot b/test/csit/tests/portal-sdk/testsuites/__init__.robot
new file mode 100644
index 0000000..b1df467
--- /dev/null
+++ b/test/csit/tests/portal-sdk/testsuites/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation    Portal-SDK - Testcases
diff --git a/test/csit/tests/portal-sdk/testsuites/test1.robot b/test/csit/tests/portal-sdk/testsuites/test1.robot
new file mode 100644
index 0000000..ad332c5
--- /dev/null
+++ b/test/csit/tests/portal-sdk/testsuites/test1.robot
@@ -0,0 +1,148 @@
+*** Settings ***
+Documentation    This is RobotFrame work script
+Library    ExtendedSelenium2Library
+Library    OperatingSystem
+Library     	XvfbRobot
+
+
+*** Variables ***
+${PORTAL_URL}		http://portal.api.simpledemo.openecomp.org:8989
+${PORTAL_ENV}            /ECOMPPORTAL
+${PORTAL_LOGIN_URL}                ${PORTAL_URL}${PORTAL_ENV}/login.htm
+${PORTAL_HOME_PAGE}        ${PORTAL_URL}${PORTAL_ENV}/applicationsHome
+${PORTAL_MICRO_ENDPOINT}    ${PORTAL_URL}${PORTAL_ENV}/commonWidgets
+${PORTAL_HOME_URL}                ${PORTAL_URL}${PORTAL_ENV}/applicationsHome
+${GLOBAL_APPLICATION_ID}           robot-functional
+${GLOBAL_PORTAL_ADMIN_USER}		demo
+${GLOBAL_PORTAL_ADMIN_PWD}		demo123456!
+${GLOBAL_SELENIUM_BROWSER}        chrome
+${GLOBAL_SELENIUM_BROWSER_CAPABILITIES}        Create Dictionary
+${GLOBAL_SELENIUM_DELAY}          0
+${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}        5
+${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}        15
+${GLOBAL_BUILD_NUMBER}    0
+${GLOBAL_VM_PRIVATE_KEY}   ${EXECDIR}/robot/assets/keys/robot_ssh_private_key.pvt
+
+
+*** Test Cases ***
+
+Portal admin Login To Portal GUI
+    [Documentation]   Logs into Portal GUI
+    ## Setup Browser Now being managed by test case
+#    Setup Browser
+	Start Virtual Display    1920    1080
+	Open Browser    ${PORTAL_LOGIN_URL}    chrome
+#    Go To    ${PORTAL_LOGIN_URL}
+    Maximize Browser Window
+    Set Selenium Speed    ${GLOBAL_SELENIUM_DELAY}
+    Set Browser Implicit Wait    ${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT}
+    Log    Logging in to ${PORTAL_URL}${PORTAL_ENV}
+   # Handle Proxy Warning
+    Title Should Be    Login
+    Input Text    xpath=//input[@ng-model='loginId']    ${GLOBAL_PORTAL_ADMIN_USER}
+    Input Password    xpath=//input[@ng-model='password']    ${GLOBAL_PORTAL_ADMIN_PWD}
+    Click Link    xpath=//a[@id='loginBtn']
+    Wait Until Page Contains Element    xpath=//img[@alt='Onap Logo']    ${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT}    
+    Log    Logged in to ${PORTAL_URL}${PORTAL_ENV}
+
+
+Portal Admin Navigation Application Link Tab    
+    [Documentation]   Logs into Portal GUI as Portal admin
+    
+    Click Element    xpath=.//h3[contains(text(),'xDemo App')]/following::div[1]
+    Page Should Contain    ONAP Portal
+   
+    
+Validate SDK Sub Menu    
+      [Documentation]   Logs into SDK GUI as Portal admin
+      Page Should Contain    Home
+      Page Should Contain    Sample Pages
+      Page Should Contain    Reports
+      Page Should Contain    Profile
+      Page Should Contain    Admin    
+    # Click Element    xpath=(.//span[@id='tab-Home'])[1]
+    
+Click Sample Pages and validate sub Menu  
+     [Documentation]   Click Sample Pages
+    Select frame    xpath=.//*[@id='tabframe-xDemo-App']
+    Click Link      xpath=//a[@id='parent-item-Sample-Pages']
+    Element Text Should Be      xpath=//a[@title='Collaboration']   Collaboration
+    Element Text Should Be      xpath=//a[@title='Notebook']   Notebook 
+    Click Link     xpath=//a[contains(@title,'Collaboration')]
+    Page Should Contain    User List  
+    Select frame    xpath=.//*[@id='tabframe-xDemo-App'] 
+    Click Link      xpath=//a[@id='parent-item-Sample-Pages']
+    Click Link     xpath=//a[contains(@title,'Notebook')]
+    Element Text Should Be     xpath=//h1[contains(.,'Notebook')]    Notebook
+    Click Link    xpath=//a[@id='parent-item-Home']
+    
+Click Reports and validate sub Menu  
+     [Documentation]   Click Reports Tab
+    #Select frame    xpath=.//*[@id='tabframe-xDemo-App']
+    Click Link      xpath=//a[@id='parent-item-Reports']
+    Element Text Should Be      xpath=//a[@title='All Reports']   All Reports
+    Element Text Should Be      xpath=//a[@title='Create Reports']   Create Reports 
+    Click Link     xpath=//a[contains(@title,'All Reports')]
+    Page Should Contain    Report search   
+    Select frame    xpath=.//*[@id='tabframe-xDemo-App'] 
+    Click Link      xpath=//a[@id='parent-item-Reports']
+    Click Link     xpath=//a[contains(@title,'Create Reports')]
+    Page Should Contain    Report Wizard  
+    
+Click Profile and validate sub Menu  
+     [Documentation]   Click Profile Tab
+    Select frame    xpath=.//*[@id='tabframe-xDemo-App']
+    Click Link      xpath=//a[@id='parent-item-Profile']
+    Element Text Should Be      xpath=//a[@title='Search']   Search
+    Element Text Should Be      xpath=//a[@title='Self']   Self 
+    Click Link     xpath=//a[contains(@title,'Search')]
+    Page Should Contain    Profile Search 
+    Select frame    xpath=.//*[@id='tabframe-xDemo-App']  
+    Click Link      xpath=//a[@id='parent-item-Profile'] 
+    Click Link     xpath=//a[contains(@title,'Self')]
+    Page Should Contain    Self Profile Detail  
+          
+          
+Click Admin and validate sub Menu  
+     [Documentation]   Click Admin Tab
+    Select frame    xpath=.//*[@id='tabframe-xDemo-App']
+    Click Link      xpath=//a[@id='parent-item-Admin']
+    Element Text Should Be      xpath=//a[@title='Roles']   Roles
+    Element Text Should Be      xpath=//a[@title='Role Functions']   Role Functions 
+    Element Text Should Be      xpath=//a[@title='Cache Admin']   Cache Admin 
+    Element Text Should Be      xpath=//a[@title='Menus']   Menus 
+    Element Text Should Be      xpath=//a[@title='Usage']   Usage 
+    Click Link     xpath=//a[contains(@title,'Roles')]
+    Page Should Contain    Roles   
+    Select frame    xpath=.//*[@id='tabframe-xDemo-App'] 
+    Click Link      xpath=//a[@id='parent-item-Admin']
+    Click Link     xpath=//a[contains(@title,'Role Function')]
+    Page Should Contain    Role Function  
+    Select frame    xpath=.//*[@id='tabframe-xDemo-App']
+    Click Link    xpath=.//a[@id='parent-item-Admin'] 
+     #Select frame    xpath=.//*[@id='tabframe-xDemo-App'] 
+     Click Link      xpath=//a[@id='parent-item-Admin']  
+     Click Link     xpath=//a[contains(@title,'Cache Admin')]
+     Page Should Contain    Cache Regions
+    Select frame    xpath=.//*[@id='tabframe-xDemo-App']
+    Click Link    xpath=.//a[@id='parent-item-Admin'] 
+     Click Link      xpath=//a[@id='parent-item-Admin']  
+     Click Link     xpath=//a[contains(@title,'Menus')]
+     Page Should Contain    Admin Menu Items  
+     Select frame    xpath=.//*[@id='tabframe-xDemo-App'] 
+     Click Link      xpath=//a[@id='parent-item-Admin']
+     Click Link      xpath=//a[@id='parent-item-Admin']
+     Click Link     xpath=//a[contains(@title,'Usage')]
+     Page Should Contain    Current Usage          
+    
+       
+Teardown  
+    [Documentation]    Close All Open browsers     
+    Close All Browsers    
+    
+
+    
+
+    
+
+*** Keywords ***