1*9507f98cSAndroid Build Coastguard Worker // Copyright (c) 2018 The LevelDB Authors. All rights reserved.
2*9507f98cSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*9507f98cSAndroid Build Coastguard Worker // found in the LICENSE file. See the AUTHORS file for names of contributors.
4*9507f98cSAndroid Build Coastguard Worker
5*9507f98cSAndroid Build Coastguard Worker #include "util/no_destructor.h"
6*9507f98cSAndroid Build Coastguard Worker
7*9507f98cSAndroid Build Coastguard Worker #include <cstdint>
8*9507f98cSAndroid Build Coastguard Worker #include <cstdlib>
9*9507f98cSAndroid Build Coastguard Worker #include <utility>
10*9507f98cSAndroid Build Coastguard Worker
11*9507f98cSAndroid Build Coastguard Worker #include "gtest/gtest.h"
12*9507f98cSAndroid Build Coastguard Worker
13*9507f98cSAndroid Build Coastguard Worker namespace leveldb {
14*9507f98cSAndroid Build Coastguard Worker
15*9507f98cSAndroid Build Coastguard Worker namespace {
16*9507f98cSAndroid Build Coastguard Worker
17*9507f98cSAndroid Build Coastguard Worker struct DoNotDestruct {
18*9507f98cSAndroid Build Coastguard Worker public:
DoNotDestructleveldb::__anonc79f7adf0111::DoNotDestruct19*9507f98cSAndroid Build Coastguard Worker DoNotDestruct(uint32_t a, uint64_t b) : a(a), b(b) {}
~DoNotDestructleveldb::__anonc79f7adf0111::DoNotDestruct20*9507f98cSAndroid Build Coastguard Worker ~DoNotDestruct() { std::abort(); }
21*9507f98cSAndroid Build Coastguard Worker
22*9507f98cSAndroid Build Coastguard Worker // Used to check constructor argument forwarding.
23*9507f98cSAndroid Build Coastguard Worker uint32_t a;
24*9507f98cSAndroid Build Coastguard Worker uint64_t b;
25*9507f98cSAndroid Build Coastguard Worker };
26*9507f98cSAndroid Build Coastguard Worker
27*9507f98cSAndroid Build Coastguard Worker constexpr const uint32_t kGoldenA = 0xdeadbeef;
28*9507f98cSAndroid Build Coastguard Worker constexpr const uint64_t kGoldenB = 0xaabbccddeeffaabb;
29*9507f98cSAndroid Build Coastguard Worker
30*9507f98cSAndroid Build Coastguard Worker } // namespace
31*9507f98cSAndroid Build Coastguard Worker
TEST(NoDestructorTest,StackInstance)32*9507f98cSAndroid Build Coastguard Worker TEST(NoDestructorTest, StackInstance) {
33*9507f98cSAndroid Build Coastguard Worker NoDestructor<DoNotDestruct> instance(kGoldenA, kGoldenB);
34*9507f98cSAndroid Build Coastguard Worker ASSERT_EQ(kGoldenA, instance.get()->a);
35*9507f98cSAndroid Build Coastguard Worker ASSERT_EQ(kGoldenB, instance.get()->b);
36*9507f98cSAndroid Build Coastguard Worker }
37*9507f98cSAndroid Build Coastguard Worker
TEST(NoDestructorTest,StaticInstance)38*9507f98cSAndroid Build Coastguard Worker TEST(NoDestructorTest, StaticInstance) {
39*9507f98cSAndroid Build Coastguard Worker static NoDestructor<DoNotDestruct> instance(kGoldenA, kGoldenB);
40*9507f98cSAndroid Build Coastguard Worker ASSERT_EQ(kGoldenA, instance.get()->a);
41*9507f98cSAndroid Build Coastguard Worker ASSERT_EQ(kGoldenB, instance.get()->b);
42*9507f98cSAndroid Build Coastguard Worker }
43*9507f98cSAndroid Build Coastguard Worker
44*9507f98cSAndroid Build Coastguard Worker } // namespace leveldb
45*9507f98cSAndroid Build Coastguard Worker
46