package net.bytebuddy.agent;
import net.bytebuddy.test.utility.ObjectPropertyAssertion;
import net.bytebuddy.test.utility.UnixSocketRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
import org.mockito.InOrder;
import java.io.IOException;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.spy;
public class VirtualMachineForHotSpotTest {
@Rule
public MethodRule unixSocketRule = new UnixSocketRule();
@Test
@UnixSocketRule.Enforce
public void testAttachment() throws Exception {
VirtualMachine.ForHotSpot virtualMachine = spy(new PseudoMachine(
"0".getBytes("UTF-8"),
new byte[]{10}
));
virtualMachine.loadAgent("foo", "bar");
InOrder order = inOrder(virtualMachine);
order.verify(virtualMachine).connect();
order.verify(virtualMachine).write("1".getBytes("UTF-8"));
order.verify(virtualMachine).write(new byte[1]);
order.verify(virtualMachine).write("load".getBytes("UTF-8"));
order.verify(virtualMachine).write(new byte[1]);
order.verify(virtualMachine).write("instrument".getBytes("UTF-8"));
order.verify(virtualMachine).write(new byte[1]);
order.verify(virtualMachine).write(Boolean.FALSE.toString().getBytes("UTF-8"));
order.verify(virtualMachine).write(new byte[1]);
order.verify(virtualMachine).write("foo=bar".getBytes("UTF-8"));
order.verify(virtualMachine).write(new byte[1]);
}
@Test
@UnixSocketRule.Enforce
public void testAttachmentWithoutArgument() throws Exception {
VirtualMachine.ForHotSpot virtualMachine = spy(new PseudoMachine(
"0".getBytes("UTF-8"),
new byte[]{10}
));
virtualMachine.loadAgent("foo", null);
InOrder order = inOrder(virtualMachine);
order.verify(virtualMachine).connect();
order.verify(virtualMachine).write("1".getBytes("UTF-8"));
order.verify(virtualMachine).write(new byte[1]);
order.verify(virtualMachine).write("load".getBytes("UTF-8"));
order.verify(virtualMachine).write(new byte[1]);
order.verify(virtualMachine).write("instrument".getBytes("UTF-8"));
order.verify(virtualMachine).write(new byte[1]);
order.verify(virtualMachine).write(Boolean.FALSE.toString().getBytes("UTF-8"));
order.verify(virtualMachine).write(new byte[1]);
order.verify(virtualMachine).write("foo".getBytes("UTF-8"));
order.verify(virtualMachine).write(new byte[1]);
}
@Test(expected = IOException.class)
@UnixSocketRule.Enforce
public void testAttachmentIncompatibleProtocol() throws Exception {
new PseudoMachine(
"1".getBytes("UTF-8"),
"0".getBytes("UTF-8"),
"1".getBytes("UTF-8"),
new byte[]{10}
).loadAgent("foo", null);
}
@Test(expected = IllegalStateException.class)
@UnixSocketRule.Enforce
public void testAttachmentUnknownError() throws Exception {
new PseudoMachine(
"1".getBytes("UTF-8"),
new byte[]{10},
"foo".getBytes("UTF-8")
).loadAgent("foo", null);
}
private static class PseudoMachine extends VirtualMachine.ForHotSpot {
private final byte[][] read;
private int index;
private PseudoMachine(byte[]... read) {
super(null);
this.read = read;
}
@Override
public void detach() throws IOException {
}
@Override
protected void connect() throws IOException {
}
@Override
protected int read(byte[] buffer) throws IOException {
if (index == read.length) {
return -1;
}
byte[] read = this.read[index++];
System.arraycopy(read, 0, buffer, 0, read.length);
return read.length;
}
@Override
protected void write(byte[] buffer) throws IOException {
}
}
}