IMPL: MC Xapp tests
[it/test.git] / ric_robot_suite / robot / testsuites / mcxapp.robot
diff --git a/ric_robot_suite/robot/testsuites/mcxapp.robot b/ric_robot_suite/robot/testsuites/mcxapp.robot
new file mode 100644 (file)
index 0000000..dd85e45
--- /dev/null
@@ -0,0 +1,103 @@
+#   Copyright (c) 2019 AT&T Intellectual Property.
+#
+#   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.
+
+*** Settings ***
+Documentation  Tests for the Measurement Campaign XApp
+
+Resource       ../resources/xapps/mcxapp_properties.robot
+Resource       ../resources/global_properties.robot
+
+Library        Collections
+Library        KubernetesEntity          ${GLOBAL_XAPP_NAMESPACE}
+
+*** Variables ***
+${deploymentName} =         ${GLOBAL_XAPP_NAMESPACE}-mcxapp
+${listenerContainerName} =  mc-xapp-listener
+${listenerStatRegex} =      ^[0-9]+\\s*\\[STAT\\]\\s*\\(mcl\\)
+${recentListenerDrops} =    last 60s.*drops\\s*=\\s*[1-9]
+${recentListenerErrors} =   last 60s.*errs\\s*=\\s*[1-9]
+
+*** Test Cases ***
+MC XApp Should Be Available
+  [Tags]  etetests  xapptests  mcxapptests
+  ${deploy} =          Deployment           ${deploymentName}
+  ${status} =          Most Recent Availability Condition           @{deploy.status.conditions}
+  Should Be Equal As Strings   ${status}  True  ignore_case=True
+
+MC XApp Listener Should Not Be Dropping Messages
+  [Tags]  etetests  xapptests  mcxapptests
+  ${log} =  Most Recent Container Log  ${listenerContainerName}  ${listenerStatRegex}
+  Should Not Contain Match             ${log}                    ${recentListenerDrops}
+  
+MC XApp Listener Should Not Be Producing Errors
+  [Tags]  etetests  xapptests  mcxapptests
+  ${log} =  Most Recent Container Log  ${listenerContainerName}  ${listenerStatRegex}
+  Should Not Contain Match             ${log}                    ${recentListenerErrors}
+
+Writer Should Be Successfully Sending Statistics
+  [Tags]  etetests  xapptests  mcxapptests
+  Set Test Variable  ${finalStatus}  PASS
+  :FOR  ${stat}  IN  @{GLOBAL_MCXAPP_WRITER_STATISTICS}
+  \  ${statRE} =        Regexp Escape  ${stat}
+  \  ${log} =           Most Recent Container Log
+  ...                   ${GLOBAL_MCXAPP_WRITER_NAME}
+  ...                   ^${statRE}:\\s+successful\\s+ves\\s+posts\\.*
+  \  ${status}  ${u} =  Run Keyword And Ignore Error
+  ...                   Should Contain Match  ${log}  regexp=${writerVesSuccesses}
+  \  ${finalStatus} =   Set Variable If  "${status}" == "FAIL"
+  ...                   FAIL
+  ...                   ${finalStatus}
+  \  Run Keyword If     "${status}" == "FAIL"
+  ...                   Log  No messages have been sent to VES for ${stat}
+  \  ${status}  ${u} =  Run Keyword And Ignore Error
+  ...                   Should Not Contain Match  ${log}  regexp=${writerVesErrors}
+  \  ${finalStatus} =   Set Variable If  "${status}" == "FAIL"
+  ...                   FAIL
+  ...                   ${finalStatus}
+  \  Run Keyword If     "${status}" == "FAIL"
+  ...                   Log  ${stat} is producing errors logging to VES
+  Run Keyword If        "${finalStatus}" == "FAIL"
+  ...                   Fail  One or more statistics is not being succesfully logged
+
+*** Keywords ***
+Most Recent Availability Condition
+  # this makes the probably-unsafe assumption that the conditions are ordered
+  # temporally.
+  [Arguments]  @{Conditions}
+  ${status} =  Set Variable  'False'
+  :FOR  ${Condition}  IN  @{Conditions}
+  \  ${status} =  Set Variable If  '${Condition.type}' == 'Available'  ${Condition.status}  ${status}
+  [Return]  ${status}
+
+Most Recent Match
+  [Arguments]    ${list}        ${regex}
+  ${matches} =   Get Matches    ${list}     regexp=${regex}
+  Should Not Be Empty           ${matches}  No log entries matching ${regex}
+  ${match} =     Get From List  ${matches}  -1
+  [Return]       ${match}
+  
+Most Recent Container Log
+  [Arguments]   ${container}=${EMPTY}  ${regex}=${EMPTY}
+  ${pods} =            Retrieve Pods For Deployment  ${deploymentName}
+  ${logs} =            Create List
+  :FOR  ${pod}  IN  @{pods}
+  \  ${log} =   Retrieve Log For Pod     ${pod}             ${container}
+  \  Should Not Be Empty        ${log}   No log entries for ${pod}/${container}
+  \  ${line} =  Run Keyword If           "${regex}" != "${EMPTY}"
+  ...                                    Most Recent Match  ${log}  ${regex}
+  ...           ELSE
+  ...                                    Get From List      ${log}  -1
+  \  Append To List             ${logs}  ${line}
+  [Return]                      ${logs}
+