Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Side by Side Diff: content/renderer/media/user_media_client_impl_unittest.cc

Issue 2696443002: Reland of Use spec-compliant algorithm to select video devices in getUserMedia. (Closed)
Patch Set: Address boliu's comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/renderer/media/user_media_client_impl.cc ('k') | content/renderer/render_frame_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/renderer/media/user_media_client_impl.h" 5 #include "content/renderer/media/user_media_client_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 27 matching lines...) Expand all
38 38
39 blink::WebMediaConstraints CreateDefaultConstraints() { 39 blink::WebMediaConstraints CreateDefaultConstraints() {
40 MockConstraintFactory factory; 40 MockConstraintFactory factory;
41 factory.AddAdvanced(); 41 factory.AddAdvanced();
42 return factory.CreateWebMediaConstraints(); 42 return factory.CreateWebMediaConstraints();
43 } 43 }
44 44
45 blink::WebMediaConstraints CreateDeviceConstraints( 45 blink::WebMediaConstraints CreateDeviceConstraints(
46 const char* basic_exact_value, 46 const char* basic_exact_value,
47 const char* basic_ideal_value = nullptr, 47 const char* basic_ideal_value = nullptr,
48 const char* advanced_exact_value = nullptr, 48 const char* advanced_exact_value = nullptr) {
49 const char* advanced_ideal_value = nullptr) {
50 MockConstraintFactory factory; 49 MockConstraintFactory factory;
51 blink::WebMediaTrackConstraintSet basic; 50 blink::WebMediaTrackConstraintSet basic;
52 if (basic_exact_value) { 51 if (basic_exact_value) {
53 factory.basic().deviceId.setExact( 52 factory.basic().deviceId.setExact(
54 blink::WebString::fromUTF8(basic_exact_value)); 53 blink::WebString::fromUTF8(basic_exact_value));
55 } 54 }
56 if (basic_ideal_value) { 55 if (basic_ideal_value) {
57 blink::WebString value = blink::WebString::fromUTF8(basic_ideal_value); 56 blink::WebString value = blink::WebString::fromUTF8(basic_ideal_value);
58 factory.basic().deviceId.setIdeal( 57 factory.basic().deviceId.setIdeal(
59 blink::WebVector<blink::WebString>(&value, 1)); 58 blink::WebVector<blink::WebString>(&value, 1));
60 } 59 }
61 60
62 auto& advanced = factory.AddAdvanced(); 61 auto& advanced = factory.AddAdvanced();
63 if (advanced_exact_value) { 62 if (advanced_exact_value) {
64 blink::WebString value = blink::WebString::fromUTF8(advanced_exact_value); 63 blink::WebString value = blink::WebString::fromUTF8(advanced_exact_value);
65 advanced.deviceId.setExact(value); 64 advanced.deviceId.setExact(value);
66 } 65 }
67 if (advanced_ideal_value) { 66
68 blink::WebString value = blink::WebString::fromUTF8(advanced_ideal_value); 67 return factory.CreateWebMediaConstraints();
69 advanced.deviceId.setIdeal(blink::WebVector<blink::WebString>(&value, 1)); 68 }
69
70 blink::WebMediaConstraints CreateFacingModeConstraints(
71 const char* basic_exact_value,
72 const char* basic_ideal_value = nullptr,
73 const char* advanced_exact_value = nullptr) {
74 MockConstraintFactory factory;
75 if (basic_exact_value) {
76 factory.basic().facingMode.setExact(
77 blink::WebString::fromUTF8(basic_exact_value));
78 }
79 if (basic_ideal_value) {
80 blink::WebString value = blink::WebString::fromUTF8(basic_ideal_value);
81 factory.basic().deviceId.setIdeal(
82 blink::WebVector<blink::WebString>(&value, 1));
83 }
84
85 auto& advanced = factory.AddAdvanced();
86 if (advanced_exact_value) {
87 blink::WebString value = blink::WebString::fromUTF8(advanced_exact_value);
88 advanced.deviceId.setExact(value);
70 } 89 }
71 90
72 return factory.CreateWebMediaConstraints(); 91 return factory.CreateWebMediaConstraints();
73 } 92 }
74 93
75 class MockMediaStreamVideoCapturerSource : public MockMediaStreamVideoSource { 94 class MockMediaStreamVideoCapturerSource : public MockMediaStreamVideoSource {
76 public: 95 public:
77 MockMediaStreamVideoCapturerSource( 96 MockMediaStreamVideoCapturerSource(
78 const StreamDeviceInfo& device, 97 const StreamDeviceInfo& device,
79 const SourceStoppedCallback& stop_callback, 98 const SourceStoppedCallback& stop_callback,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 result[MEDIA_DEVICE_TYPE_VIDEO_INPUT].push_back( 132 result[MEDIA_DEVICE_TYPE_VIDEO_INPUT].push_back(
114 MediaDeviceInfo(kFakeVideoInputDeviceId2, "Fake Video Input 2", "")); 133 MediaDeviceInfo(kFakeVideoInputDeviceId2, "Fake Video Input 2", ""));
115 } 134 }
116 if (request_audio_output) { 135 if (request_audio_output) {
117 result[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].push_back(MediaDeviceInfo( 136 result[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].push_back(MediaDeviceInfo(
118 kFakeAudioOutputDeviceId1, "Fake Audio Input 1", "fake_group 1")); 137 kFakeAudioOutputDeviceId1, "Fake Audio Input 1", "fake_group 1"));
119 } 138 }
120 callback.Run(result); 139 callback.Run(result);
121 } 140 }
122 141
142 void GetVideoInputCapabilities(
143 const url::Origin& security_origin,
144 const GetVideoInputCapabilitiesCallback& client_callback) override {
145 ::mojom::VideoInputDeviceCapabilitiesPtr device =
146 ::mojom::VideoInputDeviceCapabilities::New();
147 device->device_id = kFakeVideoInputDeviceId1;
148 device->facing_mode = ::mojom::FacingMode::USER;
149 device->formats.push_back(media::VideoCaptureFormat(
150 gfx::Size(640, 480), 30.0f, media::PIXEL_FORMAT_I420));
151 std::vector<::mojom::VideoInputDeviceCapabilitiesPtr> result;
152 result.push_back(std::move(device));
153
154 device = ::mojom::VideoInputDeviceCapabilities::New();
155 device->device_id = kFakeVideoInputDeviceId2;
156 device->facing_mode = ::mojom::FacingMode::ENVIRONMENT;
157 device->formats.push_back(media::VideoCaptureFormat(
158 gfx::Size(640, 480), 30.0f, media::PIXEL_FORMAT_I420));
159 result.push_back(std::move(device));
160
161 client_callback.Run(std::move(result));
162 }
163
123 MOCK_METHOD3(SubscribeDeviceChangeNotifications, 164 MOCK_METHOD3(SubscribeDeviceChangeNotifications,
124 void(MediaDeviceType type, 165 void(MediaDeviceType type,
125 uint32_t subscription_id, 166 uint32_t subscription_id,
126 const url::Origin& security_origin)); 167 const url::Origin& security_origin));
127 MOCK_METHOD2(UnsubscribeDeviceChangeNotifications, 168 MOCK_METHOD2(UnsubscribeDeviceChangeNotifications,
128 void(MediaDeviceType type, uint32_t subscription_id)); 169 void(MediaDeviceType type, uint32_t subscription_id));
129 MOCK_METHOD2(GetVideoInputCapabilities,
130 void(const url::Origin& security_origin,
131 const GetVideoInputCapabilitiesCallback& client_callback));
132 }; 170 };
133 171
134 class UserMediaClientImplUnderTest : public UserMediaClientImpl { 172 class UserMediaClientImplUnderTest : public UserMediaClientImpl {
135 public: 173 public:
136 enum RequestState { 174 enum RequestState {
137 REQUEST_NOT_STARTED, 175 REQUEST_NOT_STARTED,
138 REQUEST_NOT_COMPLETE, 176 REQUEST_NOT_COMPLETE,
139 REQUEST_SUCCEEDED, 177 REQUEST_SUCCEEDED,
140 REQUEST_FAILED, 178 REQUEST_FAILED,
141 }; 179 };
142 180
143 UserMediaClientImplUnderTest( 181 UserMediaClientImplUnderTest(
144 PeerConnectionDependencyFactory* dependency_factory, 182 PeerConnectionDependencyFactory* dependency_factory,
145 std::unique_ptr<MediaStreamDispatcher> media_stream_dispatcher) 183 std::unique_ptr<MediaStreamDispatcher> media_stream_dispatcher)
146 : UserMediaClientImpl(NULL, 184 : UserMediaClientImpl(nullptr,
147 dependency_factory, 185 dependency_factory,
148 std::move(media_stream_dispatcher)), 186 std::move(media_stream_dispatcher),
187 base::ThreadTaskRunnerHandle::Get()),
149 state_(REQUEST_NOT_STARTED), 188 state_(REQUEST_NOT_STARTED),
150 result_(NUM_MEDIA_REQUEST_RESULTS), 189 result_(NUM_MEDIA_REQUEST_RESULTS),
151 result_name_(""), 190 result_name_(""),
152 factory_(dependency_factory), 191 factory_(dependency_factory),
153 create_source_that_fails_(false), 192 create_source_that_fails_(false),
154 video_source_(NULL) {} 193 video_source_(nullptr) {}
155 194
156 void RequestUserMediaForTest( 195 void RequestUserMediaForTest(
157 const blink::WebUserMediaRequest& user_media_request) { 196 const blink::WebUserMediaRequest& user_media_request) {
158 state_ = REQUEST_NOT_COMPLETE; 197 state_ = REQUEST_NOT_COMPLETE;
159 requestUserMedia(user_media_request); 198 requestUserMedia(user_media_request);
160 base::RunLoop().RunUntilIdle(); 199 base::RunLoop().RunUntilIdle();
161 } 200 }
162 201
163 void RequestUserMediaForTest() { 202 void RequestUserMediaForTest() {
164 blink::WebUserMediaRequest user_media_request = 203 blink::WebUserMediaRequest user_media_request =
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 null_constraints); 422 null_constraints);
384 user_media_client_impl_->RequestUserMediaForTest(request); 423 user_media_client_impl_->RequestUserMediaForTest(request);
385 bool result = 424 bool result =
386 user_media_client_impl_->UserMediaRequestHasAutomaticDeviceSelection( 425 user_media_client_impl_->UserMediaRequestHasAutomaticDeviceSelection(
387 ms_dispatcher_->audio_input_request_id()); 426 ms_dispatcher_->audio_input_request_id());
388 user_media_client_impl_->DeleteRequest( 427 user_media_client_impl_->DeleteRequest(
389 ms_dispatcher_->audio_input_request_id()); 428 ms_dispatcher_->audio_input_request_id());
390 return result; 429 return result;
391 } 430 }
392 431
393 void TestValidRequestWithDeviceConstraints( 432 void TestValidRequestWithConstraints(
394 const blink::WebMediaConstraints& audio_constraints, 433 const blink::WebMediaConstraints& audio_constraints,
395 const blink::WebMediaConstraints& video_constraints, 434 const blink::WebMediaConstraints& video_constraints,
396 const std::string& expected_audio_device_id, 435 const std::string& expected_audio_device_id,
397 const std::string& expected_video_device_id) { 436 const std::string& expected_video_device_id) {
398 DCHECK(!audio_constraints.isNull()); 437 DCHECK(!audio_constraints.isNull());
399 DCHECK(!video_constraints.isNull()); 438 DCHECK(!video_constraints.isNull());
400 blink::WebUserMediaRequest request = 439 blink::WebUserMediaRequest request =
401 blink::WebUserMediaRequest::createForTesting(audio_constraints, 440 blink::WebUserMediaRequest::createForTesting(audio_constraints,
402 video_constraints); 441 video_constraints);
403 user_media_client_impl_->RequestUserMediaForTest(request); 442 user_media_client_impl_->RequestUserMediaForTest(request);
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 user_media_client_impl_->RequestUserMediaForTest(request); 870 user_media_client_impl_->RequestUserMediaForTest(request);
832 EXPECT_EQ(UserMediaClientImplUnderTest::REQUEST_FAILED, 871 EXPECT_EQ(UserMediaClientImplUnderTest::REQUEST_FAILED,
833 user_media_client_impl_->request_state()); 872 user_media_client_impl_->request_state());
834 } 873 }
835 874
836 TEST_F(UserMediaClientImplTest, CreateWithMandatoryValidDeviceIds) { 875 TEST_F(UserMediaClientImplTest, CreateWithMandatoryValidDeviceIds) {
837 blink::WebMediaConstraints audio_constraints = 876 blink::WebMediaConstraints audio_constraints =
838 CreateDeviceConstraints(kFakeAudioInputDeviceId1); 877 CreateDeviceConstraints(kFakeAudioInputDeviceId1);
839 blink::WebMediaConstraints video_constraints = 878 blink::WebMediaConstraints video_constraints =
840 CreateDeviceConstraints(kFakeVideoInputDeviceId1); 879 CreateDeviceConstraints(kFakeVideoInputDeviceId1);
841 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, 880 TestValidRequestWithConstraints(audio_constraints, video_constraints,
842 kFakeAudioInputDeviceId1, 881 kFakeAudioInputDeviceId1,
843 kFakeVideoInputDeviceId1); 882 kFakeVideoInputDeviceId1);
844 } 883 }
845 884
846 TEST_F(UserMediaClientImplTest, CreateWithBasicIdealValidDeviceId) { 885 TEST_F(UserMediaClientImplTest, CreateWithBasicIdealValidDeviceId) {
847 blink::WebMediaConstraints audio_constraints = 886 blink::WebMediaConstraints audio_constraints =
848 CreateDeviceConstraints(nullptr, kFakeAudioInputDeviceId1); 887 CreateDeviceConstraints(nullptr, kFakeAudioInputDeviceId1);
849 blink::WebMediaConstraints video_constraints = 888 blink::WebMediaConstraints video_constraints =
850 CreateDeviceConstraints(nullptr, kFakeVideoInputDeviceId1); 889 CreateDeviceConstraints(nullptr, kFakeVideoInputDeviceId1);
851 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, 890 TestValidRequestWithConstraints(audio_constraints, video_constraints,
852 kFakeAudioInputDeviceId1, 891 kFakeAudioInputDeviceId1,
853 kFakeVideoInputDeviceId1); 892 kFakeVideoInputDeviceId1);
854 } 893 }
855 894
856 TEST_F(UserMediaClientImplTest, CreateWithAdvancedExactValidDeviceId) { 895 TEST_F(UserMediaClientImplTest, CreateWithAdvancedExactValidDeviceId) {
857 blink::WebMediaConstraints audio_constraints = 896 blink::WebMediaConstraints audio_constraints =
858 CreateDeviceConstraints(nullptr, nullptr, kFakeAudioInputDeviceId1); 897 CreateDeviceConstraints(nullptr, nullptr, kFakeAudioInputDeviceId1);
859 blink::WebMediaConstraints video_constraints = CreateDeviceConstraints( 898 blink::WebMediaConstraints video_constraints = CreateDeviceConstraints(
860 nullptr, nullptr, kFakeVideoInputDeviceId1); 899 nullptr, nullptr, kFakeVideoInputDeviceId1);
861 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, 900 TestValidRequestWithConstraints(audio_constraints, video_constraints,
862 kFakeAudioInputDeviceId1, 901 kFakeAudioInputDeviceId1,
863 kFakeVideoInputDeviceId1); 902 kFakeVideoInputDeviceId1);
864 }
865
866 TEST_F(UserMediaClientImplTest, CreateWithAdvancedIdealValidDeviceId) {
867 blink::WebMediaConstraints audio_constraints = CreateDeviceConstraints(
868 nullptr, nullptr, nullptr, kFakeAudioInputDeviceId1);
869 blink::WebMediaConstraints video_constraints = CreateDeviceConstraints(
870 nullptr, nullptr, nullptr, kFakeVideoInputDeviceId1);
871 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints,
872 kFakeAudioInputDeviceId1,
873 kFakeVideoInputDeviceId1);
874 } 903 }
875 904
876 TEST_F(UserMediaClientImplTest, CreateWithAllOptionalInvalidDeviceId) { 905 TEST_F(UserMediaClientImplTest, CreateWithAllOptionalInvalidDeviceId) {
877 blink::WebMediaConstraints audio_constraints = CreateDeviceConstraints( 906 blink::WebMediaConstraints audio_constraints =
878 nullptr, kInvalidDeviceId, kInvalidDeviceId, kInvalidDeviceId); 907 CreateDeviceConstraints(nullptr, kInvalidDeviceId, kInvalidDeviceId);
879 blink::WebMediaConstraints video_constraints = CreateDeviceConstraints( 908 blink::WebMediaConstraints video_constraints =
880 nullptr, kInvalidDeviceId, kInvalidDeviceId, kInvalidDeviceId); 909 CreateDeviceConstraints(nullptr, kInvalidDeviceId, kInvalidDeviceId);
881 // MockMediaStreamDispatcher uses empty string as default device ID. 910 // MockMediaStreamDispatcher uses empty string as default audio device ID.
882 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, 911 // MockMediaDevicesDispatcher uses the first device in the enumeration as
883 std::string(), std::string()); 912 // default video device ID.
913 TestValidRequestWithConstraints(audio_constraints, video_constraints,
914 std::string(), kFakeVideoInputDeviceId1);
884 } 915 }
885 916
886 TEST_F(UserMediaClientImplTest, 917 TEST_F(UserMediaClientImplTest, CreateWithFacingModeUser) {
887 CreateWithAdvancedIdealValidOtherOptionalInvalidDeviceId) { 918 blink::WebMediaConstraints audio_constraints =
888 blink::WebMediaConstraints audio_constraints = CreateDeviceConstraints( 919 CreateDeviceConstraints(kFakeAudioInputDeviceId1);
889 nullptr, kInvalidDeviceId, kInvalidDeviceId, kFakeAudioInputDeviceId1); 920 blink::WebMediaConstraints video_constraints =
890 blink::WebMediaConstraints video_constraints = CreateDeviceConstraints( 921 CreateFacingModeConstraints("user");
891 nullptr, kInvalidDeviceId, kInvalidDeviceId, kFakeVideoInputDeviceId1); 922 // kFakeVideoInputDeviceId1 has user facing mode.
892 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, 923 TestValidRequestWithConstraints(audio_constraints, video_constraints,
893 kFakeAudioInputDeviceId1, 924 kFakeAudioInputDeviceId1,
894 kFakeVideoInputDeviceId1); 925 kFakeVideoInputDeviceId1);
926 }
927
928 TEST_F(UserMediaClientImplTest, CreateWithFacingModeEnvironment) {
929 blink::WebMediaConstraints audio_constraints =
930 CreateDeviceConstraints(kFakeAudioInputDeviceId1);
931 blink::WebMediaConstraints video_constraints =
932 CreateFacingModeConstraints("environment");
933 // kFakeVideoInputDeviceId2 has environment facing mode.
934 TestValidRequestWithConstraints(audio_constraints, video_constraints,
935 kFakeAudioInputDeviceId1,
936 kFakeVideoInputDeviceId2);
895 } 937 }
896 938
897 } // namespace content 939 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/user_media_client_impl.cc ('k') | content/renderer/render_frame_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698