// Copyright 2017 PDFium 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 "core/fxcrt/cfx_unowned_ptr.h" #include #include #include "testing/gtest/include/gtest/gtest.h" namespace { class Clink { public: CFX_UnownedPtr next_ = nullptr; }; void DeleteDangling() { Clink* ptr1 = new Clink(); Clink* ptr2 = new Clink(); ptr2->next_ = ptr1; delete ptr1; delete ptr2; } void AssignDangling() { Clink* ptr1 = new Clink(); Clink* ptr2 = new Clink(); ptr2->next_ = ptr1; delete ptr1; ptr2->next_ = nullptr; delete ptr2; } void ReleaseDangling() { Clink* ptr1 = new Clink(); Clink* ptr2 = new Clink(); ptr2->next_ = ptr1; delete ptr1; ptr2->next_.Release(); delete ptr2; } } // namespace TEST(fxcrt, UnownedPtrOk) { Clink* ptr1 = new Clink(); Clink* ptr2 = new Clink(); ptr2->next_ = ptr1; delete ptr2; delete ptr1; } TEST(fxcrt, UnownedPtrNotOk) { #if defined(MEMORY_TOOL_REPLACES_ALLOCATOR) EXPECT_DEATH(DeleteDangling(), ""); #else DeleteDangling(); #endif } TEST(fxcrt, UnownedAssignOk) { Clink* ptr1 = new Clink(); Clink* ptr2 = new Clink(); ptr2->next_ = ptr1; ptr2->next_ = nullptr; delete ptr2; delete ptr1; } TEST(fxcrt, UnownedAssignNotOk) { #if defined(MEMORY_TOOL_REPLACES_ALLOCATOR) EXPECT_DEATH(AssignDangling(), ""); #else AssignDangling(); #endif } TEST(fxcrt, UnownedReleaseOk) { Clink* ptr1 = new Clink(); Clink* ptr2 = new Clink(); ptr2->next_ = ptr1; ptr2->next_.Release(); delete ptr1; delete ptr2; } TEST(fxcrt, UnownedReleaseNotOk) { #if defined(MEMORY_TOOL_REPLACES_ALLOCATOR) EXPECT_DEATH(ReleaseDangling(), ""); #else ReleaseDangling(); #endif } TEST(fxcrt, UnownedOperatorEQ) { int foo; CFX_UnownedPtr ptr1; EXPECT_TRUE(ptr1 == ptr1); CFX_UnownedPtr ptr2; EXPECT_TRUE(ptr1 == ptr2); CFX_UnownedPtr ptr3(&foo); EXPECT_TRUE(&foo == ptr3); EXPECT_TRUE(ptr3 == &foo); EXPECT_FALSE(ptr1 == ptr3); ptr1 = &foo; EXPECT_TRUE(ptr1 == ptr3); } TEST(fxcrt, UnownedOperatorNE) { int foo; CFX_UnownedPtr ptr1; EXPECT_FALSE(ptr1 != ptr1); CFX_UnownedPtr ptr2; EXPECT_FALSE(ptr1 != ptr2); CFX_UnownedPtr ptr3(&foo); EXPECT_FALSE(&foo != ptr3); EXPECT_FALSE(ptr3 != &foo); EXPECT_TRUE(ptr1 != ptr3); ptr1 = &foo; EXPECT_FALSE(ptr1 != ptr3); } TEST(fxcrt, UnownedOperatorLT) { int foos[2]; CFX_UnownedPtr ptr1(&foos[0]); CFX_UnownedPtr ptr2(&foos[1]); EXPECT_FALSE(ptr1 < ptr1); EXPECT_TRUE(ptr1 < ptr2); EXPECT_FALSE(ptr2 < ptr1); }