// Path: src/test/java/org/nextrtc/signalingserver/BaseTest.java
// @ContextConfiguration(classes = {TestConfig.class})
// @RunWith(SpringJUnit4ClassRunner.class)
// public abstract class BaseTest {
// 
//     @Autowired
//     private CreateConversation create;
// 
//     @Autowired
//     private JoinConversation join;
// 
//     @Autowired
//     private Members members;
// 
//     @Autowired
//     private Conversations conversations;
// 
//     @Autowired
//     private List<EventChecker> checkers;
// 
//     @Autowired
//     private ApplicationContext context;
// 
//     @Before
//     public void reset() {
// 
//         for (String id : conversations.getAllIds()) {
//             conversations.remove(id);
//         }
//         for (String id : members.getAllIds()) {
//             members.unregister(id);
//         }
//         for (EventChecker checker : checkers) {
//             checker.reset();
//         }
//     }
// 
//     protected Connection mockConnection(String string) {
//         return mockConnection(string, new MessageMatcher());
//     }
// 
//     protected Connection mockConnection(String id, ArgumentMatcher<Message> match) {
//         Connection s = mock(Connection.class);
//         when(s.getId()).thenReturn(id);
//         when(s.isOpen()).thenReturn(true);
//         doNothing().when(s).sendObject(Mockito.argThat(match));
//         return s;
//     }
// 
//     protected Member mockMember(String string) {
//         return context.getBean(Member.class, mockConnection(string), mock(ScheduledFuture.class));
//     }
// 
//     protected Member mockMember(String string, ArgumentMatcher<Message> match) {
//         return context.getBean(Member.class, mockConnection(string, match), mock(ScheduledFuture.class));
//     }
// 
//     protected void createConversation(String conversationName, Member member) {
//         members.register(member);
//         create.execute(InternalMessage.create()//
//                 .from(member)//
//                 .content(conversationName)//
//                 .build());
//     }
// 
//     protected void createBroadcastConversation(String conversationName, Member member) {
//         members.register(member);
//         create.execute(InternalMessage.create()//
//                 .from(member)//
//                 .content(conversationName)//
//                 .addCustom("type", "BROADCAST")//
//                 .build());
//     }
// 
//     protected void joinConversation(String conversationName, Member member) {
//         members.register(member);
//         join.execute(InternalMessage.create()//
//                 .from(member)//
//                 .content(conversationName)//
//                 .build());
//     }
// 
//     protected void assertMessage(MessageMatcher matcher, int number, String from, String to, String signal, String content) {
//         assertThat(matcher.getMessage(number).getFrom(), is(from));
//         assertThat(matcher.getMessage(number).getTo(), is(to));
//         assertThat(matcher.getMessage(number).getSignal(), is(signal));
//         assertThat(matcher.getMessage(number).getContent(), is(content));
//     }
// }
// 
// Path: src/test/java/org/nextrtc/signalingserver/MessageMatcher.java
// @Slf4j
// public class MessageMatcher extends ArgumentMatcher<Message> {
// 
//     private final List<String> filter;
//     private List<Message> messages = Collections.synchronizedList(new ArrayList<>());
// 
//     public MessageMatcher() {
//         this.filter = Arrays.asList("ping");
//     }
// 
//     public MessageMatcher(String... filter) {
//         this.filter = Arrays.asList(filter);
//     }
// 
//     @Override
//     public boolean matches(Object argument) {
//         if (argument instanceof Message) {
//             Message msg = (Message) argument;
//             if (!filter.contains(msg.getSignal())) {
//                 messages.add(msg);
//             }
//             return true;
//         }
//         return false;
//     }
// 
//     public Message getMessage() {
//         return messages.get(0);
//     }
// 
//     public Message getMessage(int number) {
//         if (messages.size() <= number) {
//             return null;
//         }
//         return messages.get(number);
//     }
// 
//     public void reset() {
//         messages.clear();
//     }
// 
//     @Override
//     public String toString() {
//         StringBuilder sb = new StringBuilder();
//         for (Message msg : messages) {
//             sb.append(msg);
//             sb.append(", ");
//         }
//         return sb.toString();
//     }
// 
//     public List<Message> getMessages() {
//         return this.messages;
//     }
// 
//     public CheckMessage has(Predicate<Message> condition) {
//         return new CheckMessage().has(condition);
//     }
// 
//     public class CheckMessage {
//         private List<Predicate<Message>> predicates = new ArrayList<>();
// 
//         public CheckMessage has(Predicate<Message> condition) {
//             predicates.add(condition);
//             return this;
//         }
// 
//         public boolean check() {
//             return messages.stream()
//                     .filter(this::matchAllPredicates)
//                     .count() > 0;
//         }
// 
//         private boolean matchAllPredicates(final Message m) {
//             return predicates.stream().filter(p -> p.test(m)).count() == predicates.size();
//         }
//     }
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/repository/MemberRepository.java
// public interface MemberRepository extends Closeable{
//     Collection<String> getAllIds();
// 
//     Optional<Member> findBy(String id);
// 
//     Member register(Member member);
// 
//     void unregister(String id);
// 
// }


import org.junit.Test;
import org.nextrtc.signalingserver.BaseTest;
import org.nextrtc.signalingserver.MessageMatcher;
import org.nextrtc.signalingserver.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;
package org.nextrtc.signalingserver.domain;



public class PingTaskTest extends BaseTest {

    @Autowired
    private MessageSender sender;

