/** * 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.devsupport; import com.facebook.react.common.JavascriptException; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PowerMockIgnore; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.rule.PowerMockRule; import org.robolectric.RobolectricTestRunner; import java.util.HashMap; import okhttp3.ResponseBody; import okhttp3.ws.WebSocket; import static org.mockito.Mockito.*; @PrepareForTest({ JSDebuggerWebSocketClient.class }) @RunWith(RobolectricTestRunner.class) @PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"}) public class JSDebuggerWebSocketClientTest { @Rule public PowerMockRule rule = new PowerMockRule(); @Test public void test_prepareJSRuntime_ShouldSendCorrectMessage() throws Exception { final JSDebuggerWebSocketClient.JSDebuggerCallback cb = PowerMockito.mock(JSDebuggerWebSocketClient.JSDebuggerCallback.class); JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient()); client.prepareJSRuntime(cb); PowerMockito.verifyPrivate(client).invoke("sendMessage", 0, "{\"id\":0,\"method\":\"prepareJSRuntime\"}"); } @Test public void test_loadApplicationScript_ShouldSendCorrectMessage() throws Exception { final JSDebuggerWebSocketClient.JSDebuggerCallback cb = PowerMockito.mock(JSDebuggerWebSocketClient.JSDebuggerCallback.class); JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient()); HashMap<String, String> injectedObjects = new HashMap<>(); injectedObjects.put("key1", "value1"); injectedObjects.put("key2", "value2"); client.loadApplicationScript("http://localhost:8080/index.js", injectedObjects, cb); PowerMockito.verifyPrivate(client).invoke("sendMessage", 0, "{\"id\":0,\"method\":\"executeApplicationScript\",\"url\":\"http://localhost:8080/index.js\"" + ",\"inject\":{\"key1\":\"value1\",\"key2\":\"value2\"}}"); } @Test public void test_executeJSCall_ShouldSendCorrectMessage() throws Exception { final JSDebuggerWebSocketClient.JSDebuggerCallback cb = PowerMockito.mock(JSDebuggerWebSocketClient.JSDebuggerCallback.class); JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient()); client.executeJSCall("foo", "[1,2,3]", cb); PowerMockito.verifyPrivate(client).invoke("sendMessage", 0, "{\"id\":0,\"method\":\"foo\",\"arguments\":[1,2,3]}"); } @Test public void test_onMessage_WithInvalidContentType_ShouldNotTriggerCallbacks() throws Exception { JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient()); client.onMessage(ResponseBody.create(WebSocket.BINARY, "{\"replyID\":0, \"result\":\"OK\"}")); PowerMockito.verifyPrivate(client, never()).invoke("triggerRequestSuccess", anyInt(), anyString()); PowerMockito.verifyPrivate(client, never()).invoke("triggerRequestFailure", anyInt(), any()); } @Test public void test_onMessage_WithoutReplyId_ShouldNotTriggerCallbacks() throws Exception { JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient()); client.onMessage(ResponseBody.create(WebSocket.TEXT, "{\"result\":\"OK\"}")); PowerMockito.verifyPrivate(client, never()).invoke("triggerRequestSuccess", anyInt(), anyString()); PowerMockito.verifyPrivate(client, never()).invoke("triggerRequestFailure", anyInt(), any()); } @Test public void test_onMessage_With_Null_ReplyId_ShouldNotTriggerCallbacks() throws Exception { JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient()); client.onMessage(ResponseBody.create(WebSocket.TEXT, "{\"replyID\":null, \"result\":\"OK\"}")); PowerMockito.verifyPrivate(client, never()).invoke("triggerRequestSuccess", anyInt(), anyString()); PowerMockito.verifyPrivate(client, never()).invoke("triggerRequestFailure", anyInt(), any()); } @Test public void test_onMessage_WithResult_ShouldTriggerRequestSuccess() throws Exception { JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient()); client.onMessage(ResponseBody.create(WebSocket.TEXT, "{\"replyID\":0, \"result\":\"OK\"}")); PowerMockito.verifyPrivate(client).invoke("triggerRequestSuccess", 0, "OK"); PowerMockito.verifyPrivate(client, never()).invoke("triggerRequestFailure", anyInt(), any()); } @Test public void test_onMessage_With_Null_Result_ShouldTriggerRequestSuccess() throws Exception { JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient()); client.onMessage(ResponseBody.create(WebSocket.TEXT, "{\"replyID\":0, \"result\":null}")); PowerMockito.verifyPrivate(client).invoke("triggerRequestSuccess", 0, null); PowerMockito.verifyPrivate(client, never()).invoke("triggerRequestFailure", anyInt(), any()); } @Test public void test_onMessage_WithError_ShouldCallAbort() throws Exception { JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient()); client.onMessage(ResponseBody.create(WebSocket.TEXT, "{\"replyID\":0, \"error\":\"BOOM\"}")); PowerMockito.verifyPrivate(client).invoke("abort", eq("BOOM"), isA(JavascriptException.class)); } @Test public void test_onMessage_With_Null_Error_ShouldTriggerRequestSuccess() throws Exception { JSDebuggerWebSocketClient client = PowerMockito.spy(new JSDebuggerWebSocketClient()); client.onMessage(ResponseBody.create(WebSocket.TEXT, "{\"replyID\":0, \"error\":null}")); PowerMockito.verifyPrivate(client).invoke("triggerRequestSuccess", anyInt(), anyString()); } }