/******************************************************************************* * Copyright (c) 2009, 2015 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: * Evgeny Mandrikov - initial API and implementation * *******************************************************************************/ package org.jacoco.agent.rt.internal; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.lang.management.ManagementFactory; import javax.management.InstanceNotFoundException; import javax.management.MBeanServer; import javax.management.ObjectName; import org.jacoco.agent.rt.internal.output.IAgentOutput; import org.jacoco.agent.rt.internal.output.FileOutput; import org.jacoco.agent.rt.internal.output.NoneOutput; import org.jacoco.agent.rt.internal.output.TcpClientOutput; import org.jacoco.agent.rt.internal.output.TcpServerOutput; import org.jacoco.core.JaCoCo; import org.jacoco.core.data.ExecutionDataReader; import org.jacoco.core.data.ExecutionDataStore; import org.jacoco.core.data.SessionInfoStore; import org.jacoco.core.runtime.AgentOptions; import org.jacoco.core.runtime.AgentOptions.OutputMode; import org.jacoco.core.runtime.RuntimeData; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; /** * Unit tests for {@link Agent}. */ public class AgentTest implements IExceptionLogger { @Rule public TemporaryFolder folder = new TemporaryFolder(); private AgentOptions options; private File execfile; private Exception exception; @Before public void setup() { options = new AgentOptions(); execfile = new File(folder.getRoot(), "jacoco.exec"); options.setOutput(OutputMode.file); options.setDestfile(execfile.getAbsolutePath()); } @Test public void testCreateController() { Agent agent = new Agent(options, this); options.setOutput(OutputMode.file); assertEquals(FileOutput.class, agent.createAgentOutput() .getClass()); options.setOutput(OutputMode.tcpserver); assertEquals(TcpServerOutput.class, agent.createAgentOutput() .getClass()); options.setOutput(OutputMode.tcpclient); assertEquals(TcpClientOutput.class, agent.createAgentOutput() .getClass()); options.setOutput(OutputMode.none); assertEquals(NoneOutput.class, agent.createAgentOutput() .getClass()); } @Test public void testStartupShutdown() throws Exception { options.setSessionId("testsession"); Agent agent = new Agent(options, this); agent.startup(); assertEquals("testsession", agent.getData().getSessionId()); agent.shutdown(); assertTrue(execfile.isFile()); assertTrue(execfile.length() > 0); assertNull(exception); } @Test public void testShutdownWithException() throws Exception { final Exception expected = new Exception(); Agent agent = new Agent(options, this) { @Override IAgentOutput createAgentOutput() { return new IAgentOutput() { public void startup(AgentOptions options, RuntimeData data) { } public void shutdown() throws Exception { throw expected; } public void writeExecutionData(boolean reset) { } }; } }; agent.startup(); agent.shutdown(); assertSame(expected, exception); } @Test public void testNoSessionId() throws Exception { Agent agent = new Agent(options, this); final String defaultId = agent.getData().getSessionId(); agent.startup(); assertFalse(defaultId.equals(agent.getData().getSessionId())); assertNull(exception); } @Test public void testNoDumpOnExit() throws Exception { options.setDumpOnExit(false); Agent agent = new Agent(options, this); agent.startup(); agent.shutdown(); assertEquals(0, execfile.length()); assertNull(exception); } @Test public void testInvalidExecFile() throws Exception { options.setDestfile(folder.getRoot().getAbsolutePath()); Agent agent = new Agent(options, this); agent.startup(); assertTrue(exception instanceof IOException); } @Test public void testGetVersion() { Agent agent = new Agent(options, this); assertEquals(JaCoCo.VERSION, agent.getVersion()); } @Test public void testGetSetSessionId() throws IOException { Agent agent = new Agent(options, this); agent.startup(); agent.setSessionId("agenttestid"); assertEquals("agenttestid", agent.getSessionId()); SessionInfoStore sessionStore = new SessionInfoStore(); ExecutionDataReader reader = new ExecutionDataReader( new ByteArrayInputStream(agent.getExecutionData(false))); reader.setSessionInfoVisitor(sessionStore); reader.read(); assertEquals("agenttestid", sessionStore.getInfos().get(0).getId()); } @Test public void testReset() { Agent agent = new Agent(options, this); boolean[] probes = agent.getData() .getExecutionData(Long.valueOf(0x12345678), "Foo", 1) .getProbes(); probes[0] = true; agent.reset(); assertFalse(probes[0]); } @Test public void testGetExecutionData() throws IOException { options.setSessionId("agenttestid"); Agent agent = new Agent(options, this); agent.startup(); boolean[] probes = agent.getData() .getExecutionData(Long.valueOf(0x12345678), "Foo", 1) .getProbes(); probes[0] = true; byte[] data = agent.getExecutionData(true); // ensure reset has been executed assertFalse(probes[0]); ExecutionDataStore execStore = new ExecutionDataStore(); SessionInfoStore sessionStore = new SessionInfoStore(); ExecutionDataReader reader = new ExecutionDataReader( new ByteArrayInputStream(data)); reader.setExecutionDataVisitor(execStore); reader.setSessionInfoVisitor(sessionStore); reader.read(); assertEquals("Foo", execStore.get(0x12345678).getName()); assertEquals(1, sessionStore.getInfos().size()); assertEquals("agenttestid", sessionStore.getInfos().get(0).getId()); } @Test public void testDump() throws Exception { final boolean[] called = new boolean[1]; Agent agent = new Agent(options, this) { @Override IAgentOutput createAgentOutput() { return new IAgentOutput() { public void startup(AgentOptions options, RuntimeData data) { } public void shutdown() throws Exception { } public void writeExecutionData(boolean reset) { assertTrue(reset); called[0] = true; } }; } }; agent.startup(); agent.dump(true); assertTrue(called[0]); } @Test public void testJmx() throws Exception { options.setJmx(true); Agent agent = new Agent(options, this); agent.startup(); ObjectName objectName = new ObjectName("org.jacoco:type=Runtime"); final MBeanServer server = ManagementFactory.getPlatformMBeanServer(); assertEquals(JaCoCo.VERSION, server.getAttribute(objectName, "Version")); agent.shutdown(); try { server.getMBeanInfo(objectName); fail("InstanceNotFoundException expected"); } catch (InstanceNotFoundException expected) { } } @Test(expected = InstanceNotFoundException.class) public void testNoJmx() throws Exception { Agent agent = new Agent(options, this); agent.startup(); ObjectName objectName = new ObjectName("org.jacoco:type=Runtime"); ManagementFactory.getPlatformMBeanServer().getMBeanInfo(objectName); } // === IExceptionLogger === public void logExeption(Exception ex) { exception = ex; } }