| Index: android_webview/native/permission/permission_request_handler_unittest.cc
|
| diff --git a/android_webview/native/permission/permission_request_handler_unittest.cc b/android_webview/native/permission/permission_request_handler_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..2948dd9910a2308d98ad7b0a2ba10fa405aca955
|
| --- /dev/null
|
| +++ b/android_webview/native/permission/permission_request_handler_unittest.cc
|
| @@ -0,0 +1,269 @@
|
| +// 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/native/permission/aw_permission_request.h"
|
| +#include "android_webview/native/permission/aw_permission_request_delegate.h"
|
| +#include "android_webview/native/permission/permission_request_handler.h"
|
| +#include "android_webview/native/permission/permission_request_handler_client.h"
|
| +#include "base/bind.h"
|
| +#include "base/callback.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace android_webview {
|
| +
|
| +class TestAwPermissionRequestDelegate : public AwPermissionRequestDelegate {
|
| + public:
|
| + TestAwPermissionRequestDelegate(
|
| + const GURL& origin, int64 resources, base::Callback<void(bool)> callback)
|
| + : origin_(origin),
|
| + resources_(resources),
|
| + callback_(callback) {}
|
| +
|
| + // Get the origin which initiated the permission request.
|
| + virtual const GURL& GetOrigin() OVERRIDE {
|
| + return origin_;
|
| + }
|
| +
|
| + // Get the resources the origin wanted to access.
|
| + virtual int64 GetResources() OVERRIDE {
|
| + return resources_;
|
| + }
|
| +
|
| + // Notify the permission request is allowed or not.
|
| + virtual void NotifyRequestResult(bool allowed) OVERRIDE {
|
| + callback_.Run(allowed);
|
| + }
|
| +
|
| + private:
|
| + GURL origin_;
|
| + int64 resources_;
|
| + base::Callback<void(bool)> callback_;
|
| +};
|
| +
|
| +class TestPermissionRequestHandlerClient :
|
| + public PermissionRequestHandlerClient {
|
| + public:
|
| + struct Permission {
|
| + Permission()
|
| + :resources(0) {}
|
| + Permission(const GURL& origin, int64 resources)
|
| + : origin(origin),
|
| + resources(resources) {}
|
| + GURL origin;
|
| + int64 resources;
|
| + };
|
| +
|
| + virtual void OnPermissionRequest(AwPermissionRequest* request) OVERRIDE {
|
| + request_ = request;
|
| + requested_permission_ =
|
| + Permission(request->GetOrigin(), request->GetResources());
|
| + }
|
| +
|
| + virtual void OnPermissionRequestCanceled(
|
| + AwPermissionRequest* request) OVERRIDE{
|
| + canceled_permission_ =
|
| + Permission(request->GetOrigin(), request->GetResources());
|
| + }
|
| +
|
| + AwPermissionRequest* request() {
|
| + return request_;
|
| + }
|
| +
|
| + const Permission& requested_permission() {
|
| + return requested_permission_;
|
| + }
|
| +
|
| + const Permission& canceled_permission() {
|
| + return canceled_permission_;
|
| + }
|
| +
|
| + void Grant() {
|
| + request_->OnAccept(NULL, NULL, true);
|
| + request_ = NULL;
|
| + }
|
| +
|
| + void Deny() {
|
| + request_->OnAccept(NULL, NULL, false);
|
| + request_ = NULL;
|
| + }
|
| +
|
| + private:
|
| + AwPermissionRequest* request_;
|
| + Permission requested_permission_;
|
| + Permission canceled_permission_;
|
| +};
|
| +
|
| +class TestPermissionRequestHandler : public PermissionRequestHandler {
|
| + public:
|
| + TestPermissionRequestHandler(PermissionRequestHandlerClient* client)
|
| + : PermissionRequestHandler(client) {
|
| + }
|
| +
|
| + const std::vector<base::WeakPtr<AwPermissionRequest> > requests() {
|
| + return requests_;
|
| + }
|
| +
|
| + void PruneRequests() {
|
| + return PermissionRequestHandler::PruneRequests();
|
| + }
|
| +};
|
| +
|
| +class PermissionRequestHandlerTest : public testing::Test {
|
| + public:
|
| + PermissionRequestHandlerTest()
|
| + : handler_(&client_),
|
| + allowed_(false) {}
|
| +
|
| + void NotifyRequestResult(bool allowed) {
|
| + allowed_ = allowed;
|
| + }
|
| +
|
| + protected:
|
| + virtual void SetUp() OVERRIDE {
|
| + testing::Test::SetUp();
|
| + origin_ = GURL("http://www.google.com");
|
| + resources_ =
|
| + AwPermissionRequest::VideoCapture | AwPermissionRequest::AudioCapture;
|
| + delegate_.reset(
|
| + new TestAwPermissionRequestDelegate(
|
| + origin_, resources_, base::Bind(
|
| + &PermissionRequestHandlerTest::NotifyRequestResult,
|
| + base::Unretained(this))));
|
| + }
|
| +
|
| + const GURL& origin() {
|
| + return origin_;
|
| + }
|
| +
|
| + int64 resources() {
|
| + return resources_;
|
| + }
|
| +
|
| + scoped_ptr<AwPermissionRequestDelegate> delegate() {
|
| + return delegate_.Pass();
|
| + }
|
| +
|
| + TestPermissionRequestHandler* handler() {
|
| + return &handler_;
|
| + }
|
| +
|
| + TestPermissionRequestHandlerClient* client() {
|
| + return &client_;
|
| + }
|
| +
|
| + bool allowed() {
|
| + return allowed_;
|
| + }
|
| +
|
| + private:
|
| + GURL origin_;
|
| + int64 resources_;
|
| + scoped_ptr<AwPermissionRequestDelegate> delegate_;
|
| + TestPermissionRequestHandlerClient client_;
|
| + TestPermissionRequestHandler handler_;
|
| + bool allowed_;
|
| +};
|
| +
|
| +TEST_F(PermissionRequestHandlerTest, TestPermissionGranted) {
|
| + handler()->SendRequest(delegate().Pass());
|
| + // Verify Handler store the request correctly.
|
| + ASSERT_EQ(1u, handler()->requests().size());
|
| + EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
|
| + EXPECT_EQ(resources(), handler()->requests()[0]->GetResources());
|
| +
|
| + // Verify client's onPermissionRequest was called
|
| + EXPECT_EQ(origin(), client()->request()->GetOrigin());
|
| + EXPECT_EQ(resources(), client()->request()->GetResources());
|
| +
|
| + // Simulate the grant request.
|
| + client()->Grant();
|
| + // Verify the request is notified as granted
|
| + EXPECT_TRUE(allowed());
|
| + handler()->PruneRequests();
|
| + // Verify the weak reference in handler was removed.
|
| + EXPECT_TRUE(handler()->requests().empty());
|
| +}
|
| +
|
| +TEST_F(PermissionRequestHandlerTest, TestPermissionDenied) {
|
| + handler()->SendRequest(delegate().Pass());
|
| + // Verify Handler store the request correctly.
|
| + ASSERT_EQ(1u, handler()->requests().size());
|
| + EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
|
| + EXPECT_EQ(resources(), handler()->requests()[0]->GetResources());
|
| +
|
| + // Verify client's onPermissionRequest was called
|
| + EXPECT_EQ(origin(), client()->request()->GetOrigin());
|
| + EXPECT_EQ(resources(), client()->request()->GetResources());
|
| +
|
| + // Simulate the deny request.
|
| + client()->Deny();
|
| + // Verify the request is notified as granted
|
| + EXPECT_FALSE(allowed());
|
| + handler()->PruneRequests();
|
| + // Verify the weak reference in handler was removed.
|
| + EXPECT_TRUE(handler()->requests().empty());
|
| +}
|
| +
|
| +TEST_F(PermissionRequestHandlerTest, TestMultiplePermissionRequest) {
|
| + GURL origin1 = GURL("http://a.google.com");
|
| + int64 resources1 = AwPermissionRequest::Geolocation;
|
| +
|
| + scoped_ptr<AwPermissionRequestDelegate> delegate1;
|
| + delegate1.reset(new TestAwPermissionRequestDelegate(
|
| + origin1, resources1,
|
| + base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult,
|
| + base::Unretained(this))));
|
| +
|
| + // Send 1st request
|
| + handler()->SendRequest(delegate().Pass());
|
| + // Verify Handler store the request correctly.
|
| + ASSERT_EQ(1u, handler()->requests().size());
|
| + EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
|
| + EXPECT_EQ(resources(), handler()->requests()[0]->GetResources());
|
| + // Verify client's onPermissionRequest was called
|
| + EXPECT_EQ(origin(), client()->request()->GetOrigin());
|
| + EXPECT_EQ(resources(), client()->request()->GetResources());
|
| +
|
| + // Send 2nd request
|
| + handler()->SendRequest(delegate1.Pass());
|
| + // Verify Handler store the request correctly.
|
| + ASSERT_EQ(2u, handler()->requests().size());
|
| + EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
|
| + EXPECT_EQ(resources(), handler()->requests()[0]->GetResources());
|
| + EXPECT_EQ(origin1, handler()->requests()[1]->GetOrigin());
|
| + EXPECT_EQ(resources1, handler()->requests()[1]->GetResources());
|
| + // Verify client's onPermissionRequest was called
|
| + EXPECT_EQ(origin1, client()->request()->GetOrigin());
|
| + EXPECT_EQ(resources1, client()->request()->GetResources());
|
| +
|
| + // Send 3rd request which has same origin and resources as first one.
|
| + delegate1.reset(new TestAwPermissionRequestDelegate(origin(), resources(),
|
| + base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult,
|
| + base::Unretained(this))));
|
| + handler()->SendRequest(delegate1.Pass());
|
| + // Verify Handler store the request correctly.
|
| + ASSERT_EQ(3u, handler()->requests().size());
|
| + EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin());
|
| + EXPECT_EQ(resources(), handler()->requests()[0]->GetResources());
|
| + EXPECT_EQ(origin1, handler()->requests()[1]->GetOrigin());
|
| + EXPECT_EQ(resources1, handler()->requests()[1]->GetResources());
|
| + EXPECT_EQ(origin(), handler()->requests()[2]->GetOrigin());
|
| + EXPECT_EQ(resources(), handler()->requests()[2]->GetResources());
|
| + // Verify client's onPermissionRequest was called
|
| + EXPECT_EQ(origin(), client()->request()->GetOrigin());
|
| + EXPECT_EQ(resources(), client()->request()->GetResources());
|
| +
|
| + // Cancel the request.
|
| + handler()->CancelRequest(origin(), resources());
|
| + // Verify client's OnPermissionRequestCancled() was called.
|
| + EXPECT_EQ(origin(), client()->canceled_permission().origin);
|
| + EXPECT_EQ(resources(), client()->canceled_permission().resources);
|
| + // Verify Handler store the request correctly, the 1st and 3rd were removed.
|
| + handler()->PruneRequests();
|
| + ASSERT_EQ(1u, handler()->requests().size());
|
| + EXPECT_EQ(origin1, handler()->requests()[0]->GetOrigin());
|
| + EXPECT_EQ(resources1, handler()->requests()[0]->GetResources());
|
| +}
|
| +
|
| +} // android_webview
|
|
|