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