/*   
    Copyright (C) 2013 ApPeAL Group, Politecnico di Torino

    This file is part of TraCI4J.

    TraCI4J is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    TraCI4J is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with TraCI4J.  If not, see <http://www.gnu.org/licenses/>.
*/

package it.polito.appeal.traci.test;

import static org.junit.Assert.*;

import java.io.IOException;
import java.net.InetAddress;

import it.polito.appeal.traci.SumoTraciConnection;

import org.apache.log4j.BasicConfigurator;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

@SuppressWarnings("javadoc")
public class RemoteTraCITest {

	private Process sumoProcess;

	private SumoTraciConnection conn;
	
	private static final int PORT = 5450;
	
	static {
		BasicConfigurator.configure();
	}
	
	@Before
	public void setUp() throws IOException, InterruptedException {
		String exe = System.getProperty(SumoTraciConnection.SUMO_EXE_PROPERTY);
		if (exe == null) {
			exe = "sumo";
		}
		
		String[] args = new String[] {
			exe,
			"-c", "test/sumo_maps/variable_speed_signs/test.sumo.cfg",
			"--remote-port", Integer.toString(PORT),
		};
		
		sumoProcess = Runtime.getRuntime().exec(args);
		
		try {
			int exitVal = sumoProcess.exitValue();
			throw new IOException("SUMO died with exit value " + exitVal);
		}
		catch (IllegalThreadStateException e) {
			// all OK, it's alive
		}
		
		conn = new SumoTraciConnection(InetAddress.getLocalHost(), PORT);
	}
	
	@After
	public void tearDown() throws IOException, InterruptedException {
		conn.close();
	}
	
	@Test
	public void testNotClosed() {
		assertFalse(conn.isClosed());
	}
	
	@Test
	public void testClosesIfAskedTo() throws IOException, InterruptedException {
		conn.close();
		assertTrue(conn.isClosed());
	}
	
	@Test
	public void testCommunicationWorks() throws IOException {
		int simTime = conn.getSimulationData().queryCurrentSimTime().get();
		assertEquals(0, simTime);
	}
}
