[go: nahoru, domu]

blob: 586412a4f970f997ac3c19daf6d6679e9facaed7 [file] [log] [blame]
Avi Drissmanea1be232022-09-14 23:29:061// Copyright 2013 The Chromium Authors
rohitrao4aaf45232016-12-05 16:02:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Gauthier Ambard999088c2022-09-13 08:36:575#import "ios/testing/scoped_block_swizzler.h"
Avi Drissmaneac566b02023-08-18 02:56:216#import "base/apple/foundation_util.h"
Gauthier Ambard999088c2022-09-13 08:36:577#import "testing/gtest/include/gtest/gtest.h"
olivierrobin3c03c1c2016-12-29 17:35:198#import "testing/gtest_mac.h"
Gauthier Ambard999088c2022-09-13 08:36:579#import "testing/platform_test.h"
rohitrao4aaf45232016-12-05 16:02:5510
11// Class containing two methods that will be swizzled by the unittests.
12@interface ScopedBlockSwizzlerTestClass : NSObject
13
14// An NSString property that will be accessed by one of the swizzled methods.
15@property(nonatomic, copy) NSString* value;
16
17+ (NSString*)classMethodToSwizzle;
18- (NSString*)instanceMethodToSwizzle;
19@end
20
21namespace {
22
23NSString* const kOriginalClassValue = @"Bar";
24NSString* const kSwizzledClassValue = @"Foo";
25NSString* const kOriginalInstanceValue = @"Bizz";
26NSString* const kSwizzledInstanceValue = @"Buzz";
27
Sylvain Defresne647780802017-10-09 14:59:2728using ScopedBlockSwizzlerTest = PlatformTest;
29
rohitrao4aaf45232016-12-05 16:02:5530// Tests that swizzling a class method works properly.
Sylvain Defresne647780802017-10-09 14:59:2731TEST_F(ScopedBlockSwizzlerTest, SwizzlingClassMethods) {
rohitrao4aaf45232016-12-05 16:02:5532 EXPECT_NSEQ(kOriginalClassValue,
33 [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);
34
35 {
36 id block = ^NSString*(id self) { return kSwizzledClassValue; };
37 ScopedBlockSwizzler swizzler([ScopedBlockSwizzlerTestClass class],
38 @selector(classMethodToSwizzle), block);
39 EXPECT_NSEQ(kSwizzledClassValue,
40 [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);
41 }
42
43 EXPECT_NSEQ(kOriginalClassValue,
44 [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);
45}
46
47// Tests that swizzling an instance method works properly.
Sylvain Defresne647780802017-10-09 14:59:2748TEST_F(ScopedBlockSwizzlerTest, SwizzlingInstanceMethod) {
liaoyuke0d45a3e2017-05-17 16:25:1149 ScopedBlockSwizzlerTestClass* target =
50 [[ScopedBlockSwizzlerTestClass alloc] init];
51 target.value = kSwizzledInstanceValue;
rohitrao4aaf45232016-12-05 16:02:5552
53 EXPECT_NSEQ(kOriginalInstanceValue, [target instanceMethodToSwizzle]);
54 EXPECT_FALSE([[target instanceMethodToSwizzle]
55 isEqualToString:kSwizzledInstanceValue]);
56
57 {
58 id block = ^NSString*(id self) {
Avi Drissmaneac566b02023-08-18 02:56:2159 return base::apple::ObjCCastStrict<ScopedBlockSwizzlerTestClass>(self)
rohitrao4aaf45232016-12-05 16:02:5560 .value;
61 };
62 ScopedBlockSwizzler swizzler([ScopedBlockSwizzlerTestClass class],
63 @selector(instanceMethodToSwizzle), block);
64 EXPECT_NSEQ(kSwizzledInstanceValue, [target instanceMethodToSwizzle]);
65 }
66
67 EXPECT_NSEQ(kOriginalInstanceValue, [target instanceMethodToSwizzle]);
68}
69
70// Tests that calling |ScopedBlockSwizzler::reset()| properly unswizzles the
71// method.
Sylvain Defresne647780802017-10-09 14:59:2772TEST_F(ScopedBlockSwizzlerTest, TestReset) {
rohitrao4aaf45232016-12-05 16:02:5573 EXPECT_NSEQ(kOriginalClassValue,
74 [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);
75
76 id block = ^NSString*(id self) { return kSwizzledClassValue; };
77 std::unique_ptr<ScopedBlockSwizzler> swizzler(
78 new ScopedBlockSwizzler([ScopedBlockSwizzlerTestClass class],
79 @selector(classMethodToSwizzle), block));
80 EXPECT_NSEQ(kSwizzledClassValue,
81 [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);
82
83 swizzler.reset();
84 EXPECT_NSEQ(kOriginalClassValue,
85 [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);
86}
87
88} // namespace
89
90#pragma mark - ScopedBlockSwizzlerTestClass
91
92@implementation ScopedBlockSwizzlerTestClass
93
94@synthesize value = _value;
95
96+ (NSString*)classMethodToSwizzle {
97 return kOriginalClassValue;
98}
99
100- (NSString*)instanceMethodToSwizzle {
101 return kOriginalInstanceValue;
102}
103
104@end