package org.wso2.carbon.esb.registry.caching;
import org.apache.log4j.Logger;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.wso2.carbon.integration.common.admin.client.LogViewerClient;
import org.wso2.esb.integration.common.clients.registry.PropertiesAdminServiceClient;
import org.wso2.carbon.logging.view.stub.types.carbon.LogEvent;
import org.wso2.esb.integration.common.utils.ESBIntegrationTest;
import java.rmi.RemoteException;
/**
* ESBJAVA-3267
* When cachableDuration is 0 or not specified in the tag, the resources are cached forever.
* This needs to be corrected as "no caching" if the entry is 0.
*/
public class CachableDurationTestCase extends ESBIntegrationTest {
Logger logger = Logger.getLogger(CachableDurationTestCase.class);
private PropertiesAdminServiceClient propertyPropertiesAdminServiceClient;
private LogViewerClient cli;
private static final String NAME = "cache_test";
private static final String PATH = "/_system/config";
private static final String OLD_VALUE = "123456789";
private static final String NEW_VALUE = "987654321";
private static final String ADD_URL = "http://localhost:9000/services/SimpleStockQuoteService";
private String trpUrl;
@BeforeClass(alwaysRun = true)
protected void init() throws Exception {
super.init();
trpUrl = contextUrls.getServiceUrl();
propertyPropertiesAdminServiceClient = new PropertiesAdminServiceClient(contextUrls.getBackEndUrl(),getSessionCookie());
cli = new LogViewerClient(contextUrls.getBackEndUrl(),getSessionCookie());
uploadResourcesToConfigRegistry();
loadESBConfigurationFromClasspath( "artifacts/ESB/synapseconfig/registry/caching/synapse.xml");
}
@Test(groups = "wso2.esb", description = "ESBRegistry cachableDuration 0 property test")
public void testCachableDuration() throws Exception {
//invoking the service
SendRequest(ADD_URL, trpUrl);
//response assertions
Thread.sleep(2000);
//Check if the property we set is used
boolean validLogMessage = validateLogMessage(OLD_VALUE);
Assert.assertTrue(validLogMessage);
//Update the registry value
updateResourcesInConfigRegistry();
Assert.assertTrue(propertyPropertiesAdminServiceClient.getProperty(PATH, NAME).getProperties()[0].getValue().equals(NEW_VALUE));
SendRequest(ADD_URL, trpUrl);
//response assertions
Thread.sleep(2000);
//Check if the new value is being used
boolean validChangedLogMessage = validateLogMessage(NEW_VALUE);
Assert.assertTrue(validChangedLogMessage);
}
private boolean validateLogMessage(String value) throws RemoteException {
LogEvent[] logs = cli.getAllSystemLogs();
Assert.assertNotNull(logs, "No logs found");
Assert.assertTrue(logs.length > 0, "No logs found");
boolean success = false;
for (LogEvent logEvent : logs) {
String msg = logEvent.getMessage();
if (msg.contains(value)) {
success = true;
break;
}
}
return success;
}
private void SendRequest(String addurl, String trpurl) {
try{
cli.clearLogs();
axis2Client.sendSimpleStockQuoteRequest(trpurl, addurl ,"IBM");
}catch (Exception e){
logger.debug(e.getMessage());
}
}
private void uploadResourcesToConfigRegistry() throws Exception {
propertyPropertiesAdminServiceClient.setProperty(PATH, NAME, OLD_VALUE);
}
private void updateResourcesInConfigRegistry() throws Exception {
try{
Thread.sleep(5000);
propertyPropertiesAdminServiceClient.removeProperty(PATH, NAME);
Thread.sleep(5000);
propertyPropertiesAdminServiceClient.setProperty(PATH, NAME, NEW_VALUE);
Thread.sleep(5000);
}catch (Exception e){
logger.error("Error while updating the registry property",e);
}
}
@AfterClass(alwaysRun = true)
public void unDeployService() throws Exception {
/* un deploying deployed artifact */
propertyPropertiesAdminServiceClient.removeProperty(PATH, NAME);
super.cleanup();
}
}