package org.limewire.inspection; import java.util.ArrayList; import java.util.Collections; import java.util.List; import junit.framework.Test; import org.limewire.inject.EagerSingleton; import org.limewire.inject.GuiceUtils; import org.limewire.inject.LimeWireInjectModule; import org.limewire.util.BaseTestCase; import org.limewire.util.OSUtils; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Singleton; public class InspectionUtilsTest extends BaseTestCase { public InspectionUtilsTest(String name) { super(name); } static Injector injector; public static Test suite() { return buildTestSuite(InspectionUtilsTest.class); } @Override public void setUp() throws Exception { Requirements.created = false; injector = Guice.createInjector(getModules()); GuiceUtils.loadEagerSingletons(injector); } private Module[] getModules() { List<Module> modules = new ArrayList<Module>(); modules.add(new LimeWireInjectModule()); Module m = new AbstractModule() { @Override public void configure() { bind(TestInterface.class).to(TestClass.class); bind(TestInterface2.class).to(TestClass2.class); bind(SyncListInterface.class).to(SyncList.class); bind(SyncListInterface2.class).to(SyncList2.class); bind(OutterI.class).to(Outter.class); bind(Parent.class).to(ConcreteChild.class); bind(IConcrete.class).to(Concrete.class); bind(UsageData.class).to(UsageDataImpl.class); bind(NetworkData.class).to(NetworkDataImpl.class); } }; modules.add(m); return modules.toArray(new Module[modules.size()]); } public void testOldStyleTraversal() throws Exception { NotGuiced.inspectableInt = 1; NotGuiced.inspectable = new Inspectable() { @Override public Object inspect() { return "asdf"; } }; // injector-based traversal will fail try { InspectionUtils.inspectValue(nameOf(NotGuiced.class) + ":,inspectableInt", injector, true); } catch (InspectionException expected){} // static traversal will work assertEquals("asdf", InspectionUtils.inspectValue(nameOf(NotGuiced.class) + ":inspectable", injector, true)); assertEquals("1", InspectionUtils.inspectValue(nameOf(NotGuiced.class) + ":inspectableInt", injector, true)); } public void testInspectablePrimitive() throws Exception { TestInterface t = injector.getInstance(TestInterface.class); t.setMemberString("a"); t.setInspectableString("b"); try { InspectionUtils.inspectValue(nameOf(TestClass.class) + ",reference1,memberString", injector, true); fail("should not be inspectable"); } catch (InspectionException expcted){} String inspectable = (String)InspectionUtils.inspectValue(nameOf(TestClass.class) + ",inspectableString", injector, true); assertEquals("b", inspectable); } public void testInspectableForSize() throws Exception { TestInterface t = injector.getInstance(TestInterface.class); List<Object> member = new ArrayList<Object>(); List<Object> inspectable= new ArrayList<Object>(); member.add(new Object()); inspectable.add(new Object()); inspectable.add(new Object()); t.setMemeberList(member); t.setInspectableList(inspectable); try { InspectionUtils.inspectValue(nameOf(TestClass.class) + ",memberList", injector, true); fail("should not be inspectable for size"); } catch (InspectionException expcted){} String res = (String)InspectionUtils.inspectValue(nameOf(TestClass.class) + ",inspectableList", injector, true); assertEquals("2",res); } @SuppressWarnings("unchecked") public void testSyncCollection() throws Exception { SyncList syncList = injector.getInstance(SyncList.class); syncList.l = Collections.synchronizedList(new ArrayList()); syncList.l.add(new Object()); assertEquals(String.valueOf(syncList.l.size()),InspectionUtils.inspectValue(nameOf(SyncList.class) + ",l", injector, true)); SyncList2 syncList2 = injector.getInstance(SyncList2.class); syncList2.l = Collections.synchronizedList(new ArrayList()); syncList2.l.add(new Object()); assertEquals(String.valueOf(syncList2.l.size()),InspectionUtils.inspectValue(nameOf(SyncList2.class) + ",l", injector, true)); } public void testContainer() throws Exception { Object ret = InspectionUtils.inspectValue(nameOf(Outter.Inner.class) + ",inspectable", injector, true); assertEquals("asdf",ret); } public void testContainerInParent() throws Exception { Object ret = InspectionUtils.inspectValue(nameOf(Parent.class) + "|" + nameOf(AbstractParent.Inner.class) + ",inspectable", injector, true); assertEquals("abcd", ret); } public void testAbstractPoints() throws Exception { Object ret = InspectionUtils.inspectValue(nameOf(IConcrete.class) + "|" + nameOf(Abstract.class) + ",inspectableA", injector, true); assertEquals("qqqq", ret); } public void testRequirements() throws Exception { assertFalse(Requirements.created); if(OSUtils.isWindows()) { assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",x", injector, true)); assertTrue(Requirements.created); Requirements.created = false; try { assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",y", injector, true)); } catch(InspectionException x) { assertEquals("invalid limitations: [OS_OSX] on field: int " + Requirements.class.getName() + ".y", x.getMessage()); } assertFalse(Requirements.created); Requirements.created = false; try { assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",z", injector, true)); } catch(InspectionException x) { assertEquals("invalid limitations: [OS_LINUX] on field: int " + Requirements.class.getName() + ".z", x.getMessage()); } assertFalse(Requirements.created); } else if(OSUtils.isMacOSX()) { Requirements.created = false; try { assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",x", injector, true)); } catch(InspectionException x) { assertEquals("invalid limitations: [OS_WINDOWS] on field: int " + Requirements.class.getName() + ".x", x.getMessage()); } assertFalse(Requirements.created); assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",y", injector, true)); assertTrue(Requirements.created); Requirements.created = false; try { assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",z", injector, true)); } catch(InspectionException x) { assertEquals("invalid limitations: [OS_LINUX] on field: int " + Requirements.class.getName() + ".z", x.getMessage()); } assertFalse(Requirements.created); } else if(OSUtils.isLinux()) { Requirements.created = false; try { assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",x", injector, true)); } catch(InspectionException x) { assertEquals("invalid limitations: [OS_WINDOWS] on field: int " + Requirements.class.getName() + ".x", x.getMessage()); } assertFalse(Requirements.created); Requirements.created = false; try { assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",y", injector, true)); } catch(InspectionException x) { assertEquals("invalid limitations: [OS_OSX] on field: int " + Requirements.class.getName() + ".y", x.getMessage()); } assertFalse(Requirements.created); assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",z", injector, true)); assertTrue(Requirements.created); } else { Requirements.created = false; try { assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",x", injector, true)); } catch(InspectionException x) { assertEquals("invalid limitations: [OS_WINDOWS] on field: int " + Requirements.class.getName() + ".x", x.getMessage()); } assertFalse(Requirements.created); Requirements.created = false; try { assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",y", injector, true)); } catch(InspectionException x) { assertEquals("invalid limitations: [OS_OSX] on field: int " + Requirements.class.getName() + ".y", x.getMessage()); } assertFalse(Requirements.created); Requirements.created = false; try { assertEquals("5", InspectionUtils.inspectValue(nameOf(Requirements.class) + ",z", injector, true)); } catch(InspectionException x) { assertEquals("invalid limitations: [OS_LINUX] on field: int " + Requirements.class.getName() + ".z", x.getMessage()); } assertFalse(Requirements.created); } } public void testUsageData() throws InspectionException { UsageData usageData = injector.getInstance(UsageData.class); usageData.setUsageData("foo"); try { InspectionUtils.inspectValue(nameOf(UsageDataImpl.class) + ",data", injector, false); fail(); } catch (InspectionException e) { } assertEquals("foo", InspectionUtils.inspectValue(nameOf(UsageDataImpl.class) + ",data", injector, true)); } public void testNetworkData() throws InspectionException { NetworkData networkData = injector.getInstance(NetworkData.class); networkData.setNetworkData("foo"); networkData.setOtherNetworkData("bar"); assertEquals("foo", InspectionUtils.inspectValue(nameOf(NetworkDataImpl.class) + ",data", injector, false)); assertEquals("foo", InspectionUtils.inspectValue(nameOf(NetworkDataImpl.class) + ",data", injector, true)); assertEquals("bar", InspectionUtils.inspectValue(nameOf(NetworkDataImpl.class) + ",otherData", injector, false)); assertEquals("bar", InspectionUtils.inspectValue(nameOf(NetworkDataImpl.class) + ",otherData", injector, true)); } private static String nameOf(Class clazz) { return clazz.getName(); } @Singleton private static class Requirements { static boolean created = false; public Requirements() { created = true; } @InspectablePrimitive(value="win", requires = InspectionRequirement.OS_WINDOWS) int x = 5; @InspectablePrimitive(value="mac", requires = InspectionRequirement.OS_OSX) int y = 5; @InspectablePrimitive(value="lin", requires = InspectionRequirement.OS_LINUX) int z = 5; } private static interface TestInterface { void setReference1(TestInterface ti); void setReference2(TestInterface2 ti); void setObjectReference(Object reference); void setMemberString(String s); void setInspectableString(String s); void setMemeberList(List l); void setInspectableList(List l); } @SuppressWarnings("unused") @Singleton private static class TestClass implements TestInterface { private static TestInterface reference1; private static TestInterface2 reference2; public void setReference1(TestInterface ti) { reference1 = ti; } public void setReference2(TestInterface2 ti) { reference2 = ti; } private String memberString; @InspectablePrimitive("") private String inspectableString; public void setMemberString(String memberString) { this.memberString = memberString; } public void setInspectableString(String inspectableString) { this.inspectableString = inspectableString; } private List memberList; @InspectableForSize("") private List inspectableList; public void setMemeberList(List memberList) { this.memberList = memberList; } public void setInspectableList(List inspectableList) { this.inspectableList = inspectableList; } private Object reference; public void setObjectReference(Object reference) { this.reference = reference; } @Override public String toString() { return "testclass"; } } private static interface TestInterface2 { void setReference1(TestInterface ti); void setObjectReference(Object reference); } @Singleton @SuppressWarnings( { "unused", "FieldCanBeLocal", "UnusedDeclaration" }) private static class TestClass2 implements TestInterface2 { static TestInterface reference1; public void setReference1(TestInterface ti) { reference1 = ti; } private Object reference; public void setObjectReference(Object reference) { this.reference = reference; } @Override public String toString() { return "testclass2"; } } private static interface SyncListInterface { void setList(List l); } @Singleton private static class SyncList implements SyncListInterface { @InspectableForSize("") List l; public void setList(List l) { this.l = l; } } private static interface SyncListInterface2 { void setList(List l); } @EagerSingleton private static class SyncList2 implements SyncListInterface2 { @InspectableForSize("") List l; public void setList(List l) { this.l = l; } } private static interface OutterI { } @Singleton @SuppressWarnings( { "unused", "UnusedDeclaration" }) private static class Outter implements OutterI { @InspectableContainer private class Inner { @InspectionPoint("i") private final Inspectable inspectable = new Inspectable() { @Override public Object inspect() { return "asdf"; } }; } } private static class NotGuiced { @InspectablePrimitive("") static int inspectableInt; @InspectionPoint("insp") static Inspectable inspectable; } private static interface IConcrete {} private static abstract class Abstract implements IConcrete { @InspectablePrimitive("point") String inspectableA = "qqqq"; } @Singleton private static class Concrete extends Abstract {} private static interface Parent { } @SuppressWarnings( { "unused", "UnusedDeclaration" }) private static abstract class AbstractParent implements Parent { @InspectableContainer private class Inner { @InspectionPoint("i") private final Inspectable inspectable = new Inspectable() { @Override public Object inspect() { return "abcd"; } }; } } @Singleton private static class ConcreteChild extends AbstractParent { } private static interface UsageData { void setUsageData(String s); String getUsageData(); } @Singleton private static class UsageDataImpl implements UsageData { @InspectablePrimitive(value = "", category = DataCategory.USAGE) private String data; @Override public void setUsageData(String s) { this.data = s; } @Override public String getUsageData() { return data; } } private static interface NetworkData { void setNetworkData(String s); String getNetworkData(); void setOtherNetworkData(String s); String getOtherNetworkData(); } @Singleton private static class NetworkDataImpl implements NetworkData { @InspectablePrimitive(value = "", category = DataCategory.NETWORK) private String data; @InspectablePrimitive(value = "") private String otherData; @Override public void setNetworkData(String s) { this.data = s; } @Override public String getNetworkData() { return data; } @Override public void setOtherNetworkData(String s) { this.otherData = s; } @Override public String getOtherNetworkData() { return otherData; } } }