1 package otherTests.multicast;
2
3 import static java.util.Arrays.asList;
4
5 import java.io.ByteArrayOutputStream;
6 import java.net.Socket;
7 import java.util.ArrayList;
8 import java.util.List;
9
10 import mockit.Expectations;
11 import mockit.Injectable;
12 import mockit.Mocked;
13 import mockit.Tested;
14 import mockit.VerificationsInOrder;
15
16 import org.junit.jupiter.api.Test;
17
18 final class MessageTest {
19
20 abstract static class TaskExecution implements Runnable {
21 {
22 List<Thread> tasksBefore = getActiveTasks();
23
24 try {
25
26
27 run();
28 } finally {
29 waitForCompletionOfNewTasks(tasksBefore);
30 }
31 }
32
33 private List<Thread> getActiveTasks() {
34 Thread[] tasks = new Thread[2 * Thread.activeCount()];
35 Thread.enumerate(tasks);
36 return new ArrayList<>(asList(tasks));
37 }
38
39 private void waitForCompletionOfNewTasks(List<Thread> tasksBefore) {
40 List<Thread> tasksAfter = getActiveTasks();
41 tasksAfter.removeAll(tasksBefore);
42
43 for (Thread task : tasksAfter) {
44 try {
45 task.join();
46 } catch (InterruptedException ignore) {
47 }
48 }
49 }
50 }
51
52 @Injectable
53 final String testContents = "hello there";
54 @Injectable
55 final Client[] testClients = { new Client("client1"), new Client("client2") };
56 @Injectable
57 StatusListener listener;
58 @Tested
59 Message message;
60
61 @Test
62 void sendMessageToMultipleClients(@Mocked final Socket con) throws Exception {
63 new Expectations() {
64 {
65 con.getOutputStream();
66 result = new ByteArrayOutputStream();
67 con.getInputStream();
68 result = "reply1\n reply2\n";
69 }
70 };
71
72
73 new TaskExecution() {
74 @Override
75 public void run() {
76 message.dispatch();
77 }
78 };
79
80
81 for (final Client client : testClients) {
82 new VerificationsInOrder() {
83 {
84 listener.messageSent(client);
85 listener.messageDisplayedByClient(client);
86 listener.messageReadByClient(client);
87 }
88 };
89 }
90 }
91 }