blob: 5073fc657c5749c3edddaa7656c10e51e5c35f47 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "android_webview/browser/permission/media_access_permission_request.h"
#include "base/bind.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/mojom/mediastream/media_stream.mojom-shared.h"
namespace android_webview {
class TestMediaAccessPermissionRequest : public MediaAccessPermissionRequest {
public:
TestMediaAccessPermissionRequest(
const content::MediaStreamRequest& request,
content::MediaResponseCallback callback,
const blink::MediaStreamDevices& audio_devices,
const blink::MediaStreamDevices& video_devices)
: MediaAccessPermissionRequest(request, std::move(callback)) {
audio_test_devices_ = audio_devices;
video_test_devices_ = video_devices;
}
};
class MediaAccessPermissionRequestTest : public testing::Test {
protected:
void SetUp() override {
audio_device_id_ = "audio";
video_device_id_ = "video";
first_audio_device_id_ = "audio1";
first_video_device_id_ = "video1";
}
std::unique_ptr<TestMediaAccessPermissionRequest> CreateRequest(
std::string audio_id,
std::string video_id) {
blink::MediaStreamDevices audio_devices;
audio_devices.push_back(blink::MediaStreamDevice(
blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE,
first_audio_device_id_, "a2"));
audio_devices.push_back(blink::MediaStreamDevice(
blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE, audio_device_id_,
"a1"));
blink::MediaStreamDevices video_devices;
video_devices.push_back(blink::MediaStreamDevice(
blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE,
first_video_device_id_, "v2"));
video_devices.push_back(blink::MediaStreamDevice(
blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE, video_device_id_,
"v1"));
GURL origin("https://www.google.com");
content::MediaStreamRequest request(
0, 0, 0, origin, false, blink::MEDIA_GENERATE_STREAM, audio_id,
video_id, blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE,
blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE,
false /* disable_local_echo */);
std::unique_ptr<TestMediaAccessPermissionRequest> permission_request;
permission_request.reset(new TestMediaAccessPermissionRequest(
request,
base::BindRepeating(&MediaAccessPermissionRequestTest::Callback,
base::Unretained(this)),
audio_devices, video_devices));
return permission_request;
}
std::string audio_device_id_;
std::string video_device_id_;
std::string first_audio_device_id_;
std::string first_video_device_id_;
blink::MediaStreamDevices devices_;
blink::mojom::MediaStreamRequestResult result_;
private:
void Callback(const blink::MediaStreamDevices& devices,
blink::mojom::MediaStreamRequestResult result,
std::unique_ptr<content::MediaStreamUI> ui) {
devices_ = devices;
result_ = result;
}
};
TEST_F(MediaAccessPermissionRequestTest, TestGrantPermissionRequest) {
std::unique_ptr<TestMediaAccessPermissionRequest> request =
CreateRequest(audio_device_id_, video_device_id_);
request->NotifyRequestResult(true);
EXPECT_EQ(2u, devices_.size());
EXPECT_EQ(blink::mojom::MediaStreamRequestResult::OK, result_);
bool audio_exist = false;
bool video_exist = false;
for (blink::MediaStreamDevices::iterator i = devices_.begin();
i != devices_.end(); ++i) {
if (i->type == blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE &&
i->id == audio_device_id_) {
audio_exist = true;
} else if (i->type == blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE &&
i->id == video_device_id_) {
video_exist = true;
}
}
EXPECT_TRUE(audio_exist);
EXPECT_TRUE(video_exist);
}
TEST_F(MediaAccessPermissionRequestTest, TestGrantPermissionRequestWithoutID) {
std::unique_ptr<TestMediaAccessPermissionRequest> request =
CreateRequest(std::string(), std::string());
request->NotifyRequestResult(true);
EXPECT_EQ(2u, devices_.size());
EXPECT_EQ(blink::mojom::MediaStreamRequestResult::OK, result_);
bool audio_exist = false;
bool video_exist = false;
for (blink::MediaStreamDevices::iterator i = devices_.begin();
i != devices_.end(); ++i) {
if (i->type == blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE &&
i->id == first_audio_device_id_) {
audio_exist = true;
} else if (i->type == blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE &&
i->id == first_video_device_id_) {
video_exist = true;
}
}
EXPECT_TRUE(audio_exist);
EXPECT_TRUE(video_exist);
}
TEST_F(MediaAccessPermissionRequestTest, TestDenyPermissionRequest) {
std::unique_ptr<TestMediaAccessPermissionRequest> request =
CreateRequest(std::string(), std::string());
request->NotifyRequestResult(false);
EXPECT_TRUE(devices_.empty());
EXPECT_EQ(blink::mojom::MediaStreamRequestResult::PERMISSION_DENIED, result_);
}
} // namespace android_webview