Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2020 The Chromium Authors |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "content/browser/mojo_binder_policy_applier.h" |
| 6 | |
Avi Drissman | adac2199 | 2023-01-11 23:46:39 | [diff] [blame] | 7 | #include "base/functional/callback.h" |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 8 | #include "base/memory/weak_ptr.h" |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 9 | #include "base/test/bind.h" |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 10 | #include "base/test/task_environment.h" |
Lingqi Chi | 775e6075 | 2020-12-14 06:31:16 | [diff] [blame] | 11 | #include "content/browser/mojo_binder_policy_map_impl.h" |
Takashi Toyoshima | e133151 | 2023-11-13 02:51:15 | [diff] [blame] | 12 | #include "content/public/test/mojo_capability_control_test_interfaces.mojom.h" |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 13 | #include "mojo/public/cpp/bindings/generic_pending_receiver.h" |
| 14 | #include "mojo/public/cpp/bindings/receiver.h" |
| 15 | #include "mojo/public/cpp/bindings/remote.h" |
| 16 | #include "testing/gtest/include/gtest/gtest.h" |
| 17 | |
| 18 | namespace content { |
| 19 | |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 20 | // A test class that implements test interfaces and provides verification |
| 21 | // methods. |
| 22 | class TestReceiverCollector : public mojom::TestInterfaceForDefer, |
| 23 | public mojom::TestInterfaceForGrant, |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 24 | public mojom::TestInterfaceForCancel, |
| 25 | public mojom::TestInterfaceForUnexpected { |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 26 | public: |
| 27 | TestReceiverCollector() = default; |
| 28 | |
| 29 | ~TestReceiverCollector() override = default; |
| 30 | |
| 31 | // Deletes copy and move operations. |
| 32 | TestReceiverCollector(const TestReceiverCollector& other) = delete; |
| 33 | TestReceiverCollector& operator=(const TestReceiverCollector& other) = delete; |
| 34 | TestReceiverCollector(TestReceiverCollector&&) = delete; |
| 35 | TestReceiverCollector& operator=(TestReceiverCollector&&) = delete; |
| 36 | |
| 37 | void BindDeferInterface( |
| 38 | mojo::PendingReceiver<mojom::TestInterfaceForDefer> receiver) { |
| 39 | ASSERT_FALSE(defer_receiver_.is_bound()); |
| 40 | defer_receiver_.Bind(std::move(receiver)); |
| 41 | } |
| 42 | |
| 43 | void BindGrantInterface( |
| 44 | mojo::PendingReceiver<mojom::TestInterfaceForGrant> receiver) { |
| 45 | ASSERT_FALSE(grant_receiver_.is_bound()); |
| 46 | grant_receiver_.Bind(std::move(receiver)); |
| 47 | } |
| 48 | |
| 49 | void BindCancelInterface( |
| 50 | mojo::PendingReceiver<mojom::TestInterfaceForCancel> receiver) { |
| 51 | ASSERT_FALSE(cancel_receiver_.is_bound()); |
| 52 | cancel_receiver_.Bind(std::move(receiver)); |
| 53 | } |
| 54 | |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 55 | void BindUnexpectedInterface( |
| 56 | mojo::PendingReceiver<mojom::TestInterfaceForUnexpected> receiver) { |
| 57 | ASSERT_FALSE(unexpected_receiver_.is_bound()); |
| 58 | unexpected_receiver_.Bind(std::move(receiver)); |
| 59 | } |
| 60 | |
Hiroki Nakagawa | b2ce097 | 2021-03-17 08:20:35 | [diff] [blame] | 61 | // mojom::TestInterfaceForDefer implementation. |
Peter Boström | fc7ddc18 | 2024-10-31 19:37:21 | [diff] [blame] | 62 | void Ping(PingCallback callback) override { NOTREACHED(); } |
Hiroki Nakagawa | b2ce097 | 2021-03-17 08:20:35 | [diff] [blame] | 63 | |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 64 | // Will be called when MojoBinderPolicyApplier::ApplyPolicyToBinder() |
| 65 | // handles a kCancel binding request. |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 66 | void Cancel(const std::string& interface_name) { |
| 67 | is_cancelled_ = true; |
| 68 | cancelled_interface_ = interface_name; |
| 69 | } |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 70 | |
| 71 | // Used to check if the cancel_closure of MojoBinderPolicyApplier was |
| 72 | // executed. |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 73 | bool IsCancelled() { return is_cancelled_; } |
| 74 | |
| 75 | const std::string& cancelled_interface() const { |
| 76 | return cancelled_interface_; |
| 77 | } |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 78 | |
| 79 | bool IsDeferReceiverBound() const { return defer_receiver_.is_bound(); } |
| 80 | |
| 81 | bool IsGrantReceiverBound() const { return grant_receiver_.is_bound(); } |
| 82 | |
| 83 | bool IsCancelReceiverBound() const { return cancel_receiver_.is_bound(); } |
| 84 | |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 85 | bool IsUnexpectedReceiverBound() const { |
| 86 | return unexpected_receiver_.is_bound(); |
| 87 | } |
| 88 | |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 89 | private: |
| 90 | mojo::Receiver<mojom::TestInterfaceForDefer> defer_receiver_{this}; |
| 91 | mojo::Receiver<mojom::TestInterfaceForGrant> grant_receiver_{this}; |
| 92 | mojo::Receiver<mojom::TestInterfaceForCancel> cancel_receiver_{this}; |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 93 | mojo::Receiver<mojom::TestInterfaceForUnexpected> unexpected_receiver_{this}; |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 94 | bool is_cancelled_ = false; |
| 95 | std::string cancelled_interface_; |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 96 | }; |
| 97 | |
Lingqi Chi | 93462c6 | 2021-06-15 05:25:08 | [diff] [blame] | 98 | class MojoBinderPolicyApplierTest : public testing::Test, |
| 99 | mojom::MojoContextProvider { |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 100 | public: |
| 101 | MojoBinderPolicyApplierTest() = default; |
| 102 | |
Lingqi Chi | 93462c6 | 2021-06-15 05:25:08 | [diff] [blame] | 103 | // mojom::MojoContextProvider |
| 104 | void GrantAll() override { policy_applier_.GrantAll(); } |
| 105 | |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 106 | protected: |
Lingqi Chi | 242d891e | 2021-03-10 09:45:49 | [diff] [blame] | 107 | std::vector<base::OnceClosure>& deferred_binders() { |
| 108 | return policy_applier_.deferred_binders_; |
| 109 | } |
| 110 | |
Lingqi Chi | 93462c6 | 2021-06-15 05:25:08 | [diff] [blame] | 111 | // Calls MojoBinderPolicyApplier::GrantAll() inside a Mojo message dispatch |
| 112 | // stack. |
| 113 | void RunGrantAll() { |
| 114 | DCHECK(!receiver_.is_bound()); |
| 115 | receiver_.Bind(remote_.BindNewPipeAndPassReceiver()); |
| 116 | remote_->GrantAll(); |
| 117 | remote_.FlushForTesting(); |
| 118 | } |
| 119 | |
Lingqi Chi | 775e6075 | 2020-12-14 06:31:16 | [diff] [blame] | 120 | const MojoBinderPolicyMapImpl policy_map_{ |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 121 | {{"content.mojom.TestInterfaceForDefer", |
| 122 | MojoBinderNonAssociatedPolicy::kDefer}, |
| 123 | {"content.mojom.TestInterfaceForGrant", |
| 124 | MojoBinderNonAssociatedPolicy::kGrant}, |
| 125 | {"content.mojom.TestInterfaceForCancel", |
| 126 | MojoBinderNonAssociatedPolicy::kCancel}, |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 127 | {"content.mojom.TestInterfaceForUnexpected", |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 128 | MojoBinderNonAssociatedPolicy::kUnexpected}}}; |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 129 | TestReceiverCollector collector_{}; |
| 130 | MojoBinderPolicyApplier policy_applier_{ |
| 131 | &policy_map_, base::BindOnce(&TestReceiverCollector::Cancel, |
| 132 | base::Unretained(&collector_))}; |
| 133 | |
| 134 | private: |
| 135 | base::test::TaskEnvironment task_environment_; |
Lingqi Chi | 93462c6 | 2021-06-15 05:25:08 | [diff] [blame] | 136 | mojo::Remote<mojom::MojoContextProvider> remote_; |
| 137 | mojo::Receiver<mojom::MojoContextProvider> receiver_{this}; |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 138 | }; |
| 139 | |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 140 | // Verifies that interfaces whose policies are kGrant can be bound immediately. |
| 141 | TEST_F(MojoBinderPolicyApplierTest, GrantInEnforce) { |
| 142 | // Initialize Mojo interfaces. |
| 143 | mojo::Remote<mojom::TestInterfaceForGrant> grant_remote; |
| 144 | mojo::GenericPendingReceiver grant_receiver( |
| 145 | grant_remote.BindNewPipeAndPassReceiver()); |
| 146 | |
| 147 | // Bind the interface immediately if the policy is kGrant. |
| 148 | const std::string interface_name = grant_receiver.interface_name().value(); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 149 | EXPECT_FALSE(collector_.IsCancelled()); |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 150 | EXPECT_FALSE(collector_.IsGrantReceiverBound()); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 151 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 152 | interface_name, |
| 153 | base::BindOnce(&TestReceiverCollector::BindGrantInterface, |
| 154 | base::Unretained(&collector_), |
| 155 | grant_receiver.As<mojom::TestInterfaceForGrant>())); |
| 156 | EXPECT_TRUE(collector_.IsGrantReceiverBound()); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 157 | EXPECT_FALSE(collector_.IsCancelled()); |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 158 | } |
| 159 | |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 160 | // Verifies that interfaces whose policies are kDefer cannot be bound until |
| 161 | // GrantAll() is called. |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 162 | TEST_F(MojoBinderPolicyApplierTest, DeferInEnforce) { |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 163 | // Initialize Mojo interfaces. |
| 164 | mojo::Remote<mojom::TestInterfaceForDefer> defer_remote; |
| 165 | mojo::GenericPendingReceiver defer_receiver( |
| 166 | defer_remote.BindNewPipeAndPassReceiver()); |
| 167 | |
| 168 | // Delay binding the interface until GrantAll() is called. |
| 169 | const std::string interface_name = defer_receiver.interface_name().value(); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 170 | EXPECT_FALSE(collector_.IsCancelled()); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 171 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 172 | interface_name, |
| 173 | base::BindOnce(&TestReceiverCollector::BindDeferInterface, |
| 174 | base::Unretained(&collector_), |
| 175 | defer_receiver.As<mojom::TestInterfaceForDefer>())); |
| 176 | EXPECT_FALSE(collector_.IsDeferReceiverBound()); |
Lingqi Chi | 242d891e | 2021-03-10 09:45:49 | [diff] [blame] | 177 | EXPECT_EQ(1U, deferred_binders().size()); |
| 178 | |
Lingqi Chi | 93462c6 | 2021-06-15 05:25:08 | [diff] [blame] | 179 | RunGrantAll(); |
Lingqi Chi | 242d891e | 2021-03-10 09:45:49 | [diff] [blame] | 180 | EXPECT_EQ(0U, deferred_binders().size()); |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 181 | EXPECT_TRUE(collector_.IsDeferReceiverBound()); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 182 | EXPECT_FALSE(collector_.IsCancelled()); |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 183 | } |
| 184 | |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 185 | // Verifies that MojoBinderPolicyApplier will run `cancel_closure` when running |
| 186 | // in the kEnforce mode and receiving an interface whose policy is kCancel, |
| 187 | TEST_F(MojoBinderPolicyApplierTest, CancelInEnforce) { |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 188 | // Initialize Mojo interfaces. |
| 189 | mojo::Remote<mojom::TestInterfaceForCancel> cancel_remote; |
| 190 | mojo::GenericPendingReceiver cancel_receiver( |
| 191 | cancel_remote.BindNewPipeAndPassReceiver()); |
| 192 | |
| 193 | const std::string interface_name = cancel_receiver.interface_name().value(); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 194 | EXPECT_FALSE(collector_.IsCancelled()); |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 195 | EXPECT_FALSE(collector_.IsCancelReceiverBound()); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 196 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 197 | interface_name, |
| 198 | base::BindOnce(&TestReceiverCollector::BindCancelInterface, |
| 199 | base::Unretained(&collector_), |
| 200 | cancel_receiver.As<mojom::TestInterfaceForCancel>())); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 201 | EXPECT_TRUE(collector_.IsCancelled()); |
| 202 | EXPECT_EQ(collector_.cancelled_interface(), |
| 203 | "content.mojom.TestInterfaceForCancel"); |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 204 | EXPECT_FALSE(collector_.IsCancelReceiverBound()); |
| 205 | } |
| 206 | |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 207 | // When MojoBinderPolicyApplier runs in the kPrepareToGrantAll mode, verifies it |
| 208 | // applies kGrant for kGrant interfaces. |
| 209 | TEST_F(MojoBinderPolicyApplierTest, GrantInPrepareToGrantAll) { |
| 210 | // Initialize Mojo interfaces. |
| 211 | mojo::Remote<mojom::TestInterfaceForGrant> grant_remote; |
| 212 | mojo::GenericPendingReceiver grant_receiver( |
| 213 | grant_remote.BindNewPipeAndPassReceiver()); |
| 214 | |
| 215 | policy_applier_.PrepareToGrantAll(); |
| 216 | const std::string grant_interface_name = |
| 217 | grant_receiver.interface_name().value(); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 218 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 219 | grant_interface_name, |
| 220 | base::BindOnce(&TestReceiverCollector::BindGrantInterface, |
| 221 | base::Unretained(&collector_), |
| 222 | grant_receiver.As<mojom::TestInterfaceForGrant>())); |
| 223 | EXPECT_TRUE(collector_.IsGrantReceiverBound()); |
| 224 | } |
| 225 | |
| 226 | // When MojoBinderPolicyApplier runs in the kPrepareToGrantAll mode, verifies it |
| 227 | // applies kDefer for kDefer interfaces. |
| 228 | TEST_F(MojoBinderPolicyApplierTest, DeferInPrepareToGrantAll) { |
| 229 | // Initialize Mojo interfaces. |
| 230 | mojo::Remote<mojom::TestInterfaceForDefer> defer_remote; |
| 231 | mojo::GenericPendingReceiver defer_receiver( |
| 232 | defer_remote.BindNewPipeAndPassReceiver()); |
| 233 | |
| 234 | policy_applier_.PrepareToGrantAll(); |
| 235 | const std::string defer_interface_name = |
| 236 | defer_receiver.interface_name().value(); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 237 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 238 | defer_interface_name, |
| 239 | base::BindOnce(&TestReceiverCollector::BindDeferInterface, |
| 240 | base::Unretained(&collector_), |
| 241 | defer_receiver.As<mojom::TestInterfaceForDefer>())); |
| 242 | EXPECT_FALSE(collector_.IsDeferReceiverBound()); |
| 243 | EXPECT_EQ(1U, deferred_binders().size()); |
| 244 | |
Lingqi Chi | 93462c6 | 2021-06-15 05:25:08 | [diff] [blame] | 245 | RunGrantAll(); |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 246 | EXPECT_TRUE(collector_.IsDeferReceiverBound()); |
| 247 | EXPECT_EQ(0U, deferred_binders().size()); |
| 248 | } |
| 249 | |
| 250 | // When MojoBinderPolicyApplier runs in the kPrepareToGrantAll mode, verifies it |
Lingqi Chi | c8b3e81 | 2021-04-23 11:45:18 | [diff] [blame] | 251 | // applies kGrant rather than kCancel policy when receiving a kCancel interface |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 252 | // binding request. |
| 253 | TEST_F(MojoBinderPolicyApplierTest, CancelInPrepareToGrantAll) { |
| 254 | // Initialize Mojo interfaces. |
| 255 | mojo::Remote<mojom::TestInterfaceForCancel> cancel_remote; |
| 256 | mojo::GenericPendingReceiver cancel_receiver( |
| 257 | cancel_remote.BindNewPipeAndPassReceiver()); |
| 258 | |
| 259 | policy_applier_.PrepareToGrantAll(); |
| 260 | const std::string cancel_interface_name = |
| 261 | cancel_receiver.interface_name().value(); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 262 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 263 | cancel_interface_name, |
| 264 | base::BindOnce(&TestReceiverCollector::BindCancelInterface, |
| 265 | base::Unretained(&collector_), |
| 266 | cancel_receiver.As<mojom::TestInterfaceForCancel>())); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 267 | EXPECT_FALSE(collector_.IsCancelled()); |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 268 | EXPECT_TRUE(collector_.IsCancelReceiverBound()); |
Lingqi Chi | 0ca6ac5 | 2021-03-17 10:39:55 | [diff] [blame] | 269 | } |
| 270 | |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 271 | TEST_F(MojoBinderPolicyApplierTest, UnexpectedInPrepareToGrantAll) { |
| 272 | // Initialize Mojo interfaces. |
| 273 | mojo::Remote<mojom::TestInterfaceForUnexpected> unexpected_remote; |
| 274 | mojo::GenericPendingReceiver unexpected_receiver( |
| 275 | unexpected_remote.BindNewPipeAndPassReceiver()); |
| 276 | |
| 277 | policy_applier_.PrepareToGrantAll(); |
| 278 | const std::string interface_name = |
| 279 | unexpected_receiver.interface_name().value(); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 280 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 281 | interface_name, |
| 282 | base::BindOnce( |
| 283 | &TestReceiverCollector::BindUnexpectedInterface, |
| 284 | base::Unretained(&collector_), |
| 285 | unexpected_receiver.As<mojom::TestInterfaceForUnexpected>())); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 286 | EXPECT_FALSE(collector_.IsCancelled()); |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 287 | EXPECT_TRUE(collector_.IsUnexpectedReceiverBound()); |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 288 | } |
| 289 | |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 290 | // Verifies that all interfaces are bound immediately if GrantAll() is called, |
| 291 | // regardless of policies. |
| 292 | TEST_F(MojoBinderPolicyApplierTest, BindInterfacesAfterResolving) { |
| 293 | // Initialize Mojo interfaces. |
| 294 | mojo::Remote<mojom::TestInterfaceForDefer> defer_remote; |
| 295 | mojo::GenericPendingReceiver defer_receiver( |
| 296 | defer_remote.BindNewPipeAndPassReceiver()); |
| 297 | mojo::Remote<mojom::TestInterfaceForGrant> grant_remote; |
| 298 | mojo::GenericPendingReceiver grant_receiver( |
| 299 | grant_remote.BindNewPipeAndPassReceiver()); |
| 300 | mojo::Remote<mojom::TestInterfaceForCancel> cancel_remote; |
| 301 | mojo::GenericPendingReceiver cancel_receiver( |
| 302 | cancel_remote.BindNewPipeAndPassReceiver()); |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 303 | mojo::Remote<mojom::TestInterfaceForUnexpected> unexpected_remote; |
| 304 | mojo::GenericPendingReceiver unexpected_receiver( |
| 305 | unexpected_remote.BindNewPipeAndPassReceiver()); |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 306 | |
Lingqi Chi | 93462c6 | 2021-06-15 05:25:08 | [diff] [blame] | 307 | RunGrantAll(); |
| 308 | |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 309 | // All interfaces should be bound immediately. |
| 310 | const std::string defer_interface_name = |
| 311 | defer_receiver.interface_name().value(); |
| 312 | const std::string grant_interface_name = |
| 313 | grant_receiver.interface_name().value(); |
| 314 | const std::string cancel_interface_name = |
| 315 | cancel_receiver.interface_name().value(); |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 316 | const std::string unexpected_interface_name = |
| 317 | unexpected_receiver.interface_name().value(); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 318 | EXPECT_FALSE(collector_.IsCancelled()); |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 319 | EXPECT_FALSE(collector_.IsGrantReceiverBound()); |
| 320 | EXPECT_FALSE(collector_.IsDeferReceiverBound()); |
| 321 | EXPECT_FALSE(collector_.IsCancelReceiverBound()); |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 322 | EXPECT_FALSE(collector_.IsUnexpectedReceiverBound()); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 323 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 324 | defer_interface_name, |
| 325 | base::BindOnce(&TestReceiverCollector::BindDeferInterface, |
| 326 | base::Unretained(&collector_), |
| 327 | defer_receiver.As<mojom::TestInterfaceForDefer>())); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 328 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 329 | grant_interface_name, |
| 330 | base::BindOnce(&TestReceiverCollector::BindGrantInterface, |
| 331 | base::Unretained(&collector_), |
| 332 | grant_receiver.As<mojom::TestInterfaceForGrant>())); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 333 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 334 | cancel_interface_name, |
| 335 | base::BindOnce(&TestReceiverCollector::BindCancelInterface, |
| 336 | base::Unretained(&collector_), |
| 337 | cancel_receiver.As<mojom::TestInterfaceForCancel>())); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 338 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 339 | unexpected_interface_name, |
| 340 | base::BindOnce( |
| 341 | &TestReceiverCollector::BindUnexpectedInterface, |
| 342 | base::Unretained(&collector_), |
| 343 | unexpected_receiver.As<mojom::TestInterfaceForUnexpected>())); |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 344 | EXPECT_TRUE(collector_.IsGrantReceiverBound()); |
| 345 | EXPECT_TRUE(collector_.IsDeferReceiverBound()); |
| 346 | EXPECT_TRUE(collector_.IsCancelReceiverBound()); |
Lingqi Chi | e9e0fb3 | 2021-03-30 13:13:51 | [diff] [blame] | 347 | EXPECT_TRUE(collector_.IsUnexpectedReceiverBound()); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 348 | EXPECT_FALSE(collector_.IsCancelled()); |
Lingqi Chi | 242d891e | 2021-03-10 09:45:49 | [diff] [blame] | 349 | EXPECT_EQ(0U, deferred_binders().size()); |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 350 | } |
| 351 | |
Lingqi Chi | 242d891e | 2021-03-10 09:45:49 | [diff] [blame] | 352 | // Verifies that DropDeferredBinders() deletes all deferred binders. |
| 353 | TEST_F(MojoBinderPolicyApplierTest, DropDeferredBinders) { |
| 354 | // Initialize Mojo interfaces. |
| 355 | mojo::Remote<mojom::TestInterfaceForDefer> defer_remote; |
| 356 | mojo::GenericPendingReceiver defer_receiver( |
| 357 | defer_remote.BindNewPipeAndPassReceiver()); |
| 358 | |
| 359 | const std::string interface_name = defer_receiver.interface_name().value(); |
Lingqi Chi | fc4b7d9c | 2021-04-08 01:41:22 | [diff] [blame] | 360 | EXPECT_FALSE(collector_.IsCancelled()); |
Lingqi Chi | 2e03d9d6 | 2021-11-08 05:45:41 | [diff] [blame] | 361 | policy_applier_.ApplyPolicyToNonAssociatedBinder( |
Lingqi Chi | 242d891e | 2021-03-10 09:45:49 | [diff] [blame] | 362 | interface_name, |
| 363 | base::BindOnce(&TestReceiverCollector::BindDeferInterface, |
| 364 | base::Unretained(&collector_), |
| 365 | defer_receiver.As<mojom::TestInterfaceForDefer>())); |
| 366 | EXPECT_FALSE(collector_.IsDeferReceiverBound()); |
| 367 | EXPECT_EQ(1U, deferred_binders().size()); |
| 368 | policy_applier_.DropDeferredBinders(); |
| 369 | EXPECT_EQ(0U, deferred_binders().size()); |
Lingqi Chi | 93462c6 | 2021-06-15 05:25:08 | [diff] [blame] | 370 | RunGrantAll(); |
Lingqi Chi | 242d891e | 2021-03-10 09:45:49 | [diff] [blame] | 371 | EXPECT_FALSE(collector_.IsDeferReceiverBound()); |
| 372 | } |
Lingqi Chi | fa0dda1 | 2020-11-18 05:32:45 | [diff] [blame] | 373 | |
| 374 | } // namespace content |