public void testWithNoPackage() throws Exception {

    RecorderLocator.clearRecorders();

    final URLClassLoader ourClassLoader =
        (URLClassLoader) BlockingClassLoader.class.getClassLoader();

    final BlockingClassLoader blockingClassLoader =
        new BlockingClassLoader(
            ourClassLoader, Arrays.<String>asList(AnotherClass.class.getName()));

    final NoPackageURLClassLoader cl =
        new NoPackageURLClassLoader(ourClassLoader.getURLs(), blockingClassLoader);

    final Class<?> noPackageClass = cl.loadClass(AnotherClass.class.getName());
    final Method noPackageMethod = noPackageClass.getMethod("getOne");

    assertEquals(1, noPackageMethod.invoke(null));
    m_recorderStubFactory.assertNoMoreCalls();

    final Object result = m_instrumenter.createInstrumentedProxy(null, m_recorder, noPackageClass);
    assertSame(noPackageClass, result);
    m_recorderStubFactory.assertNoMoreCalls();

    assertEquals(1, noPackageMethod.invoke(null));
    m_recorderStubFactory.assertSuccess("start");
    m_recorderStubFactory.assertSuccess("end", true);
    m_recorderStubFactory.assertNoMoreCalls();
  }
  public void testInstrumentInstance() throws Exception {

    RecorderLocator.clearRecorders();

    final MyClass c1 = new MyExtendedClass();

    assertEquals(0, c1.getA());
    m_recorderStubFactory.assertNoMoreCalls();

    final Object result = m_instrumenter.createInstrumentedProxy(null, m_recorder, c1);
    assertSame(c1, result);
    m_recorderStubFactory.assertNoMoreCalls();

    MyClass.staticSix();
    m_recorderStubFactory.assertNoMoreCalls();

    assertEquals(0, c1.getA());
    m_recorderStubFactory.assertSuccess("start");
    m_recorderStubFactory.assertSuccess("end", true);
    m_recorderStubFactory.assertNoMoreCalls();

    final MyClass c2 = new MyClass();
    assertEquals(0, c2.getA());
    m_recorderStubFactory.assertNoMoreCalls();
  }
  public void testArrays() throws Exception {

    RecorderLocator.clearRecorders();

    try {
      m_instrumenter.createInstrumentedProxy(null, m_recorder, new MyClass[0]);
      fail("Expected NotWrappableTypeException");
    } catch (NotWrappableTypeException e) {
    }

    try {
      m_instrumenter.createInstrumentedProxy(null, m_recorder, MyClass[].class);
      fail("Expected NotWrappableTypeException");
    } catch (NotWrappableTypeException e) {
    }

    m_recorderStubFactory.assertNoMoreCalls();
  }
  public void testInstrumentUnmodifiableCLass() throws Exception {

    final RandomStubFactory<Instrumentation> instrumentationStubFactory =
        RandomStubFactory.create(Instrumentation.class);
    final Instrumentation instrumentation = instrumentationStubFactory.getStub();

    ExposeInstrumentation.premain("", instrumentation);

    instrumentationStubFactory.setThrows("retransformClasses", new UnmodifiableClassException());

    // Create a new weaver to force the weaving.
    final JavaDCRInstrumenter instrumenter =
        new JavaDCRInstrumenter(
            new DCRWeaver(
                new ASMTransformerFactory(RecorderLocator.class),
                ExposeInstrumentation.getInstrumentation()),
            RecorderLocator.getRecorderRegistry());

    try {
      instrumenter.createInstrumentedProxy(null, m_recorder, MyClass.class);
      fail("Expected NotWrappableTypeException");
    } catch (NotWrappableTypeException e) {
    }
  }
 @Override
 protected void tearDown() throws Exception {
   super.tearDown();
   ExposeInstrumentation.premain("", m_originalInstrumentation);
   RecorderLocator.clearRecorders();
 }
 public TestJavaDCRInstrumenter() throws Exception {
   m_instrumenter = new JavaDCRInstrumenter(s_weaver, RecorderLocator.getRecorderRegistry());
 }