1 // Copyright 2022 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
9 #include "base/command_line.h"
10 #include "base/functional/bind.h"
11 #include "base/test/scoped_feature_list.h"
12 #include "build/build_config.h"
13 #include "components/permissions/features.h"
14 #include "components/permissions/permission_request.h"
15 #include "components/permissions/permission_request_queue.h"
16 #include "components/permissions/permission_util.h"
17 #include "components/permissions/request_type.h"
18 #include "components/permissions/test/mock_permission_prompt_factory.h"
19 #include "components/permissions/test/mock_permission_request.h"
20 #include "testing/gtest/include/gtest/gtest.h"
22 namespace permissions {
24 class PermissionRequestQueueTest : public ::testing::Test {
26 PermissionRequestQueueTest()
27 : request_low1_(RequestType::kGeolocation,
28 PermissionRequestGestureType::GESTURE),
29 request_low2_(RequestType::kNotifications,
30 PermissionRequestGestureType::NO_GESTURE),
31 request_normal1_(RequestType::kMultipleDownloads,
32 PermissionRequestGestureType::GESTURE),
33 request_normal2_(RequestType::kClipboard,
34 PermissionRequestGestureType::NO_GESTURE),
35 request_pepc1_(RequestType::kCameraStream,
36 /*embedded_permission_element_initiated=*/true),
37 request_pepc2_(RequestType::kGeolocation,
38 /*embedded_permission_element_initiated=*/true) {}
41 PermissionRequestQueue permission_request_queue_;
42 MockPermissionRequest request_low1_;
43 MockPermissionRequest request_low2_;
44 MockPermissionRequest request_normal1_;
45 MockPermissionRequest request_normal2_;
46 MockPermissionRequest request_pepc1_;
47 MockPermissionRequest request_pepc2_;
48 base::test::ScopedFeatureList feature_list_;
51 TEST_F(PermissionRequestQueueTest, CountNumberOfRequestsInQueue) {
52 EXPECT_EQ(0ul, permission_request_queue_.size());
54 permission_request_queue_.Push(&request_normal1_);
55 permission_request_queue_.Push(&request_normal2_);
56 EXPECT_EQ(2ul, permission_request_queue_.size());
58 permission_request_queue_.Pop();
59 EXPECT_EQ(1ul, permission_request_queue_.size());
62 TEST_F(PermissionRequestQueueTest, CountDuplicateRequests) {
63 EXPECT_EQ(0ul, permission_request_queue_.size());
65 permission_request_queue_.Push(&request_normal1_);
66 permission_request_queue_.Push(&request_normal1_);
67 EXPECT_EQ(2ul, permission_request_queue_.size());
70 TEST_F(PermissionRequestQueueTest, CountNumberOfRequestOccurencesInQueue) {
71 EXPECT_EQ(0ul, permission_request_queue_.Count(&request_normal1_));
73 permission_request_queue_.Push(&request_normal1_);
74 permission_request_queue_.Push(&request_normal1_);
75 permission_request_queue_.Push(&request_normal2_);
77 EXPECT_EQ(2ul, permission_request_queue_.Count(&request_normal1_));
80 TEST_F(PermissionRequestQueueTest, OnlyEmptyWithoutRequests) {
81 EXPECT_TRUE(permission_request_queue_.IsEmpty());
83 permission_request_queue_.Push(&request_normal1_);
84 EXPECT_FALSE(permission_request_queue_.IsEmpty());
86 permission_request_queue_.Pop();
87 EXPECT_TRUE(permission_request_queue_.IsEmpty());
90 TEST_F(PermissionRequestQueueTest, ShouldFindDuplicateRequest) {
91 permission_request_queue_.Push(&request_normal1_);
92 permission_request_queue_.Push(&request_normal2_);
94 EXPECT_EQ(&request_normal2_,
95 permission_request_queue_.FindDuplicate(&request_normal2_));
98 TEST_F(PermissionRequestQueueTest, ShouldNotFindDuplicateIfNotPresent) {
99 permission_request_queue_.Push(&request_normal1_);
102 permission_request_queue_.FindDuplicate(&request_normal2_));
105 TEST_F(PermissionRequestQueueTest, PeekedElementIsNextPoppedElement) {
106 permission_request_queue_.Push(&request_normal1_);
107 permission_request_queue_.Push(&request_normal2_);
108 PermissionRequest* peekedElement = permission_request_queue_.Peek();
110 EXPECT_EQ(peekedElement, permission_request_queue_.Pop());
113 TEST_F(PermissionRequestQueueTest, VerifyPushOrder) {
114 permission_request_queue_.Push(&request_normal1_);
115 permission_request_queue_.Push(&request_normal2_);
116 permission_request_queue_.Push(&request_normal2_);
118 if (!PermissionUtil::DoesPlatformSupportChip()) {
119 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
120 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal2_);
121 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal2_);
123 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal2_);
124 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal2_);
125 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
129 TEST_F(PermissionRequestQueueTest, VerifyPushOrderLowPriority) {
130 permission_request_queue_.Push(&request_low1_);
131 permission_request_queue_.Push(&request_normal1_);
132 permission_request_queue_.Push(&request_low2_);
133 permission_request_queue_.Push(&request_normal2_);
135 if (PermissionUtil::DoesPlatformSupportChip()) {
136 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal2_);
137 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
138 EXPECT_EQ(permission_request_queue_.Pop(), &request_low2_);
139 EXPECT_EQ(permission_request_queue_.Pop(), &request_low1_);
141 EXPECT_EQ(permission_request_queue_.Pop(), &request_low1_);
142 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
143 EXPECT_EQ(permission_request_queue_.Pop(), &request_low2_);
144 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal2_);
148 TEST_F(PermissionRequestQueueTest, VerifyPushFrontOrder) {
149 permission_request_queue_.PushFront(&request_pepc1_);
150 permission_request_queue_.PushFront(&request_low1_);
151 permission_request_queue_.PushFront(&request_normal1_);
152 permission_request_queue_.PushFront(&request_normal2_);
153 permission_request_queue_.PushFront(&request_low2_);
155 if (PermissionUtil::DoesPlatformSupportChip()) {
156 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc1_);
157 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal2_);
158 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
159 EXPECT_EQ(permission_request_queue_.Pop(), &request_low2_);
160 EXPECT_EQ(permission_request_queue_.Pop(), &request_low1_);
162 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc1_);
163 EXPECT_EQ(permission_request_queue_.Pop(), &request_low2_);
164 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal2_);
165 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
166 EXPECT_EQ(permission_request_queue_.Pop(), &request_low1_);
170 TEST_F(PermissionRequestQueueTest, VerifyPushBackOrder) {
171 permission_request_queue_.PushBack(&request_low1_);
172 permission_request_queue_.PushBack(&request_pepc1_);
173 permission_request_queue_.PushBack(&request_normal1_);
174 permission_request_queue_.PushBack(&request_normal2_);
175 permission_request_queue_.PushBack(&request_low2_);
176 permission_request_queue_.PushBack(&request_pepc2_);
178 if (PermissionUtil::DoesPlatformSupportChip()) {
179 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc1_);
180 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc2_);
181 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
182 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal2_);
183 EXPECT_EQ(permission_request_queue_.Pop(), &request_low1_);
184 EXPECT_EQ(permission_request_queue_.Pop(), &request_low2_);
186 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc1_);
187 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc2_);
188 EXPECT_EQ(permission_request_queue_.Pop(), &request_low1_);
189 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
190 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal2_);
191 EXPECT_EQ(permission_request_queue_.Pop(), &request_low2_);
195 TEST_F(PermissionRequestQueueTest, PEPCPushesOtherRequests) {
196 permission_request_queue_.Push(&request_low1_);
197 permission_request_queue_.Push(&request_normal1_);
198 permission_request_queue_.Push(&request_pepc1_);
200 if (PermissionUtil::DoesPlatformSupportChip()) {
201 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc1_);
202 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
203 EXPECT_EQ(permission_request_queue_.Pop(), &request_low1_);
205 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc1_);
206 EXPECT_EQ(permission_request_queue_.Pop(), &request_low1_);
207 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
211 TEST_F(PermissionRequestQueueTest, PEPCNotPushedByOtherRequests) {
212 permission_request_queue_.Push(&request_pepc1_);
213 permission_request_queue_.Push(&request_normal1_);
215 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc1_);
216 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
219 TEST_F(PermissionRequestQueueTest, PEPCDoesNotPushOtherPEPCRequests) {
220 permission_request_queue_.Push(&request_pepc1_);
221 permission_request_queue_.Push(&request_normal1_);
222 permission_request_queue_.Push(&request_pepc2_);
224 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc1_);
225 EXPECT_EQ(permission_request_queue_.Pop(), &request_pepc2_);
226 EXPECT_EQ(permission_request_queue_.Pop(), &request_normal1_);
229 } // namespace permissions