package org.wso2.carbon.esb.mediator.test.aggregate;
import org.apache.commons.lang.ArrayUtils;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.wso2.carbon.automation.test.utils.http.client.HttpsResponse;
import org.wso2.carbon.integration.common.admin.client.ApplicationAdminClient;
import org.wso2.carbon.integration.common.admin.client.CarbonAppUploaderClient;
import org.wso2.esb.integration.common.utils.ESBIntegrationTest;
import javax.activation.DataHandler;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Calendar;
import java.util.concurrent.TimeUnit;
public class SoapHeaderBlocksTestCase extends ESBIntegrationTest {
private CarbonAppUploaderClient carbonAppUploaderClient;
private ApplicationAdminClient applicationAdminClient;
private final int MAX_TIME = 120000;
private final String carFileName = "SoapHeaderTestRegFiles_1.0.0";
private final String carFileNameWithExtension = "SoapHeaderTestRegFiles_1.0.0.car";
private final String serviceName="TestProxy";
@BeforeClass(alwaysRun = true)
public void setEnvironment() throws Exception {
super.init();
carbonAppUploaderClient = new CarbonAppUploaderClient(context.getContextUrls().getBackEndUrl(), getSessionCookie());
carbonAppUploaderClient.uploadCarbonAppArtifact(carFileNameWithExtension
, new DataHandler(new URL("file:" + File.separator + File.separator + getESBResourceLocation()
+ File.separator + "car" + File.separator + carFileNameWithExtension)));
applicationAdminClient = new ApplicationAdminClient(context.getContextUrls().getBackEndUrl(), getSessionCookie());
Assert.assertTrue(isCarFileDeployed(carFileName), "Car file deployment failed");
loadESBConfigurationFromClasspath("/artifacts/ESB/synapseconfig/requestWithSoapHeaderBlockConfig/synapse.xml");
TimeUnit.SECONDS.sleep(5);
}
@Test(groups = {"wso2.esb"})
public void aggregateMediatorSoapHeaderBlockTestCase() throws Exception {
HttpsResponse response = postWithBasicAuth(getProxyServiceURLHttps(serviceName),
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" "
+ "xmlns:u=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">"
+ "<s:Header>"
+ "<VsDebugger "
+ "xmlns=\"http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink\">"
+ "uIDPo0Mttttvvvvvvv</VsDebugger>"
+ "</s:Header>"
+ "<s:Body xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
+ "<sendLetter xmlns=\"http://ws.cts.deg.gov.ae/\">" + "<letter xmlns=\"\">"
+ "<body/>" + "<confidentiality>Public</confidentiality>"
+ "<date>201d6-02-29T15:22:14.88dd7</date>" + "<from>"
+ "<code>ADdddSG</code>" + "<id>AAdd7</id>" + "</from>"
+ "<importance>Normal</importance>"
+ "<outgoingRef>DSssssG/ddddOUT/2016TEST/0uy0099</outgoingRef>"
+ "<priority>Normal</priority>" + "<replyTo>218602</replyTo>"
+ "<signedCopy>" + "<filename>Test.pdf</filename>"
+ "<format>pdf</format>" + "</signedCopy>"
+ "<subject>Test 1</subject>" + "<to>"
+ "<code>DM</code>" + "<id>eeeeeeeeeeeee@dd.com</id>"
+ "</to>" + "</letter>" + "</sendLetter>" + "</s:Body>"
+ "</s:Envelope>", "text/xml;charset=UTF-8", "admin", "admin");
Assert.assertEquals(response.getResponseCode(), 200);
}
@AfterClass(alwaysRun = true)
public void destroy() throws Exception {
super.cleanup();
}
private boolean isCarFileDeployed(String carFileName) throws Exception {
log.info("waiting " + MAX_TIME + " millis for car deployment " + carFileName);
boolean isCarFileDeployed = false;
Calendar startTime = Calendar.getInstance();
long time;
while ((time = (Calendar.getInstance().getTimeInMillis() - startTime.getTimeInMillis())) < MAX_TIME) {
String[] applicationList = applicationAdminClient.listAllApplications();
if (applicationList != null) {
if (ArrayUtils.contains(applicationList, carFileName)) {
isCarFileDeployed = true;
log.info("car file deployed in " + time + " mills");
return isCarFileDeployed;
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//ignore
}
}
return isCarFileDeployed;
}
public HttpsResponse postWithBasicAuth(String uri, String requestQuery, String contentType, String userName,
String password) throws IOException {
if (uri.startsWith("https://")) {
URL url = new URL(uri);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("POST");
String encode = new String(new org.apache.commons.codec.binary.Base64()
.encode((userName + ":" + password).getBytes(Charset.defaultCharset())), Charset.defaultCharset())
.replaceAll("\n", "");
conn.setRequestProperty("Authorization", "Basic " + encode);
conn.setDoOutput(true); // Triggers POST.
conn.setRequestProperty("Content-Type", contentType);
conn.setRequestProperty("charset", "utf-8");
conn.setRequestProperty("SOAPAction", "http://test/sendLetterRequest");
conn.setRequestProperty("Content-Length",
"" + Integer.toString(requestQuery.getBytes(Charset.defaultCharset()).length));
conn.setUseCaches(false);
conn.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(requestQuery);
conn.setReadTimeout(3000);
conn.connect();
System.out.println(conn.getRequestMethod());
// Get the response
boolean responseRecieved = false;
StringBuilder sb = new StringBuilder();
BufferedReader rd = null;
try {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), Charset.defaultCharset()));
String line;
while ((line = rd.readLine()) != null) {
responseRecieved = true;
sb.append(line);
}
} catch (FileNotFoundException ignored) {
} finally {
if (rd != null) {
rd.close();
}
if(!responseRecieved){
return new HttpsResponse(sb.toString(), 500);
}
wr.flush();
wr.close();
conn.disconnect();
}
return new HttpsResponse(sb.toString(), conn.getResponseCode());
}
return null;
}
}