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