summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/mojo/heap_mojo_receiver_set_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/mojo/heap_mojo_receiver_set_test.cc')
-rw-r--r--chromium/third_party/blink/renderer/platform/mojo/heap_mojo_receiver_set_test.cc179
1 files changed, 179 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/platform/mojo/heap_mojo_receiver_set_test.cc b/chromium/third_party/blink/renderer/platform/mojo/heap_mojo_receiver_set_test.cc
new file mode 100644
index 00000000000..aa13bc2b39b
--- /dev/null
+++ b/chromium/third_party/blink/renderer/platform/mojo/heap_mojo_receiver_set_test.cc
@@ -0,0 +1,179 @@
+// Copyright 2020 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 "third_party/blink/renderer/platform/mojo/heap_mojo_receiver_set.h"
+
+#include "base/test/null_task_runner.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "mojo/public/interfaces/bindings/tests/sample_service.mojom-blink.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/platform/context_lifecycle_notifier.h"
+#include "third_party/blink/renderer/platform/heap/heap_test_utilities.h"
+#include "third_party/blink/renderer/platform/heap/persistent.h"
+#include "third_party/blink/renderer/platform/heap_observer_list.h"
+#include "third_party/blink/renderer/platform/mojo/heap_mojo_wrapper_mode.h"
+
+namespace blink {
+
+namespace {
+
+class FakeContextNotifier final : public GarbageCollected<FakeContextNotifier>,
+ public ContextLifecycleNotifier {
+ USING_GARBAGE_COLLECTED_MIXIN(FakeContextNotifier);
+
+ public:
+ FakeContextNotifier() = default;
+
+ void AddContextLifecycleObserver(
+ ContextLifecycleObserver* observer) override {
+ observers_.AddObserver(observer);
+ }
+ void RemoveContextLifecycleObserver(
+ ContextLifecycleObserver* observer) override {
+ observers_.RemoveObserver(observer);
+ }
+
+ void NotifyContextDestroyed() {
+ observers_.ForEachObserver([](ContextLifecycleObserver* observer) {
+ observer->ContextDestroyed();
+ });
+ }
+
+ void Trace(Visitor* visitor) override {
+ visitor->Trace(observers_);
+ ContextLifecycleNotifier::Trace(visitor);
+ }
+
+ private:
+ HeapObserverList<ContextLifecycleObserver> observers_;
+};
+
+class MockService : public sample::blink::Service {
+ public:
+ MockService() = default;
+
+ void Frobinate(sample::blink::FooPtr foo,
+ Service::BazOptions baz,
+ mojo::PendingRemote<sample::blink::Port> port,
+ FrobinateCallback callback) override {}
+ void GetPort(mojo::PendingReceiver<sample::blink::Port> receiver) override {}
+};
+
+template <HeapMojoWrapperMode Mode>
+class GCOwner : public GarbageCollected<GCOwner<Mode>> {
+ public:
+ explicit GCOwner(FakeContextNotifier* context) : receiver_set_(context) {}
+ void Trace(Visitor* visitor) { visitor->Trace(receiver_set_); }
+
+ HeapMojoReceiverSet<sample::blink::Service, Mode>& receiver_set() {
+ return receiver_set_;
+ }
+
+ private:
+ HeapMojoReceiverSet<sample::blink::Service, Mode> receiver_set_;
+};
+
+template <HeapMojoWrapperMode Mode>
+class HeapMojoReceiverSetGCBaseTest : public TestSupportingGC {
+ public:
+ FakeContextNotifier* context() { return context_; }
+ scoped_refptr<base::NullTaskRunner> task_runner() {
+ return null_task_runner_;
+ }
+ GCOwner<Mode>* owner() { return owner_; }
+
+ void ClearOwner() { owner_ = nullptr; }
+
+ protected:
+ void SetUp() override {
+ context_ = MakeGarbageCollected<FakeContextNotifier>();
+ owner_ = MakeGarbageCollected<GCOwner<Mode>>(context());
+ }
+ void TearDown() override {}
+
+ Persistent<FakeContextNotifier> context_;
+ Persistent<GCOwner<Mode>> owner_;
+ scoped_refptr<base::NullTaskRunner> null_task_runner_ =
+ base::MakeRefCounted<base::NullTaskRunner>();
+};
+
+} // namespace
+
+class HeapMojoReceiverSetGCWithContextObserverTest
+ : public HeapMojoReceiverSetGCBaseTest<
+ HeapMojoWrapperMode::kWithContextObserver> {};
+class HeapMojoReceiverSetGCWithoutContextObserverTest
+ : public HeapMojoReceiverSetGCBaseTest<
+ HeapMojoWrapperMode::kWithoutContextObserver> {};
+
+// GC the HeapMojoReceiverSet with context observer and verify that the receiver
+// is no longer part of the set, and that the service was deleted.
+TEST_F(HeapMojoReceiverSetGCWithContextObserverTest, RemovesReceiver) {
+ auto receiver_set = owner()->receiver_set();
+ MockService service;
+ auto receiver = mojo::PendingReceiver<sample::blink::Service>(
+ mojo::MessagePipe().handle0);
+
+ mojo::ReceiverId rid =
+ receiver_set.Add(&service, std::move(receiver), task_runner());
+ EXPECT_TRUE(receiver_set.HasReceiver(rid));
+
+ receiver_set.Remove(rid);
+
+ EXPECT_FALSE(receiver_set.HasReceiver(rid));
+}
+
+// GC the HeapMojoReceiverSet without context observer and verify that the
+// receiver is no longer part of the set, and that the service was deleted.
+TEST_F(HeapMojoReceiverSetGCWithoutContextObserverTest, RemovesReceiver) {
+ auto receiver_set = owner()->receiver_set();
+ MockService service;
+ auto receiver = mojo::PendingReceiver<sample::blink::Service>(
+ mojo::MessagePipe().handle0);
+
+ mojo::ReceiverId rid =
+ receiver_set.Add(&service, std::move(receiver), task_runner());
+ EXPECT_TRUE(receiver_set.HasReceiver(rid));
+
+ receiver_set.Remove(rid);
+
+ EXPECT_FALSE(receiver_set.HasReceiver(rid));
+}
+
+// GC the HeapMojoReceiverSet with context observer and verify that the receiver
+// is no longer part of the set, and that the service was deleted.
+TEST_F(HeapMojoReceiverSetGCWithContextObserverTest, ClearLeavesSetEmpty) {
+ auto receiver_set = owner()->receiver_set();
+ MockService service;
+ auto receiver = mojo::PendingReceiver<sample::blink::Service>(
+ mojo::MessagePipe().handle0);
+
+ mojo::ReceiverId rid =
+ receiver_set.Add(&service, std::move(receiver), task_runner());
+ EXPECT_TRUE(receiver_set.HasReceiver(rid));
+
+ receiver_set.Clear();
+
+ EXPECT_FALSE(receiver_set.HasReceiver(rid));
+}
+
+// GC the HeapMojoReceiverSet without context observer and verify that the
+// receiver is no longer part of the set, and that the service was deleted.
+TEST_F(HeapMojoReceiverSetGCWithoutContextObserverTest, ClearLeavesSetEmpty) {
+ auto receiver_set = owner()->receiver_set();
+ MockService service;
+ auto receiver = mojo::PendingReceiver<sample::blink::Service>(
+ mojo::MessagePipe().handle0);
+
+ mojo::ReceiverId rid =
+ receiver_set.Add(&service, std::move(receiver), task_runner());
+ EXPECT_TRUE(receiver_set.HasReceiver(rid));
+
+ receiver_set.Clear();
+
+ EXPECT_FALSE(receiver_set.HasReceiver(rid));
+}
+
+} // namespace blink