blob: dd3e35215ea6c0ed05fd9916c06a37ab7662164c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc R. Hoffmann - initial API and implementation
*
*******************************************************************************/
package org.jacoco.core.runtime;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.Callable;
import org.jacoco.core.test.TargetLoader;
import org.junit.Before;
import org.junit.Test;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
/**
* Unit tests for {@link RuntimeData}.
*
*/
public class RuntimeDataTest {
private RuntimeData data;
private TestStorage storage;
@Before
public void setup() {
data = new RuntimeData();
storage = new TestStorage();
}
@Test
public void testGetSetSessionId() {
assertNotNull(data.getSessionId());
data.setSessionId("test-id");
assertEquals("test-id", data.getSessionId());
}
@Test
public void testGetProbes() {
Object[] args = new Object[] { Long.valueOf(123), "Foo",
Integer.valueOf(3) };
data.equals(args);
assertEquals(3, ((boolean[]) args[0]).length);
data.collect(storage, storage, false);
boolean[] data = (boolean[]) args[0];
assertEquals(3, data.length, 0.0);
assertFalse(data[0]);
assertFalse(data[1]);
assertFalse(data[2]);
assertSame(storage.getData(123).getProbes(), data);
assertEquals("Foo", storage.getData(123).getName());
}
@Test
public void testCollectEmpty() {
data.collect(storage, storage, false);
storage.assertSize(0);
}
@Test
public void testCollectWithReset() {
data.setSessionId("testsession");
boolean[] probes = data.getExecutionData(Long.valueOf(123), "Foo", 1)
.getProbes();
probes[0] = true;
data.collect(storage, storage, true);
assertFalse(probes[0]);
assertEquals("testsession", storage.getSessionInfo().getId());
}
@Test
public void testCollectWithoutReset() {
data.setSessionId("testsession");
boolean[] probes = data.getExecutionData(Long.valueOf(123), "Foo", 1)
.getProbes();
probes[0] = true;
data.collect(storage, storage, false);
assertTrue(probes[0]);
assertEquals("testsession", storage.getSessionInfo().getId());
}
@Test
public void testEquals() {
assertTrue(data.equals(data));
}
@Test
public void testHashCode() {
assertEquals(System.identityHashCode(data), data.hashCode());
}
@Test
public void testGenerateArgumentArray() throws Exception {
final ClassWriter writer = new ClassWriter(0);
writer.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "Sample", null,
"java/lang/Object",
new String[] { Type.getInternalName(Callable.class) });
// Constructor
MethodVisitor mv = writer.visitMethod(Opcodes.ACC_PUBLIC, "<init>",
"()V", null, new String[0]);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>",
"()V", false);
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(1, 1);
mv.visitEnd();
// call()
mv = writer.visitMethod(Opcodes.ACC_PUBLIC, "call",
"()Ljava/lang/Object;", null, new String[0]);
mv.visitCode();
RuntimeData.generateArgumentArray(1000, "Sample", 15, mv);
mv.visitInsn(Opcodes.ARETURN);
mv.visitMaxs(5, 1);
mv.visitEnd();
writer.visitEnd();
final TargetLoader loader = new TargetLoader();
Callable<?> callable = (Callable<?>) loader.add("Sample",
writer.toByteArray()).newInstance();
final Object[] args = (Object[]) callable.call();
assertEquals(3, args.length, 0.0);
assertEquals(Long.valueOf(1000), args[0]);
assertEquals("Sample", args[1]);
assertEquals(Integer.valueOf(15), args[2]);
}
@Test
public void testGenerateAccessCall() throws Exception {
final boolean[] probes = data.getExecutionData(Long.valueOf(1234),
"Sample", 5).getProbes();
final ClassWriter writer = new ClassWriter(0);
writer.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC, "Sample", null,
"java/lang/Object",
new String[] { Type.getInternalName(Callable.class) });
// Constructor
MethodVisitor mv = writer.visitMethod(Opcodes.ACC_PUBLIC, "<init>",
"(Ljava/lang/Object;)V", null, new String[0]);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>",
"()V", false);
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitVarInsn(Opcodes.ALOAD, 1);
mv.visitFieldInsn(Opcodes.PUTFIELD, "Sample", "access",
"Ljava/lang/Object;");
mv.visitInsn(Opcodes.RETURN);
mv.visitMaxs(2, 2);
mv.visitEnd();
// call()
mv = writer.visitMethod(Opcodes.ACC_PUBLIC, "call",
"()Ljava/lang/Object;", null, new String[0]);
mv.visitCode();
mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitFieldInsn(Opcodes.GETFIELD, "Sample", "access",
"Ljava/lang/Object;");
RuntimeData.generateAccessCall(1234, "Sample", 5, mv);
mv.visitInsn(Opcodes.ARETURN);
mv.visitMaxs(6, 1);
mv.visitEnd();
writer.visitField(Opcodes.ACC_PRIVATE, "access", "Ljava/lang/Object;",
null, null);
writer.visitEnd();
final TargetLoader loader = new TargetLoader();
Callable<?> callable = (Callable<?>) loader
.add("Sample", writer.toByteArray())
.getConstructor(Object.class).newInstance(data);
assertSame(probes, callable.call());
}
}