View Javadoc
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      // A general-purpose utility class that waits for background task completion.
20      abstract static class TaskExecution implements Runnable {
21          {
22              List<Thread> tasksBefore = getActiveTasks();
23  
24              try {
25                  // noinspection
26                  // OverriddenMethodCallDuringObjectConstruction,OverridableMethodCallDuringObjectConstruction
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;// = new Message(testClients, testContents, listener);
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          // Code under test:
73          new TaskExecution() {
74              @Override
75              public void run() {
76                  message.dispatch();
77              }
78          };
79  
80          // Verification that each client received the expected invocations:
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  }