package org.apache.synapse.transport.vfs;
import junit.framework.TestCase;
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.description.TransportOutDescription;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.transport.OutTransportInfo;
import org.apache.commons.vfs2.FileSystemManager;
import org.apache.commons.vfs2.FilesCache;
import org.apache.commons.vfs2.cache.SoftRefFilesCache;
import org.apache.synapse.commons.vfs.VFSOutTransportInfo;
import java.lang.reflect.Field;
import java.util.Map;
public class VFSTransportSenderTest extends TestCase {
private static final int FILE_SEND_ITERATIONS = 2;
public void testMemoryLeakWhileLockCreation() throws AxisFault, NoSuchFieldException, IllegalAccessException {
VFSTransportSender vfsTransportSender = new VFSTransportSender();
ConfigurationContext configurationContext = new ConfigurationContext(new AxisConfiguration());
TransportOutDescription transportOutDescription = new TransportOutDescription("Test");
vfsTransportSender.init(configurationContext, transportOutDescription);
org.apache.axis2.context.MessageContext mc = new org.apache.axis2.context.MessageContext();
for (int i = 0; i < FILE_SEND_ITERATIONS; i++) {
String fName = "test1://foo/bar/test" + i + "-" + System.currentTimeMillis()
+ ".ack?transport.vfs.MaxRetryCount=0&transport.vfs.ReconnectTimeout=1";
OutTransportInfo outTransportInfo = new VFSOutTransportInfo(fName, true);
try {
vfsTransportSender.sendMessage(mc, fName, outTransportInfo);
} catch (AxisFault fse) {
//Ignore
}
}
//Perform the GC
System.gc();
Map<?, ?> refReverseMap = getSoftReferenceMap(vfsTransportSender);
assertEquals("If there is no memory leak, soft reference map size should be zero.", 0, refReverseMap.size());
}
private Map<?, ?> getSoftReferenceMap(VFSTransportSender vfsTransportSender)
throws NoSuchFieldException, IllegalAccessException {
Field field = VFSTransportSender.class.getDeclaredField("fsManager");
field.setAccessible(true);
FileSystemManager fsm = (FileSystemManager) field.get(vfsTransportSender);
FilesCache fileCache = fsm.getFilesCache();
SoftRefFilesCache softRefFilesCache = (SoftRefFilesCache) fileCache;
Field field1 = SoftRefFilesCache.class.getDeclaredField("refReverseMap");
field1.setAccessible(true);
return (Map<?, ?>) (Map) field1.get(softRefFilesCache);
}
}