diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2017-09-21 16:19:19 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-09-21 20:29:29 +0000 |
commit | 9317f8f5336f989aade75ceb925391262b1ccdca (patch) | |
tree | 88f3a8f244f2d1c8f89906bb8e3ea84eb65ae5fd /core/fxcrt/shared_copy_on_write_unittest.cpp | |
parent | 0b95042db2e6dab5876abd12ce485fff0a8e08fe (diff) | |
download | pdfium-9317f8f5336f989aade75ceb925391262b1ccdca.tar.xz |
Move CFX_SharedCopyOnWrite to SharedCopyOnWrite
This CL renames CFX_SharedCopyOnWrite to SharedCopyOnWrite and moves to
the fxcrt namespace.
Bug: pdfium:898
Change-Id: Iced796b9f341407720e2a88f11d1916df56fe68c
Reviewed-on: https://pdfium-review.googlesource.com/14617
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Diffstat (limited to 'core/fxcrt/shared_copy_on_write_unittest.cpp')
-rw-r--r-- | core/fxcrt/shared_copy_on_write_unittest.cpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/core/fxcrt/shared_copy_on_write_unittest.cpp b/core/fxcrt/shared_copy_on_write_unittest.cpp new file mode 100644 index 0000000000..a683767054 --- /dev/null +++ b/core/fxcrt/shared_copy_on_write_unittest.cpp @@ -0,0 +1,128 @@ +// Copyright 2016 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "core/fxcrt/shared_copy_on_write.h" + +#include <map> +#include <string> + +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +class Observer { + public: + void OnConstruct(const std::string& name) { construction_counts_[name]++; } + void OnDestruct(const std::string& name) { destruction_counts_[name]++; } + int GetConstructionCount(const std::string& name) { + return construction_counts_[name]; + } + int GetDestructionCount(const std::string& name) { + return destruction_counts_[name]; + } + + private: + std::map<std::string, int> construction_counts_; + std::map<std::string, int> destruction_counts_; +}; + +class Object { + public: + Object(Observer* observer, const std::string& name) + : name_(name), observer_(observer) { + observer->OnConstruct(name_); + } + Object(const Object& that) : name_(that.name_), observer_(that.observer_) { + observer_->OnConstruct(name_); + } + ~Object() { observer_->OnDestruct(name_); } + + private: + std::string name_; + Observer* observer_; +}; + +} // namespace + +TEST(SharedCopyOnWrite, Null) { + Observer observer; + { + SharedCopyOnWrite<Object> ptr; + EXPECT_EQ(nullptr, ptr.GetObject()); + } +} + +TEST(SharedCopyOnWrite, Copy) { + Observer observer; + { + SharedCopyOnWrite<Object> ptr1; + ptr1.Emplace(&observer, std::string("one")); + { + SharedCopyOnWrite<Object> ptr2 = ptr1; + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + { + SharedCopyOnWrite<Object> ptr3(ptr1); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(1, observer.GetDestructionCount("one")); +} + +TEST(SharedCopyOnWrite, AssignOverOld) { + Observer observer; + { + SharedCopyOnWrite<Object> ptr1; + ptr1.Emplace(&observer, std::string("one")); + ptr1.Emplace(&observer, std::string("two")); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetConstructionCount("two")); + EXPECT_EQ(1, observer.GetDestructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("two")); + } + EXPECT_EQ(1, observer.GetDestructionCount("two")); +} + +TEST(SharedCopyOnWrite, AssignOverRetained) { + Observer observer; + { + SharedCopyOnWrite<Object> ptr1; + ptr1.Emplace(&observer, std::string("one")); + SharedCopyOnWrite<Object> ptr2(ptr1); + ptr1.Emplace(&observer, std::string("two")); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetConstructionCount("two")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("two")); + } + EXPECT_EQ(1, observer.GetDestructionCount("one")); + EXPECT_EQ(1, observer.GetDestructionCount("two")); +} + +TEST(SharedCopyOnWrite, GetModify) { + Observer observer; + { + SharedCopyOnWrite<Object> ptr; + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(1, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + { + SharedCopyOnWrite<Object> other(ptr); + EXPECT_NE(nullptr, ptr.GetPrivateCopy(&observer, std::string("one"))); + EXPECT_EQ(2, observer.GetConstructionCount("one")); + EXPECT_EQ(0, observer.GetDestructionCount("one")); + } + EXPECT_EQ(2, observer.GetConstructionCount("one")); + EXPECT_EQ(1, observer.GetDestructionCount("one")); + } + EXPECT_EQ(2, observer.GetDestructionCount("one")); +} |