package com.netthreads.osc.network; import static org.junit.Assert.assertTrue; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.junit.Before; import org.junit.Test; import com.netthreads.network.osc.client.OSCClient; import com.netthreads.network.osc.client.OSCClientImpl; import com.netthreads.osc.common.domain.OSCBundle; import com.netthreads.osc.note.service.AppNotes; import com.netthreads.osc.note.service.MIDINoteDefinition; import com.netthreads.osc.note.service.NoteDefinition; import com.netthreads.osc.note.service.NoteModel; import com.netthreads.osc.note.service.NoteModelImpl; import com.netthreads.osc.test.task.OSCClientTask; import com.netthreads.osc.test.task.OSCServerTask; /** * Simple test of sending and receiving OSC messages between client and server * objects. * */ public class ClientServerTest { private static final int TASK_COUNT = 2; private static final int MSG_COUNT = 2; private static final int NOTE_COUNT = 5; public static final String DEFAULT_HOST = "localhost"; public static final int DEFAULT_PORT = 9000; private NoteModel noteModel; private OSCClient oscClient; private ExecutorService executor; private OSCServerTask serverTask; private OSCClientTask clientTask; /** * Set up components. * */ @Before public void before() { noteModel = AppInjector.getInjector().getInstance(NoteModel.class); initialiseNotes(noteModel); oscClient = AppInjector.getInjector().getInstance(OSCClientImpl.class); executor = Executors.newFixedThreadPool(TASK_COUNT); } /** * Test sending messages from client to server. * * TODO: Is there a neater way to do this? */ @Test public void testClientServer() { // --------------------------------------------------------------- // Initialise test notes // --------------------------------------------------------------- initNotes(); // --------------------------------------------------------------- // Server // --------------------------------------------------------------- serverTask = new OSCServerTask(DEFAULT_PORT, MSG_COUNT); executor.submit(serverTask); // --------------------------------------------------------------- // Client // --------------------------------------------------------------- boolean connected = oscClient.connect(DEFAULT_HOST, DEFAULT_PORT); if (connected) { clientTask = new OSCClientTask(oscClient, noteModel); executor.submit(clientTask); // Pause try { Thread.sleep(1000); List<OSCBundle> bundles = serverTask.getBundles(); int size = bundles.size(); assertTrue(size == MSG_COUNT); for (OSCBundle oscBundle : bundles) { assertTrue(oscBundle.getMessages().size() == NOTE_COUNT); } } catch (InterruptedException e) { e.printStackTrace(); } } executor.shutdown(); } /** * Initialise notes. * * @param data * The note active array. */ private void initialiseNotes(NoteModel noteModel) { NoteDefinition data[][] = noteModel.getNotes(); for (int i = 0; i < NoteModelImpl.COUNT_PANELS; i++) { for (int j = 0; j < NoteModelImpl.COUNT_NOTES; j++) { Integer note = MIDINoteDefinition.NOTES.get(AppNotes.APP_NOTES[j]); /** * Channels go 1..16 not 0..15 */ data[i][j] = new NoteDefinition(note, i + 1); } } } /** * Activate example notes in model. * */ private void initNotes() { for (int i = 0; i < NOTE_COUNT; i++) { noteModel.setState(0, 0, i, true); } } }