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