/******************************************************************************* * Copyright (c) 2010 protos software gmbh (http://www.protos.de). * 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 *******************************************************************************/ package org.eclipse.etrice.runtime.java.messaging; import org.eclipse.etrice.runtime.java.messaging.Address; import org.eclipse.etrice.runtime.java.messaging.Message; import org.eclipse.etrice.runtime.java.messaging.MessageService; import junit.framework.TestCase; public class MessageServiceTest extends TestCase { public void testRun() { // testing basic functionality of MessageService and Dispatcher Address addr = new Address(0,0,0); MessageService msg_service = new MessageService(null, addr, "MessageService1"); DummyMessageReceiver receiver1 = new DummyMessageReceiver(new Address(0,0,1)); DummyMessageReceiver receiver2 = new DummyMessageReceiver(new Address(0,1,1)); DummyMessageReceiver receiver3 = new DummyMessageReceiver(new Address(1,1,1)); DummyMessageReceiver receiver4 = new DummyMessageReceiver(new Address(0,0,2)); DummyMessageReceiver receiver5 = new DummyMessageReceiver(new Address(0,1,2)); DummyMessageReceiver receiver6 = new DummyMessageReceiver(new Address(1,1,2)); msg_service.getMessageDispatcher().addMessageReceiver(receiver1); msg_service.getMessageDispatcher().addMessageReceiver(receiver2); msg_service.getMessageDispatcher().addMessageReceiver(receiver3); msg_service.getMessageDispatcher().addMessageReceiver(receiver4); msg_service.getMessageDispatcher().addMessageReceiver(receiver5); msg_service.getMessageDispatcher().addMessageReceiver(receiver6); Message msg1 = new Message(new Address(0,0,1)); Message msg2 = new Message(new Address(0,1,1)); Message msg3 = new Message(new Address(1,1,1)); Message msg4 = new Message(new Address(0,0,2)); Message msg5 = new Message(new Address(0,1,2)); Message msg6 = new Message(new Address(1,1,2)); msg_service.start(); msg_service.receive(msg1); msg_service.receive(msg2); msg_service.receive(msg3); msg_service.receive(msg4); msg_service.receive(msg5); msg_service.receive(msg6); try { // give the other thread in MessageService a bit time to compute the queue Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } assertEquals(msg1, receiver1.getLastReceivedMessage()); assertEquals(msg2, receiver2.getLastReceivedMessage()); assertEquals(msg3, receiver3.getLastReceivedMessage()); assertEquals(msg4, receiver4.getLastReceivedMessage()); assertEquals(msg5, receiver5.getLastReceivedMessage()); assertEquals(msg6, receiver6.getLastReceivedMessage()); } public void testMassiveMessaging(){ // testing massive use of messaging between two threads // current thread sends, MessageService has its own thread to dispatch the received messages // implicit test of race conditions -> test breaks if you take out the synchronized keywords from the MessageService Address addr = new Address(0,0,0); MessageService msg_service = new MessageService(null, addr, "MessageService1"); int max=3000; int max_iter=10; // create and register message receivers DummyMessageReceiver receiver[]=new DummyMessageReceiver[max]; for (int i=0; i<max; i++){ receiver[i] = new DummyMessageReceiver(new Address(0,0,1+i)); msg_service.getMessageDispatcher().addMessageReceiver(receiver[i]); } // Create all Messages Message msg[][]=new Message[max][max_iter]; for (int j=0; j<max_iter; j++){ for (int i=0; i<max; i++){ msg[i][j] = new Message(new Address(0,0,i+1)); } } // Start Message Service before sending the Messages to test the synchronization // This test fails without the synchronized keywords in the MessageService msg_service.start(); // send all messages for (int j=0; j<max_iter; j++){ for (int i=0; i<max; i++){ msg_service.receive(msg[i][j]); } } try { // give the other thread in MessageService a bit time to compute the queue // TODO: maybe not a good choice to make a sleep in a test, a better strategy for multi threaded unit tests is needed Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } for (int i=0; i<max; i++){ assertEquals(msg[i][max_iter-1], receiver[i].getLastReceivedMessage()); } } public void testMessageService() { Address addr = new Address(0,0,0); MessageService msg_service = new MessageService(null, addr, "MessageService1"); assertEquals(addr, msg_service.getAddress()); assertEquals(msg_service.getMessageDispatcher().getAddress().objectID, msg_service.getAddress().objectID+1); } public void testInstanceId() { Address addr = new Address(0,0,0); // setInstanceId via Constructor MessageService msg_service = new MessageService(null, addr, "MessageService1"); assertEquals("/MessageService1", msg_service.getInstancePath()); assertEquals("/MessageService1/Queue", msg_service.getMessageQueue().getInstancePath()); assertEquals("/MessageService1/Dispatcher", msg_service.getMessageDispatcher().getInstancePath()); } }