diff --git a/smp-soapui-tests/src/main/java/SMP.groovy b/smp-soapui-tests/src/main/java/SMP.groovy index 6dc69bf134c01550864f83977eb358298446b799..149a29c9c6c50358e034f7e9cac2dd564ec1c4c2 100644 --- a/smp-soapui-tests/src/main/java/SMP.groovy +++ b/smp-soapui-tests/src/main/java/SMP.groovy @@ -18,86 +18,93 @@ import javax.xml.crypto.dsig.dom.DOMValidateContext import javax.xml.crypto.dsig.XMLSignatureFactory import javax.xml.crypto.dsig.XMLSignature import java.util.Iterator; -import sun.misc.IOUtils; +// Giving error Could not find artifact xmlbeans:xbean:jar:fixed-2.4.0 in cefdigital-releases (https://ec.europa.eu/digital-building-blocks/artifact/content/repositories/eDelivery/) +//import sun.misc.IOUtils; +import java.util.Base64 + import java.text.SimpleDateFormat import com.eviware.soapui.support.GroovyUtils import com.eviware.soapui.impl.wsdl.teststeps.RestTestRequestStep -class SMP +class SMP implements AutoCloseable { - // Database parameters - def sqlConnection; + // Database parameters + def sqlConnection; def url; - def driver; - def testDatabase="false"; + def driver; + def testDatabase="false"; def messageExchange; def context def log; - static def DEFAULT_LOG_LEVEL = true; + static def DEFAULT_LOG_LEVEL = true; // Table allocated to store the data/parameters of the request. def requestDataTable = []; // Table allocated to store the data/parameters of the response. def responseDataTable = []; - + // Table allocated to store the intermediate data/parameters. def tempoContainer = []; - + // String allocated to extract parts of XML. def tempoString = null; - + // Table allocated to store metadata. def tablebuffer = []; - + //Signature Algorithm def String SIGNATURE_ALGORITHM = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; def String SIGNATURE_XMLNS = "http://www.w3.org/2000/09/xmldsig#"; - + // Node container def Node nodeContainer = null; - + def dbUser=null def dbPassword=null // Constructor of the SMP Class SMP(log,messageExchange,context) { debugLog("Create SMP instance", log) - this.log = log + this.log = log this.messageExchange = messageExchange; this.context=context; - this.url=context.expand( '${#Project#jdbc.url}' ); - driver=context.expand( '${#Project#jdbc.driver}' ); - testDatabase=context.expand( '${#Project#testDB}' ); + this.url=context.expand( '${#Project#jdbc.url}' ); + driver=context.expand( '${#Project#jdbc.driver}' ); + testDatabase=context.expand( '${#Project#testDB}' ); dbUser=context.expand( '${#Project#dbUser}' ); - dbPassword=context.expand( '${#Project#dbPassword}' ); - sqlConnection = null; + dbPassword=context.expand( '${#Project#dbPassword}' ); + sqlConnection = null; debugLog("SMP instance created", log) } - + // Class destructor + /* void finalize(){ log.info "Test finished." - } + }*/ + void close(){ + log.info "Test finished." + } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII - // Log information wrapper + // Log information wrapper static def void debugLog(logMsg, logObject, logLevel = DEFAULT_LOG_LEVEL) { - if (logLevel.toString()=="1" || logLevel.toString() == "true") + if (logLevel.toString()=="1" || logLevel.toString() == "true") logObject.info (logMsg) } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII - // Simply open DB connection (dev or test depending on testEnvironment variable) + // Simply open DB connection (dev or test depending on testEnvironment variable) def openConnection(){ - debugLog("Open DB connections", log) - if(testDatabase.toLowerCase()=="true") { - if (sqlConnection) { - debugLog("DB connection seems already open", log) - } - else { - try{ + debugLog("Open DB connections", log) + if(testDatabase.toLowerCase()=="true") { + if (sqlConnection) { + debugLog("DB connection seems already open", log) + } + else { + try{ if(driver.contains("oracle")){ // Oracle DB GroovyUtils.registerJdbcDriver( "oracle.jdbc.driver.OracleDriver" ) @@ -107,42 +114,42 @@ class SMP } debugLog("Open connection with url ${url} dbUser=${dbUser} pass=${dbPassword} driver=${driver} |", log) sqlConnection = Sql.newInstance(url, dbUser, dbPassword, driver) - - } - catch (SQLException ex) - { - assert 0,"SQLException occurred: " + ex; - } + + } + catch (SQLException ex) + { + assert 0,"SQLException occurred: " + ex; + } } - } - else // testDatabase.toLowerCase()=="false") - assert 0, "testDatabase param is set not set to true value - would not try to open DB connection" - } + } + else // testDatabase.toLowerCase()=="false") + assert 0, "testDatabase param is set not set to true value - would not try to open DB connection" + } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII - // Close the DB connection opened previously - def closeConnection(){ - debugLog("Close DB connection", log) - if(testDatabase.toLowerCase()=="true"){ - if(sqlConnection){ - sqlConnection.connection.close(); - sqlConnection = null; - } - } - debugLog("DB connection closed", log) - } - + // Close the DB connection opened previously + def closeConnection(){ + debugLog("Close DB connection", log) + if(testDatabase.toLowerCase()=="true"){ + if(sqlConnection){ + sqlConnection.connection.close(); + sqlConnection = null; + } + } + debugLog("DB connection closed", log) + } + //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII - def executeListOfSqlQueries(String[] sqlQueriesList) { - def connectionOpenedInsideMethod = false + def executeListOfSqlQueries(String[] sqlQueriesList) { + def connectionOpenedInsideMethod = false - if (!sqlConnection) { - debugLog("Method executed without connections open to the DB - try to open connection", log) - openConnection() - connectionOpenedInsideMethod = true - } + if (!sqlConnection) { + debugLog("Method executed without connections open to the DB - try to open connection", log) + openConnection() + connectionOpenedInsideMethod = true + } - for (query in sqlQueriesList) { - debugLog("Executing SQL query: " + query, log) + for (query in sqlQueriesList) { + debugLog("Executing SQL query: " + query, log) try{ sqlConnection.execute query } @@ -150,26 +157,26 @@ class SMP closeConnection(); assert 0,"SQLException occurred: " + ex; } - } + } - if (connectionOpenedInsideMethod) { - debugLog("Connection to DB opened during method execution - close opened connection", log) - closeConnection() - } - } + if (connectionOpenedInsideMethod) { + debugLog("Connection to DB opened during method execution - close opened connection", log) + closeConnection() + } + } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII - def executeSqlAndReturnFirstRow(String query) { - def connectionOpenedInsideMethod = false + def executeSqlAndReturnFirstRow(String query) { + def connectionOpenedInsideMethod = false def res - if (!sqlConnection) { - debugLog("Method executed without connections open to the DB - try to open connection", log) - openConnection() - connectionOpenedInsideMethod = true - } + if (!sqlConnection) { + debugLog("Method executed without connections open to the DB - try to open connection", log) + openConnection() + connectionOpenedInsideMethod = true + } - debugLog("Executing SQL query: " + query, log) + debugLog("Executing SQL query: " + query, log) debugLog("Executing SQL query: " + (sqlConnection == null), log) try{ res = sqlConnection.firstRow query @@ -179,79 +186,79 @@ class SMP assert 0,"SQLException occurred: " + ex; } - if (connectionOpenedInsideMethod) { - debugLog("Connection to DB opened during method execution - close opened connection", log) - closeConnection() - } + if (connectionOpenedInsideMethod) { + debugLog("Connection to DB opened during method execution - close opened connection", log) + closeConnection() + } return res - } - + } + def findDomainName() { def result = executeSqlAndReturnFirstRow('SELECT DOMAIN_CODE FROM SMP_DOMAIN order by ID') return result.domain_code } //IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII -//// filterForTestSuite = /PASSING_AUTO_BAMBOO/ // for multiple test suite use more advanced regexp like for example: /PASSING_AUTO_BAMBOO|PASSING_NOT_FOR_BAMBOO/ +//// filterForTestSuite = /PASSING_AUTO_BAMBOO/ // for multiple test suite use more advanced regexp like for example: /PASSING_AUTO_BAMBOO|PASSING_NOT_FOR_BAMBOO/ //// filterForTestCases = /SMP001.*/ //for single test case use simple regexp like /SMP001.*/ -def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fieldName, String newValue = null, restMethodName = 'PUT ServiceGroup') { - - debugLog("START: modyfication of test requests", log) - context.testCase.testSuite.project.getTestSuiteList().each { testSuite -> - if (testSuite.getLabel() =~ filterForTestSuite) { - debugLog("test suite: " + testSuite.getLabel(), log) - testSuite.getTestCaseList().each { testCase -> - if (testCase.getLabel() =~ filterForTestCases) { - debugLog("test label:" + testCase.getLabel(), log) - testCase.getTestStepList().each {testStep -> - if (testStep instanceof RestTestRequestStep && testStep.getRestMethod().name == restMethodName) { - - def hOld = testStep.getHttpRequest().getRequestHeaders() - hOld.remove(fieldName) - hOld.remove(fieldName.capitalize()) - hOld.remove(fieldName.toUpperCase()) - if (newValue) - hOld[fieldName] = [newValue] - testStep.getHttpRequest().setRequestHeaders(hOld) - debugLog("For testStep:" + testStep.name + "; Header: " + testStep.getHttpRequest().getRequestHeaders(), log) + def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fieldName, String newValue = null, restMethodName = 'PUT ServiceGroup') { + + debugLog("START: modyfication of test requests", log) + context.testCase.testSuite.project.getTestSuiteList().each { testSuite -> + if (testSuite.getLabel() =~ filterForTestSuite) { + debugLog("test suite: " + testSuite.getLabel(), log) + testSuite.getTestCaseList().each { testCase -> + if (testCase.getLabel() =~ filterForTestCases) { + debugLog("test label:" + testCase.getLabel(), log) + testCase.getTestStepList().each {testStep -> + if (testStep instanceof RestTestRequestStep && testStep.getRestMethod().name == restMethodName) { + + def hOld = testStep.getHttpRequest().getRequestHeaders() + hOld.remove(fieldName) + hOld.remove(fieldName.capitalize()) + hOld.remove(fieldName.toUpperCase()) + if (newValue) + hOld[fieldName] = [newValue] + testStep.getHttpRequest().setRequestHeaders(hOld) + debugLog("For testStep:" + testStep.name + "; Header: " + testStep.getHttpRequest().getRequestHeaders(), log) + } } - } - } - + } + + } } } - } - debugLog("END: Modification of requests hedears finished", log) -} + debugLog("END: Modification of requests hedears finished", log) + } //================================================================================= //======================== Initialize the parameters names ======================== -//================================================================================= +//================================================================================= def initParameters(String testType, String indicator){ if(indicator.toLowerCase()=="request"){ - switch(testType.toLowerCase()){ + switch(testType.toLowerCase()){ case "servicemetadata": requestDataTable[0]=["0","businessIdSchemeRequest"]; requestDataTable[1]=["0","ParticipantIdentifierRequest"]; requestDataTable[2]=["0","documentIdentSchemeRequest"]; requestDataTable[3]=["0","documentIdentifierRequest"]; - break; + break; case "servicegroup": requestDataTable[0]=["0","businessIdSchemeRequest"]; requestDataTable[1]=["0","ParticipantIdentifierRequest"]; requestDataTable[2]=["0","Extension"]; requestDataTable[3]=["0","Certificate"]; - break; + break; case "redirection": requestDataTable[0]=["0","redirectUrl"]; requestDataTable[1]=["0","CertificateUID"]; - break; - default: - log.info "Unknown operation"; - } - } + break; + default: + log.info "Unknown operation"; + } + } if(indicator.toLowerCase()=="response"){ - switch(testType){ + switch(testType){ case "servicemetadata": responseDataTable[0]=["0","businessIdSchemeResponse"]; responseDataTable[1]=["0","ParticipantIdentifierResponse"]; @@ -263,20 +270,20 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie responseDataTable[1]=["0","ParticipantIdentifierResponse"]; responseDataTable[2]=["0","Extension"]; responseDataTable[3]=["0","Certificate"]; - break; + break; case "redirection": responseDataTable[0]=["0","redirectUrl"] responseDataTable[1]=["0","CertificateUID"] - break; - default: - log.info "Unknown operation"; - } - } + break; + default: + log.info "Unknown operation"; + } + } } //================================================================================= - + //================================================================================= //========================== Extract request parameters =========================== //================================================================================= @@ -285,16 +292,16 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie // Load the Request requestContent = messageExchange.getOperation(); - assert (requestContent!=null),locateTest()+"Error: Not possible to extract the request content. Request content extracted is empty."; - + assert (requestContent!=null),locateTest()+"Error: Not possible to extract the request content. Request content extracted is empty."; + // Browse the REST request extractFromURL(requestContent.toString()); - - switch(testType.toLowerCase()){ - - // Extract the Participant Identifier and the Business Identifier Scheme from the Request + + switch(testType.toLowerCase()){ + + // Extract the Participant Identifier and the Business Identifier Scheme from the Request case "servicegroup": - debugLog("In extractRequestParameters tempoContainer: $tempoContainer", log) + debugLog("In extractRequestParameters tempoContainer: $tempoContainer", log) initParameters("servicegroup","request"); requestDataTable[0][0] = tempoContainer[0]; requestDataTable[1][0] = tempoContainer[1]; @@ -302,31 +309,31 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie requestDataTable[2][0] = extractExtValues(extractTextFromReq(testStepName)); requestDataTable[3][0] = extractNodeValue("CertificateIdentifier",extractTextFromReq(testStepName)); } - break; - - // Extract the Participant Identifier and the document from the Request + break; + + // Extract the Participant Identifier and the document from the Request case "servicemetadata": case "signature": - initParameters("servicemetadata","request"); + initParameters("servicemetadata","request"); requestDataTable[0][0] = tempoContainer[0]; requestDataTable[1][0] = tempoContainer[1]; requestDataTable[2][0] = tempoContainer[2]; requestDataTable[3][0] = tempoContainer[3]; - break; - - + break; + + case "redirection": - initParameters("redirection","request"); - break; - - default: + initParameters("redirection","request"); + break; + + default: if(testType.toLowerCase()=="contenttype"){ // Do nothing break; } assert(0), locateTest()+"Error: -extractRequestParameters-Unknown operation: "+testType+"."+" Possible operations: serviceGroup, serviceMetadata, Redirection, Signature, contentType"; - break; - } + break; + } } //================================================================================= @@ -344,75 +351,75 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie def responseContent = messageExchange.getResponseContentAsXml(); // Extract the Participant Identifier, the references to the signed metadata and the extensions from the Response def ServiceDetails = new XmlSlurper().parseText(responseContent); - switch(testType.toLowerCase()){ + switch(testType.toLowerCase()){ case "servicegroup": initParameters("servicegroup","response"); urlRefCounter = 4; allNodes = ServiceDetails.depthFirst().each{ - if(it.name()== "ParticipantIdentifier"){ - responseDataTable[1][0]=it.text(); - responseDataTable[0][0]=it.@scheme.text(); - } - if(it.name()== "ServiceMetadataReference"){ + if(it.name()== "ParticipantIdentifier"){ + responseDataTable[1][0]=it.text(); + responseDataTable[0][0]=it.@scheme.text(); + } + if(it.name()== "ServiceMetadataReference"){ responseDataTable[urlRefCounter]=[it.@href.text(),"ServiceMetadataReference"]; - urlRefCounter+=1; - } - /*if(it.name()== "Extension"){ - responseDataTable[2][0]=it.text(); - }*/ + urlRefCounter+=1; + } + /*if(it.name()== "Extension"){ + responseDataTable[2][0]=it.text(); + }*/ if(it.name()== "CertificateIdentifier"){ - responseDataTable[3][0]=it.text(); - } + responseDataTable[3][0]=it.text(); + } } - // Extract the extension + // Extract the extension responseDataTable[2][0]=extractExtValues(responseContent.toString()); - break; - + break; + case "servicemetadata": case "signature": tempoString = null; initParameters("servicemetadata","response"); allNodes = ServiceDetails.depthFirst().each{ - if(it.name()== "ParticipantIdentifier"){ - responseDataTable[1][0]=it.text(); - responseDataTable[0][0]=it.@scheme.text(); - } + if(it.name()== "ParticipantIdentifier"){ + responseDataTable[1][0]=it.text(); + responseDataTable[0][0]=it.@scheme.text(); + } if(it.name()== "DocumentIdentifier"){ responseDataTable[2][0]=it.@scheme.text(); - responseDataTable[3][0]=it.text(); - } + responseDataTable[3][0]=it.text(); + } } tempoString = responseContent.toString(); - break; - + break; + case "redirection": initParameters("redirection","response"); allNodes = ServiceDetails.depthFirst().each{ if(it.name()== "Redirect"){ - responseDataTable[0][0]=it.@href.text(); - } + responseDataTable[0][0]=it.@href.text(); + } if(it.name()== "CertificateUID"){ - responseDataTable[1][0]=it.text(); - } + responseDataTable[1][0]=it.text(); + } } - assert((responseDataTable[0][0]!=null)&&(responseDataTable[0][0]!="0")), locateTest()+"Error: Redirection is expected but redirect element was not found in the response."; + assert((responseDataTable[0][0]!=null)&&(responseDataTable[0][0]!="0")), locateTest()+"Error: Redirection is expected but redirect element was not found in the response."; assert((responseDataTable[1][0]!=null)&&(responseDataTable[1][0]!="0")), locateTest()+"Error: Redirection is expected but CertificateUID element was not found in the response."; - break; - - default: + break; + + default: // content-Type = text/xml if(testType.toLowerCase()=="contenttype"){ for(header in messageExchange.getResponseHeaders()){ if((header.toString().contains("Content-Type")) && (header.toString().contains("text/xml"))){ headerFound = 1; - } + } } assert(headerFound==1), locateTest()+"Error: Header content-Type is not found or is not set to text/xml."; break; } - assert(0), locateTest()+"Error: -extractResponseParameters-Unknown operation: "+testType+"."+" Possible operations: serviceGroup, serviceMetadata, Redirection, Signature, contentType."; - break; - } + assert(0), locateTest()+"Error: -extractResponseParameters-Unknown operation: "+testType+"."+" Possible operations: serviceGroup, serviceMetadata, Redirection, Signature, contentType."; + break; + } } //================================================================================= @@ -422,8 +429,8 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie //========================== Perform test verifications =========================== //================================================================================= def verifyResults(String testType, String expectedResult, String testStepName="false", String redirectURL=null, String redirectCer=null, int nRef=0){ - // In case of testType = "servicegroup", - debugLog("Entering verifyResults method with testType: $testType, expectedResult: $expectedResult, testStepName: $testStepName, redirectURL: $redirectURL, redirectCer: $redirectCer, nRef: $nRef", log) + // In case of testType = "servicegroup", + debugLog("Entering verifyResults method with testType: $testType, expectedResult: $expectedResult, testStepName: $testStepName, redirectURL: $redirectURL, redirectCer: $redirectCer, nRef: $nRef", log) def counter = 0; def String reqString = null; def String extensionRequest = "0"; @@ -431,19 +438,19 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie def sigAlgo = "0"; debugLog("Befor extractRequestParameters(testType,testStepName)", log) extractRequestParameters(testType,testStepName); - debugLog("After extractRequestParameters(testType,testStepName)", log) + debugLog("After extractRequestParameters(testType,testStepName)", log) extractResponseParameters(testType); - debugLog("After extractResponseParameters(testType)", log) - switch(testType.toLowerCase()){ + debugLog("After extractResponseParameters(testType)", log) + switch(testType.toLowerCase()){ case "servicegroup": if(expectedResult.toLowerCase()=="success"){ while(counter<4){ - if ((counter==2)&&(requestDataTable[2][0]!="0")){ + if ((counter==2)&&(requestDataTable[2][0]!="0")){ if(compareXMLs(responseDataTable[counter][0],requestDataTable[counter][0])==false){ log.error "Extension in request: "+requestDataTable[counter][0]; log.error "Extension in response: "+responseDataTable[counter][0]; assert(0), locateTest()+"Error: Extension returned is different from Extension pushed. For details, please refer to logs in red."; - } + } }else{ assert(responseDataTable[counter][0].toLowerCase()==requestDataTable[counter][0].toLowerCase()), locateTest()+"Error: in request, "+requestDataTable[counter][1]+"=\""+requestDataTable[counter][0]+"\""+" wheras in response, "+responseDataTable[counter][1]+"=\""+responseDataTable[counter][0]+"\"."; } @@ -464,7 +471,7 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie assert(nRef), locateTest()+"Error: in a ServiceMetadataReference in the response, participant is ("+tempoContainer[0]+","+tempoContainer[1]+") instead of ("+responseDataTable[0][0]+","+responseDataTable[1][0]+")."; } } - break; + break; case "servicemetadata": counter = 0; if(expectedResult.toLowerCase()=="success"){ @@ -484,36 +491,36 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie assert(0), locateTest()+"Error: Extension returned is different from Extension pushed. For details, please refer to logs in red."; } } - break; + break; case "redirection": counter = 0; requestDataTable[0][0]=redirectURL; requestDataTable[1][0]=redirectCer; assert(requestDataTable[0][0]==responseDataTable[0][0]), locateTest()+"Error: in ServiceMetadata returned redirect URL is ------"+responseDataTable[0][0]+"------ instead of ------"+requestDataTable[0][0]+"------."; assert(requestDataTable[0][0]==responseDataTable[0][0]), locateTest()+"Error: in ServiceMetadata returned certificate is ------"+responseDataTable[1][0]+"------ instead of ------"+requestDataTable[1][0]+"------."; - break; + break; case "signature": sigAlgo = extractNodeValue("SignatureMethod", tempoString,null, "Algorithm"); assert(sigAlgo!= "0"), locateTest()+"Error: Signature Algorithm couldn't be extracted from the response." assert(SIGNATURE_ALGORITHM==sigAlgo), locateTest()+"Error: Signature Algorithm is "+sigAlgo+" instead of "+SIGNATURE_ALGORITHM+"."; - // Verify the SMP signature validity + // Verify the SMP signature validity def Boolean validResult = validateSignature(returnDOMDocument(tempoString)); assert (validResult == true),locateTest()+"Error: Signature of the SMP is not valid."; validResult =false; - + // TODO: Enable the extension signature validation. validResult = validateSignatureExtension(returnDOMDocument(tempoString)); assert (validResult == true),locateTest()+"Error: Signature in the extension is not valid."; - break; - - default: + break; + + default: if(testType.toLowerCase()=="contenttype"){ // Do nothing break; } - assert(0), locateTest()+"Error: -verifyResults-Unknown operation: "+testType+"."+" Possible operations: serviceGroup, serviceMetadata, Redirection, Signature, contentType."; - break; - } + assert(0), locateTest()+"Error: -verifyResults-Unknown operation: "+testType+"."+" Possible operations: serviceGroup, serviceMetadata, Redirection, Signature, contentType."; + break; + } } //================================================================================= @@ -523,13 +530,13 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie //=========================== Extract PUT XML contents ============================ //================================================================================= def String extractTextFromReq(String testStepName){ - def fullRequest = context.testCase.getTestStepByName(testStepName); + def fullRequest = context.testCase.getTestStepByName(testStepName); assert (fullRequest != null), locateTest()+"Error in function \"extractTextFromReq\": can't find test step name: \""+testStepName+"\""; - def request = fullRequest.getProperty( "request" ); + def request = fullRequest.getProperty( "request" ); def result = request.value.toString(); result = result.replace("%23","#"); result = result.replace("%3A",":"); - return result; + return result; } //================================================================================= @@ -556,17 +563,17 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie result=it.@{attribute.toString()}.text(); } } - } + } if(result==""){ result="0"; } return result; } - + // Extensions are extracted in a different way def String extractExtValues(String extInput){ def String extResult = ""; - def String inputTrimmed=extInput.replaceAll("\n","").replaceAll("\r", "").replaceAll(">\\s+<", "><").replaceAll("%23","#").replaceAll("%3A",":"); + def String inputTrimmed=extInput.replaceAll("\n","").replaceAll("\r", "").replaceAll(">\\s+<", "><").replaceAll("%23","#").replaceAll("%3A",":"); def containerExt = (inputTrimmed =~ /<Extension>((?!<Extension>).)*<\/Extension>/); while(containerExt.find()){ extResult = extResult+containerExt.group(); @@ -577,9 +584,9 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie //log.info "<AllExtensionsRoot>"+extResult+"</AllExtensionsRoot>"; return "<AllExtensionsRoot>"+extResult+"</AllExtensionsRoot>"; } - + // Difference between XMLs - def Boolean compareXMLs(String request, String response){ + def Boolean compareXMLs(String request, String response){ def DetailedDiff myDiff = new DetailedDiff(new Diff(request, response)); def List allDifferences = myDiff.getAllDifferences(); @@ -594,7 +601,7 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie } return true; } - + //================================================================================= @@ -622,7 +629,7 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie def String startTag = null; def String endTag = null; def String result = null; - + //if(requestName.toLowerCase()=="servicegroup"){ // startTag = "<ServiceMetadataReferenceCollection>"; // endTag = "</ServiceGroup>"; @@ -663,9 +670,9 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie def mesure = 0; def extraParts = null; debugLog("entering extractFromURL", log) - + tempoContainer=["0","0","0","0"]; - + Table1 = url.split('/services/'); parts=Table1[0].split('/'); mesure=parts.size(); @@ -681,30 +688,30 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie assert (Table1.size()== 2),locateTest()+"Error: Could not extract the Participant Identifier from the url. Non usual url format, :: separator not found"; tempoContainer[0] = Table1[0]; tempoContainer[1] = Table1[1]; - debugLog("Filling tempoContainer table", log) + debugLog("Filling tempoContainer table", log) // TODO FIX this backward compatibility issue if (messageExchange.getProperties()) { debugLog("Extracting ParticipantIdentifier from property. Table1: Table1", log) tempoContainer[0] = messageExchange.getProperty('ParticipantIdentifierScheme') tempoContainer[1] = messageExchange.getProperty('ParticipantIdentifier') } - + if(extraParts!=null){ - debugLog("Filling tempoContainer table fields 2 and 3. extraParts: $extraParts", log) + debugLog("Filling tempoContainer table fields 2 and 3. extraParts: $extraParts", log) extraParts = extraParts.replace("%3A",":"); extraParts = extraParts.replace("%23","#"); Table1 = []; Table1=extraParts.split('::',2); tempoContainer[2] = Table1[0].replace("%2F","/"); tempoContainer[3] = Table1[1].replace("%2F","/"); - // TODO FIX this backward compatibility issue - if (messageExchange.getProperties()) { - debugLog("Extracting DocTypeIdentifier from property", log) - tempoContainer[2] = messageExchange.getProperty('DocTypeIdentifierScheme') - tempoContainer[3] = messageExchange.getProperty('DocTypeIdentifier') - } + // TODO FIX this backward compatibility issue + if (messageExchange.getProperties()) { + debugLog("Extracting DocTypeIdentifier from property", log) + tempoContainer[2] = messageExchange.getProperty('DocTypeIdentifierScheme') + tempoContainer[3] = messageExchange.getProperty('DocTypeIdentifier') + } } - debugLog("Leaving extractFromURL", log) + debugLog("Leaving extractFromURL", log) } //================================================================================= @@ -722,7 +729,7 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie outcome = compareTables(table1,table2); return (outcome); } -//================================================================================= +//================================================================================= //================================================================================= @@ -737,8 +744,8 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie def String oldProcessScheme ="0"; tablebuffer=["0","0","0","0","0","0","0","0","0","0","0","0","0"]; def rootMT = new XmlSlurper().parseText(metadata); - def allNodes = rootMT.depthFirst().each{ - if(it.name()== "ProcessIdentifier"){ + def allNodes = rootMT.depthFirst().each{ + if(it.name()== "ProcessIdentifier"){ if(switchProcess==0){ oldProcessScheme=it.@scheme.text(); oldProcessId=it.text(); @@ -749,9 +756,9 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie switchProcess=0; } tablebuffer[0]=it.@scheme.text(); - tablebuffer[1]=it.text(); - } - if(it.name()== "Endpoint"){ + tablebuffer[1]=it.text(); + } + if(it.name()== "Endpoint"){ if(switchEndPoint==0){ switchEndPoint=1; }else{ @@ -760,53 +767,53 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie i=i+1; } tablebuffer[2]=it.@transportProfile.text(); - } + } if(it.name()== "EndpointURI"){ - tablebuffer[3]=it.text().trim(); - } + tablebuffer[3]=it.text().trim(); + } if(it.name()== "RequireBusinessLevelSignature"){ - if(it.text()=~ /[f|F][a|A][l|L][S|s]/){ - tablebuffer[4]="0"; - }else{ - if(it.text()=~ /[T|t][R|r][U|u]/){ - tablebuffer[4]="1"; - } - else{ - tablebuffer[4] = it.text() - } - } - } + if(it.text()=~ /[f|F][a|A][l|L][S|s]/){ + tablebuffer[4]="0"; + }else{ + if(it.text()=~ /[T|t][R|r][U|u]/){ + tablebuffer[4]="1"; + } + else{ + tablebuffer[4] = it.text() + } + } + } if(it.name()== "ServiceActivationDate"){ - //tablebuffer[5]=it.text(); + //tablebuffer[5]=it.text(); tablebuffer[5]=Date.parse("yyyy-MM-dd",it.text()); - } + } if(it.name()== "ServiceExpirationDate"){ - //tablebuffer[6]=it.text(); + //tablebuffer[6]=it.text(); tablebuffer[6]=Date.parse("yyyy-MM-dd",it.text()); - } + } if(it.name()== "Certificate"){ - tablebuffer[7]=it.text(); - } + tablebuffer[7]=it.text(); + } if(it.name()== "ServiceDescription"){ - tablebuffer[8]=it.text(); - } + tablebuffer[8]=it.text(); + } if(it.name()== "TechnicalContactUrl"){ tablebuffer[9]=it.text(); - } + } if(it.name()== "minimumAuthenticationLevel"){ - tablebuffer[10]=it.text(); - } + tablebuffer[10]=it.text(); + } if(it.name()== "TechnicalInformationUrl"){ - tablebuffer[11]=it.text(); - } + tablebuffer[11]=it.text(); + } if(it.name()== "extension"){ - tablebuffer[12]=it.text(); - } - } + tablebuffer[12]=it.text(); + } + } result[i]=returnHash(tablebuffer.join(",")); return(result); } -//================================================================================= +//================================================================================= @@ -815,7 +822,7 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie //================================================================================= def String compareTables(tab1,tab2){ def found = 0; - if(tab1.size()!=tab2.size()){ + if(tab1.size()!=tab2.size()){ return "false"; } for (String item1 : tab1) { @@ -843,55 +850,55 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie } return "true"; } -//================================================================================= +//================================================================================= //================================================================================= //============= Locate the test case for display it in the error logs ============= -//================================================================================= - def String locateTest(){ - // Returns: "--TestCase--testStep--" - return("--"+context.testCase.name+"--"+context.testCase.getTestStepAt(context.getCurrentStepIndex()).getLabel()+"-- "); - } -//================================================================================= +//================================================================================= + def String locateTest(){ + // Returns: "--TestCase--testStep--" + return("--"+context.testCase.name+"--"+context.testCase.getTestStepAt(context.getCurrentStepIndex()).getLabel()+"-- "); + } +//================================================================================= //================================================================================= //============================== Dump request table =============================== -//================================================================================= - def String dumpRequestTable(){ +//================================================================================= + def String dumpRequestTable(){ def ii = 0; log.info("== Request Table =="); while(ii<requestDataTable.size()){ log.info "--"+requestDataTable[ii][1]+"--"+requestDataTable[ii][0]+"--"; ii=ii+1; - } + } log.info("================================"); - } -//================================================================================= + } +//================================================================================= //================================================================================= //============================== Dump response table ============================== -//================================================================================= - def String dumpResponseTable(){ +//================================================================================= + def String dumpResponseTable(){ def ii = 0; log.info("== Response Table =="); while(ii<responseDataTable.size()){ log.info "--"+responseDataTable[ii][1]+"--"+responseDataTable[ii][0]+"--"; ii=ii+1; - } + } log.info("================================"); - } -//================================================================================= + } +//================================================================================= //================================================================================= //================================== Dump table =================================== -//================================================================================= - def dumpTable(tableToDump, String name, dimension){ +//================================================================================= + def dumpTable(tableToDump, String name, dimension){ def ii = 0; if(dimension=='2'){ log.info("== "+name+" Table =="); @@ -906,9 +913,9 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie log.info "--"+tableToDump[ii]+"--"; ii=ii+1; } - } + } log.info("================================"); - } + } //================================================================================= //====================== Signature code =================================== @@ -930,30 +937,31 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie def Certificate decodeX509Certificate(Document doc){ def Certificate cert = null; def String certMessage = null; - + // Check Certificate def Element smpSig = findElement(doc,"X509Certificate","SMP",null); assert (smpSig != null),locateTest()+"Error: SMP X509Certificate Signature not found in the response."; - + certMessage=smpSig.getTextContent(); def CertificateFactory cf = CertificateFactory.getInstance("X509"); - def InputStream is = new ByteArrayInputStream(new sun.misc.BASE64Decoder().decodeBuffer(certMessage)); + //def InputStream is = new ByteArrayInputStream(new sun.misc.BASE64Decoder().decodeBuffer(certMessage)); + def InputStream is = Base64.decoder.decode(certMessage); cert =cf.generateCertificate(is); return (cert); } - + def Boolean validateSignature(Document doc){ def Boolean validFlag = true; - + // Find the signature of the SMP node to extract the signature algorithm def Element smpSig = findElement(doc,"Signature","SMP",SIGNATURE_XMLNS); assert (smpSig != null),locateTest()+"Error: SMP Signature not found in the response."; - + def PublicKey publicKey = decodeX509Certificate(doc).getPublicKey(); def XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); def DOMValidateContext valContext = new DOMValidateContext(publicKey, smpSig); valContext.setProperty("javax.xml.crypto.dsig.cacheReference", Boolean.TRUE); - + // Unmarshal the XMLSignature. def XMLSignature signature = fac.unmarshalXMLSignature(valContext); try { @@ -964,30 +972,30 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie return (validFlag); } - + def Boolean validateSignatureExtension(Document doc){ def Boolean validFlag = true; - + // Find the signature of the SMP node to extract the signature algorithm - def Element smpSig = findElement(doc,"Signature","Extension",SIGNATURE_XMLNS); + def Element smpSig = findElement(doc,"Signature","Extension",SIGNATURE_XMLNS); if(smpSig==null){ log.info "No extension Signature."; return(true); } - + def PublicKey publicKey = decodeX509Certificate(doc).getPublicKey(); def XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM"); def DOMValidateContext valContext = new DOMValidateContext(publicKey, smpSig); valContext.setProperty("javax.xml.crypto.dsig.cacheReference", Boolean.TRUE); - - + + // Unmarshal the XMLSignature. def XMLSignature signature = fac.unmarshalXMLSignature(valContext); //displaySignatureInfo(signature,valContext); try { validFlag = signature.validate(valContext); - }catch(Exception ex) { + }catch(Exception ex) { assert (0),"-- validateSignatureExtension function -- Error occurred while trying to validate the signature: "+ex; } if(validFlag==false){ @@ -995,15 +1003,15 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie } return (validFlag); } - - + + def Element findElement(Document doc, String elementName, String target, String nameSpace){ def elements =null; if(nameSpace!=null){ - elements = doc.getElementsByTagNameNS(nameSpace, elementName); + elements = doc.getElementsByTagNameNS(nameSpace, elementName); }else{ - elements = doc.getElementsByTagName(elementName); + elements = doc.getElementsByTagName(elementName); } if(target=="SMP"){ if(elements.getLength()>1){ @@ -1020,31 +1028,30 @@ def cleanAndAddHeaderElement(filterForTestSuite, filterForTestCases, String fie return (Element) elements.item(0); }else{ return null; - } + } } - } - + } + def printErrorSigValDetails(DOMValidateContext valContext, XMLSignature signature){ - boolean sv = signature.getSignatureValue().validate(valContext); - log.info("signature validation status: " + sv); - if (sv == false) { - // Check the validation status of each Reference. - Iterator i1 = signature.getSignedInfo().getReferences().iterator(); + boolean sv = signature.getSignatureValue().validate(valContext); + log.info("signature validation status: " + sv); + if (sv == false) { + // Check the validation status of each Reference. + Iterator i1 = signature.getSignedInfo().getReferences().iterator(); //log.info i1.getAt(0); //log.info i1.getAt(1); //log.info i1.toString(); - for (int j = 0; i1.hasNext(); j++) { - boolean refValid = ((org.jcp.xml.dsig.internal.dom.DOMReference) i1.next()).validate(valContext); - log.info("ref[" + j + "] validity status: " + refValid); - } - } - } - + for (int j = 0; i1.hasNext(); j++) { + boolean refValid = ((org.jcp.xml.dsig.internal.dom.DOMReference) i1.next()).validate(valContext); + log.info("ref[" + j + "] validity status: " + refValid); + } + } + } + def displaySignatureInfo(XMLSignature signature,DOMValidateContext valContext){ log.info"======== Signature ========"; log.info "- Signature Value: "+signature.getSignatureValue().getValue(); log.info"==========================="; } - - + } \ No newline at end of file