| Index: base/weak_ptr_unittest.cc
|
| ===================================================================
|
| --- base/weak_ptr_unittest.cc (revision 0)
|
| +++ base/weak_ptr_unittest.cc (revision 0)
|
| @@ -0,0 +1,122 @@
|
| +// Copyright (c) 2009 The Chromium 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 "testing/gtest/include/gtest/gtest.h"
|
| +#include "base/thread.h"
|
| +#include "base/weak_ptr.h"
|
| +
|
| +namespace base {
|
| +namespace {
|
| +
|
| +template <class T>
|
| +class OffThreadObjectCreator {
|
| + public:
|
| + static T* NewObject() {
|
| + T* result;
|
| + {
|
| + Thread creator_thread("creator_thread");
|
| + creator_thread.Start();
|
| + creator_thread.message_loop()->PostTask(FROM_HERE,
|
| + NewRunnableFunction(OffThreadObjectCreator::CreateObject, &result));
|
| + }
|
| + DCHECK(result); // We synchronized on thread destruction above.
|
| + return result;
|
| + }
|
| + private:
|
| + static void CreateObject(T** result) {
|
| + *result = new T;
|
| + }
|
| +};
|
| +
|
| +struct Base {};
|
| +struct Derived : Base {};
|
| +
|
| +struct Producer : SupportsWeakPtr<Producer> {};
|
| +struct Consumer { WeakPtr<Producer> producer; };
|
| +
|
| +} // namespace
|
| +
|
| +TEST(WeakPtrTest, Basic) {
|
| + int data;
|
| + WeakPtrFactory<int> factory(&data);
|
| + WeakPtr<int> ptr = factory.GetWeakPtr();
|
| + EXPECT_EQ(&data, ptr.get());
|
| +}
|
| +
|
| +TEST(WeakPtrTest, Comparison) {
|
| + int data;
|
| + WeakPtrFactory<int> factory(&data);
|
| + WeakPtr<int> ptr = factory.GetWeakPtr();
|
| + WeakPtr<int> ptr2 = ptr;
|
| + EXPECT_TRUE(ptr == ptr2);
|
| +}
|
| +
|
| +TEST(WeakPtrTest, OutOfScope) {
|
| + WeakPtr<int> ptr;
|
| + EXPECT_EQ(NULL, ptr.get());
|
| + {
|
| + int data;
|
| + WeakPtrFactory<int> factory(&data);
|
| + ptr = factory.GetWeakPtr();
|
| + }
|
| + EXPECT_EQ(NULL, ptr.get());
|
| +}
|
| +
|
| +TEST(WeakPtrTest, Multiple) {
|
| + WeakPtr<int> a, b;
|
| + {
|
| + int data;
|
| + WeakPtrFactory<int> factory(&data);
|
| + a = factory.GetWeakPtr();
|
| + b = factory.GetWeakPtr();
|
| + EXPECT_EQ(&data, a.get());
|
| + EXPECT_EQ(&data, b.get());
|
| + }
|
| + EXPECT_EQ(NULL, a.get());
|
| + EXPECT_EQ(NULL, b.get());
|
| +}
|
| +
|
| +TEST(WeakPtrTest, UpCast) {
|
| + Derived data;
|
| + WeakPtrFactory<Derived> factory(&data);
|
| + WeakPtr<Base> ptr = factory.GetWeakPtr();
|
| + ptr = factory.GetWeakPtr();
|
| + EXPECT_EQ(ptr.get(), &data);
|
| +}
|
| +
|
| +TEST(WeakPtrTest, SupportsWeakPtr) {
|
| + Producer f;
|
| + WeakPtr<Producer> ptr = f.AsWeakPtr();
|
| + EXPECT_EQ(&f, ptr.get());
|
| +}
|
| +
|
| +TEST(WeakPtrTest, InvalidateWeakPtrs) {
|
| + int data;
|
| + WeakPtrFactory<int> factory(&data);
|
| + WeakPtr<int> ptr = factory.GetWeakPtr();
|
| + EXPECT_EQ(&data, ptr.get());
|
| + factory.InvalidateWeakPtrs();
|
| + EXPECT_EQ(NULL, ptr.get());
|
| +}
|
| +
|
| +TEST(WeakPtrTest, SingleThreaded1) {
|
| + // Test that it is OK to create a class that supports weak references on one
|
| + // thread, but use it on another. This tests that we do not trip runtime
|
| + // checks that ensure that a weak reference is not used by multiple threads.
|
| + scoped_ptr<Producer> producer(OffThreadObjectCreator<Producer>::NewObject());
|
| + WeakPtr<Producer> weak_producer = producer->AsWeakPtr();
|
| + EXPECT_EQ(producer.get(), weak_producer.get());
|
| +}
|
| +
|
| +TEST(WeakPtrTest, SingleThreaded2) {
|
| + // Test that it is OK to create a class that has a WeakPtr member on one
|
| + // thread, but use it on another. This tests that we do not trip runtime
|
| + // checks that ensure that a weak reference is not used by multiple threads.
|
| + scoped_ptr<Consumer> consumer(OffThreadObjectCreator<Consumer>::NewObject());
|
| + Producer producer;
|
| + consumer->producer = producer.AsWeakPtr();
|
| + EXPECT_EQ(&producer, consumer->producer.get());
|
| +}
|
| +
|
| +} // namespace base
|
|
|
| Property changes on: base\weak_ptr_unittest.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|