media_access_permission_request_unittest.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // Copyright 2014 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 "android_webview/browser/permission/media_access_permission_request.h"
  5. #include <memory>
  6. #include "base/bind.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. #include "third_party/blink/public/common/mediastream/media_stream_request.h"
  9. #include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"
  10. #include "third_party/blink/public/mojom/mediastream/media_stream.mojom.h"
  11. namespace android_webview {
  12. class TestMediaAccessPermissionRequest : public MediaAccessPermissionRequest {
  13. public:
  14. TestMediaAccessPermissionRequest(
  15. const content::MediaStreamRequest& request,
  16. content::MediaResponseCallback callback,
  17. const blink::MediaStreamDevices& audio_devices,
  18. const blink::MediaStreamDevices& video_devices)
  19. : MediaAccessPermissionRequest(request, std::move(callback)) {
  20. audio_test_devices_ = audio_devices;
  21. video_test_devices_ = video_devices;
  22. }
  23. };
  24. class MediaAccessPermissionRequestTest : public testing::Test {
  25. protected:
  26. void SetUp() override {
  27. audio_device_id_ = "audio";
  28. video_device_id_ = "video";
  29. first_audio_device_id_ = "audio1";
  30. first_video_device_id_ = "video1";
  31. }
  32. std::unique_ptr<TestMediaAccessPermissionRequest> CreateRequest(
  33. std::string audio_id,
  34. std::string video_id) {
  35. blink::MediaStreamDevices audio_devices;
  36. audio_devices.push_back(blink::MediaStreamDevice(
  37. blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE,
  38. first_audio_device_id_, "a2"));
  39. audio_devices.push_back(blink::MediaStreamDevice(
  40. blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE, audio_device_id_,
  41. "a1"));
  42. blink::MediaStreamDevices video_devices;
  43. video_devices.push_back(blink::MediaStreamDevice(
  44. blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE,
  45. first_video_device_id_, "v2"));
  46. video_devices.push_back(blink::MediaStreamDevice(
  47. blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE, video_device_id_,
  48. "v1"));
  49. GURL origin("https://www.google.com");
  50. content::MediaStreamRequest request(
  51. 0, 0, 0, origin, false, blink::MEDIA_GENERATE_STREAM, audio_id,
  52. video_id, blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE,
  53. blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE,
  54. false /* disable_local_echo */,
  55. false /* request_pan_tilt_zoom_permission */);
  56. std::unique_ptr<TestMediaAccessPermissionRequest> permission_request;
  57. permission_request = std::make_unique<TestMediaAccessPermissionRequest>(
  58. request,
  59. base::BindOnce(&MediaAccessPermissionRequestTest::Callback,
  60. base::Unretained(this)),
  61. audio_devices, video_devices);
  62. return permission_request;
  63. }
  64. std::string audio_device_id_;
  65. std::string video_device_id_;
  66. std::string first_audio_device_id_;
  67. std::string first_video_device_id_;
  68. blink::MediaStreamDevices devices_;
  69. blink::mojom::MediaStreamRequestResult result_;
  70. private:
  71. void Callback(const blink::mojom::StreamDevicesSet& stream_devices_set,
  72. blink::mojom::MediaStreamRequestResult result,
  73. std::unique_ptr<content::MediaStreamUI> ui) {
  74. devices_ = blink::ToMediaStreamDevicesList(stream_devices_set);
  75. result_ = result;
  76. }
  77. };
  78. TEST_F(MediaAccessPermissionRequestTest, TestGrantPermissionRequest) {
  79. std::unique_ptr<TestMediaAccessPermissionRequest> request =
  80. CreateRequest(audio_device_id_, video_device_id_);
  81. request->NotifyRequestResult(true);
  82. EXPECT_EQ(2u, devices_.size());
  83. EXPECT_EQ(blink::mojom::MediaStreamRequestResult::OK, result_);
  84. bool audio_exist = false;
  85. bool video_exist = false;
  86. for (blink::MediaStreamDevices::iterator i = devices_.begin();
  87. i != devices_.end(); ++i) {
  88. if (i->type == blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE &&
  89. i->id == audio_device_id_) {
  90. audio_exist = true;
  91. } else if (i->type == blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE &&
  92. i->id == video_device_id_) {
  93. video_exist = true;
  94. }
  95. }
  96. EXPECT_TRUE(audio_exist);
  97. EXPECT_TRUE(video_exist);
  98. }
  99. TEST_F(MediaAccessPermissionRequestTest, TestGrantPermissionRequestWithoutID) {
  100. std::unique_ptr<TestMediaAccessPermissionRequest> request =
  101. CreateRequest(std::string(), std::string());
  102. request->NotifyRequestResult(true);
  103. EXPECT_EQ(2u, devices_.size());
  104. EXPECT_EQ(blink::mojom::MediaStreamRequestResult::OK, result_);
  105. bool audio_exist = false;
  106. bool video_exist = false;
  107. for (blink::MediaStreamDevices::iterator i = devices_.begin();
  108. i != devices_.end(); ++i) {
  109. if (i->type == blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE &&
  110. i->id == first_audio_device_id_) {
  111. audio_exist = true;
  112. } else if (i->type == blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE &&
  113. i->id == first_video_device_id_) {
  114. video_exist = true;
  115. }
  116. }
  117. EXPECT_TRUE(audio_exist);
  118. EXPECT_TRUE(video_exist);
  119. }
  120. TEST_F(MediaAccessPermissionRequestTest, TestDenyPermissionRequest) {
  121. std::unique_ptr<TestMediaAccessPermissionRequest> request =
  122. CreateRequest(std::string(), std::string());
  123. request->NotifyRequestResult(false);
  124. EXPECT_TRUE(devices_.empty());
  125. EXPECT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED, result_);
  126. }
  127. } // namespace android_webview