package org.infinispan.server.websocket.handlers; import static org.infinispan.assertions.JsonPayloadAssertion.assertThat; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.fail; import org.infinispan.server.websocket.json.JsonObject; import org.infinispan.test.AbstractInfinispanTest; import org.infinispan.websocket.MockChannel; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** * Tests Operation handlers. * * @author <a href="mailto:tom.fennelly@gmail.com">tom.fennelly@gmail.com</a> */ @Test (testName = "websocket.handlers.OpHandlerTest", groups = "unit") public class OpHandlerTest extends AbstractInfinispanTest { public static final String CACHE_NAME = "cacheName"; private MockChannel serverChannel; private MockClient cacheClient; @BeforeClass public void beforeTest() { serverChannel = new MockChannel(); cacheClient = new MockClient(CACHE_NAME, serverChannel); } @AfterClass public void afterTest() { if(cacheClient != null) { cacheClient.stop(); } if(serverChannel != null) { serverChannel.clear(); } } public void shouldReturnPreviouslyPutValueInJsonPayload() throws Exception { //when cacheClient.put("a", "aVal"); cacheClient.get("a"); JsonObject payload = serverChannel.getJSONPayload(); //then assertThat(payload).hasCacheName(CACHE_NAME).hasKey("a").hasValue("aVal").hasMimeType("text/plain"); } public void shouldReturnNullWhenValueIsNotInCache() throws Exception { //when cacheClient.get("notInCache"); JsonObject payload = serverChannel.getJSONPayload(); //then assertThat(payload).hasCacheName(CACHE_NAME).hasKey("notInCache").hasValue(null); } public void shouldReturnPreviouslyPutValueOnNotify() throws Exception { //given cacheClient.put("a", "aVal"); //when cacheClient.notify("a"); JsonObject payload = serverChannel.getJSONPayload(1000); //then assertThat(payload).hasKey("a").hasValue("aVal"); } public void shouldCallNotifyIfModifyingValueInCache() throws Exception { //given cacheClient.put("a", "oldValue"); cacheClient.notify("a"); serverChannel.getJSONPayload(1000); //when cacheClient.getCache().put("a", "newValue"); JsonObject payload = serverChannel.getJSONPayload(); //then assertThat(payload).hasKey("a").hasValue("newValue"); } public void shouldNotCallNotifyWhenListeningToDataWithoutNotifications() throws Exception { //given cacheClient.put("notificationKey", "aVal"); cacheClient.put("irrelevantKey", "bVal"); cacheClient.notify("notificationKey"); serverChannel.getJSONPayload(); //when cacheClient.getCache().put("irrelevantKey", "newValue"); try { JsonObject jsonPayload = serverChannel.getJSONPayload(250); fail("Expected timeout" + jsonPayload); } catch (RuntimeException e) { assertEquals(e.getMessage(), "Timed out waiting for data to be pushed onto the channel."); } } /** * This test is a bit tricky. It registers notifications to all channels, so if executed in parallel it might * crash some other tests. This is why we need to add dependency on particular methods - we need to make sure that * this is test is executed last. */ @Test(dependsOnMethods = {"shouldNotCallNotifyWhenListeningToDataWithoutNotifications", "shouldCallNotifyIfModifyingValueInCache"}) public void shouldCallNotifyWhenListeningToAllNotifications() throws Exception { //given cacheClient.put("a", "aVal"); cacheClient.put("b", "bVal"); cacheClient.notify("*"); serverChannel.getJSONPayload(); //when cacheClient.getCache().put("b", "newValue"); JsonObject payload = serverChannel.getJSONPayload(); //then assertThat(payload).hasKey("b").hasValue("newValue"); } public void shouldReturnPreviouslyPutValueOnRemove() throws Exception { //given cacheClient.put("a", "aVal"); cacheClient.get("a"); serverChannel.getJSONPayload(); //when cacheClient.remove("a"); cacheClient.get("a"); JsonObject payload = serverChannel.getJSONPayload(); //then assertThat(payload).hasCacheName(CACHE_NAME).hasKey("a").hasValue(null); } }