<<<<<<< HEAD /* Copyright (C) 2011 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; import static org.junit.Assert.*; import it.polito.appeal.traci.protocol.Command; import it.polito.appeal.traci.protocol.Constants; import it.polito.appeal.traci.protocol.RequestMessage; import it.polito.appeal.traci.protocol.ResponseMessage; import it.polito.appeal.traci.protocol.ResponseContainer; import it.polito.appeal.traci.query.SimStepQuery; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Here we verify some assumptions about the TraCI protocol and the behaviour of * SUMO. * * @author Enrico Gueli <enrico.gueli@polito.it> * */ public class TraCIServerTest { /** * The system property name to get the executable path and name to run. */ public static final String SUMO_EXE_PROPERTY = "it.polito.appeal.traci.sumo_exe"; public static final int TRACI_PORT = 15000; private DataInputStream inStream; private DataOutputStream outStream; private Socket socket; private Process sumoProcess; @Before public void setUp() throws UnknownHostException, IOException, InterruptedException { runSUMO(); Thread.sleep(1000); socket = new Socket(); socket.connect(new InetSocketAddress(InetAddress.getLocalHost(), TRACI_PORT)); inStream = new DataInputStream(socket.getInputStream()); outStream = new DataOutputStream(socket.getOutputStream()); } private void runSUMO() throws IOException { final String sumoEXE = System.getProperty(SUMO_EXE_PROPERTY); if (sumoEXE == null) throw new RuntimeException("System property " + SUMO_EXE_PROPERTY + " must be set"); String[] args; args = new String[] { sumoEXE, "-c", "test/sumo_maps/box1l/test.sumo.cfg", "--remote-port", Integer.toString(TRACI_PORT) }; sumoProcess = Runtime.getRuntime().exec(args); } @After public void tearDown() throws IOException, InterruptedException { inStream.close(); outStream.close(); sumoProcess.waitFor(); } @Test public void testJustConnect() { } @Test public void testGetVersionLowLevel() throws IOException { outStream.writeInt(6); // msg length outStream.writeByte(2); // cmd length outStream.writeByte(Constants.CMD_GETVERSION); int msgLength = inStream.readInt(); System.out.println("message length = " + msgLength); assertTrue("minimum message length", msgLength >= 21); /* byte[] all = new byte[msgLength - 4]; inStream.readFully(all); System.out.println(Arrays.toString(all)); fail(); */ testVersionResponseLowLevel(); } private void testVersionResponseLowLevel() throws IOException { assertEquals("status resp len", 7, inStream.readByte()); assertEquals("status resp ID", Constants.CMD_GETVERSION, inStream.readByte()); assertEquals("status code OK", 0, inStream.readByte()); assertEquals("status descr empty", 0, inStream.readInt()); int respLen = inStream.readByte(); System.out.println("response length = " + respLen); assertTrue("minimum response length", respLen > 5); assertEquals("Response ID", Constants.CMD_GETVERSION, inStream.readByte()); assertEquals("API version", 1, inStream.readInt()); int nameLen = inStream.readInt(); assertEquals(1 + 1 + 4 + 4 + nameLen, respLen); byte[] name = new byte[nameLen]; inStream.readFully(name); System.out.println("Version name: \"" + new String(name) + "\""); } @Test public void testTwoGetVersion() throws IOException { outStream.writeInt(8); // msg length outStream.writeByte(2); // cmd length outStream.writeByte(Constants.CMD_GETVERSION); outStream.writeByte(2); // cmd length outStream.writeByte(Constants.CMD_GETVERSION); int msgLength = inStream.readInt(); System.out.println("message length = " + msgLength); assertTrue("minimum message length", msgLength > 21); /* byte[] all = new byte[msgLength - 4]; inStream.readFully(all); System.out.println(Arrays.toString(all)); fail(); */ testVersionResponseLowLevel(); testVersionResponseLowLevel(); } @Test public void testLongMessageLowLevel() throws IOException { final int REPETITIONS = 30; outStream.writeInt(4 + 2 * REPETITIONS); for (int i=0; i<REPETITIONS; i++) { outStream.writeByte(2); // cmd length outStream.writeByte(Constants.CMD_GETVERSION); } int msgLength = inStream.readInt(); System.out.println("message length = " + msgLength); assertTrue("minimum message length", msgLength > 255); for (int i=0; i<REPETITIONS; i++) { testVersionResponseLowLevel(); } } @Test public void testGetVersionHighLevel() throws IOException { RequestMessage reqm = new RequestMessage(); reqm.append(new Command(Constants.CMD_GETVERSION)); reqm.writeTo(outStream); ResponseMessage respm = new ResponseMessage(inStream); assertEquals(1, respm.responses().size()); ResponseContainer pair = respm.responses().get(0); assertEquals(Constants.CMD_GETVERSION, pair.getStatus().id()); Command resp = pair.getResponse(); assertEquals(Constants.CMD_GETVERSION, resp.id()); assertEquals(1, resp.content().readInt()); System.out.println(resp.content().readStringASCII()); } @Test public void testCloseHighLevel() throws IOException { RequestMessage reqm = new RequestMessage(); reqm.append(new Command(Constants.CMD_CLOSE)); reqm.writeTo(outStream); ResponseMessage respm = new ResponseMessage(inStream); assertEquals(1, respm.responses().size()); ResponseContainer pair = respm.responses().get(0); assertEquals(Constants.CMD_CLOSE, pair.getStatus().id()); assertEquals("Goodbye", pair.getStatus().description()); // undocumented! assertNull(pair.getResponse()); } /** * What happens when the simulation ends? * @throws IOException */ public void testSimulationEnd() throws IOException { SimStepQuery ssq = new SimStepQuery(socket, 1000); while(true) ssq.doCommand(); } } ======= /* Copyright (C) 2011 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; import static org.junit.Assert.*; import it.polito.appeal.traci.protocol.Command; import it.polito.appeal.traci.protocol.Constants; import it.polito.appeal.traci.protocol.RequestMessage; import it.polito.appeal.traci.protocol.ResponseMessage; import it.polito.appeal.traci.protocol.ResponseContainer; import it.polito.appeal.traci.query.SimStepQuery; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Here we verify some assumptions about the TraCI protocol and the behaviour of * SUMO. * * @author Enrico Gueli <enrico.gueli@polito.it> * */ public class TraCIServerTest { /** * The system property name to get the executable path and name to run. */ public static final String SUMO_EXE_PROPERTY = "it.polito.appeal.traci.sumo_exe"; public static final int TRACI_PORT = 15000; private DataInputStream inStream; private DataOutputStream outStream; private Socket socket; private Process sumoProcess; @Before public void setUp() throws UnknownHostException, IOException, InterruptedException { runSUMO(); Thread.sleep(1000); socket = new Socket(); socket.connect(new InetSocketAddress(InetAddress.getLocalHost(), TRACI_PORT)); inStream = new DataInputStream(socket.getInputStream()); outStream = new DataOutputStream(socket.getOutputStream()); } private void runSUMO() throws IOException { final String sumoEXE = System.getProperty(SUMO_EXE_PROPERTY); if (sumoEXE == null) throw new RuntimeException("System property " + SUMO_EXE_PROPERTY + " must be set"); String[] args; args = new String[] { sumoEXE, "-c", "test/sumo_maps/box1l/test.sumo.cfg", "--remote-port", Integer.toString(TRACI_PORT) }; sumoProcess = Runtime.getRuntime().exec(args); } @After public void tearDown() throws IOException, InterruptedException { inStream.close(); outStream.close(); sumoProcess.waitFor(); } @Test public void testJustConnect() { } @Test public void testGetVersionLowLevel() throws IOException { outStream.writeInt(6); // msg length outStream.writeByte(2); // cmd length outStream.writeByte(Constants.CMD_GETVERSION); int msgLength = inStream.readInt(); System.out.println("message length = " + msgLength); assertTrue("minimum message length", msgLength >= 21); /* byte[] all = new byte[msgLength - 4]; inStream.readFully(all); System.out.println(Arrays.toString(all)); fail(); */ testVersionResponseLowLevel(); } private void testVersionResponseLowLevel() throws IOException { assertEquals("status resp len", 7, inStream.readByte()); assertEquals("status resp ID", Constants.CMD_GETVERSION, inStream.readByte()); assertEquals("status code OK", 0, inStream.readByte()); assertEquals("status descr empty", 0, inStream.readInt()); int respLen = inStream.readByte(); System.out.println("response length = " + respLen); assertTrue("minimum response length", respLen > 5); assertEquals("Response ID", Constants.CMD_GETVERSION, inStream.readByte()); assertEquals("API version", 1, inStream.readInt()); int nameLen = inStream.readInt(); assertEquals(1 + 1 + 4 + 4 + nameLen, respLen); byte[] name = new byte[nameLen]; inStream.readFully(name); System.out.println("Version name: \"" + new String(name) + "\""); } @Test public void testTwoGetVersion() throws IOException { outStream.writeInt(8); // msg length outStream.writeByte(2); // cmd length outStream.writeByte(Constants.CMD_GETVERSION); outStream.writeByte(2); // cmd length outStream.writeByte(Constants.CMD_GETVERSION); int msgLength = inStream.readInt(); System.out.println("message length = " + msgLength); assertTrue("minimum message length", msgLength > 21); /* byte[] all = new byte[msgLength - 4]; inStream.readFully(all); System.out.println(Arrays.toString(all)); fail(); */ testVersionResponseLowLevel(); testVersionResponseLowLevel(); } @Test public void testLongMessageLowLevel() throws IOException { final int REPETITIONS = 30; outStream.writeInt(4 + 2 * REPETITIONS); for (int i=0; i<REPETITIONS; i++) { outStream.writeByte(2); // cmd length outStream.writeByte(Constants.CMD_GETVERSION); } int msgLength = inStream.readInt(); System.out.println("message length = " + msgLength); assertTrue("minimum message length", msgLength > 255); for (int i=0; i<REPETITIONS; i++) { testVersionResponseLowLevel(); } } @Test public void testGetVersionHighLevel() throws IOException { RequestMessage reqm = new RequestMessage(); reqm.append(new Command(Constants.CMD_GETVERSION)); reqm.writeTo(outStream); ResponseMessage respm = new ResponseMessage(inStream); assertEquals(1, respm.responses().size()); ResponseContainer pair = respm.responses().get(0); assertEquals(Constants.CMD_GETVERSION, pair.getStatus().id()); Command resp = pair.getResponse(); assertEquals(Constants.CMD_GETVERSION, resp.id()); assertEquals(1, resp.content().readInt()); System.out.println(resp.content().readStringASCII()); } @Test public void testCloseHighLevel() throws IOException { RequestMessage reqm = new RequestMessage(); reqm.append(new Command(Constants.CMD_CLOSE)); reqm.writeTo(outStream); ResponseMessage respm = new ResponseMessage(inStream); assertEquals(1, respm.responses().size()); ResponseContainer pair = respm.responses().get(0); assertEquals(Constants.CMD_CLOSE, pair.getStatus().id()); assertEquals("Goodbye", pair.getStatus().description()); // undocumented! assertNull(pair.getResponse()); } /** * What happens when the simulation ends? * @throws IOException */ public void testSimulationEnd() throws IOException { SimStepQuery ssq = new SimStepQuery(socket, 1000); while(true) ssq.doCommand(); } } >>>>>>> origin/abdalla