Skip to content

Commit beebf5d

Browse files
jimmaasoldano
authored andcommitted
[RESTEASY-2689]:Add a test case
1 parent a90b583 commit beebf5d

File tree

3 files changed

+143
-2
lines changed

3 files changed

+143
-2
lines changed

testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/sse/SseResource.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package org.jboss.resteasy.test.providers.sse;
22

33
import java.io.IOException;
4+
import java.io.InputStreamReader;
5+
import java.io.Reader;
6+
import java.net.URISyntaxException;
47
import java.util.ArrayList;
58
import java.util.List;
69
import java.util.concurrent.ExecutorService;
@@ -341,4 +344,60 @@ public void noEventStream(@Context SseEventSink eventSink) throws Exception {
341344
}
342345
eventSink.close();
343346
}
347+
348+
@GET
349+
@Path("/bigmsg")
350+
@Produces(MediaType.SERVER_SENT_EVENTS)
351+
public void bigEventMsg(@Context SseEventSink sink) throws IOException, URISyntaxException
352+
{
353+
if (sink == null)
354+
{
355+
throw new IllegalStateException("No client connected.");
356+
}
357+
this.eventSink = sink;
358+
ExecutorService service = (ExecutorService) servletContext
359+
.getAttribute(ExecutorServletContextListener.TEST_EXECUTOR);
360+
java.io.InputStream inputStream = SseResource.class.getResourceAsStream("bigmsg.json");
361+
String bigMsg = toString(new InputStreamReader(inputStream));
362+
service.execute(new Thread()
363+
{
364+
public void run()
365+
{
366+
if (!eventSink.isClosed() && sending)
367+
{
368+
try
369+
{
370+
synchronized (openLock)
371+
{
372+
eventSink.send(sse.newEvent(bigMsg));
373+
}
374+
Thread.sleep(200);
375+
}
376+
catch (final InterruptedException e)
377+
{
378+
logger.error(e.getMessage(), e);
379+
}
380+
381+
}
382+
}
383+
});
384+
}
385+
386+
public static String toString(final Reader input) throws IOException {
387+
388+
final char[] buffer = new char[2048];
389+
StringBuilder strBuilder = new StringBuilder();
390+
try (Reader r = input) {
391+
int n = r.read(buffer);
392+
while (-1 != n) {
393+
if (n == 0) {
394+
throw new IOException("0 bytes read in violation of InputStream.read(byte[])");
395+
}
396+
strBuilder.append(buffer, 0, n);
397+
n = r.read(buffer);
398+
}
399+
return strBuilder.toString();
400+
}
401+
}
402+
344403
}

testsuite/integration-tests/src/test/java/org/jboss/resteasy/test/providers/sse/SseTest.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package org.jboss.resteasy.test.providers.sse;
22

3+
import java.nio.file.Files;
4+
import java.nio.file.Paths;
35
import java.util.ArrayList;
46
import java.util.Arrays;
57
import java.util.List;
8+
import java.util.Map;
69
import java.util.SortedSet;
710
import java.util.TreeSet;
811
import java.util.concurrent.CountDownLatch;
@@ -40,6 +43,8 @@
4043
import org.junit.Test;
4144
import org.junit.runner.RunWith;
4245

46+
import com.fasterxml.jackson.databind.ObjectMapper;
47+
4348
@RunWith(Arquillian.class)
4449
@RunAsClient
4550
public class SseTest
@@ -52,14 +57,16 @@ public static Archive<?> deploy()
5257
{
5358
WebArchive war = TestUtil.prepareArchive(SseTest.class.getSimpleName());
5459
war.addClass(SseTest.class);
60+
war.addAsResource("org/jboss/resteasy/test/providers/sse/bigmsg.json", "org/jboss/resteasy/test/providers/sse/bigmsg.json");
5561
war.addAsWebInfResource("org/jboss/resteasy/test/providers/sse/web.xml", "web.xml");
5662
war.addAsWebResource("org/jboss/resteasy/test/providers/sse/index.html", "index.html");
5763
war.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
5864
war.addAsManifestResource(PermissionUtil.createPermissionsXmlAsset(
5965
new RuntimePermission("modifyThread")
6066
), "permissions.xml");
6167
return TestUtil.finishContainerPrepare(war, null, SseApplication.class, GreenHouse.class, SseResource.class,
62-
AnotherSseResource.class, EscapingSseResource.class, ExecutorServletContextListener.class);
68+
AnotherSseResource.class, EscapingSseResource.class, ExecutorServletContextListener.class);
69+
6370
}
6471

6572
private String generateURL(String path)
@@ -559,7 +566,45 @@ public void testNoContent() throws Exception
559566
Assert.assertTrue("error is not expected", errors.get() == 0);
560567
client.close();
561568
}
562-
569+
//Test for RESTEASY-2689 which is reported in quarkus: https://github.com/quarkusio/quarkus/issues/11824
570+
@Test
571+
@InSequence(14)
572+
public void testBigMessage() throws Exception
573+
{
574+
final CountDownLatch latch = new CountDownLatch(1);
575+
final AtomicInteger errors = new AtomicInteger(0);
576+
final List<String> results = new ArrayList<String>();
577+
Client client = ClientBuilder.newBuilder().build();
578+
WebTarget target = client.target(generateURL("/service/server-sent-events/bigmsg"));
579+
SseEventSource msgEventSource = SseEventSource.target(target).build();
580+
try (SseEventSource eventSource = msgEventSource)
581+
{
582+
Assert.assertEquals(SseEventSourceImpl.class, eventSource.getClass());
583+
eventSource.register(event -> {
584+
results.add(event.readData());
585+
latch.countDown();
586+
}, ex -> {
587+
errors.incrementAndGet();
588+
logger.error(ex.getMessage(), ex);
589+
throw new RuntimeException(ex);
590+
}) ;
591+
eventSource.open();
592+
boolean waitResult = latch.await(30, TimeUnit.SECONDS);
593+
Assert.assertEquals(0, errors.get());
594+
Assert.assertTrue("Waiting for event to be delivered has timed out.", waitResult);
595+
}
596+
Assert.assertFalse("SseEventSource is not closed", msgEventSource.isOpen());
597+
Assert.assertTrue("1 messages are expected, but is : " + results.size(), results.size() == 1);
598+
java.nio.file.Path filepath= Paths.get(SseTest.class.getResource("bigmsg.json").toURI());
599+
String bigMsg = new String(Files.readAllBytes(filepath));
600+
ObjectMapper om = new ObjectMapper();
601+
@SuppressWarnings("unchecked")
602+
Map<String, Object> m1 = (Map<String, Object>)(om.readValue(bigMsg, Map.class));
603+
@SuppressWarnings("unchecked")
604+
Map<String, Object> m2 = (Map<String, Object>)(om.readValue(results.get(0), Map.class));
605+
Assert.assertTrue("Unexpceted big size message", m1.equals(m2));
606+
client.close();
607+
}
563608
// @Test
564609
// //This will open a browser and test with html sse client
565610
// public void testHtmlSse() throws Exception

0 commit comments

Comments
 (0)