| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 | /* * * Copyright 2017 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */#include "src/core/lib/gprpp/orphanable.h"#include <gtest/gtest.h>#include "src/core/lib/gprpp/memory.h"#include "test/core/util/test_config.h"namespace grpc_core {namespace testing {namespace {class Foo : public Orphanable { public:  Foo() : Foo(0) {}  explicit Foo(int value) : value_(value) {}  void Orphan() override { Delete(this); }  int value() const { return value_; } private:  int value_;};TEST(Orphanable, Basic) {  Foo* foo = New<Foo>();  foo->Orphan();}TEST(OrphanablePtr, Basic) {  OrphanablePtr<Foo> foo(New<Foo>());  EXPECT_EQ(0, foo->value());}TEST(MakeOrphanable, DefaultConstructor) {  auto foo = MakeOrphanable<Foo>();  EXPECT_EQ(0, foo->value());}TEST(MakeOrphanable, WithParameters) {  auto foo = MakeOrphanable<Foo>(5);  EXPECT_EQ(5, foo->value());}class Bar : public InternallyRefCounted<Bar> { public:  Bar() : Bar(0) {}  explicit Bar(int value) : value_(value) {}  void Orphan() override { Unref(); }  int value() const { return value_; }  void StartWork() { self_ref_ = Ref(); }  void FinishWork() { self_ref_.reset(); } private:  int value_;  RefCountedPtr<Bar> self_ref_;};TEST(OrphanablePtr, InternallyRefCounted) {  auto bar = MakeOrphanable<Bar>();  bar->StartWork();  bar->FinishWork();}// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that// things build properly in both debug and non-debug cases.DebugOnlyTraceFlag baz_tracer(true, "baz");class Baz : public InternallyRefCounted<Baz> { public:  Baz() : Baz(0) {}  explicit Baz(int value)      : InternallyRefCounted<Baz>(&baz_tracer), value_(value) {}  void Orphan() override { Unref(); }  int value() const { return value_; }  void StartWork() { self_ref_ = Ref(DEBUG_LOCATION, "work"); }  void FinishWork() {    // This is a little ugly, but it makes the logged ref and unref match up.    self_ref_.release();    Unref(DEBUG_LOCATION, "work");  } private:  int value_;  RefCountedPtr<Baz> self_ref_;};TEST(OrphanablePtr, InternallyRefCountedWithTracing) {  auto baz = MakeOrphanable<Baz>();  baz->StartWork();  baz->FinishWork();}}  // namespace}  // namespace testing}  // namespace grpc_coreint main(int argc, char** argv) {  grpc::testing::TestEnvironment env(argc, argv);  ::testing::InitGoogleTest(&argc, argv);  return RUN_ALL_TESTS();}
 |