Commit 38a06f63 authored by Zhiqiang Zhang's avatar Zhiqiang Zhang Committed by Commit Bot

Unit test for CafMessageHandler

Most of the tests are migrated from CastMessageHandlerTest. Some
new tests are added as CafMessageHandler has more methods than
CastMessageHandler:

* testHandleClientConnectMessage*
* testHandleClientDisconnectMessage*
* testHandleClientLeaveSessionMessage*
* testSendReceiverActionToClient
* testBuildSessionMessage*

Bug: 711860
Change-Id: I821bb91f0c685809c143b60cc4700c47ffec16b6
Reviewed-on: https://chromium-review.googlesource.com/c/1343292
Commit-Queue: Zhiqiang Zhang <zqzhang@chromium.org>
Reviewed-by: default avatarThomas Guilbert <tguilbert@chromium.org>
Cr-Commit-Position: refs/heads/master@{#609805}
parent 8c45c21a
...@@ -70,8 +70,6 @@ public class CafMessageHandler { ...@@ -70,8 +70,6 @@ public class CafMessageHandler {
private ArrayMap<String, Queue<Integer>> mStopRequests; private ArrayMap<String, Queue<Integer>> mStopRequests;
private Queue<RequestRecord> mVolumeRequests; private Queue<RequestRecord> mVolumeRequests;
// The reference to CastSession, only valid after calling {@link onSessionCreated}, and will be
// reset to null when calling {@link onApplicationStopped}.
private final CastSessionController mSessionController; private final CastSessionController mSessionController;
private final CafMediaRouteProvider mRouteProvider; private final CafMediaRouteProvider mRouteProvider;
private Handler mHandler; private Handler mHandler;
...@@ -216,7 +214,7 @@ public class CafMessageHandler { ...@@ -216,7 +214,7 @@ public class CafMessageHandler {
if (clientId == null || !mSessionController.isConnected()) return false; if (clientId == null || !mSessionController.isConnected()) return false;
String sessionId = jsonMessage.getString("message"); String sessionId = jsonMessage.getString("message");
if (!mSessionController.getSession().getSessionId().equals(sessionId)) return false; if (!mSessionController.getSessionId().equals(sessionId)) return false;
ClientRecord currentClient = mRouteProvider.getClientIdToRecords().get(clientId); ClientRecord currentClient = mRouteProvider.getClientIdToRecords().get(clientId);
if (currentClient == null) return false; if (currentClient == null) return false;
...@@ -225,8 +223,8 @@ public class CafMessageHandler { ...@@ -225,8 +223,8 @@ public class CafMessageHandler {
// The web sender SDK doesn't actually recognize "leave_session" response, but this is to // The web sender SDK doesn't actually recognize "leave_session" response, but this is to
// acknowledge the "leave_session" request. // acknowledge the "leave_session" request.
mRouteProvider.sendMessageToClient(clientId, mRouteProvider.sendMessageToClient(
buildSimpleSessionMessage("leave_session", sequenceNumber, clientId, null)); clientId, buildSimpleSessionMessage("leave_session", sequenceNumber, clientId));
List<ClientRecord> leavingClients = new ArrayList<>(); List<ClientRecord> leavingClients = new ArrayList<>();
...@@ -253,14 +251,13 @@ public class CafMessageHandler { ...@@ -253,14 +251,13 @@ public class CafMessageHandler {
} }
/** Builds a simple message for session-related events. */ /** Builds a simple message for session-related events. */
private String buildSimpleSessionMessage( private String buildSimpleSessionMessage(String type, int sequenceNumber, String clientId)
String type, int sequenceNumber, String clientId, String message) throws JSONException { throws JSONException {
JSONObject jsonMessage = new JSONObject(); JSONObject jsonMessage = new JSONObject();
jsonMessage.put("type", type); jsonMessage.put("type", type);
jsonMessage.put("sequenceNumber", sequenceNumber); jsonMessage.put("sequenceNumber", sequenceNumber);
jsonMessage.put("timeoutMillis", TIMEOUT_IMMEDIATE); jsonMessage.put("timeoutMillis", TIMEOUT_IMMEDIATE);
jsonMessage.put("clientId", clientId); jsonMessage.put("clientId", clientId);
jsonMessage.put("message", message);
return jsonMessage.toString(); return jsonMessage.toString();
} }
...@@ -414,7 +411,7 @@ public class CafMessageHandler { ...@@ -414,7 +411,7 @@ public class CafMessageHandler {
JSONObject jsonAppMessageWrapper = jsonMessage.getJSONObject("message"); JSONObject jsonAppMessageWrapper = jsonMessage.getJSONObject("message");
if (!mSessionController.getSession().getSessionId().equals( if (!mSessionController.getSessionId().equals(
jsonAppMessageWrapper.getString("sessionId"))) { jsonAppMessageWrapper.getString("sessionId"))) {
return false; return false;
} }
...@@ -522,7 +519,7 @@ public class CafMessageHandler { ...@@ -522,7 +519,7 @@ public class CafMessageHandler {
void onAppMessage(String message, String namespace, RequestRecord request) { void onAppMessage(String message, String namespace, RequestRecord request) {
try { try {
JSONObject jsonMessage = new JSONObject(); JSONObject jsonMessage = new JSONObject();
jsonMessage.put("sessionId", mSessionController.getSession().getSessionId()); jsonMessage.put("sessionId", mSessionController.getSessionId());
jsonMessage.put("namespaceName", namespace); jsonMessage.put("namespaceName", namespace);
jsonMessage.put("message", message); jsonMessage.put("message", message);
if (request != null) { if (request != null) {
...@@ -544,13 +541,13 @@ public class CafMessageHandler { ...@@ -544,13 +541,13 @@ public class CafMessageHandler {
Queue<Integer> sequenceNumbersForClient = mStopRequests.get(clientId); Queue<Integer> sequenceNumbersForClient = mStopRequests.get(clientId);
if (sequenceNumbersForClient == null) { if (sequenceNumbersForClient == null) {
sendEnclosedMessageToClient(clientId, "remove_session", sendEnclosedMessageToClient(clientId, "remove_session",
mSessionController.getSession().getSessionId(), VOID_SEQUENCE_NUMBER); mSessionController.getSessionId(), VOID_SEQUENCE_NUMBER);
continue; continue;
} }
for (int sequenceNumber : sequenceNumbersForClient) { for (int sequenceNumber : sequenceNumbersForClient) {
sendEnclosedMessageToClient(clientId, "remove_session", sendEnclosedMessageToClient(clientId, "remove_session",
mSessionController.getSession().getSessionId(), sequenceNumber); mSessionController.getSessionId(), sequenceNumber);
} }
mStopRequests.remove(clientId); mStopRequests.remove(clientId);
} }
...@@ -688,7 +685,7 @@ public class CafMessageHandler { ...@@ -688,7 +685,7 @@ public class CafMessageHandler {
} }
JSONObject jsonMessage = new JSONObject(); JSONObject jsonMessage = new JSONObject();
jsonMessage.put("sessionId", mSessionController.getSession().getSessionId()); jsonMessage.put("sessionId", mSessionController.getSessionId());
jsonMessage.put("statusText", mSessionController.getSession().getApplicationStatus()); jsonMessage.put("statusText", mSessionController.getSession().getApplicationStatus());
jsonMessage.put("receiver", jsonReceiver); jsonMessage.put("receiver", jsonReceiver);
jsonMessage.put("namespaces", jsonNamespaces); jsonMessage.put("namespaces", jsonNamespaces);
...@@ -714,12 +711,12 @@ public class CafMessageHandler { ...@@ -714,12 +711,12 @@ public class CafMessageHandler {
* Modifies the received MediaStatus message to match the format expected by the client. * Modifies the received MediaStatus message to match the format expected by the client.
*/ */
private void sanitizeMediaStatusMessage(JSONObject object) throws JSONException { private void sanitizeMediaStatusMessage(JSONObject object) throws JSONException {
object.put("sessionId", mSessionController.getSession().getSessionId()); object.put("sessionId", mSessionController.getSessionId());
JSONArray mediaStatus = object.getJSONArray("status"); JSONArray mediaStatus = object.getJSONArray("status");
for (int i = 0; i < mediaStatus.length(); ++i) { for (int i = 0; i < mediaStatus.length(); ++i) {
JSONObject status = mediaStatus.getJSONObject(i); JSONObject status = mediaStatus.getJSONObject(i);
status.put("sessionId", mSessionController.getSession().getSessionId()); status.put("sessionId", mSessionController.getSessionId());
if (!status.has("supportedMediaCommands")) continue; if (!status.has("supportedMediaCommands")) continue;
JSONArray commands = new JSONArray(); JSONArray commands = new JSONArray();
...@@ -776,7 +773,7 @@ public class CafMessageHandler { ...@@ -776,7 +773,7 @@ public class CafMessageHandler {
return result; return result;
} }
private boolean sendStringCastMessage( boolean sendStringCastMessage(
String message, String namespace, String clientId, int sequenceNumber) { String message, String namespace, String clientId, int sequenceNumber) {
if (!mSessionController.isConnected()) return false; if (!mSessionController.isConnected()) return false;
...@@ -795,7 +792,7 @@ public class CafMessageHandler { ...@@ -795,7 +792,7 @@ public class CafMessageHandler {
* @param clientId The client id the message is sent from. * @param clientId The client id the message is sent from.
* @param sequenceNumber The sequence number of the message. * @param sequenceNumber The sequence number of the message.
*/ */
private void onSendAppMessageResult(Status result, String clientId, int sequenceNumber) { void onSendAppMessageResult(Status result, String clientId, int sequenceNumber) {
if (!result.isSuccess()) { if (!result.isSuccess()) {
// TODO(avayvod): should actually report back to the page. // TODO(avayvod): should actually report back to the page.
// See https://crbug.com/550445. // See https://crbug.com/550445.
......
...@@ -2366,12 +2366,12 @@ chrome_junit_test_java_sources = [ ...@@ -2366,12 +2366,12 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterSinkObservationTest.java", "junit/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterSinkObservationTest.java",
"junit/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterTestBase.java", "junit/src/org/chromium/chrome/browser/media/router/ChromeMediaRouterTestBase.java",
"junit/src/org/chromium/chrome/browser/media/router/DiscoveryCallbackTest.java", "junit/src/org/chromium/chrome/browser/media/router/DiscoveryCallbackTest.java",
"junit/src/org/chromium/chrome/browser/media/router/JSONTestUtils.java",
"junit/src/org/chromium/chrome/browser/media/router/TestUtils.java", "junit/src/org/chromium/chrome/browser/media/router/TestUtils.java",
"junit/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProviderTest.java", "junit/src/org/chromium/chrome/browser/media/router/cast/CastMediaRouteProviderTest.java",
"junit/src/org/chromium/chrome/browser/media/router/cast/CastMediaSourceTest.java", "junit/src/org/chromium/chrome/browser/media/router/cast/CastMediaSourceTest.java",
"junit/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandlerTest.java", "junit/src/org/chromium/chrome/browser/media/router/cast/CastMessageHandlerTest.java",
"junit/src/org/chromium/chrome/browser/media/router/cast/ChromeCastSessionManagerTest.java", "junit/src/org/chromium/chrome/browser/media/router/cast/ChromeCastSessionManagerTest.java",
"junit/src/org/chromium/chrome/browser/media/router/cast/JSONTestUtils.java",
"junit/src/org/chromium/chrome/browser/media/router/caf/MediaRouterTestHelper.java", "junit/src/org/chromium/chrome/browser/media/router/caf/MediaRouterTestHelper.java",
"junit/src/org/chromium/chrome/browser/media/router/caf/ShadowMediaRouter.java", "junit/src/org/chromium/chrome/browser/media/router/caf/ShadowMediaRouter.java",
"junit/src/org/chromium/chrome/browser/media/router/caf/ShadowCastContext.java", "junit/src/org/chromium/chrome/browser/media/router/caf/ShadowCastContext.java",
...@@ -2380,6 +2380,7 @@ chrome_junit_test_java_sources = [ ...@@ -2380,6 +2380,7 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/media/router/caf/CastSessionControllerTest.java", "junit/src/org/chromium/chrome/browser/media/router/caf/CastSessionControllerTest.java",
"junit/src/org/chromium/chrome/browser/media/router/caf/CafBaseMediaRouteProviderTest.java", "junit/src/org/chromium/chrome/browser/media/router/caf/CafBaseMediaRouteProviderTest.java",
"junit/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProviderTest.java", "junit/src/org/chromium/chrome/browser/media/router/caf/CafMediaRouteProviderTest.java",
"junit/src/org/chromium/chrome/browser/media/router/caf/CafMessageHandlerTest.java",
"junit/src/org/chromium/chrome/browser/media/ui/MediaImageManagerTest.java", "junit/src/org/chromium/chrome/browser/media/ui/MediaImageManagerTest.java",
"junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationActionsUpdatedTest.java", "junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationActionsUpdatedTest.java",
"junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationButtonComputationTest.java", "junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationButtonComputationTest.java",
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.media.router.cast; package org.chromium.chrome.browser.media.router;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
...@@ -13,7 +13,6 @@ import java.util.Iterator; ...@@ -13,7 +13,6 @@ import java.util.Iterator;
/** /**
* Utilities for comparing JSON objects and strings. * Utilities for comparing JSON objects and strings.
* TODO(zqzhang): Move the class to somewhere more generic.
*/ */
public class JSONTestUtils { public class JSONTestUtils {
private static final String TAG = "MediaRouter"; private static final String TAG = "MediaRouter";
...@@ -36,6 +35,7 @@ public class JSONTestUtils { ...@@ -36,6 +35,7 @@ public class JSONTestUtils {
return true; return true;
} }
/** Returns whether two JSON arrays are equal. */
public static boolean isJSONArrayEqual(JSONArray expected, JSONArray actual) { public static boolean isJSONArrayEqual(JSONArray expected, JSONArray actual) {
try { try {
if (expected.length() != actual.length()) return false; if (expected.length() != actual.length()) return false;
...@@ -48,6 +48,7 @@ public class JSONTestUtils { ...@@ -48,6 +48,7 @@ public class JSONTestUtils {
return true; return true;
} }
/** Returns whether two JSON objects are equal. */
public static boolean isJSONObjectEqual(Object expected, Object actual) { public static boolean isJSONObjectEqual(Object expected, Object actual) {
if (expected == null && actual == null) return true; if (expected == null && actual == null) return true;
if (expected == null || actual == null) return false; if (expected == null || actual == null) return false;
...@@ -74,7 +75,8 @@ public class JSONTestUtils { ...@@ -74,7 +75,8 @@ public class JSONTestUtils {
} }
} }
static class JSONObjectLike implements ArgumentMatcher<JSONObject> { /** Matcher to determine whether a JSON object is equal to the expected one. */
public static class JSONObjectLike implements ArgumentMatcher<JSONObject> {
private final JSONObject mExpected; private final JSONObject mExpected;
public JSONObjectLike(JSONObject expected) { public JSONObjectLike(JSONObject expected) {
...@@ -92,7 +94,8 @@ public class JSONTestUtils { ...@@ -92,7 +94,8 @@ public class JSONTestUtils {
} }
} }
static class JSONStringLike implements ArgumentMatcher<String> { /** Matcher to determine whether a JSON string is equal to the expected one. */
public static class JSONStringLike implements ArgumentMatcher<String> {
private JSONObject mExpected; private JSONObject mExpected;
public JSONStringLike(JSONObject expected) { public JSONStringLike(JSONObject expected) {
......
...@@ -36,9 +36,9 @@ import org.chromium.base.test.BaseRobolectricTestRunner; ...@@ -36,9 +36,9 @@ import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.chrome.browser.media.router.CastSessionUtil; import org.chromium.chrome.browser.media.router.CastSessionUtil;
import org.chromium.chrome.browser.media.router.ClientRecord; import org.chromium.chrome.browser.media.router.ClientRecord;
import org.chromium.chrome.browser.media.router.JSONTestUtils.JSONObjectLike;
import org.chromium.chrome.browser.media.router.JSONTestUtils.JSONStringLike;
import org.chromium.chrome.browser.media.router.cast.CastMessageHandler.RequestRecord; import org.chromium.chrome.browser.media.router.cast.CastMessageHandler.RequestRecord;
import org.chromium.chrome.browser.media.router.cast.JSONTestUtils.JSONObjectLike;
import org.chromium.chrome.browser.media.router.cast.JSONTestUtils.JSONStringLike;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.HashMap; import java.util.HashMap;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment