hippomocks icon indicating copy to clipboard operation
hippomocks copied to clipboard

[cpp11 branch] memory access violation with multiple mock repositories

Open torbjoernk opened this issue 6 years ago • 2 comments

When using more than one mock repository, the destructor of the second mock repository fails with a memory access violation at hippomocks.h:942 when calling TestFinished() on the reporter of the second repository as MockRepoInstanceHolder<0>::instance = nullptr; and MockRepoInstanceHolder<0>::reporter = nullptr; has been called in the destructor of the first mock repository.

Sample code:

#include <boost/test/unit_test.hpp>
#include <hippomocks.h>

struct Foo
{
  virtual ~Foo() noexcept = 0;
  virtual int foo() = 0;
};

struct Bar
{
  virtual ~Bar() noexcept = 0;
  virtual int bar() = 0;
};

struct Fixture
{
  Fixture()
  {
    mocks_foo.autoExpect = false;
    mocks_bar.autoExpect = false;

    foo.reset(mocks_foo.Mock<Foo>());
    bar.reset(mocks_bar.Mock<Bar>());

    mocks_foo.ExpectCallDestructor(foo.get());
    mocks_bar.ExpectCallDestructor(bar.get());
  }

  HippoMocks::MockRepository mocks_foo;
  HippoMocks::MockRepository mocks_bar;
  std::shared_ptr<Foo> foo;
  std::shared_ptr<Bar> bar;
};

BOOST_FIXTURE_TEST_SUITE(HippoMocksTest, Fixture)

BOOST_AUTO_TEST_CASE(hippomocks_two_repos)
{
}

BOOST_AUTO_TEST_SUITE_END()

torbjoernk avatar Jul 10 '18 13:07 torbjoernk

Hmm, it looks like there is a singleton being used now, so using two repos no longer works. The example is a skinned down example where, due to complex setup, it was necessary to introduce a second repository to change the order of destructor calls, or rather the point in time when the expectations on a mock are evaluated. Is there any way to achieve such an effect using other means?

tnovotny avatar Jul 10 '18 19:07 tnovotny

We were able to workaround our need for two separate mock repositories. Thus, this issue isn't relevant for us any more.

torbjoernk avatar Jul 11 '18 06:07 torbjoernk