/******************************************************************************* * Copyright (c) 2009, 2017 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: * Brock Janiczak - initial API and implementation * Marc R. Hoffmann - migration to mock socket * *******************************************************************************/ package org.jacoco.agent.rt.internal.output; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.List; import org.jacoco.agent.rt.internal.ExceptionRecorder; import org.jacoco.core.data.ExecutionDataStore; import org.jacoco.core.data.ExecutionDataWriter; import org.jacoco.core.data.SessionInfo; import org.jacoco.core.data.SessionInfoStore; import org.jacoco.core.runtime.AgentOptions; import org.jacoco.core.runtime.RemoteControlReader; import org.jacoco.core.runtime.RemoteControlWriter; import org.jacoco.core.runtime.RuntimeData; import org.junit.Before; import org.junit.Test; /** * Unit tests for {@link TcpServerOutput}. */ public class TcpServerOutputTest { private ExceptionRecorder logger; private AgentOptions options; private MockServerSocket serverSocket; private TcpServerOutput controller; private RuntimeData data; @Before public void setup() throws Exception { options = new AgentOptions(); logger = new ExceptionRecorder(); serverSocket = new MockServerSocket(); controller = new TcpServerOutput(logger) { @Override protected ServerSocket createServerSocket(AgentOptions options) throws IOException { return serverSocket; } }; data = new RuntimeData(); controller.startup(options, data); } @Test public void testShutdownWithoutConnection() throws Exception { serverSocket.waitForAccept(); controller.shutdown(); logger.assertNoException(); } @Test public void testShutdownWithConnection() throws Exception { serverSocket.waitForAccept(); new ExecutionDataWriter(serverSocket.connect().getOutputStream()); controller.shutdown(); logger.assertNoException(); } @Test public void testWriteExecutionData() throws Exception { data.getExecutionData(Long.valueOf(0x12345678), "Foo", 42).getProbes()[0] = true; data.setSessionId("stubid"); final Socket socket = serverSocket.connect(); final RemoteControlWriter remoteWriter = new RemoteControlWriter( socket.getOutputStream()); final RemoteControlReader remoteReader = new RemoteControlReader( socket.getInputStream()); // First process a NOP command to ensure the connection is initialized: remoteWriter.visitDumpCommand(false, false); remoteReader.read(); // Now the actual test starts: controller.writeExecutionData(false); final ExecutionDataStore execStore = new ExecutionDataStore(); remoteReader.setExecutionDataVisitor(execStore); final SessionInfoStore infoStore = new SessionInfoStore(); remoteReader.setSessionInfoVisitor(infoStore); remoteReader.read(); assertEquals("Foo", execStore.get(0x12345678).getName()); final List<SessionInfo> infos = infoStore.getInfos(); assertEquals(1, infos.size()); assertEquals("stubid", infos.get(0).getId()); logger.assertNoException(); controller.shutdown(); } @Test public void testInvalidHeader() throws Exception { final Socket socket = serverSocket.connect(); final OutputStream out = socket.getOutputStream(); out.write(0xca); out.write(0xfe); out.write(0xba); out.write(0xbe); serverSocket.waitForAccept(); logger.assertException(IOException.class, "Invalid execution data file."); controller.shutdown(); } @Test public void testGetInetAddressLoopback() throws UnknownHostException { final InetAddress addr = controller.getInetAddress(null); assertTrue(addr.isLoopbackAddress()); } @Test public void testGetInetAddressAny() throws UnknownHostException { final InetAddress addr = controller.getInetAddress("*"); assertNull(addr); } }