aboutsummaryrefslogtreecommitdiff
path: root/UnitTesting/GTMUnitTestDevLog.m
blob: ae4050f425ccfb1ffdfa71d2fec1cbe22ccee066 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
//
//  GTMUnitTestDevLog.m
//
//  Copyright 2008 Google Inc.
//
//  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.
//

#import "GTMUnitTestDevLog.h"

@interface GTMUnttestDevLogAssertionHandler : NSAssertionHandler
- (void)handleFailure:(NSString *)functionName
                 file:(NSString *)fileName
           lineNumber:(NSInteger)line
          description:(NSString *)format
            arguments:(va_list)argList NS_FORMAT_FUNCTION(4,0);
@end

@implementation GTMUnttestDevLogAssertionHandler
- (void)handleFailureInMethod:(SEL)selector
                       object:(id)object
                         file:(NSString *)fileName
                   lineNumber:(NSInteger)line
                  description:(NSString *)format, ... {
  NSString *call = [NSString stringWithFormat:@"[%@ %@]",
                    NSStringFromClass([object class]),
                    NSStringFromSelector(selector)];

  va_list argList;
  va_start(argList, format);
  [self handleFailure:call
             file:fileName
            lineNumber:line
          description:format
            arguments:argList];
  va_end(argList);
}

- (void)handleFailureInFunction:(NSString *)functionName
                           file:(NSString *)fileName
                     lineNumber:(NSInteger)line
                    description:(NSString *)format, ... {
  va_list argList;
  va_start(argList, format);
  [self handleFailure:functionName
                 file:fileName
           lineNumber:line
          description:format
            arguments:argList];
  va_end(argList);
}

- (void)handleFailure:(NSString *)failure
                 file:(NSString *)fileName
           lineNumber:(NSInteger)line
          description:(NSString *)format
            arguments:(va_list)argList {
  NSString *descStr
       = [[[NSString alloc] initWithFormat:format arguments:argList] autorelease];

  // You need a format that will be useful in logs, but won't trip up Xcode or
  // any other build systems parsing of the output.
  NSString *outLog
      = [NSString stringWithFormat:@"RecordedNSAssert in %@ - %@ (%@:%ld)",
         failure, descStr, fileName, (long)line];
  // To avoid unused variable warning when _GTMDevLog is stripped.
  (void)outLog;
  _GTMDevLog(@"%@", outLog); // Don't want any percents in outLog honored
  [NSException raise:NSInternalInconsistencyException
              format:@"NSAssert raised"];
}
@end

@implementation GTMUnitTestDevLog

+ (void)enableTracking {

  NSMutableDictionary *threadDictionary
    = [[NSThread currentThread] threadDictionary];
  if ([threadDictionary objectForKey:@"NSAssertionHandler"] != nil) {
    NSLog(@"Warning: replacing NSAssertionHandler to capture assertions");
  }

  // Install an assertion handler to capture those.
  GTMUnttestDevLogAssertionHandler *handler =
    [[[GTMUnttestDevLogAssertionHandler alloc] init] autorelease];
  [threadDictionary setObject:handler forKey:@"NSAssertionHandler"];
}

+ (void)disableTracking {

  // Clear our assertion handler back out.
  NSMutableDictionary *threadDictionary
    = [[NSThread currentThread] threadDictionary];
  [threadDictionary removeObjectForKey:@"NSAssertionHandler"];
}

@end