package com.limegroup.gnutella;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import junit.framework.Test;
import org.limewire.util.BaseTestCase;
import org.limewire.util.OSUtils;
import org.limewire.util.PrivilegedAccessor;
/* This extends BaseTestCase on purpose! We don't want the overhead of LimeTestCase! */
public class LimeCoreGlueTest extends BaseTestCase {
public LimeCoreGlueTest(String name) {
super(name);
}
public static Test suite() {
return buildTestSuite(LimeCoreGlueTest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
// This test requires that the ClassLoader is implemented as we expect it.
// If a ClassLoader implementation changes, this test needs to change.
public void testPreinstallDoesntLoadExtraClasses() throws Exception {
List<Class> loaded = getLoadedClasses();
assertFalse("CommonUtils can't already be loaded!",
containsClass(loaded, "org.limewire.util.CommonUtils"));
LimeCoreGlue.preinstall();
List<Class> nextLoaded = getLoadedClasses();
List<String> expected = new LinkedList<String>(Arrays.asList(new String[]
{"com.limegroup.gnutella.LimeCoreGlue",
"com.limegroup.gnutella.LimeCoreGlue$InstallFailedException",
"org.limewire.setting.RemoteSettingManager",
"com.limegroup.gnutella.util.LimeWireUtils",
"org.limewire.util.CommonUtils",
"org.limewire.util.OSUtils",
"org.limewire.util.OSUtils$OSInspecter",
"org.limewire.util.FileUtils",
"com.limegroup.gnutella.util.Portable",
"com.limegroup.gnutella.util.PortableImpl",
"org.limewire.lifecycle.Service",
"org.limewire.logging.LogFactory",
"org.limewire.logging.Log",
"org.limewire.logging.LogImpl",
"org.limewire.inspection.Inspectable"}));
if(OSUtils.isWindows() || OSUtils.isMacOSX()) {
expected.add("org.limewire.util.SystemUtils");
expected.add("org.limewire.util.SystemUtils$SpecialLocations");
}
removeClasses(nextLoaded, expected);
ArrayList<Class> extraClasses = new ArrayList<Class>(nextLoaded);
extraClasses.removeAll(loaded);
assertEquals("loaded more classes than expected " + extraClasses +
" -- make sure nothing is using CommonUtils.getUserSettingsDir too early!",
loaded, nextLoaded);
}
@SuppressWarnings("unchecked")
private List<Class> getLoadedClasses() throws Exception {
ClassLoader loader = LimeCoreGlueTest.class.getClassLoader();
List<Class> list = new ArrayList<Class>((List<Class>)PrivilegedAccessor.getValue(loader, "classes"));
for(Iterator<Class> i = list.iterator(); i.hasNext(); ) {
Class next = i.next();
if(!next.getName().startsWith("org.limewire.") && !next.getName().startsWith("com.limegroup"))
i.remove();
}
return list;
}
private boolean containsClass(List<Class> classes, String expected) {
for(Class clazz : classes)
if(clazz.getName().equals(expected))
return true;
return false;
}
private void removeClasses(List<Class> classes, List<String> expected) {
List<String> found = new ArrayList<String>();
for(Iterator<Class> it = classes.iterator(); it.hasNext(); ) {
Class next = it.next();
String name = next.getName();
// remove artificial class name postfix added by Clover
int i = name.indexOf("$__CLR2_");
if (i != -1) {
name = name.substring(0, i);
}
if (expected.contains(name)) {
it.remove();
found.add(name);
}
}
expected.removeAll(found);
assertTrue("didn't find all expected classes: " + expected, expected.isEmpty());
}
}