GreetingIntegrationTests.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package hello;
  2. import static org.junit.Assert.*;
  3. import java.lang.reflect.Type;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.concurrent.CountDownLatch;
  7. import java.util.concurrent.TimeUnit;
  8. import java.util.concurrent.atomic.AtomicReference;
  9. import org.junit.Before;
  10. import org.junit.Test;
  11. import org.junit.runner.RunWith;
  12. import org.springframework.boot.test.context.SpringBootTest;
  13. import org.springframework.boot.web.server.LocalServerPort;
  14. import org.springframework.messaging.converter.MappingJackson2MessageConverter;
  15. import org.springframework.messaging.simp.stomp.StompCommand;
  16. import org.springframework.messaging.simp.stomp.StompFrameHandler;
  17. import org.springframework.messaging.simp.stomp.StompHeaders;
  18. import org.springframework.messaging.simp.stomp.StompSession;
  19. import org.springframework.messaging.simp.stomp.StompSessionHandler;
  20. import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter;
  21. import org.springframework.test.context.junit4.SpringRunner;
  22. import org.springframework.web.socket.WebSocketHttpHeaders;
  23. import org.springframework.web.socket.client.standard.StandardWebSocketClient;
  24. import org.springframework.web.socket.messaging.WebSocketStompClient;
  25. import org.springframework.web.socket.sockjs.client.SockJsClient;
  26. import org.springframework.web.socket.sockjs.client.Transport;
  27. import org.springframework.web.socket.sockjs.client.WebSocketTransport;
  28. @RunWith(SpringRunner.class)
  29. @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
  30. public class GreetingIntegrationTests {
  31. @LocalServerPort
  32. private int port;
  33. private SockJsClient sockJsClient;
  34. private WebSocketStompClient stompClient;
  35. private final WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
  36. @Before
  37. public void setup() {
  38. List<Transport> transports = new ArrayList<>();
  39. transports.add(new WebSocketTransport(new StandardWebSocketClient()));
  40. this.sockJsClient = new SockJsClient(transports);
  41. this.stompClient = new WebSocketStompClient(sockJsClient);
  42. this.stompClient.setMessageConverter(new MappingJackson2MessageConverter());
  43. }
  44. @Test
  45. public void getGreeting() throws Exception {
  46. final CountDownLatch latch = new CountDownLatch(1);
  47. final AtomicReference<Throwable> failure = new AtomicReference<>();
  48. StompSessionHandler handler = new TestSessionHandler(failure) {
  49. @Override
  50. public void afterConnected(final StompSession session, StompHeaders connectedHeaders) {
  51. session.subscribe("/topic/greetings", new StompFrameHandler() {
  52. @Override
  53. public Type getPayloadType(StompHeaders headers) {
  54. return Greeting.class;
  55. }
  56. @Override
  57. public void handleFrame(StompHeaders headers, Object payload) {
  58. Greeting greeting = (Greeting) payload;
  59. try {
  60. assertEquals("Hello, Spring!", greeting.getContent());
  61. } catch (Throwable t) {
  62. failure.set(t);
  63. } finally {
  64. session.disconnect();
  65. latch.countDown();
  66. }
  67. }
  68. });
  69. try {
  70. session.send("/app/hello", new HelloMessage("Spring"));
  71. } catch (Throwable t) {
  72. failure.set(t);
  73. latch.countDown();
  74. }
  75. }
  76. };
  77. this.stompClient.connect("ws://localhost:{port}/gs-guide-websocket", this.headers, handler, this.port);
  78. if (latch.await(3, TimeUnit.SECONDS)) {
  79. if (failure.get() != null) {
  80. throw new AssertionError("", failure.get());
  81. }
  82. }
  83. else {
  84. fail("Greeting not received");
  85. }
  86. }
  87. private class TestSessionHandler extends StompSessionHandlerAdapter {
  88. private final AtomicReference<Throwable> failure;
  89. public TestSessionHandler(AtomicReference<Throwable> failure) {
  90. this.failure = failure;
  91. }
  92. @Override
  93. public void handleFrame(StompHeaders headers, Object payload) {
  94. this.failure.set(new Exception(headers.toString()));
  95. }
  96. @Override
  97. public void handleException(StompSession s, StompCommand c, StompHeaders h, byte[] p, Throwable ex) {
  98. this.failure.set(ex);
  99. }
  100. @Override
  101. public void handleTransportError(StompSession session, Throwable ex) {
  102. this.failure.set(ex);
  103. }
  104. }
  105. }