refcnttest.cc revision 7842:4c0f7929ee33
111308Santhony.gutierrez@amd.com/* 211308Santhony.gutierrez@amd.com * Copyright (c) 2010 The Regents of The University of Michigan 311308Santhony.gutierrez@amd.com * All rights reserved. 411308Santhony.gutierrez@amd.com * 511308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 611308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are 711308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright 811308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer; 911308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright 1011308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the 1111308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution; 1211308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its 1311308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from 1411308Santhony.gutierrez@amd.com * this software without specific prior written permission. 1511308Santhony.gutierrez@amd.com * 1611308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711308Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811308Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911308Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711308Santhony.gutierrez@amd.com * 2811308Santhony.gutierrez@amd.com * Authors: Gabe Black 2911308Santhony.gutierrez@amd.com */ 3011308Santhony.gutierrez@amd.com 3111308Santhony.gutierrez@amd.com#include <cassert> 3211308Santhony.gutierrez@amd.com#include <iostream> 3311308Santhony.gutierrez@amd.com#include <list> 3411308Santhony.gutierrez@amd.com 3511308Santhony.gutierrez@amd.com#include "base/cprintf.hh" 3612581Sgiacomo.travaglini@arm.com#include "base/refcnt.hh" 3712581Sgiacomo.travaglini@arm.com#include "unittest/unittest.hh" 3811308Santhony.gutierrez@amd.com 3911308Santhony.gutierrez@amd.comusing namespace std; 4011308Santhony.gutierrez@amd.comusing UnitTest::setCase; 4111308Santhony.gutierrez@amd.com 4211308Santhony.gutierrez@amd.comnamespace { 4311308Santhony.gutierrez@amd.com 4411670Sandreas.hansson@arm.combool printNewDel = false; 4511308Santhony.gutierrez@amd.com 4611670Sandreas.hansson@arm.comclass TestRC; 4711682Sandreas.hansson@arm.comtypedef list<TestRC *> LiveList; 4811682Sandreas.hansson@arm.comLiveList liveList; 4911308Santhony.gutierrez@amd.com 5011308Santhony.gutierrez@amd.comint 5111308Santhony.gutierrez@amd.comlive() 5211308Santhony.gutierrez@amd.com{ 5311308Santhony.gutierrez@amd.com return liveList.size(); 5411308Santhony.gutierrez@amd.com} 5511308Santhony.gutierrez@amd.com 5611308Santhony.gutierrez@amd.comint 5711308Santhony.gutierrez@amd.comliveChange() 5811308Santhony.gutierrez@amd.com{ 5911308Santhony.gutierrez@amd.com static int oldLive = 0; 6011308Santhony.gutierrez@amd.com int newLive = live(); 6111308Santhony.gutierrez@amd.com int diff = newLive - oldLive; 6211308Santhony.gutierrez@amd.com oldLive = newLive; 6311308Santhony.gutierrez@amd.com return diff; 6411308Santhony.gutierrez@amd.com} 6511308Santhony.gutierrez@amd.com 6611308Santhony.gutierrez@amd.comclass TestRC : public RefCounted 6711308Santhony.gutierrez@amd.com{ 6811308Santhony.gutierrez@amd.com protected: 6911308Santhony.gutierrez@amd.com const char *_tag; 7011308Santhony.gutierrez@amd.com LiveList::iterator liveIt; 7111308Santhony.gutierrez@amd.com 7211308Santhony.gutierrez@amd.com public: 7311308Santhony.gutierrez@amd.com TestRC(const char *newTag) : _tag(newTag) 7411308Santhony.gutierrez@amd.com { 7511308Santhony.gutierrez@amd.com if (printNewDel) 7611308Santhony.gutierrez@amd.com cprintf(" Creating object \"%s\"\n", _tag); 7711308Santhony.gutierrez@amd.com liveList.push_front(this); 7811308Santhony.gutierrez@amd.com liveIt = liveList.begin(); 7911308Santhony.gutierrez@amd.com } 8011308Santhony.gutierrez@amd.com 8111308Santhony.gutierrez@amd.com ~TestRC() 8212581Sgiacomo.travaglini@arm.com { 8311308Santhony.gutierrez@amd.com if (printNewDel) 8411308Santhony.gutierrez@amd.com cprintf(" Destroying object \"%s\"\n", _tag); 8511308Santhony.gutierrez@amd.com liveList.erase(liveIt); 8611308Santhony.gutierrez@amd.com } 8711308Santhony.gutierrez@amd.com 8811308Santhony.gutierrez@amd.com const char * 8911308Santhony.gutierrez@amd.com tag() 9011308Santhony.gutierrez@amd.com { 9111308Santhony.gutierrez@amd.com return _tag; 9211310SBrad.Beckmann@amd.com } 9311308Santhony.gutierrez@amd.com 9411308Santhony.gutierrez@amd.com int testVal; 9511308Santhony.gutierrez@amd.com}; 9611308Santhony.gutierrez@amd.com 9711308Santhony.gutierrez@amd.comtypedef RefCountingPtr<TestRC> Ptr; 9811308Santhony.gutierrez@amd.com 9911308Santhony.gutierrez@amd.com} // anonymous namespace 10011308Santhony.gutierrez@amd.com 10111308Santhony.gutierrez@amd.comint 10211308Santhony.gutierrez@amd.commain() 10311308Santhony.gutierrez@amd.com{ 10411308Santhony.gutierrez@amd.com assert(live() == 0); 10511308Santhony.gutierrez@amd.com assert(liveChange() == 0); 10611308Santhony.gutierrez@amd.com 10711308Santhony.gutierrez@amd.com // Create an empty Ptr and verify it's data pointer is NULL. 10811308Santhony.gutierrez@amd.com setCase("NULL check"); 10911308Santhony.gutierrez@amd.com Ptr nullCheck; 11011308Santhony.gutierrez@amd.com EXPECT_EQ(nullCheck.get(), NULL); 11111308Santhony.gutierrez@amd.com 11211308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 0); 11311308Santhony.gutierrez@amd.com 11411308Santhony.gutierrez@amd.com // Construct a Ptr from a TestRC pointer. 11511308Santhony.gutierrez@amd.com setCase("construction from pointer"); 11611308Santhony.gutierrez@amd.com Ptr constFromPointer = new TestRC("construction from pointer"); 11711308Santhony.gutierrez@amd.com 11811308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 1); 11911308Santhony.gutierrez@amd.com 12011308Santhony.gutierrez@amd.com // Construct a Ptr from an existing Ptr. 12111308Santhony.gutierrez@amd.com setCase("construction from a Ptr"); 12211308Santhony.gutierrez@amd.com Ptr constFromPtr = constFromPointer; 12311308Santhony.gutierrez@amd.com 12411308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 0); 12511308Santhony.gutierrez@amd.com 12611308Santhony.gutierrez@amd.com // Test a Ptr being destroyed. 12711308Santhony.gutierrez@amd.com setCase("destroying a Ptr"); 12811308Santhony.gutierrez@amd.com Ptr *ptrPtr = new Ptr(new TestRC("destroying a ptr")); 12911308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 1); 13011308Santhony.gutierrez@amd.com delete ptrPtr; 13111308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), -1); 13211308Santhony.gutierrez@amd.com 13311308Santhony.gutierrez@amd.com // Test assignment from a pointer and from a Ptr. 13411308Santhony.gutierrez@amd.com setCase("assignment operators"); 13511308Santhony.gutierrez@amd.com Ptr assignmentTarget; 13611308Santhony.gutierrez@amd.com TestRC *assignmentSourcePointer = new TestRC("assignment source 1"); 13711308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 1); 13811308Santhony.gutierrez@amd.com assignmentTarget = assignmentSourcePointer; 13911308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 0); 14011308Santhony.gutierrez@amd.com assignmentTarget = NULL; 14111308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), -1); 14211308Santhony.gutierrez@amd.com Ptr assignmentSourcePtr(new TestRC("assignment source 2")); 14311308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 1); 14411308Santhony.gutierrez@amd.com assignmentTarget = assignmentSourcePtr; 14511308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 0); 14611308Santhony.gutierrez@amd.com assignmentSourcePtr = NULL; 14711308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 0); 14811308Santhony.gutierrez@amd.com assignmentTarget = NULL; 14911308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), -1); 15011308Santhony.gutierrez@amd.com 15111308Santhony.gutierrez@amd.com // Test access to members of the pointed to class and dereferencing. 15211308Santhony.gutierrez@amd.com setCase("access to members"); 15311308Santhony.gutierrez@amd.com TestRC *accessTest = new TestRC("access test"); 15411308Santhony.gutierrez@amd.com Ptr accessTestPtr = accessTest; 15511308Santhony.gutierrez@amd.com accessTest->testVal = 1; 15611308Santhony.gutierrez@amd.com EXPECT_EQ(accessTestPtr->testVal, 1); 15711308Santhony.gutierrez@amd.com EXPECT_EQ((*accessTestPtr).testVal, 1); 15811308Santhony.gutierrez@amd.com accessTest->testVal = 2; 15911308Santhony.gutierrez@amd.com EXPECT_EQ(accessTestPtr->testVal, 2); 16011308Santhony.gutierrez@amd.com EXPECT_EQ((*accessTestPtr).testVal, 2); 16111308Santhony.gutierrez@amd.com accessTestPtr->testVal = 3; 16211308Santhony.gutierrez@amd.com EXPECT_EQ(accessTest->testVal, 3); 16311308Santhony.gutierrez@amd.com (*accessTestPtr).testVal = 4; 16411308Santhony.gutierrez@amd.com EXPECT_EQ(accessTest->testVal, 4); 16511308Santhony.gutierrez@amd.com accessTestPtr = NULL; 16611308Santhony.gutierrez@amd.com accessTest = NULL; 16711308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 0); 16811308Santhony.gutierrez@amd.com 16911308Santhony.gutierrez@amd.com // Test bool and ! operator overloads. 17011308Santhony.gutierrez@amd.com setCase("conversion to bool and ! overload"); 17111308Santhony.gutierrez@amd.com Ptr boolTest = new TestRC("bool test"); 17211308Santhony.gutierrez@amd.com EXPECT_EQ(boolTest, true); 17311308Santhony.gutierrez@amd.com EXPECT_EQ(!boolTest, false); 17411308Santhony.gutierrez@amd.com boolTest = NULL; 17511308Santhony.gutierrez@amd.com EXPECT_EQ(boolTest, false); 17611308Santhony.gutierrez@amd.com EXPECT_EQ(!boolTest, true); 17711308Santhony.gutierrez@amd.com EXPECT_EQ(liveChange(), 0); 17811308Santhony.gutierrez@amd.com 17911308Santhony.gutierrez@amd.com // Test the equality operators. 18011308Santhony.gutierrez@amd.com setCase("equality operators"); 18111308Santhony.gutierrez@amd.com TestRC *equalTestA = new TestRC("equal test a"); 18211308Santhony.gutierrez@amd.com Ptr equalTestAPtr = equalTestA; 18311308Santhony.gutierrez@amd.com Ptr equalTestAPtr2 = equalTestA; 18411308Santhony.gutierrez@amd.com TestRC *equalTestB = new TestRC("equal test b"); 18511308Santhony.gutierrez@amd.com Ptr equalTestBPtr = equalTestB; 18611308Santhony.gutierrez@amd.com EXPECT_TRUE(equalTestA == equalTestAPtr); 18711308Santhony.gutierrez@amd.com EXPECT_TRUE(equalTestAPtr == equalTestA); 18811308Santhony.gutierrez@amd.com EXPECT_TRUE(equalTestAPtr == equalTestAPtr2); 18911308Santhony.gutierrez@amd.com EXPECT_TRUE(equalTestA != equalTestBPtr); 19011308Santhony.gutierrez@amd.com EXPECT_TRUE(equalTestAPtr != equalTestB); 19111308Santhony.gutierrez@amd.com EXPECT_TRUE(equalTestAPtr != equalTestBPtr); 19211308Santhony.gutierrez@amd.com 19311308Santhony.gutierrez@amd.com return UnitTest::printResults(); 19411308Santhony.gutierrez@amd.com} 19511308Santhony.gutierrez@amd.com