/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package otherTests.multicast;
import java.io.*;
import java.net.*;
import java.util.*;
import static java.util.Arrays.asList;
import org.junit.*;
import mockit.*;
public final class MessageTest
{
static final String testContents = "hello there";
void exerciseCodeUnderTest(StatusListener listener, Client... to)
{
final Message message = new Message(to, testContents, listener);
new TaskExecution() {
@Override public void run() { message.dispatch(); }
};
}
// A general-purpose utility class that waits for background task completion.
abstract static class TaskExecution implements Runnable
{
{
List<Thread> tasksBefore = getActiveTasks();
try {
//noinspection OverriddenMethodCallDuringObjectConstruction
run();
}
finally {
waitForCompletionOfNewTasks(tasksBefore);
}
}
private List<Thread> getActiveTasks()
{
Thread[] tasks = new Thread[2 * Thread.activeCount()];
Thread.enumerate(tasks);
return new ArrayList<Thread>(asList(tasks));
}
private void waitForCompletionOfNewTasks(List<Thread> tasksBefore)
{
List<Thread> tasksAfter = getActiveTasks();
tasksAfter.removeAll(tasksBefore);
for (Thread task : tasksAfter) {
try { task.join(); } catch (InterruptedException ignore) {}
}
}
}
@Test
public void sendMessageToMultipleClients(@Mocked final Socket con, @Mocked final StatusListener listener)
throws Exception
{
Client[] testClients = {new Client("client1"), new Client("client2")};
new Expectations() {{
con.getOutputStream(); result = new ByteArrayOutputStream();
con.getInputStream(); result = "reply1\n reply2\n";
}};
exerciseCodeUnderTest(listener, testClients);
for (final Client client : testClients) {
new VerificationsInOrder() {{
listener.messageSent(client);
listener.messageDisplayedByClient(client);
listener.messageReadByClient(client);
}};
}
}
}