1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <stddef.h>
#include <memory>
#include <string>
#include "base/command_line.h"
#include "base/functional/bind.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "components/permissions/features.h"
#include "components/permissions/permission_request.h"
#include "components/permissions/permission_request_queue.h"
#include "components/permissions/permission_util.h"
#include "components/permissions/request_type.h"
#include "components/permissions/test/mock_permission_prompt_factory.h"
#include "components/permissions/test/mock_permission_request.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace permissions {
class PermissionRequestQueueTest : public ::testing::Test {
public:
PermissionRequestQueueTest()
: request_low1_(RequestType::kGeolocation,
PermissionRequestGestureType::GESTURE),
request_low2_(RequestType::kNotifications,
PermissionRequestGestureType::NO_GESTURE),
request_normal1_(RequestType::kMultipleDownloads,
PermissionRequestGestureType::GESTURE),
request_normal2_(RequestType::kClipboard,
PermissionRequestGestureType::NO_GESTURE),
request_pepc1_(RequestType::kCameraStream,
/*embedded_permission_element_initiated=*/true),
request_pepc2_(RequestType::kGeolocation,
/*embedded_permission_element_initiated=*/true) {}
protected:
std::unique_ptr<MockPermissionRequest> CreateRequest(
std::pair<RequestType, PermissionRequestGestureType> request_params,
base::WeakPtr<MockPermissionRequest::MockPermissionRequestState> state =
nullptr) {
return std::make_unique<permissions::MockPermissionRequest>(
request_params.first, request_params.second, state);
}
std::unique_ptr<MockPermissionRequest> CreateRequest(
std::pair<RequestType, bool> request_params,
base::WeakPtr<MockPermissionRequest::MockPermissionRequestState> state =
nullptr) {
return std::make_unique<permissions::MockPermissionRequest>(
GURL(MockPermissionRequest::kDefaultOrigin), request_params.first,
request_params.second, state);
}
PermissionRequestQueue permission_request_queue_;
std::pair<RequestType, PermissionRequestGestureType> request_low1_;
std::pair<RequestType, PermissionRequestGestureType> request_low2_;
std::pair<RequestType, PermissionRequestGestureType> request_normal1_;
std::pair<RequestType, PermissionRequestGestureType> request_normal2_;
std::pair<RequestType, bool> request_pepc1_;
std::pair<RequestType, bool> request_pepc2_;
base::test::ScopedFeatureList feature_list_;
};
TEST_F(PermissionRequestQueueTest, CountNumberOfRequestsInQueue) {
EXPECT_EQ(0ul, permission_request_queue_.size());
permission_request_queue_.Push(CreateRequest(request_normal1_));
permission_request_queue_.Push(CreateRequest(request_normal2_));
EXPECT_EQ(2ul, permission_request_queue_.size());
permission_request_queue_.Pop();
EXPECT_EQ(1ul, permission_request_queue_.size());
}
TEST_F(PermissionRequestQueueTest, CountDuplicateRequests) {
EXPECT_EQ(0ul, permission_request_queue_.size());
permission_request_queue_.Push(CreateRequest(request_normal1_));
permission_request_queue_.Push(CreateRequest(request_normal1_));
EXPECT_EQ(2ul, permission_request_queue_.size());
}
TEST_F(PermissionRequestQueueTest, OnlyEmptyWithoutRequests) {
EXPECT_TRUE(permission_request_queue_.IsEmpty());
permission_request_queue_.Push(CreateRequest(request_normal1_));
EXPECT_FALSE(permission_request_queue_.IsEmpty());
permission_request_queue_.Pop();
EXPECT_TRUE(permission_request_queue_.IsEmpty());
}
TEST_F(PermissionRequestQueueTest, VerifyContains) {
auto request1 = CreateRequest(request_normal1_);
auto request2 = CreateRequest(request_normal2_);
auto* request1_ptr = request1.get();
auto* request2_ptr = request2.get();
EXPECT_FALSE(permission_request_queue_.Contains(request1_ptr));
EXPECT_FALSE(permission_request_queue_.Contains(request2_ptr));
permission_request_queue_.Push(std::move(request1));
EXPECT_TRUE(permission_request_queue_.Contains(request1_ptr));
EXPECT_FALSE(permission_request_queue_.Contains(request2_ptr));
permission_request_queue_.Push(std::move(request2));
EXPECT_TRUE(permission_request_queue_.Contains(request1_ptr));
EXPECT_TRUE(permission_request_queue_.Contains(request2_ptr));
auto popped_request = permission_request_queue_.Pop();
if (PermissionUtil::DoesPlatformSupportChip()) {
EXPECT_EQ(popped_request.get(), request2_ptr);
EXPECT_TRUE(permission_request_queue_.Contains(request1_ptr));
EXPECT_FALSE(permission_request_queue_.Contains(request2_ptr));
} else {
EXPECT_EQ(popped_request.get(), request1_ptr);
EXPECT_FALSE(permission_request_queue_.Contains(request1_ptr));
EXPECT_TRUE(permission_request_queue_.Contains(request2_ptr));
}
}
TEST_F(PermissionRequestQueueTest, ShouldFindDuplicateRequest) {
auto request_normal1 = CreateRequest(request_normal1_);
auto request_normal2 = CreateRequest(request_normal2_);
auto request_normal2_ptr = request_normal2.get();
permission_request_queue_.Push(std::move(request_normal1));
permission_request_queue_.Push(std::move(request_normal2));
EXPECT_EQ(request_normal2_ptr, permission_request_queue_.FindDuplicate(
CreateRequest(request_normal2_).get()));
}
TEST_F(PermissionRequestQueueTest, ShouldNotFindDuplicateIfNotPresent) {
permission_request_queue_.Push(CreateRequest(request_normal1_));
EXPECT_EQ(nullptr, permission_request_queue_.FindDuplicate(
CreateRequest(request_normal2_).get()));
}
TEST_F(PermissionRequestQueueTest, PeekedElementIsNextPoppedElement) {
permission_request_queue_.Push(CreateRequest(request_normal1_));
permission_request_queue_.Push(CreateRequest(request_normal2_));
PermissionRequest* peekedElement = permission_request_queue_.Peek();
EXPECT_EQ(peekedElement, permission_request_queue_.Pop().get());
}
TEST_F(PermissionRequestQueueTest, VerifyPushOrder) {
permission_request_queue_.Push(CreateRequest(request_normal1_));
permission_request_queue_.Push(CreateRequest(request_normal2_));
permission_request_queue_.Push(CreateRequest(request_normal2_));
if (!PermissionUtil::DoesPlatformSupportChip()) {
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal2_.first);
} else {
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
}
}
TEST_F(PermissionRequestQueueTest, VerifyPushOrderLowPriority) {
permission_request_queue_.Push(CreateRequest(request_low1_));
permission_request_queue_.Push(CreateRequest(request_normal1_));
permission_request_queue_.Push(CreateRequest(request_low2_));
permission_request_queue_.Push(CreateRequest(request_normal2_));
if (PermissionUtil::DoesPlatformSupportChip()) {
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low1_.first);
} else {
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal2_.first);
}
}
TEST_F(PermissionRequestQueueTest, VerifyPushFrontOrder) {
permission_request_queue_.PushFront(CreateRequest(request_pepc1_));
permission_request_queue_.PushFront(CreateRequest(request_low1_));
permission_request_queue_.PushFront(CreateRequest(request_normal1_));
permission_request_queue_.PushFront(CreateRequest(request_normal2_));
permission_request_queue_.PushFront(CreateRequest(request_low2_));
if (PermissionUtil::DoesPlatformSupportChip()) {
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low1_.first);
} else {
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low1_.first);
}
}
TEST_F(PermissionRequestQueueTest, VerifyPushBackOrder) {
permission_request_queue_.PushBack(CreateRequest(request_low1_));
permission_request_queue_.PushBack(CreateRequest(request_pepc1_));
permission_request_queue_.PushBack(CreateRequest(request_normal1_));
permission_request_queue_.PushBack(CreateRequest(request_normal2_));
permission_request_queue_.PushBack(CreateRequest(request_low2_));
permission_request_queue_.PushBack(CreateRequest(request_pepc2_));
if (PermissionUtil::DoesPlatformSupportChip()) {
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low2_.first);
} else {
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low2_.first);
}
}
TEST_F(PermissionRequestQueueTest, PEPCPushesOtherRequests) {
permission_request_queue_.Push(CreateRequest(request_low1_));
permission_request_queue_.Push(CreateRequest(request_normal1_));
permission_request_queue_.Push(CreateRequest(request_pepc1_));
if (PermissionUtil::DoesPlatformSupportChip()) {
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low1_.first);
} else {
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_low1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
}
}
TEST_F(PermissionRequestQueueTest, PEPCNotPushedByOtherRequests) {
permission_request_queue_.Push(CreateRequest(request_pepc1_));
permission_request_queue_.Push(CreateRequest(request_normal1_));
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
}
TEST_F(PermissionRequestQueueTest, PEPCDoesNotPushOtherPEPCRequests) {
permission_request_queue_.Push(CreateRequest(request_pepc1_));
permission_request_queue_.Push(CreateRequest(request_normal1_));
permission_request_queue_.Push(CreateRequest(request_pepc2_));
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc1_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_pepc2_.first);
EXPECT_EQ(permission_request_queue_.Pop()->request_type(),
request_normal1_.first);
}
} // namespace permissions
|