X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Ftest%2Fcommon%2Ftest_mutex.cc;fp=src%2Fceph%2Fsrc%2Ftest%2Fcommon%2Ftest_mutex.cc;h=b62341e71422120f2b53ead160faee7946372858;hb=812ff6ca9fcd3e629e49d4328905f33eee8ca3f5;hp=0000000000000000000000000000000000000000;hpb=15280273faafb77777eab341909a3f495cf248d9;p=stor4nfv.git diff --git a/src/ceph/src/test/common/test_mutex.cc b/src/ceph/src/test/common/test_mutex.cc new file mode 100644 index 0000000..b62341e --- /dev/null +++ b/src/ceph/src/test/common/test_mutex.cc @@ -0,0 +1,68 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + */ + +#include +#include "gtest/gtest.h" +#include "common/ceph_context.h" +#include "common/config.h" +#include "include/coredumpctl.h" + +/* + * Override normal ceph assert. + * It is needed to prevent hang when we assert() and THEN still wait on lock(). + */ +namespace ceph +{ + void __ceph_assert_fail(const char *assertion, const char *file, int line, + const char *func) + { + throw 0; + } +} + +void do_init() { + static CephContext* cct = nullptr; + if (cct == nullptr) { + cct = new CephContext(0); + lockdep_register_ceph_context(cct); + } +} + +TEST(Mutex, NormalAsserts) { + Mutex* m = new Mutex("Normal",false); + m->Lock(); + EXPECT_THROW(m->Lock(), int); +} + +TEST(Mutex, RecursiveWithLockdep) { + do_init(); + g_lockdep = 1; + Mutex* m = new Mutex("Recursive1",true); + m->Lock(); + m->Lock(); + m->Unlock(); + m->Unlock(); + delete m; +} + +TEST(Mutex, RecursiveWithoutLockdep) { + do_init(); + g_lockdep = 0; + Mutex* m = new Mutex("Recursive2",true); + m->Lock(); + m->Lock(); + m->Unlock(); + m->Unlock(); + delete m; +} + +TEST(Mutex, DeleteLocked) { + Mutex* m = new Mutex("Recursive3",false); + m->Lock(); + PrCtl unset_dumpable; + EXPECT_DEATH(delete m,".*"); +}