cast_message_util_unittest.cc 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/cast_channel/cast_message_util.h"
  5. #include "base/strings/strcat.h"
  6. #include "base/test/values_test_util.h"
  7. #include "base/values.h"
  8. #include "testing/gtest/include/gtest/gtest.h"
  9. #include "third_party/openscreen/src/cast/common/channel/proto/cast_channel.pb.h"
  10. using base::test::IsJson;
  11. using base::test::ParseJson;
  12. using base::test::ParseJsonDict;
  13. namespace cast_channel {
  14. TEST(CastMessageUtilTest, IsCastReservedNamespace) {
  15. EXPECT_TRUE(
  16. IsCastReservedNamespace("urn:x-cast:com.google.cast.receiver.xyzzy"));
  17. EXPECT_TRUE(IsCastReservedNamespace("urn:x-cast:com.google.cast.receiver"));
  18. EXPECT_FALSE(IsCastReservedNamespace("urn:x-cast:com.google.cast"));
  19. EXPECT_FALSE(IsCastReservedNamespace("urn:x-cast:com.google.cast."));
  20. EXPECT_FALSE(
  21. IsCastReservedNamespace("urn:x-cast:com.google.cast.foo.receiver"));
  22. EXPECT_FALSE(
  23. IsCastReservedNamespace("urn:x-cast:com.google.cast.receiverfoo"));
  24. EXPECT_FALSE(IsCastReservedNamespace("urn:x-cast:com.google.cast.xyzzy"));
  25. EXPECT_FALSE(IsCastReservedNamespace("urn:x-cast:com.google.youtube"));
  26. EXPECT_FALSE(IsCastReservedNamespace("urn:x-cast:com.foo"));
  27. EXPECT_FALSE(IsCastReservedNamespace("foo"));
  28. EXPECT_FALSE(IsCastReservedNamespace(""));
  29. }
  30. TEST(CastMessageUtilTest, CastMessageType) {
  31. for (int i = 0; i < static_cast<int>(CastMessageType::kOther); ++i) {
  32. CastMessageType type = static_cast<CastMessageType>(i);
  33. EXPECT_EQ(type, CastMessageTypeFromString(ToString(type)));
  34. }
  35. }
  36. TEST(CastMessageUtilTest, GetLaunchSessionResponseOk) {
  37. std::string status = R"(
  38. {
  39. "applications": [
  40. {
  41. "appId": "2FE23A98",
  42. "universalAppId": "AD9AF8E0",
  43. "appType": "ANDROID_TV"
  44. }
  45. ]
  46. }
  47. )";
  48. std::string payload = base::StrCat({R"(
  49. {
  50. "type": "RECEIVER_STATUS",
  51. "requestId": 123,
  52. "status": )",
  53. status, "}"});
  54. LaunchSessionResponse response =
  55. GetLaunchSessionResponse(ParseJsonDict(payload));
  56. EXPECT_EQ(LaunchSessionResponse::Result::kOk, response.result);
  57. EXPECT_EQ(ParseJson(status), response.receiver_status);
  58. }
  59. TEST(CastMessageUtilTest, GetLaunchSessionResponseError) {
  60. std::string payload = R"(
  61. {
  62. "type": "LAUNCH_ERROR",
  63. "requestId": 123
  64. }
  65. )";
  66. LaunchSessionResponse response =
  67. GetLaunchSessionResponse(ParseJsonDict(payload));
  68. EXPECT_EQ(LaunchSessionResponse::Result::kError, response.result);
  69. EXPECT_FALSE(response.receiver_status);
  70. }
  71. TEST(CastMessageUtilTest, GetLaunchSessionResponseUnknown) {
  72. // Unrelated type.
  73. std::string payload = R"(
  74. {
  75. "type": "APPLICATION_BROADCAST",
  76. "requestId": 123,
  77. "status": {}
  78. }
  79. )";
  80. LaunchSessionResponse response =
  81. GetLaunchSessionResponse(ParseJsonDict(payload));
  82. EXPECT_EQ(LaunchSessionResponse::Result::kUnknown, response.result);
  83. EXPECT_FALSE(response.receiver_status);
  84. }
  85. TEST(CastMessageUtilTest, CreateStopRequest) {
  86. std::string expected_message = R"(
  87. {
  88. "type": "STOP",
  89. "requestId": 123,
  90. "sessionId": "sessionId"
  91. }
  92. )";
  93. CastMessage message = CreateStopRequest("sourceId", 123, "sessionId");
  94. ASSERT_TRUE(IsCastMessageValid(message));
  95. EXPECT_THAT(message.payload_utf8(), IsJson(expected_message));
  96. }
  97. TEST(CastMessageUtilTest, CreateCastMessageWithObject) {
  98. constexpr char payload[] = R"({"foo": "bar"})";
  99. const auto message = CreateCastMessage("theNamespace", ParseJson(payload),
  100. "theSourceId", "theDestinationId");
  101. ASSERT_TRUE(IsCastMessageValid(message));
  102. EXPECT_EQ("theNamespace", message.namespace_());
  103. EXPECT_EQ("theSourceId", message.source_id());
  104. EXPECT_EQ("theDestinationId", message.destination_id());
  105. EXPECT_THAT(message.payload_utf8(), IsJson(payload));
  106. }
  107. TEST(CastMessageUtilTest, CreateCastMessageWithString) {
  108. constexpr char payload[] = "foo";
  109. const auto message = CreateCastMessage("theNamespace", base::Value(payload),
  110. "theSourceId", "theDestinationId");
  111. ASSERT_TRUE(IsCastMessageValid(message));
  112. EXPECT_EQ("theNamespace", message.namespace_());
  113. EXPECT_EQ("theSourceId", message.source_id());
  114. EXPECT_EQ("theDestinationId", message.destination_id());
  115. EXPECT_EQ(message.payload_utf8(), payload);
  116. }
  117. TEST(CastMessageUtilTest, CreateVirtualConnectionClose) {
  118. std::string expected_message = R"(
  119. {
  120. "type": "CLOSE",
  121. "reasonCode": 5
  122. }
  123. )";
  124. CastMessage message =
  125. CreateVirtualConnectionClose("sourceId", "destinationId");
  126. ASSERT_TRUE(IsCastMessageValid(message));
  127. EXPECT_EQ(message.source_id(), "sourceId");
  128. EXPECT_EQ(message.destination_id(), "destinationId");
  129. EXPECT_EQ(message.namespace_(), kConnectionNamespace);
  130. EXPECT_THAT(message.payload_utf8(), IsJson(expected_message));
  131. }
  132. TEST(CastMessageUtilTest, CreateReceiverStatusRequest) {
  133. std::string expected_message = R"(
  134. {
  135. "type": "GET_STATUS",
  136. "requestId": 123
  137. }
  138. )";
  139. CastMessage message = CreateReceiverStatusRequest("sourceId", 123);
  140. ASSERT_TRUE(IsCastMessageValid(message));
  141. EXPECT_THAT(message.payload_utf8(), IsJson(expected_message));
  142. }
  143. TEST(CastMessageUtilTest, CreateMediaRequest) {
  144. std::string body = R"({
  145. "type": "STOP_MEDIA",
  146. })";
  147. std::string expected_message = R"({
  148. "type": "STOP",
  149. "requestId": 123,
  150. })";
  151. CastMessage message = CreateMediaRequest(ParseJson(body), 123, "theSourceId",
  152. "theDestinationId");
  153. ASSERT_TRUE(IsCastMessageValid(message));
  154. EXPECT_EQ(kMediaNamespace, message.namespace_());
  155. EXPECT_EQ("theSourceId", message.source_id());
  156. EXPECT_EQ("theDestinationId", message.destination_id());
  157. EXPECT_THAT(message.payload_utf8(), IsJson(expected_message));
  158. }
  159. TEST(CastMessageUtilTest, CreateVolumeRequest) {
  160. std::string body = R"({
  161. "type": "SET_VOLUME",
  162. "sessionId": "theSessionId",
  163. })";
  164. std::string expected_message = R"({
  165. "type": "SET_VOLUME",
  166. "requestId": 123,
  167. })";
  168. CastMessage message =
  169. CreateSetVolumeRequest(ParseJson(body), 123, "theSourceId");
  170. ASSERT_TRUE(IsCastMessageValid(message));
  171. EXPECT_EQ(kReceiverNamespace, message.namespace_());
  172. EXPECT_EQ("theSourceId", message.source_id());
  173. EXPECT_EQ(kPlatformReceiverId, message.destination_id());
  174. EXPECT_THAT(message.payload_utf8(), IsJson(expected_message));
  175. }
  176. TEST(CastMessageUtilTest, GetConnectionType) {
  177. EXPECT_EQ(VirtualConnectionType::kStrong, GetConnectionType("receiver-0"));
  178. EXPECT_EQ(VirtualConnectionType::kInvisible, GetConnectionType("sender-123"));
  179. }
  180. } // namespace cast_channel