Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F81068074
sample10_unittest.cc
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Wed, Sep 4, 01:36
Size
4 KB
Mime Type
text/x-c
Expires
Fri, Sep 6, 01:36 (1 d, 22 h)
Engine
blob
Format
Raw Data
Handle
20511946
Attached To
R9484 sp4e-homework-lars-bertil
sample10_unittest.cc
View Options
// Copyright 2009 Google Inc. All Rights Reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// This sample shows how to use Google Test listener API to implement
// a primitive leak checker.
#include <stdio.h>
#include <stdlib.h>
#include "gtest/gtest.h"
using
::
testing
::
EmptyTestEventListener
;
using
::
testing
::
InitGoogleTest
;
using
::
testing
::
Test
;
using
::
testing
::
TestEventListeners
;
using
::
testing
::
TestInfo
;
using
::
testing
::
TestPartResult
;
using
::
testing
::
UnitTest
;
namespace
{
// We will track memory used by this class.
class
Water
{
public
:
// Normal Water declarations go here.
// operator new and operator delete help us control water allocation.
void
*
operator
new
(
size_t
allocation_size
)
{
allocated_
++
;
return
malloc
(
allocation_size
);
}
void
operator
delete
(
void
*
block
,
size_t
/* allocation_size */
)
{
allocated_
--
;
free
(
block
);
}
static
int
allocated
()
{
return
allocated_
;
}
private
:
static
int
allocated_
;
};
int
Water
::
allocated_
=
0
;
// This event listener monitors how many Water objects are created and
// destroyed by each test, and reports a failure if a test leaks some Water
// objects. It does this by comparing the number of live Water objects at
// the beginning of a test and at the end of a test.
class
LeakChecker
:
public
EmptyTestEventListener
{
private
:
// Called before a test starts.
void
OnTestStart
(
const
TestInfo
&
/* test_info */
)
override
{
initially_allocated_
=
Water
::
allocated
();
}
// Called after a test ends.
void
OnTestEnd
(
const
TestInfo
&
/* test_info */
)
override
{
int
difference
=
Water
::
allocated
()
-
initially_allocated_
;
// You can generate a failure in any event handler except
// OnTestPartResult. Just use an appropriate Google Test assertion to do
// it.
EXPECT_LE
(
difference
,
0
)
<<
"Leaked "
<<
difference
<<
" unit(s) of Water!"
;
}
int
initially_allocated_
;
};
TEST
(
ListenersTest
,
DoesNotLeak
)
{
Water
*
water
=
new
Water
;
delete
water
;
}
// This should fail when the --check_for_leaks command line flag is
// specified.
TEST
(
ListenersTest
,
LeaksWater
)
{
Water
*
water
=
new
Water
;
EXPECT_TRUE
(
water
!=
nullptr
);
}
}
// namespace
int
main
(
int
argc
,
char
**
argv
)
{
InitGoogleTest
(
&
argc
,
argv
);
bool
check_for_leaks
=
false
;
if
(
argc
>
1
&&
strcmp
(
argv
[
1
],
"--check_for_leaks"
)
==
0
)
check_for_leaks
=
true
;
else
printf
(
"%s
\n
"
,
"Run this program with --check_for_leaks to enable "
"custom leak checking in the tests."
);
// If we are given the --check_for_leaks command line flag, installs the
// leak checker.
if
(
check_for_leaks
)
{
TestEventListeners
&
listeners
=
UnitTest
::
GetInstance
()
->
listeners
();
// Adds the leak checker to the end of the test event listener list,
// after the default text output printer and the default XML report
// generator.
//
// The order is important - it ensures that failures generated in the
// leak checker's OnTestEnd() method are processed by the text and XML
// printers *before* their OnTestEnd() methods are called, such that
// they are attributed to the right test. Remember that a listener
// receives an OnXyzStart event *after* listeners preceding it in the
// list received that event, and receives an OnXyzEnd event *before*
// listeners preceding it.
//
// We don't need to worry about deleting the new listener later, as
// Google Test will do it.
listeners
.
Append
(
new
LeakChecker
);
}
return
RUN_ALL_TESTS
();
}
Event Timeline
Log In to Comment