View Javadoc
1   /*
2    * MIT License
3    * Copyright (c) 2006-2025 JMockit developers
4    * See LICENSE file for full license text.
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      // A general-purpose utility class that waits for background task completion.
28      abstract static class TaskExecution implements Runnable {
29          {
30              List<Thread> tasksBefore = getActiveTasks();
31  
32              try {
33                  // noinspection
34                  // OverriddenMethodCallDuringObjectConstruction,OverridableMethodCallDuringObjectConstruction
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;// = new Message(testClients, testContents, listener);
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          // Code under test:
81          new TaskExecution() {
82              @Override
83              public void run() {
84                  message.dispatch();
85              }
86          };
87  
88          // Verification that each client received the expected invocations:
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  }