blob: e409185c0f8dbc51dc455e2f44b9195d36f104ae [file]
/*
* Copyright 2010-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
#include "FinalizerHooks.hpp"
#include "gtest/gtest.h"
#include "gmock/gmock.h"
#include "FinalizerHooksTestSupport.hpp"
#include "Memory.h"
#include "ObjectTestSupport.hpp"
#include "TestSupport.hpp"
using namespace kotlin;
using ::testing::_;
namespace {
struct EmptyPayload {
static constexpr test_support::NoRefFields<EmptyPayload> kFields{};
};
class FinalizerHooksTest : public testing::Test {
public:
testing::MockFunction<void(ObjHeader*)>& finalizerHook() { return finalizerHooks_.finalizerHook(); }
private:
FinalizerHooksTestSupport finalizerHooks_;
};
} // namespace
TEST_F(FinalizerHooksTest, TypeWithFinalizerHookWithoutExtra) {
test_support::TypeInfoHolder type{test_support::TypeInfoHolder::ObjectBuilder<EmptyPayload>().addFlag(TF_HAS_FINALIZER)};
test_support::Object<EmptyPayload> object(type.typeInfo());
ObjHeader* obj = object.header();
ASSERT_FALSE(obj->has_meta_object());
EXPECT_TRUE(HasFinalizers(obj));
EXPECT_CALL(finalizerHook(), Call(obj));
RunFinalizers(obj);
EXPECT_FALSE(obj->has_meta_object());
}
TEST_F(FinalizerHooksTest, TypeWithFinalizerHookWithExtra) {
ScopedMemoryInit init;
test_support::TypeInfoHolder type{test_support::TypeInfoHolder::ObjectBuilder<EmptyPayload>().addFlag(TF_HAS_FINALIZER)};
test_support::Object<EmptyPayload> object(type.typeInfo());
ObjHeader* obj = object.header();
ObjHeader::createMetaObject(obj);
ASSERT_TRUE(obj->has_meta_object());
EXPECT_TRUE(HasFinalizers(obj));
EXPECT_CALL(finalizerHook(), Call(obj));
RunFinalizers(obj);
EXPECT_FALSE(obj->has_meta_object());
}
TEST_F(FinalizerHooksTest, TypeWithoutFinalizerHookWithoutExtra) {
test_support::TypeInfoHolder type{test_support::TypeInfoHolder::ObjectBuilder<EmptyPayload>()};
test_support::Object<EmptyPayload> object(type.typeInfo());
ObjHeader* obj = object.header();
ASSERT_FALSE(obj->has_meta_object());
EXPECT_FALSE(HasFinalizers(obj));
EXPECT_CALL(finalizerHook(), Call(_)).Times(0);
RunFinalizers(obj);
EXPECT_FALSE(obj->has_meta_object());
}
TEST_F(FinalizerHooksTest, TypeWithoutFinalizerHookWithExtra) {
ScopedMemoryInit init;
test_support::TypeInfoHolder type{test_support::TypeInfoHolder::ObjectBuilder<EmptyPayload>()};
test_support::Object<EmptyPayload> object(type.typeInfo());
ObjHeader* obj = object.header();
ObjHeader::createMetaObject(obj);
ASSERT_TRUE(obj->has_meta_object());
EXPECT_TRUE(HasFinalizers(obj));
EXPECT_CALL(finalizerHook(), Call(_)).Times(0);
RunFinalizers(obj);
EXPECT_FALSE(obj->has_meta_object());
}