Index: chrome/browser/ui/cocoa/objc_zombie_unittest.mm |
diff --git a/chrome/browser/ui/cocoa/objc_zombie_unittest.mm b/chrome/browser/ui/cocoa/objc_zombie_unittest.mm |
deleted file mode 100644 |
index 1cadf4a7888e7565dcc193dca226a393aabb9664..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/cocoa/objc_zombie_unittest.mm |
+++ /dev/null |
@@ -1,134 +0,0 @@ |
-// Copyright (c) 2011 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. |
- |
-#import <Cocoa/Cocoa.h> |
-#include <dlfcn.h> |
- |
-#include "base/logging.h" |
-#import "base/memory/scoped_nsobject.h" |
-#import "chrome/browser/ui/cocoa/objc_zombie.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "testing/platform_test.h" |
- |
-namespace { |
- |
-// Dynamically look up |objc_setAssociatedObject()|, which isn't |
-// available until the 10.6 SDK. |
- |
-typedef void objc_setAssociatedObjectFn(id object, void *key, id value, |
- int policy); |
-objc_setAssociatedObjectFn* LookupSetAssociatedObjectFn() { |
- return reinterpret_cast<objc_setAssociatedObjectFn*>( |
- dlsym(RTLD_DEFAULT, "objc_setAssociatedObject")); |
-} |
- |
-} // namespace |
- |
-@interface ZombieCxxDestructTest : NSObject |
-{ |
- scoped_nsobject<id> aRef_; |
-} |
-- (id)initWith:(id)anObject; |
-@end |
- |
-@implementation ZombieCxxDestructTest |
-- (id)initWith:(id)anObject { |
- self = [super init]; |
- if (self) { |
- aRef_.reset([anObject retain]); |
- } |
- return self; |
-} |
-@end |
- |
-@interface ZombieAssociatedObjectTest : NSObject |
-+ (BOOL)supportsAssociatedObjects; |
-- (id)initWithAssociatedObject:(id)anObject; |
-@end |
- |
-@implementation ZombieAssociatedObjectTest |
- |
-+ (BOOL)supportsAssociatedObjects { |
- if (LookupSetAssociatedObjectFn()) |
- return YES; |
- return NO; |
-} |
- |
-- (id)initWithAssociatedObject:(id)anObject { |
- self = [super init]; |
- if (self) { |
- objc_setAssociatedObjectFn* fn = LookupSetAssociatedObjectFn(); |
- if (fn) { |
- // Cribbed from 10.6 <objc/runtime.h>. |
- static const int kObjcAssociationRetain = 01401; |
- |
- // The address of the variable itself is the unique key, the |
- // contents don't matter. |
- static char kAssociatedObjectKey = 'x'; |
- |
- (*fn)(self, &kAssociatedObjectKey, anObject, kObjcAssociationRetain); |
- } |
- } |
- return self; |
-} |
- |
-@end |
- |
-namespace { |
- |
-// Verify that the C++ destructors run when the last reference to the |
-// object is released. |
-// NOTE(shess): To test the negative, comment out the |g_objectDestruct()| |
-// call in |ZombieDealloc()|. |
-TEST(ObjcZombieTest, CxxDestructors) { |
- scoped_nsobject<id> anObject([[NSObject alloc] init]); |
- EXPECT_EQ(1u, [anObject retainCount]); |
- |
- ASSERT_TRUE(ObjcEvilDoers::ZombieEnable(YES, 100)); |
- |
- scoped_nsobject<ZombieCxxDestructTest> soonInfected( |
- [[ZombieCxxDestructTest alloc] initWith:anObject]); |
- EXPECT_EQ(2u, [anObject retainCount]); |
- |
- // When |soonInfected| becomes a zombie, the C++ destructors should |
- // run and release a reference to |anObject|. |
- soonInfected.reset(); |
- EXPECT_EQ(1u, [anObject retainCount]); |
- |
- // The local reference should remain (C++ destructors aren't re-run). |
- ObjcEvilDoers::ZombieDisable(); |
- EXPECT_EQ(1u, [anObject retainCount]); |
-} |
- |
-// Verify that the associated objects are released when the object is |
-// released. |
-// NOTE(shess): To test the negative, hardcode |g_objectDestruct| to |
-// the 10.5 version in |ZombieInit()|, and run this test on 10.6. |
-TEST(ObjcZombieTest, AssociatedObjectsReleased) { |
- if (![ZombieAssociatedObjectTest supportsAssociatedObjects]) { |
- LOG(ERROR) |
- << "ObjcZombieTest.AssociatedObjectsReleased not supported on 10.5"; |
- return; |
- } |
- |
- scoped_nsobject<id> anObject([[NSObject alloc] init]); |
- EXPECT_EQ(1u, [anObject retainCount]); |
- |
- ASSERT_TRUE(ObjcEvilDoers::ZombieEnable(YES, 100)); |
- |
- scoped_nsobject<ZombieAssociatedObjectTest> soonInfected( |
- [[ZombieAssociatedObjectTest alloc] initWithAssociatedObject:anObject]); |
- EXPECT_EQ(2u, [anObject retainCount]); |
- |
- // When |soonInfected| becomes a zombie, the associated object |
- // should be released. |
- soonInfected.reset(); |
- EXPECT_EQ(1u, [anObject retainCount]); |
- |
- // The local reference should remain (associated objects not re-released). |
- ObjcEvilDoers::ZombieDisable(); |
- EXPECT_EQ(1u, [anObject retainCount]); |
-} |
- |
-} // namespace |