OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <memory> | 8 #include <memory> |
9 #include <string> | 9 #include <string> |
10 #include <utility> | 10 #include <utility> |
(...skipping 981 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 message->message = "text"; | 992 message->message = "text"; |
993 expected_messages.push_back(std::move(message)); | 993 expected_messages.push_back(std::move(message)); |
994 | 994 |
995 message.reset(new content::PresentationSessionMessage( | 995 message.reset(new content::PresentationSessionMessage( |
996 content::PresentationMessageType::ARRAY_BUFFER)); | 996 content::PresentationMessageType::ARRAY_BUFFER)); |
997 message->data.reset(new std::vector<uint8_t>(1, 1)); | 997 message->data.reset(new std::vector<uint8_t>(1, 1)); |
998 expected_messages.push_back(std::move(message)); | 998 expected_messages.push_back(std::move(message)); |
999 | 999 |
1000 base::RunLoop run_loop; | 1000 base::RunLoop run_loop; |
1001 MediaRoute::Id expected_route_id("foo"); | 1001 MediaRoute::Id expected_route_id("foo"); |
1002 interfaces::MediaRouteProvider::ListenForRouteMessagesCallback mojo_callback; | |
1003 EXPECT_CALL(mock_media_route_provider_, | 1002 EXPECT_CALL(mock_media_route_provider_, |
1004 ListenForRouteMessages(Eq(expected_route_id), _)) | 1003 StartListeningForRouteMessages(Eq(expected_route_id))) |
1005 .WillOnce(DoAll(SaveArg<1>(&mojo_callback), | 1004 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
1006 InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }))); | |
1007 | 1005 |
1008 // |pass_ownership| param is "true" here because there is only one observer. | 1006 // |pass_ownership| param is |true| here because there is only one observer. |
1009 ListenForMessagesCallbackHandler handler(std::move(expected_messages), true); | 1007 ListenForMessagesCallbackHandler handler(std::move(expected_messages), true); |
1010 | 1008 |
1011 EXPECT_CALL(handler, InvokeObserver()); | |
1012 // Creating PresentationSessionMessagesObserver will register itself to the | 1009 // Creating PresentationSessionMessagesObserver will register itself to the |
1013 // MediaRouter, which in turn will start listening for route messages. | 1010 // MediaRouter, which in turn will start listening for route messages. |
1014 std::unique_ptr<PresentationSessionMessagesObserver> observer( | 1011 std::unique_ptr<PresentationSessionMessagesObserver> observer( |
1015 new PresentationSessionMessagesObserver( | 1012 new PresentationSessionMessagesObserver( |
1016 base::Bind(&ListenForMessagesCallbackHandler::Invoke, | 1013 base::Bind(&ListenForMessagesCallbackHandler::Invoke, |
1017 base::Unretained(&handler)), | 1014 base::Unretained(&handler)), |
1018 expected_route_id, router())); | 1015 expected_route_id, router())); |
1019 run_loop.Run(); | 1016 run_loop.Run(); |
1020 | 1017 |
1021 base::RunLoop run_loop2; | 1018 EXPECT_CALL(handler, InvokeObserver()); |
1022 // Simulate messages by invoking the saved mojo callback. | 1019 router()->OnRouteMessagesReceived(expected_route_id, |
1023 // We expect one more ListenForRouteMessages call since |observer| was | 1020 std::move(mojo_messages)); |
1024 // still registered when the first set of messages arrived. | |
1025 mojo_callback.Run(std::move(mojo_messages), false); | |
1026 interfaces::MediaRouteProvider::ListenForRouteMessagesCallback | |
1027 mojo_callback_2; | |
1028 EXPECT_CALL(mock_media_route_provider_, ListenForRouteMessages(_, _)) | |
1029 .WillOnce(DoAll(SaveArg<1>(&mojo_callback_2), | |
1030 InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); }))); | |
1031 run_loop2.Run(); | |
1032 | |
1033 base::RunLoop run_loop3; | |
1034 // Stop listening for messages. In particular, MediaRouterMojoImpl will not | |
1035 // call ListenForRouteMessages again when it sees there are no more observers. | |
1036 mojo::Array<interfaces::RouteMessagePtr> mojo_messages_2(1); | |
1037 mojo_messages_2[0] = interfaces::RouteMessage::New(); | |
1038 mojo_messages_2[0]->type = interfaces::RouteMessage::Type::TEXT; | |
1039 mojo_messages_2[0]->message = "foo"; | |
1040 observer.reset(); | |
1041 mojo_callback_2.Run(std::move(mojo_messages_2), false); | |
1042 EXPECT_CALL(mock_media_route_provider_, StopListeningForRouteMessages(_)) | |
1043 .WillOnce(InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); })); | |
1044 run_loop3.Run(); | |
1045 } | 1021 } |
1046 | 1022 |
1047 TEST_F(MediaRouterMojoImplTest, PresentationSessionMessagesMultipleObservers) { | 1023 TEST_F(MediaRouterMojoImplTest, PresentationSessionMessagesMultipleObservers) { |
1048 mojo::Array<interfaces::RouteMessagePtr> mojo_messages(2); | 1024 mojo::Array<interfaces::RouteMessagePtr> mojo_messages(2); |
1049 mojo_messages[0] = interfaces::RouteMessage::New(); | 1025 mojo_messages[0] = interfaces::RouteMessage::New(); |
1050 mojo_messages[0]->type = interfaces::RouteMessage::Type::TEXT; | 1026 mojo_messages[0]->type = interfaces::RouteMessage::Type::TEXT; |
1051 mojo_messages[0]->message = "text"; | 1027 mojo_messages[0]->message = "text"; |
1052 mojo_messages[1] = interfaces::RouteMessage::New(); | 1028 mojo_messages[1] = interfaces::RouteMessage::New(); |
1053 mojo_messages[1]->type = interfaces::RouteMessage::Type::BINARY; | 1029 mojo_messages[1]->type = interfaces::RouteMessage::Type::BINARY; |
1054 mojo_messages[1]->data.push_back(1); | 1030 mojo_messages[1]->data.push_back(1); |
1055 | 1031 |
1056 ScopedVector<content::PresentationSessionMessage> expected_messages; | 1032 ScopedVector<content::PresentationSessionMessage> expected_messages; |
1057 std::unique_ptr<content::PresentationSessionMessage> message; | 1033 std::unique_ptr<content::PresentationSessionMessage> message; |
1058 message.reset(new content::PresentationSessionMessage( | 1034 message.reset(new content::PresentationSessionMessage( |
1059 content::PresentationMessageType::TEXT)); | 1035 content::PresentationMessageType::TEXT)); |
1060 message->message = "text"; | 1036 message->message = "text"; |
1061 expected_messages.push_back(std::move(message)); | 1037 expected_messages.push_back(std::move(message)); |
1062 | 1038 |
1063 message.reset(new content::PresentationSessionMessage( | 1039 message.reset(new content::PresentationSessionMessage( |
1064 content::PresentationMessageType::ARRAY_BUFFER)); | 1040 content::PresentationMessageType::ARRAY_BUFFER)); |
1065 message->data.reset(new std::vector<uint8_t>(1, 1)); | 1041 message->data.reset(new std::vector<uint8_t>(1, 1)); |
1066 expected_messages.push_back(std::move(message)); | 1042 expected_messages.push_back(std::move(message)); |
1067 | 1043 |
1068 base::RunLoop run_loop; | 1044 base::RunLoop run_loop; |
1069 MediaRoute::Id expected_route_id("foo"); | 1045 MediaRoute::Id expected_route_id("foo"); |
1070 interfaces::MediaRouteProvider::ListenForRouteMessagesCallback mojo_callback; | |
1071 EXPECT_CALL(mock_media_route_provider_, | 1046 EXPECT_CALL(mock_media_route_provider_, |
1072 ListenForRouteMessages(Eq(expected_route_id), _)) | 1047 StartListeningForRouteMessages(Eq(expected_route_id))) |
1073 .WillOnce(DoAll(SaveArg<1>(&mojo_callback), | 1048 .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
1074 InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }))); | |
1075 | 1049 |
1076 // |pass_ownership| param is "false" here because there are more than one | 1050 // |pass_ownership| param is |false| here because there are more than one |
1077 // observers. | 1051 // observers. |
1078 ListenForMessagesCallbackHandler handler(std::move(expected_messages), false); | 1052 ListenForMessagesCallbackHandler handler(std::move(expected_messages), false); |
1079 | 1053 |
1080 EXPECT_CALL(handler, InvokeObserver()).Times(2); | |
1081 // Creating PresentationSessionMessagesObserver will register itself to the | 1054 // Creating PresentationSessionMessagesObserver will register itself to the |
1082 // MediaRouter, which in turn will start listening for route messages. | 1055 // MediaRouter, which in turn will start listening for route messages. |
1083 std::unique_ptr<PresentationSessionMessagesObserver> observer1( | 1056 std::unique_ptr<PresentationSessionMessagesObserver> observer1( |
1084 new PresentationSessionMessagesObserver( | 1057 new PresentationSessionMessagesObserver( |
1085 base::Bind(&ListenForMessagesCallbackHandler::Invoke, | 1058 base::Bind(&ListenForMessagesCallbackHandler::Invoke, |
1086 base::Unretained(&handler)), | 1059 base::Unretained(&handler)), |
1087 expected_route_id, router())); | 1060 expected_route_id, router())); |
1088 std::unique_ptr<PresentationSessionMessagesObserver> observer2( | 1061 std::unique_ptr<PresentationSessionMessagesObserver> observer2( |
1089 new PresentationSessionMessagesObserver( | 1062 new PresentationSessionMessagesObserver( |
1090 base::Bind(&ListenForMessagesCallbackHandler::Invoke, | 1063 base::Bind(&ListenForMessagesCallbackHandler::Invoke, |
1091 base::Unretained(&handler)), | 1064 base::Unretained(&handler)), |
1092 expected_route_id, router())); | 1065 expected_route_id, router())); |
1093 run_loop.Run(); | 1066 run_loop.Run(); |
1094 | 1067 |
1095 base::RunLoop run_loop2; | 1068 EXPECT_CALL(handler, InvokeObserver()).Times(2); |
1096 // Simulate messages by invoking the saved mojo callback. | 1069 router()->OnRouteMessagesReceived(expected_route_id, |
1097 // We expect one more ListenForRouteMessages call since |observer| was | 1070 std::move(mojo_messages)); |
1098 // still registered when the first set of messages arrived. | |
1099 mojo_callback.Run(std::move(mojo_messages), false); | |
1100 interfaces::MediaRouteProvider::ListenForRouteMessagesCallback | |
1101 mojo_callback_2; | |
1102 EXPECT_CALL(mock_media_route_provider_, ListenForRouteMessages(_, _)) | |
1103 .WillOnce(DoAll(SaveArg<1>(&mojo_callback_2), | |
1104 InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); }))); | |
1105 run_loop2.Run(); | |
1106 | |
1107 base::RunLoop run_loop3; | |
1108 // Stop listening for messages. In particular, MediaRouterMojoImpl will not | |
1109 // call ListenForRouteMessages again when it sees there are no more observers. | |
1110 mojo::Array<interfaces::RouteMessagePtr> mojo_messages_2(1); | |
1111 mojo_messages_2[0] = interfaces::RouteMessage::New(); | |
1112 mojo_messages_2[0]->type = interfaces::RouteMessage::Type::TEXT; | |
1113 mojo_messages_2[0]->message = "foo"; | |
1114 observer1.reset(); | |
1115 observer2.reset(); | |
1116 mojo_callback_2.Run(std::move(mojo_messages_2), false); | |
1117 EXPECT_CALL(mock_media_route_provider_, StopListeningForRouteMessages(_)) | |
1118 .WillOnce(InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); })); | |
1119 run_loop3.Run(); | |
1120 } | |
1121 | |
1122 TEST_F(MediaRouterMojoImplTest, PresentationSessionMessagesError) { | |
1123 MediaRoute::Id expected_route_id("foo"); | |
1124 interfaces::MediaRouteProvider::ListenForRouteMessagesCallback mojo_callback; | |
1125 base::RunLoop run_loop; | |
1126 EXPECT_CALL(mock_media_route_provider_, | |
1127 ListenForRouteMessages(Eq(expected_route_id), _)) | |
1128 .WillOnce(DoAll(SaveArg<1>(&mojo_callback), | |
1129 InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }))); | |
1130 | |
1131 ListenForMessagesCallbackHandler handler( | |
1132 ScopedVector<content::PresentationSessionMessage>(), true); | |
1133 | |
1134 // Creating PresentationSessionMessagesObserver will register itself to the | |
1135 // MediaRouter, which in turn will start listening for route messages. | |
1136 std::unique_ptr<PresentationSessionMessagesObserver> observer1( | |
1137 new PresentationSessionMessagesObserver( | |
1138 base::Bind(&ListenForMessagesCallbackHandler::Invoke, | |
1139 base::Unretained(&handler)), | |
1140 expected_route_id, router())); | |
1141 run_loop.Run(); | |
1142 | |
1143 mojo_callback.Run(mojo::Array<interfaces::RouteMessagePtr>(), true); | |
1144 ProcessEventLoop(); | |
1145 } | 1071 } |
1146 | 1072 |
1147 TEST_F(MediaRouterMojoImplTest, PresentationConnectionStateChangedCallback) { | 1073 TEST_F(MediaRouterMojoImplTest, PresentationConnectionStateChangedCallback) { |
1148 MediaRoute::Id route_id("route-id"); | 1074 MediaRoute::Id route_id("route-id"); |
1149 const std::string kPresentationUrl("http://foo.fakeUrl"); | 1075 const std::string kPresentationUrl("http://foo.fakeUrl"); |
1150 const std::string kPresentationId("pid"); | 1076 const std::string kPresentationId("pid"); |
1151 content::PresentationSessionInfo connection(kPresentationUrl, | 1077 content::PresentationSessionInfo connection(kPresentationUrl, |
1152 kPresentationId); | 1078 kPresentationId); |
1153 MockPresentationConnectionStateChangedCallback callback; | 1079 MockPresentationConnectionStateChangedCallback callback; |
1154 std::unique_ptr<PresentationConnectionStateSubscription> subscription = | 1080 std::unique_ptr<PresentationConnectionStateSubscription> subscription = |
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1630 EXPECT_CALL(mock_media_route_provider_, | 1556 EXPECT_CALL(mock_media_route_provider_, |
1631 UpdateMediaSinks(mojo::String(MediaSourceForDesktop().id()))) | 1557 UpdateMediaSinks(mojo::String(MediaSourceForDesktop().id()))) |
1632 .WillOnce(InvokeWithoutArgs([&run_loop2]() { | 1558 .WillOnce(InvokeWithoutArgs([&run_loop2]() { |
1633 run_loop2.Quit(); | 1559 run_loop2.Quit(); |
1634 })); | 1560 })); |
1635 | 1561 |
1636 run_loop2.Run(); | 1562 run_loop2.Run(); |
1637 } | 1563 } |
1638 | 1564 |
1639 } // namespace media_router | 1565 } // namespace media_router |
OLD | NEW |