5#define FML_USED_ON_EMBEDDER
15#include "gtest/gtest.h"
20TEST(WeakPtrTest, Basic) {
22 WeakPtrFactory<int> factory(&
data);
23 WeakPtr<int> ptr = factory.GetWeakPtr();
24 EXPECT_EQ(&
data, ptr.get());
27TEST(WeakPtrTest, CopyConstruction) {
29 WeakPtrFactory<int> factory(&
data);
30 WeakPtr<int> ptr = factory.GetWeakPtr();
31 const WeakPtr<int>& ptr2(ptr);
32 EXPECT_EQ(&
data, ptr.get());
33 EXPECT_EQ(&
data, ptr2.get());
36TEST(WeakPtrTest, MoveConstruction) {
38 WeakPtrFactory<int> factory(&
data);
39 WeakPtr<int> ptr = factory.GetWeakPtr();
40 WeakPtr<int> ptr2(std::move(ptr));
43 EXPECT_EQ(
nullptr, ptr.get());
44 EXPECT_EQ(&
data, ptr2.get());
47TEST(WeakPtrTest, CopyAssignment) {
49 WeakPtrFactory<int> factory(&
data);
50 WeakPtr<int> ptr = factory.GetWeakPtr();
52 EXPECT_EQ(
nullptr, ptr2.get());
54 EXPECT_EQ(&
data, ptr.get());
55 EXPECT_EQ(&
data, ptr2.get());
58TEST(WeakPtrTest, MoveAssignment) {
60 WeakPtrFactory<int> factory(&
data);
61 WeakPtr<int> ptr = factory.GetWeakPtr();
63 EXPECT_EQ(
nullptr, ptr2.get());
64 ptr2 = std::move(ptr);
67 EXPECT_EQ(
nullptr, ptr.get());
68 EXPECT_EQ(&
data, ptr2.get());
71TEST(WeakPtrTest, Testable) {
73 WeakPtrFactory<int> factory(&
data);
75 EXPECT_EQ(
nullptr, ptr.get());
77 ptr = factory.GetWeakPtr();
78 EXPECT_EQ(&
data, ptr.get());
82TEST(WeakPtrTest, OutOfScope) {
84 EXPECT_EQ(
nullptr, ptr.get());
87 WeakPtrFactory<int> factory(&
data);
88 ptr = factory.GetWeakPtr();
90 EXPECT_EQ(
nullptr, ptr.get());
93TEST(WeakPtrTest, Multiple) {
98 WeakPtrFactory<int> factory(&
data);
99 a = factory.GetWeakPtr();
100 b = factory.GetWeakPtr();
101 EXPECT_EQ(&
data, a.get());
102 EXPECT_EQ(&
data, b.get());
104 EXPECT_EQ(
nullptr, a.get());
105 EXPECT_EQ(
nullptr, b.get());
108TEST(WeakPtrTest, MultipleStaged) {
112 WeakPtrFactory<int> factory(&
data);
113 a = factory.GetWeakPtr();
115 WeakPtr<int> b = factory.GetWeakPtr();
117 EXPECT_NE(a.get(),
nullptr);
119 EXPECT_EQ(
nullptr, a.get());
125struct Derived :
public Base {};
127TEST(WeakPtrTest, Dereference) {
129 data.member = 123456.;
130 WeakPtrFactory<Base> factory(&
data);
131 WeakPtr<Base> ptr = factory.GetWeakPtr();
132 EXPECT_EQ(&
data, ptr.get());
133 EXPECT_EQ(
data.member, (*ptr).member);
134 EXPECT_EQ(
data.member, ptr->member);
137TEST(WeakPtrTest, UpcastCopyConstruction) {
139 WeakPtrFactory<Derived> factory(&
data);
140 WeakPtr<Derived> ptr = factory.GetWeakPtr();
141 WeakPtr<Base> ptr2(ptr);
142 EXPECT_EQ(&
data, ptr.get());
143 EXPECT_EQ(&
data, ptr2.get());
146TEST(WeakPtrTest, UpcastMoveConstruction) {
148 WeakPtrFactory<Derived> factory(&
data);
149 WeakPtr<Derived> ptr = factory.GetWeakPtr();
150 WeakPtr<Base> ptr2(std::move(ptr));
153 EXPECT_EQ(
nullptr, ptr.get());
154 EXPECT_EQ(&
data, ptr2.get());
157TEST(WeakPtrTest, UpcastCopyAssignment) {
159 WeakPtrFactory<Derived> factory(&
data);
160 WeakPtr<Derived> ptr = factory.GetWeakPtr();
162 EXPECT_EQ(
nullptr, ptr2.get());
164 EXPECT_EQ(&
data, ptr.get());
165 EXPECT_EQ(&
data, ptr2.get());
168TEST(WeakPtrTest, UpcastMoveAssignment) {
170 WeakPtrFactory<Derived> factory(&
data);
171 WeakPtr<Derived> ptr = factory.GetWeakPtr();
173 EXPECT_EQ(
nullptr, ptr2.get());
174 ptr2 = std::move(ptr);
177 EXPECT_EQ(
nullptr, ptr.get());
178 EXPECT_EQ(&
data, ptr2.get());
181TEST(TaskRunnerAffineWeakPtrTest, ShouldNotCrashIfRunningOnTheSameTaskRunner) {
185 std::thread thread1([&loop1, &latch1, &term1]() {
197 std::thread thread2([&loop2, &latch2, &term2, &loop2_task_finish_latch,
198 &loop2_task_start_latch]() {
201 TaskRunnerAffineWeakPtrFactory<int> factory(&
data);
204 loop2->GetTaskRunner()->PostTask([&]() {
206 loop2_task_start_latch.
Wait();
207 TaskRunnerAffineWeakPtr<int> ptr = factory.GetWeakPtr();
208 EXPECT_EQ(*ptr,
data);
209 loop2_task_finish_latch.
Signal();
219 const auto raster_thread_merger =
220 fml::MakeRefCounted<fml::RasterThreadMerger>(qid1, qid2);
221 const size_t kNumFramesMerged = 5;
223 raster_thread_merger->MergeWithLease(kNumFramesMerged);
225 loop2_task_start_latch.
Signal();
226 loop2_task_finish_latch.
Wait();
228 for (
size_t i = 0;
i < kNumFramesMerged;
i++) {
229 ASSERT_TRUE(raster_thread_merger->IsMerged());
230 raster_thread_merger->DecrementLease();
233 ASSERT_FALSE(raster_thread_merger->IsMerged());
static void EnsureInitializedForCurrentThread()
fml::RefPtr< fml::TaskRunner > GetTaskRunner() const
static FML_EMBEDDER_ONLY MessageLoop & GetCurrent()
virtual TaskQueueId GetTaskQueueId()
TEST(MallocMapping, EmptyContructor)
std::shared_ptr< const fml::Mapping > data