Extract the JSPackagerWebSocketClient into a reusable packagerconnection module

Reviewed By: cwdick

Differential Revision: D4488628

fbshipit-source-id: ad07b7bfe74c6916beceb0ebcc506a57319f4ae9
This commit is contained in:
Lukas Piatkowski 2017-02-10 10:34:37 -08:00 committed by Facebook Github Bot
parent 3329969b63
commit 6f2544a16b
7 changed files with 75 additions and 49 deletions

View File

@ -17,6 +17,7 @@ android_library(
react_native_target('java/com/facebook/react/module/annotations:annotations'), react_native_target('java/com/facebook/react/module/annotations:annotations'),
react_native_target('java/com/facebook/react/modules/debug:debug'), react_native_target('java/com/facebook/react/modules/debug:debug'),
react_native_target('java/com/facebook/react/modules/systeminfo:systeminfo'), react_native_target('java/com/facebook/react/modules/systeminfo:systeminfo'),
react_native_target('java/com/facebook/react/packagerconnection:packagerconnection'),
react_native_target('res:devsupport'), react_native_target('res:devsupport'),
], ],
visibility = [ visibility = [

View File

@ -27,6 +27,7 @@ import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.common.ReactConstants; import com.facebook.react.common.ReactConstants;
import com.facebook.react.common.network.OkHttpCallUtil; import com.facebook.react.common.network.OkHttpCallUtil;
import com.facebook.react.modules.systeminfo.AndroidInfoHelpers; import com.facebook.react.modules.systeminfo.AndroidInfoHelpers;
import com.facebook.react.packagerconnection.JSPackagerWebSocketClient;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Callback; import okhttp3.Callback;

View File

@ -53,6 +53,7 @@ import com.facebook.react.common.futures.SimpleSettableFuture;
import com.facebook.react.devsupport.DevServerHelper.PackagerCommandListener; import com.facebook.react.devsupport.DevServerHelper.PackagerCommandListener;
import com.facebook.react.devsupport.StackTraceHelper.StackFrame; import com.facebook.react.devsupport.StackTraceHelper.StackFrame;
import com.facebook.react.modules.debug.DeveloperSettings; import com.facebook.react.modules.debug.DeveloperSettings;
import com.facebook.react.packagerconnection.JSPackagerWebSocketClient;
import okhttp3.MediaType; import okhttp3.MediaType;
import okhttp3.OkHttpClient; import okhttp3.OkHttpClient;

View File

@ -0,0 +1,17 @@
include_defs('//ReactAndroid/DEFS')
android_library(
name = 'packagerconnection',
srcs = glob(['**/*.java']),
deps = [
react_native_dep('libraries/fbcore/src/main/java/com/facebook/common/logging:logging'),
react_native_dep('third-party/java/infer-annotations:infer-annotations'),
react_native_dep('third-party/java/jsr-305:jsr-305'),
react_native_dep('third-party/java/okhttp:okhttp3'),
react_native_dep('third-party/java/okhttp:okhttp3-ws'),
react_native_dep('third-party/java/okio:okio'),
],
visibility = [
'PUBLIC',
],
)

View File

@ -6,7 +6,7 @@
* file in the same directory. * file in the same directory.
*/ */
package com.facebook.react.devsupport; package com.facebook.react.packagerconnection;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -161,7 +161,9 @@ public class JSPackagerWebSocketClient implements WebSocketListener {
action = reader.nextString(); action = reader.nextString();
} }
} }
if (version != 1) { reader.close();
if (version == null || version != 1) {
return; return;
} }
if (target == null || action == null) { if (target == null || action == null) {

View File

@ -0,0 +1,22 @@
include_defs('//ReactAndroid/DEFS')
rn_robolectric_test(
name = 'packagerconnection',
# Please change the contact to the oncall of your team
contacts = ['oncall+fbandroid_sheriff@xmail.facebook.com'],
srcs = glob(['**/*.java']),
deps = [
react_native_dep('libraries/fbcore/src/test/java/com/facebook/powermock:powermock'),
react_native_dep('third-party/java/fest:fest'),
react_native_dep('third-party/java/jsr-305:jsr-305'),
react_native_dep('third-party/java/junit:junit'),
react_native_dep('third-party/java/mockito:mockito'),
react_native_dep('third-party/java/okhttp:okhttp3'),
react_native_dep('third-party/java/okhttp:okhttp3-ws'),
react_native_dep('third-party/java/robolectric3/robolectric:robolectric'),
react_native_target('java/com/facebook/react/packagerconnection:packagerconnection'),
],
visibility = [
'PUBLIC'
],
)

View File

@ -7,17 +7,13 @@
* of patent rights can be found in the PATENTS file in the same directory. * of patent rights can be found in the PATENTS file in the same directory.
*/ */
package com.facebook.react.devsupport; package com.facebook.react.packagerconnection;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.robolectric.ParameterizedRobolectricTestRunner;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import okhttp3.MediaType;
import okhttp3.ResponseBody; import okhttp3.ResponseBody;
import okhttp3.ws.WebSocket; import okhttp3.ws.WebSocket;
@ -32,12 +28,10 @@ public class JSPackagerWebSocketClientTest {
final JSPackagerWebSocketClient.JSPackagerCallback callback = final JSPackagerWebSocketClient.JSPackagerCallback callback =
mock(JSPackagerWebSocketClient.JSPackagerCallback.class); mock(JSPackagerWebSocketClient.JSPackagerCallback.class);
final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback); final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback);
client.onMessage(ResponseBody.create(WebSocket.TEXT, client.onMessage(ResponseBody.create(
"{\"version\": 1, \"target\": \"targetValue\", \"action\": \"actionValue\"}")); WebSocket.TEXT,
verify(callback).onMessage( "{\"version\": 1, \"target\": \"targetValue\", \"action\": \"actionValue\"}"));
any(JSPackagerWebSocketClient.WebSocketSender.class), verify(callback).onMessage(any(JSPackagerWebSocketClient.WebSocketSender.class), eq("targetValue"), eq("actionValue"));
eq("targetValue"),
eq("actionValue"));
} }
@Test @Test
@ -45,12 +39,10 @@ public class JSPackagerWebSocketClientTest {
final JSPackagerWebSocketClient.JSPackagerCallback callback = final JSPackagerWebSocketClient.JSPackagerCallback callback =
mock(JSPackagerWebSocketClient.JSPackagerCallback.class); mock(JSPackagerWebSocketClient.JSPackagerCallback.class);
final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback); final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback);
client.onMessage(ResponseBody.create(WebSocket.BINARY, client.onMessage(ResponseBody.create(
"{\"version\": 1, \"target\": \"targetValue\", \"action\": \"actionValue\"}")); WebSocket.BINARY,
verify(callback, never()).onMessage( "{\"version\": 1, \"target\": \"targetValue\", \"action\": \"actionValue\"}"));
any(JSPackagerWebSocketClient.WebSocketSender.class), verify(callback, never()).onMessage(any(JSPackagerWebSocketClient.WebSocketSender.class), anyString(), anyString());
anyString(),
anyString());
} }
@Test @Test
@ -58,12 +50,10 @@ public class JSPackagerWebSocketClientTest {
final JSPackagerWebSocketClient.JSPackagerCallback callback = final JSPackagerWebSocketClient.JSPackagerCallback callback =
mock(JSPackagerWebSocketClient.JSPackagerCallback.class); mock(JSPackagerWebSocketClient.JSPackagerCallback.class);
final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback); final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback);
client.onMessage(ResponseBody.create(WebSocket.TEXT, client.onMessage(ResponseBody.create(
"{\"version\": 1, \"action\": \"actionValue\"}")); WebSocket.TEXT,
verify(callback, never()).onMessage( "{\"version\": 1, \"action\": \"actionValue\"}"));
any(JSPackagerWebSocketClient.WebSocketSender.class), verify(callback, never()).onMessage(any(JSPackagerWebSocketClient.WebSocketSender.class), anyString(), anyString());
anyString(),
anyString());
} }
@Test @Test
@ -71,12 +61,10 @@ public class JSPackagerWebSocketClientTest {
final JSPackagerWebSocketClient.JSPackagerCallback callback = final JSPackagerWebSocketClient.JSPackagerCallback callback =
mock(JSPackagerWebSocketClient.JSPackagerCallback.class); mock(JSPackagerWebSocketClient.JSPackagerCallback.class);
final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback); final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback);
client.onMessage(ResponseBody.create(WebSocket.TEXT, client.onMessage(ResponseBody.create(
"{\"version\": 1, \"target\": null, \"action\": \"actionValue\"}")); WebSocket.TEXT,
verify(callback, never()).onMessage( "{\"version\": 1, \"target\": null, \"action\": \"actionValue\"}"));
any(JSPackagerWebSocketClient.WebSocketSender.class), verify(callback, never()).onMessage(any(JSPackagerWebSocketClient.WebSocketSender.class), anyString(), anyString());
anyString(),
anyString());
} }
@Test @Test
@ -84,12 +72,10 @@ public class JSPackagerWebSocketClientTest {
final JSPackagerWebSocketClient.JSPackagerCallback callback = final JSPackagerWebSocketClient.JSPackagerCallback callback =
mock(JSPackagerWebSocketClient.JSPackagerCallback.class); mock(JSPackagerWebSocketClient.JSPackagerCallback.class);
final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback); final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback);
client.onMessage(ResponseBody.create(WebSocket.TEXT, client.onMessage(ResponseBody.create(
"{\"version\": 1, \"target\": \"targetValue\"}")); WebSocket.TEXT,
verify(callback, never()).onMessage( "{\"version\": 1, \"target\": \"targetValue\"}"));
any(JSPackagerWebSocketClient.WebSocketSender.class), verify(callback, never()).onMessage(any(JSPackagerWebSocketClient.WebSocketSender.class), anyString(), anyString());
anyString(),
anyString());
} }
@Test @Test
@ -97,12 +83,10 @@ public class JSPackagerWebSocketClientTest {
final JSPackagerWebSocketClient.JSPackagerCallback callback = final JSPackagerWebSocketClient.JSPackagerCallback callback =
mock(JSPackagerWebSocketClient.JSPackagerCallback.class); mock(JSPackagerWebSocketClient.JSPackagerCallback.class);
final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback); final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback);
client.onMessage(ResponseBody.create(WebSocket.TEXT, client.onMessage(ResponseBody.create(
"{\"version\": 1, \"target\": \"targetValue\", \"action\": null}")); WebSocket.TEXT,
verify(callback, never()).onMessage( "{\"version\": 1, \"target\": \"targetValue\", \"action\": null}"));
any(JSPackagerWebSocketClient.WebSocketSender.class), verify(callback, never()).onMessage(any(JSPackagerWebSocketClient.WebSocketSender.class), anyString(), anyString());
anyString(),
anyString());
} }
@Test @Test
@ -110,11 +94,9 @@ public class JSPackagerWebSocketClientTest {
final JSPackagerWebSocketClient.JSPackagerCallback callback = final JSPackagerWebSocketClient.JSPackagerCallback callback =
mock(JSPackagerWebSocketClient.JSPackagerCallback.class); mock(JSPackagerWebSocketClient.JSPackagerCallback.class);
final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback); final JSPackagerWebSocketClient client = new JSPackagerWebSocketClient("ws://not_needed", callback);
client.onMessage(ResponseBody.create(WebSocket.TEXT, client.onMessage(ResponseBody.create(
"{\"version\": 2, \"target\": \"targetValue\", \"action\": \"actionValue\"}")); WebSocket.TEXT,
verify(callback, never()).onMessage( "{\"version\": 2, \"target\": \"targetValue\", \"action\": \"actionValue\"}"));
any(JSPackagerWebSocketClient.WebSocketSender.class), verify(callback, never()).onMessage(any(JSPackagerWebSocketClient.WebSocketSender.class), anyString(), anyString());
anyString(),
anyString());
} }
} }