Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/Ref.cpp (218495 => 218496)
--- trunk/Tools/TestWebKitAPI/Tests/WTF/Ref.cpp 2017-06-19 16:47:06 UTC (rev 218495)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/Ref.cpp 2017-06-19 17:01:14 UTC (rev 218496)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -26,7 +26,6 @@
#include "config.h"
#include "RefLogger.h"
-#include <wtf/Ref.h>
#include <wtf/RefPtr.h>
namespace TestWebKitAPI {
@@ -36,18 +35,18 @@
DerivedRefLogger a("a");
{
- Ref<RefLogger> ptr(a);
- ASSERT_EQ(&a, ptr.ptr());
- ASSERT_EQ(&a.name, &ptr->name);
+ Ref<RefLogger> ref(a);
+ EXPECT_EQ(&a, ref.ptr());
+ EXPECT_EQ(&a.name, &ref->name);
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
- Ref<RefLogger> ptr(adoptRef(a));
- ASSERT_EQ(&a, ptr.ptr());
- ASSERT_EQ(&a.name, &ptr->name);
+ Ref<RefLogger> ref(adoptRef(a));
+ EXPECT_EQ(&a, ref.ptr());
+ EXPECT_EQ(&a.name, &ref->name);
}
- ASSERT_STREQ("deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("deref(a) ", takeLogStr().c_str());
}
TEST(WTF_Ref, Assignment)
@@ -57,44 +56,44 @@
DerivedRefLogger c("c");
{
- Ref<RefLogger> ptr(a);
- ASSERT_EQ(&a, ptr.ptr());
+ Ref<RefLogger> ref(a);
+ EXPECT_EQ(&a, ref.ptr());
log() << "| ";
- ptr = b;
- ASSERT_EQ(&b, ptr.ptr());
+ ref = b;
+ EXPECT_EQ(&b, ref.ptr());
log() << "| ";
}
- ASSERT_STREQ("ref(a) | ref(b) deref(a) | deref(b) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) | ref(b) deref(a) | deref(b) ", takeLogStr().c_str());
{
- Ref<RefLogger> ptr(a);
- ASSERT_EQ(&a, ptr.ptr());
+ Ref<RefLogger> ref(a);
+ EXPECT_EQ(&a, ref.ptr());
log() << "| ";
- ptr = c;
- ASSERT_EQ(&c, ptr.ptr());
+ ref = c;
+ EXPECT_EQ(&c, ref.ptr());
log() << "| ";
}
- ASSERT_STREQ("ref(a) | ref(c) deref(a) | deref(c) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) | ref(c) deref(a) | deref(c) ", takeLogStr().c_str());
{
- Ref<RefLogger> ptr(a);
- ASSERT_EQ(&a, ptr.ptr());
+ Ref<RefLogger> ref(a);
+ EXPECT_EQ(&a, ref.ptr());
log() << "| ";
- ptr = adoptRef(b);
- ASSERT_EQ(&b, ptr.ptr());
+ ref = adoptRef(b);
+ EXPECT_EQ(&b, ref.ptr());
log() << "| ";
}
- ASSERT_STREQ("ref(a) | deref(a) | deref(b) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) | deref(a) | deref(b) ", takeLogStr().c_str());
{
- Ref<RefLogger> ptr(a);
- ASSERT_EQ(&a, ptr.ptr());
+ Ref<RefLogger> ref(a);
+ EXPECT_EQ(&a, ref.ptr());
log() << "| ";
- ptr = adoptRef(c);
- ASSERT_EQ(&c, ptr.ptr());
+ ref = adoptRef(c);
+ EXPECT_EQ(&c, ref.ptr());
log() << "| ";
}
- ASSERT_STREQ("ref(a) | deref(a) | deref(c) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) | deref(a) | deref(c) ", takeLogStr().c_str());
}
static Ref<RefLogger> passWithRef(Ref<RefLogger>&& reference)
@@ -109,42 +108,168 @@
DerivedRefLogger c("c");
{
- Ref<RefLogger> ptr(passWithRef(Ref<RefLogger>(a)));
- ASSERT_EQ(&a, ptr.ptr());
+ Ref<RefLogger> ref(passWithRef(Ref<RefLogger>(a)));
+ EXPECT_EQ(&a, ref.ptr());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
- Ref<RefLogger> ptr(a);
- ASSERT_EQ(&a, ptr.ptr());
+ Ref<RefLogger> ref(a);
+ EXPECT_EQ(&a, ref.ptr());
log() << "| ";
- ptr = passWithRef(b);
- ASSERT_EQ(&b, ptr.ptr());
+ ref = passWithRef(b);
+ EXPECT_EQ(&b, ref.ptr());
log() << "| ";
}
- ASSERT_STREQ("ref(a) | ref(b) deref(a) | deref(b) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) | ref(b) deref(a) | deref(b) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr(passWithRef(a));
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<DerivedRefLogger> ptr(&a);
RefPtr<RefLogger> ptr2(WTFMove(ptr));
- ASSERT_EQ(nullptr, ptr.get());
- ASSERT_EQ(&a, ptr2.get());
+ EXPECT_EQ(nullptr, ptr.get());
+ EXPECT_EQ(&a, ptr2.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
Ref<DerivedRefLogger> derivedReference(a);
Ref<RefLogger> baseReference(passWithRef(derivedReference.copyRef()));
- ASSERT_EQ(&a, derivedReference.ptr());
- ASSERT_EQ(&a, baseReference.ptr());
+ EXPECT_EQ(&a, derivedReference.ptr());
+ EXPECT_EQ(&a, baseReference.ptr());
}
- ASSERT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
}
+TEST(WTF_Ref, Swap)
+{
+ RefLogger a("a");
+ RefLogger b("b");
+
+ {
+ Ref<RefLogger> p1(a);
+ Ref<RefLogger> p2(b);
+ log() << "| ";
+ EXPECT_EQ(&a, p1.ptr());
+ EXPECT_EQ(&b, p2.ptr());
+ p1.swap(p2);
+ EXPECT_EQ(&b, p1.ptr());
+ EXPECT_EQ(&a, p2.ptr());
+ log() << "| ";
+ }
+ EXPECT_STREQ("ref(a) ref(b) | | deref(a) deref(b) ", takeLogStr().c_str());
+
+ {
+ Ref<RefLogger> p1(a);
+ Ref<RefLogger> p2(b);
+ log() << "| ";
+ EXPECT_EQ(&a, p1.ptr());
+ EXPECT_EQ(&b, p2.ptr());
+ std::swap(p1, p2);
+ EXPECT_EQ(&b, p1.ptr());
+ EXPECT_EQ(&a, p2.ptr());
+ log() << "| ";
+ }
+ EXPECT_STREQ("ref(a) ref(b) | | deref(a) deref(b) ", takeLogStr().c_str());
+}
+
+struct RefCheckingRefLogger : RefLogger {
+ RefCheckingRefLogger(const char* name);
+ void ref();
+ void deref();
+ const Ref<RefCheckingRefLogger>* slotToCheck { nullptr };
+};
+
+struct DerivedRefCheckingRefLogger : RefCheckingRefLogger {
+ DerivedRefCheckingRefLogger(const char* name);
+};
+
+RefCheckingRefLogger::RefCheckingRefLogger(const char* name)
+ : RefLogger { name }
+{
+}
+
+void RefCheckingRefLogger::ref()
+{
+ if (slotToCheck)
+ log() << "slot=" << slotToCheck->get().name << " ";
+ RefLogger::ref();
+}
+
+void RefCheckingRefLogger::deref()
+{
+ if (slotToCheck)
+ log() << "slot=" << slotToCheck->get().name << " ";
+ RefLogger::deref();
+}
+
+DerivedRefCheckingRefLogger::DerivedRefCheckingRefLogger(const char* name)
+ : RefCheckingRefLogger { name }
+{
+}
+
+TEST(WTF_Ref, AssignBeforeDeref)
+{
+ DerivedRefCheckingRefLogger a("a");
+ RefCheckingRefLogger b("b");
+ DerivedRefCheckingRefLogger c("c");
+
+ {
+ Ref<RefCheckingRefLogger> ref(a);
+ EXPECT_EQ(&a, ref.ptr());
+ log() << "| ";
+ a.slotToCheck = &ref;
+ b.slotToCheck = &ref;
+ ref = b;
+ a.slotToCheck = nullptr;
+ b.slotToCheck = nullptr;
+ EXPECT_EQ(&b, ref.ptr());
+ log() << "| ";
+ }
+ EXPECT_STREQ("ref(a) | slot=a ref(b) slot=b deref(a) | deref(b) ", takeLogStr().c_str());
+
+ {
+ Ref<RefCheckingRefLogger> ref(a);
+ EXPECT_EQ(&a, ref.ptr());
+ log() << "| ";
+ a.slotToCheck = &ref;
+ c.slotToCheck = &ref;
+ ref = c;
+ a.slotToCheck = nullptr;
+ c.slotToCheck = nullptr;
+ EXPECT_EQ(&c, ref.ptr());
+ log() << "| ";
+ }
+ EXPECT_STREQ("ref(a) | slot=a ref(c) slot=c deref(a) | deref(c) ", takeLogStr().c_str());
+
+ {
+ Ref<RefCheckingRefLogger> ref(a);
+ EXPECT_EQ(&a, ref.ptr());
+ log() << "| ";
+ a.slotToCheck = &ref;
+ ref = adoptRef(b);
+ a.slotToCheck = nullptr;
+ EXPECT_EQ(&b, ref.ptr());
+ log() << "| ";
+ }
+ EXPECT_STREQ("ref(a) | slot=b deref(a) | deref(b) ", takeLogStr().c_str());
+
+ {
+ Ref<RefCheckingRefLogger> ref(a);
+ EXPECT_EQ(&a, ref.ptr());
+ log() << "| ";
+ a.slotToCheck = &ref;
+ ref = adoptRef(c);
+ a.slotToCheck = nullptr;
+ EXPECT_EQ(&c, ref.ptr());
+ log() << "| ";
+ }
+ EXPECT_STREQ("ref(a) | slot=c deref(a) | deref(c) ", takeLogStr().c_str());
+}
+
} // namespace TestWebKitAPI
Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/RefPtr.cpp (218495 => 218496)
--- trunk/Tools/TestWebKitAPI/Tests/WTF/RefPtr.cpp 2017-06-19 16:47:06 UTC (rev 218495)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/RefPtr.cpp 2017-06-19 17:01:14 UTC (rev 218496)
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013-2017 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -37,77 +37,77 @@
DerivedRefLogger a("a");
RefPtr<RefLogger> empty;
- ASSERT_EQ(nullptr, empty.get());
+ EXPECT_EQ(nullptr, empty.get());
{
RefPtr<RefLogger> ptr(&a);
- ASSERT_EQ(&a, ptr.get());
- ASSERT_EQ(&a, &*ptr);
- ASSERT_EQ(&a.name, &ptr->name);
+ EXPECT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, &*ptr);
+ EXPECT_EQ(&a.name, &ptr->name);
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr = &a;
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1 = &a;
RefPtr<RefLogger> p2(p1);
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&a, p2.get());
}
- ASSERT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1 = &a;
RefPtr<RefLogger> p2 = p1;
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&a, p2.get());
}
- ASSERT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1 = &a;
RefPtr<RefLogger> p2 = WTFMove(p1);
- ASSERT_EQ(nullptr, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(nullptr, p1.get());
+ EXPECT_EQ(&a, p2.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1 = &a;
RefPtr<RefLogger> p2(WTFMove(p1));
- ASSERT_EQ(nullptr, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(nullptr, p1.get());
+ EXPECT_EQ(&a, p2.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<DerivedRefLogger> p1 = &a;
RefPtr<RefLogger> p2 = p1;
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&a, p2.get());
}
- ASSERT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(a) deref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<DerivedRefLogger> p1 = &a;
RefPtr<RefLogger> p2 = WTFMove(p1);
- ASSERT_EQ(nullptr, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(nullptr, p1.get());
+ EXPECT_EQ(&a, p2.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr(&a);
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
ptr = nullptr;
- ASSERT_EQ(nullptr, ptr.get());
+ EXPECT_EQ(nullptr, ptr.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
}
TEST(WTF_RefPtr, AssignPassRefToRefPtr)
@@ -116,9 +116,9 @@
{
Ref<RefLogger> passRef(a);
RefPtr<RefLogger> ptr = WTFMove(passRef);
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
}
TEST(WTF_RefPtr, Adopt)
@@ -126,21 +126,21 @@
DerivedRefLogger a("a");
RefPtr<RefLogger> empty;
- ASSERT_EQ(nullptr, empty.get());
+ EXPECT_EQ(nullptr, empty.get());
{
RefPtr<RefLogger> ptr(adoptRef(&a));
- ASSERT_EQ(&a, ptr.get());
- ASSERT_EQ(&a, &*ptr);
- ASSERT_EQ(&a.name, &ptr->name);
+ EXPECT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, &*ptr);
+ EXPECT_EQ(&a.name, &ptr->name);
}
- ASSERT_STREQ("deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr = adoptRef(&a);
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
}
- ASSERT_STREQ("deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("deref(a) ", takeLogStr().c_str());
}
TEST(WTF_RefPtr, Assignment)
@@ -152,116 +152,116 @@
{
RefPtr<RefLogger> p1(&a);
RefPtr<RefLogger> p2(&b);
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&b, p2.get());
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&b, p2.get());
log() << "| ";
p1 = p2;
- ASSERT_EQ(&b, p1.get());
- ASSERT_EQ(&b, p2.get());
+ EXPECT_EQ(&b, p1.get());
+ EXPECT_EQ(&b, p2.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) ref(b) | ref(b) deref(a) | deref(b) deref(b) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(b) | ref(b) deref(a) | deref(b) deref(b) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr(&a);
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
log() << "| ";
ptr = &b;
- ASSERT_EQ(&b, ptr.get());
+ EXPECT_EQ(&b, ptr.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) | ref(b) deref(a) | deref(b) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) | ref(b) deref(a) | deref(b) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr(&a);
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
log() << "| ";
ptr = adoptRef(&b);
- ASSERT_EQ(&b, ptr.get());
+ EXPECT_EQ(&b, ptr.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) | deref(a) | deref(b) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) | deref(a) | deref(b) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr(&a);
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
ptr = nullptr;
- ASSERT_EQ(nullptr, ptr.get());
+ EXPECT_EQ(nullptr, ptr.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1(&a);
RefPtr<RefLogger> p2(&b);
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&b, p2.get());
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&b, p2.get());
log() << "| ";
p1 = WTFMove(p2);
- ASSERT_EQ(&b, p1.get());
- ASSERT_EQ(nullptr, p2.get());
+ EXPECT_EQ(&b, p1.get());
+ EXPECT_EQ(nullptr, p2.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) ref(b) | deref(a) | deref(b) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(b) | deref(a) | deref(b) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1(&a);
RefPtr<DerivedRefLogger> p2(&c);
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&c, p2.get());
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&c, p2.get());
log() << "| ";
p1 = p2;
- ASSERT_EQ(&c, p1.get());
- ASSERT_EQ(&c, p2.get());
+ EXPECT_EQ(&c, p1.get());
+ EXPECT_EQ(&c, p2.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) ref(c) | ref(c) deref(a) | deref(c) deref(c) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(c) | ref(c) deref(a) | deref(c) deref(c) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr(&a);
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
log() << "| ";
ptr = &c;
- ASSERT_EQ(&c, ptr.get());
+ EXPECT_EQ(&c, ptr.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) | ref(c) deref(a) | deref(c) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) | ref(c) deref(a) | deref(c) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr(&a);
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
log() << "| ";
ptr = adoptRef(&c);
- ASSERT_EQ(&c, ptr.get());
+ EXPECT_EQ(&c, ptr.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) | deref(a) | deref(c) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) | deref(a) | deref(c) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1(&a);
RefPtr<DerivedRefLogger> p2(&c);
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&c, p2.get());
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&c, p2.get());
log() << "| ";
p1 = WTFMove(p2);
- ASSERT_EQ(&c, p1.get());
- ASSERT_EQ(nullptr, p2.get());
+ EXPECT_EQ(&c, p1.get());
+ EXPECT_EQ(nullptr, p2.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) ref(c) | deref(a) | deref(c) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(c) | deref(a) | deref(c) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr(&a);
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
log() << "| ";
ptr = ptr;
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) | ref(a) deref(a) | deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) | ref(a) deref(a) | deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> ptr(&a);
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
#if COMPILER(CLANG)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunknown-pragmas"
@@ -271,9 +271,9 @@
#if COMPILER(CLANG)
#pragma clang diagnostic pop
#endif
- ASSERT_EQ(&a, ptr.get());
+ EXPECT_EQ(&a, ptr.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
}
TEST(WTF_RefPtr, Swap)
@@ -284,26 +284,28 @@
{
RefPtr<RefLogger> p1(&a);
RefPtr<RefLogger> p2(&b);
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&b, p2.get());
+ log() << "| ";
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&b, p2.get());
p1.swap(p2);
- ASSERT_EQ(&b, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(&b, p1.get());
+ EXPECT_EQ(&a, p2.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) ref(b) | deref(a) deref(b) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(b) | | deref(a) deref(b) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1(&a);
RefPtr<RefLogger> p2(&b);
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&b, p2.get());
+ log() << "| ";
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&b, p2.get());
std::swap(p1, p2);
- ASSERT_EQ(&b, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(&b, p1.get());
+ EXPECT_EQ(&a, p2.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) ref(b) | deref(a) deref(b) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(b) | | deref(a) deref(b) ", takeLogStr().c_str());
}
TEST(WTF_RefPtr, ReleaseNonNull)
@@ -315,7 +317,7 @@
RefPtr<RefLogger> ref = refPtr.releaseNonNull();
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
}
TEST(WTF_RefPtr, Release)
@@ -327,52 +329,52 @@
{
RefPtr<RefLogger> p1 = &a;
RefPtr<RefLogger> p2 = WTFMove(p1);
- ASSERT_EQ(nullptr, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(nullptr, p1.get());
+ EXPECT_EQ(&a, p2.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1 = &a;
RefPtr<RefLogger> p2(WTFMove(p1));
- ASSERT_EQ(nullptr, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(nullptr, p1.get());
+ EXPECT_EQ(&a, p2.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<DerivedRefLogger> p1 = &a;
RefPtr<RefLogger> p2 = WTFMove(p1);
- ASSERT_EQ(nullptr, p1.get());
- ASSERT_EQ(&a, p2.get());
+ EXPECT_EQ(nullptr, p1.get());
+ EXPECT_EQ(&a, p2.get());
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1(&a);
RefPtr<RefLogger> p2(&b);
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&b, p2.get());
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&b, p2.get());
log() << "| ";
p1 = WTFMove(p2);
- ASSERT_EQ(&b, p1.get());
- ASSERT_EQ(nullptr, p2.get());
+ EXPECT_EQ(&b, p1.get());
+ EXPECT_EQ(nullptr, p2.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) ref(b) | deref(a) | deref(b) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(b) | deref(a) | deref(b) ", takeLogStr().c_str());
{
RefPtr<RefLogger> p1(&a);
RefPtr<DerivedRefLogger> p2(&c);
- ASSERT_EQ(&a, p1.get());
- ASSERT_EQ(&c, p2.get());
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&c, p2.get());
log() << "| ";
p1 = WTFMove(p2);
- ASSERT_EQ(&c, p1.get());
- ASSERT_EQ(nullptr, p2.get());
+ EXPECT_EQ(&c, p1.get());
+ EXPECT_EQ(nullptr, p2.get());
log() << "| ";
}
- ASSERT_STREQ("ref(a) ref(c) | deref(a) | deref(c) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) ref(c) | deref(a) | deref(c) ", takeLogStr().c_str());
}
RefPtr<RefLogger> f1(RefLogger& logger)
@@ -387,15 +389,14 @@
{
f1(a);
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
{
auto ptr = f1(a);
}
- ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
+ EXPECT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
}
-
struct ConstRefCounted : RefCounted<ConstRefCounted> {
static Ref<ConstRefCounted> create() { return adoptRef(*new ConstRefCounted); }
};
@@ -425,4 +426,113 @@
Ref<const ConstRefCounted> i(returnRefCountedRef());
}
+struct RefPtrCheckingRefLogger : RefLogger {
+ RefPtrCheckingRefLogger(const char* name);
+ void ref();
+ void deref();
+ const RefPtr<RefPtrCheckingRefLogger>* slotToCheck { nullptr };
+};
+
+RefPtrCheckingRefLogger::RefPtrCheckingRefLogger(const char* name)
+ : RefLogger { name }
+{
+}
+
+static const char* loggerName(const RefPtr<RefPtrCheckingRefLogger>& pointer)
+{
+ return pointer ? &pointer->name : "null";
+}
+
+void RefPtrCheckingRefLogger::ref()
+{
+ if (slotToCheck)
+ log() << "slot=" << loggerName(*slotToCheck) << " ";
+ RefLogger::ref();
+}
+
+void RefPtrCheckingRefLogger::deref()
+{
+ if (slotToCheck)
+ log() << "slot=" << loggerName(*slotToCheck) << " ";
+ RefLogger::deref();
+}
+
+TEST(WTF_RefPtr, AssignBeforeDeref)
+{
+ RefPtrCheckingRefLogger a("a");
+ RefPtrCheckingRefLogger b("b");
+
+ {
+ RefPtr<RefPtrCheckingRefLogger> p1(&a);
+ RefPtr<RefPtrCheckingRefLogger> p2(&b);
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&b, p2.get());
+ log() << "| ";
+ a.slotToCheck = &p1;
+ b.slotToCheck = &p1;
+ p1 = p2;
+ a.slotToCheck = nullptr;
+ b.slotToCheck = nullptr;
+ EXPECT_EQ(&b, p1.get());
+ EXPECT_EQ(&b, p2.get());
+ log() << "| ";
+ }
+ EXPECT_STREQ("ref(a) ref(b) | slot=a ref(b) slot=b deref(a) | deref(b) deref(b) ", takeLogStr().c_str());
+
+ {
+ RefPtr<RefPtrCheckingRefLogger> ptr(&a);
+ EXPECT_EQ(&a, ptr.get());
+ log() << "| ";
+ a.slotToCheck = &ptr;
+ b.slotToCheck = &ptr;
+ ptr = &b;
+ a.slotToCheck = nullptr;
+ b.slotToCheck = nullptr;
+ EXPECT_EQ(&b, ptr.get());
+ log() << "| ";
+ }
+ EXPECT_STREQ("ref(a) | slot=a ref(b) slot=b deref(a) | deref(b) ", takeLogStr().c_str());
+
+ {
+ RefPtr<RefPtrCheckingRefLogger> ptr(&a);
+ EXPECT_EQ(&a, ptr.get());
+ a.slotToCheck = &ptr;
+ ptr = nullptr;
+ a.slotToCheck = nullptr;
+ EXPECT_EQ(nullptr, ptr.get());
+ }
+ EXPECT_STREQ("ref(a) slot=null deref(a) ", takeLogStr().c_str());
+
+ {
+ RefPtr<RefPtrCheckingRefLogger> p1(&a);
+ RefPtr<RefPtrCheckingRefLogger> p2(&b);
+ EXPECT_EQ(&a, p1.get());
+ EXPECT_EQ(&b, p2.get());
+ log() << "| ";
+ a.slotToCheck = &p1;
+ b.slotToCheck = &p1;
+ p1 = WTFMove(p2);
+ a.slotToCheck = nullptr;
+ b.slotToCheck = nullptr;
+ EXPECT_EQ(&b, p1.get());
+ EXPECT_EQ(nullptr, p2.get());
+ log() << "| ";
+ }
+ EXPECT_STREQ("ref(a) ref(b) | slot=b deref(a) | deref(b) ", takeLogStr().c_str());
+}
+
+TEST(WTF_RefPtr, ReleaseNonNullBeforeDeref)
+{
+ RefPtrCheckingRefLogger a("a");
+
+ {
+ RefPtr<RefPtrCheckingRefLogger> refPtr = &a;
+ a.slotToCheck = &refPtr;
+ refPtr.releaseNonNull();
+ a.slotToCheck = nullptr;
+ }
+
+ EXPECT_STREQ("ref(a) slot=null deref(a) ", takeLogStr().c_str());
+}
+
} // namespace TestWebKitAPI