    @Autowired
// Path: src/test/java/org/nextrtc/signalingserver/BaseTest.java
// @ContextConfiguration(classes = {TestConfig.class})
// @RunWith(SpringJUnit4ClassRunner.class)
// public abstract class BaseTest {
// 
//     @Autowired
//     private CreateConversation create;
// 
//     @Autowired
//     private JoinConversation join;
// 
//     @Autowired
//     private Members members;
// 
//     @Autowired
//     private Conversations conversations;
// 
//     @Autowired
//     private List<EventChecker> checkers;
// 
//     @Autowired
//     private ApplicationContext context;
// 
//     @Before
//     public void reset() {
// 
//         for (String id : conversations.getAllIds()) {
//             conversations.remove(id);
//         }
//         for (String id : members.getAllIds()) {
//             members.unregister(id);
//         }
//         for (EventChecker checker : checkers) {
//             checker.reset();
//         }
//     }
// 
//     protected Connection mockConnection(String string) {
//         return mockConnection(string, new MessageMatcher());
//     }
// 
//     protected Connection mockConnection(String id, ArgumentMatcher<Message> match) {
//         Connection s = mock(Connection.class);
//         when(s.getId()).thenReturn(id);
//         when(s.isOpen()).thenReturn(true);
//         doNothing().when(s).sendObject(Mockito.argThat(match));
//         return s;
//     }
// 
//     protected Member mockMember(String string) {
//         return context.getBean(Member.class, mockConnection(string), mock(ScheduledFuture.class));
//     }
// 
//     protected Member mockMember(String string, ArgumentMatcher<Message> match) {
//         return context.getBean(Member.class, mockConnection(string, match), mock(ScheduledFuture.class));
//     }
// 
//     protected void createConversation(String conversationName, Member member) {
//         members.register(member);
//         create.execute(InternalMessage.create()//
//                 .from(member)//
//                 .content(conversationName)//
//                 .build());
//     }
// 
//     protected void createBroadcastConversation(String conversationName, Member member) {
//         members.register(member);
//         create.execute(InternalMessage.create()//
//                 .from(member)//
//                 .content(conversationName)//
//                 .addCustom("type", "BROADCAST")//
//                 .build());
//     }
// 
//     protected void joinConversation(String conversationName, Member member) {
//         members.register(member);
//         join.execute(InternalMessage.create()//
//                 .from(member)//
//                 .content(conversationName)//
//                 .build());
//     }
// 
//     protected void assertMessage(MessageMatcher matcher, int number, String from, String to, String signal, String content) {
//         assertThat(matcher.getMessage(number).getFrom(), is(from));
//         assertThat(matcher.getMessage(number).getTo(), is(to));
//         assertThat(matcher.getMessage(number).getSignal(), is(signal));
//         assertThat(matcher.getMessage(number).getContent(), is(content));
//     }
// }
// 
// Path: src/test/java/org/nextrtc/signalingserver/MessageMatcher.java
// @Slf4j
// public class MessageMatcher extends ArgumentMatcher<Message> {
// 
//     private final List<String> filter;
//     private List<Message> messages = Collections.synchronizedList(new ArrayList<>());
// 
//     public MessageMatcher() {
//         this.filter = Arrays.asList("ping");
//     }
// 
//     public MessageMatcher(String... filter) {
//         this.filter = Arrays.asList(filter);
//     }
// 
//     @Override
//     public boolean matches(Object argument) {
//         if (argument instanceof Message) {
//             Message msg = (Message) argument;
//             if (!filter.contains(msg.getSignal())) {
//                 messages.add(msg);
//             }
//             return true;
//         }
//         return false;
//     }
// 
//     public Message getMessage() {
//         return messages.get(0);
//     }
// 
//     public Message getMessage(int number) {
//         if (messages.size() <= number) {
//             return null;
//         }
//         return messages.get(number);
//     }
// 
//     public void reset() {
//         messages.clear();
//     }
// 
//     @Override
//     public String toString() {
//         StringBuilder sb = new StringBuilder();
//         for (Message msg : messages) {
//             sb.append(msg);
//             sb.append(", ");
//         }
//         return sb.toString();
//     }
// 
//     public List<Message> getMessages() {
//         return this.messages;
//     }
// 
//     public CheckMessage has(Predicate<Message> condition) {
//         return new CheckMessage().has(condition);
//     }
// 
//     public class CheckMessage {
//         private List<Predicate<Message>> predicates = new ArrayList<>();
// 
//         public CheckMessage has(Predicate<Message> condition) {
//             predicates.add(condition);
//             return this;
//         }
// 
//         public boolean check() {
//             return messages.stream()
//                     .filter(this::matchAllPredicates)
//                     .count() > 0;
//         }
// 
//         private boolean matchAllPredicates(final Message m) {
//             return predicates.stream().filter(p -> p.test(m)).count() == predicates.size();
//         }
//     }
// }
// 
// Path: src/main/java/org/nextrtc/signalingserver/repository/MemberRepository.java
// public interface MemberRepository extends Closeable{
//     Collection<String> getAllIds();
// 
//     Optional<Member> findBy(String id);
// 
//     Member register(Member member);
// 
//     void unregister(String id);
// 
// }


// Path: src/test/java/org/nextrtc/signalingserver/domain/PingTaskTest.java
import org.junit.Test;
import org.nextrtc.signalingserver.BaseTest;
import org.nextrtc.signalingserver.MessageMatcher;
import org.nextrtc.signalingserver.repository.MemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.when;

package org.nextrtc.signalingserver.domain;



public class PingTaskTest extends BaseTest {

    @Autowired
    private MessageSender sender;

    @Autowired
    private MemberRepository members;