/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.react.packagerconnection; import org.junit.Test; import org.junit.runner.RunWith; import java.io.IOException; import java.util.HashMap; import java.util.Map; import okhttp3.ResponseBody; import okhttp3.ws.WebSocket; import static org.mockito.Mockito.*; import org.robolectric.RobolectricTestRunner; @RunWith(RobolectricTestRunner.class) public class JSPackagerClientTest { private static Map<String, JSPackagerClient.RequestHandler> createRH( String action, JSPackagerClient.RequestHandler handler) { Map<String, JSPackagerClient.RequestHandler> m = new HashMap<String, JSPackagerClient.RequestHandler>(); m.put(action, handler); return m; } @Test public void test_onMessage_ShouldTriggerNotification() throws IOException { JSPackagerClient.RequestHandler handler = mock(JSPackagerClient.RequestHandler.class); final JSPackagerClient client = new JSPackagerClient("ws://not_needed", createRH("methodValue", handler)); WebSocket webSocket = mock(WebSocket.class); client.onMessage( ResponseBody.create( WebSocket.TEXT, "{\"version\": 2, \"method\": \"methodValue\", \"params\": \"paramsValue\"}")); verify(handler).onNotification(eq("paramsValue")); verify(handler, never()).onRequest(any(), any(JSPackagerClient.Responder.class)); } @Test public void test_onMessage_ShouldTriggerRequest() throws IOException { JSPackagerClient.RequestHandler handler = mock(JSPackagerClient.RequestHandler.class); final JSPackagerClient client = new JSPackagerClient("ws://not_needed", createRH("methodValue", handler)); WebSocket webSocket = mock(WebSocket.class); client.onMessage( ResponseBody.create( WebSocket.TEXT, "{\"version\": 2, \"id\": \"idValue\", \"method\": \"methodValue\", \"params\": \"paramsValue\"}")); verify(handler, never()).onNotification(any()); verify(handler).onRequest(eq("paramsValue"), any(JSPackagerClient.Responder.class)); } @Test public void test_onMessage_WithoutParams_ShouldTriggerNotification() throws IOException { JSPackagerClient.RequestHandler handler = mock(JSPackagerClient.RequestHandler.class); final JSPackagerClient client = new JSPackagerClient("ws://not_needed", createRH("methodValue", handler)); WebSocket webSocket = mock(WebSocket.class); client.onMessage( ResponseBody.create( WebSocket.TEXT, "{\"version\": 2, \"method\": \"methodValue\"}")); verify(handler).onNotification(eq(null)); verify(handler, never()).onRequest(any(), any(JSPackagerClient.Responder.class)); } @Test public void test_onMessage_WithInvalidContentType_ShouldNotTriggerCallback() throws IOException { JSPackagerClient.RequestHandler handler = mock(JSPackagerClient.RequestHandler.class); final JSPackagerClient client = new JSPackagerClient("ws://not_needed", createRH("methodValue", handler)); WebSocket webSocket = mock(WebSocket.class); client.onMessage( ResponseBody.create( WebSocket.BINARY, "{\"version\": 2, \"method\": \"methodValue\"}")); verify(handler, never()).onNotification(any()); verify(handler, never()).onRequest(any(), any(JSPackagerClient.Responder.class)); } @Test public void test_onMessage_WithoutMethod_ShouldNotTriggerCallback() throws IOException { JSPackagerClient.RequestHandler handler = mock(JSPackagerClient.RequestHandler.class); final JSPackagerClient client = new JSPackagerClient("ws://not_needed", createRH("methodValue", handler)); WebSocket webSocket = mock(WebSocket.class); client.onMessage( ResponseBody.create( WebSocket.TEXT, "{\"version\": 2}")); verify(handler, never()).onNotification(any()); verify(handler, never()).onRequest(any(), any(JSPackagerClient.Responder.class)); } @Test public void test_onMessage_With_Null_Action_ShouldNotTriggerCallback() throws IOException { JSPackagerClient.RequestHandler handler = mock(JSPackagerClient.RequestHandler.class); final JSPackagerClient client = new JSPackagerClient("ws://not_needed", createRH("methodValue", handler)); WebSocket webSocket = mock(WebSocket.class); client.onMessage( ResponseBody.create( WebSocket.TEXT, "{\"version\": 2, \"method\": null}")); verify(handler, never()).onNotification(any()); verify(handler, never()).onRequest(any(), any(JSPackagerClient.Responder.class)); } @Test public void test_onMessage_WithInvalidMethod_ShouldNotTriggerCallback() throws IOException { JSPackagerClient.RequestHandler handler = mock(JSPackagerClient.RequestHandler.class); final JSPackagerClient client = new JSPackagerClient("ws://not_needed", createRH("methodValue", handler)); WebSocket webSocket = mock(WebSocket.class); client.onMessage( ResponseBody.create( WebSocket.BINARY, "{\"version\": 2, \"method\": \"methodValue2\"}")); verify(handler, never()).onNotification(any()); verify(handler, never()).onRequest(any(), any(JSPackagerClient.Responder.class)); } @Test public void test_onMessage_WrongVersion_ShouldNotTriggerCallback() throws IOException { JSPackagerClient.RequestHandler handler = mock(JSPackagerClient.RequestHandler.class); final JSPackagerClient client = new JSPackagerClient("ws://not_needed", createRH("methodValue", handler)); WebSocket webSocket = mock(WebSocket.class); client.onMessage( ResponseBody.create( WebSocket.TEXT, "{\"version\": 1, \"method\": \"methodValue\"}")); verify(handler, never()).onNotification(any()); verify(handler, never()).onRequest(any(), any(JSPackagerClient.Responder.class)); } }