/core/externals/update-engine/externals/google-toolbox-for-mac/Foundation/GTMLoggerTest.m

http://macfuse.googlecode.com/ · Objective C · 601 lines · 436 code · 97 blank · 68 comment · 13 complexity · 09c1f099ec95cd0770eb0ea8d1966fec MD5 · raw file

  1. //
  2. // GTMLoggerTest.m
  3. //
  4. // Copyright 2007-2008 Google Inc.
  5. //
  6. // Licensed under the Apache License, Version 2.0 (the "License"); you may not
  7. // use this file except in compliance with the License. You may obtain a copy
  8. // of the License at
  9. //
  10. // http://www.apache.org/licenses/LICENSE-2.0
  11. //
  12. // Unless required by applicable law or agreed to in writing, software
  13. // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  14. // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  15. // License for the specific language governing permissions and limitations under
  16. // the License.
  17. //
  18. #import "GTMLogger.h"
  19. #import "GTMRegex.h"
  20. #import "GTMSenTestCase.h"
  21. // A test writer that stores log messages in an array for easy retrieval.
  22. @interface ArrayWriter : NSObject <GTMLogWriter> {
  23. @private
  24. NSMutableArray *messages_;
  25. }
  26. - (NSArray *)messages;
  27. - (void)clear;
  28. @end
  29. @implementation ArrayWriter
  30. - (id)init {
  31. if ((self = [super init])) {
  32. messages_ = [[NSMutableArray alloc] init];
  33. }
  34. return self;
  35. }
  36. - (void)dealloc {
  37. [messages_ release];
  38. [super dealloc];
  39. }
  40. - (NSArray *)messages {
  41. return messages_;
  42. }
  43. - (void)logMessage:(NSString *)msg level:(GTMLoggerLevel)level {
  44. [messages_ addObject:msg];
  45. }
  46. - (void)clear {
  47. [messages_ removeAllObjects];
  48. }
  49. @end // ArrayWriter
  50. // A formatter for testing that prepends the word DUMB to log messages, along
  51. // with the log level number.
  52. @interface DumbFormatter : GTMLogBasicFormatter
  53. @end
  54. @implementation DumbFormatter
  55. #if !defined(__clang__) && (__GNUC__*10+__GNUC_MINOR__ >= 42)
  56. // Some versions of GCC (4.2 and below AFAIK) aren't great about supporting
  57. // -Wmissing-format-attribute
  58. // when the function is anything more complex than foo(NSString *fmt, ...).
  59. // You see the error inside the function when you turn ... into va_args and
  60. // attempt to call another function (like vsprintf for example).
  61. // So we just shut off the warning for this function.
  62. #pragma GCC diagnostic ignored "-Wmissing-format-attribute"
  63. #endif // !__clang__
  64. - (NSString *)stringForFunc:(NSString *)func
  65. withFormat:(NSString *)fmt
  66. valist:(va_list)args
  67. level:(GTMLoggerLevel)level {
  68. return [NSString stringWithFormat:@"DUMB [%d] %@", level,
  69. [super stringForFunc:nil withFormat:fmt valist:args level:level]];
  70. }
  71. #if !defined(__clang__) && (__GNUC__*10+__GNUC_MINOR__ >= 42)
  72. #pragma GCC diagnostic error "-Wmissing-format-attribute"
  73. #endif // !__clang__
  74. @end // DumbFormatter
  75. // A test filter that ignores messages with the string "ignore".
  76. @interface IgnoreFilter : NSObject <GTMLogFilter>
  77. @end
  78. @implementation IgnoreFilter
  79. - (BOOL)filterAllowsMessage:(NSString *)msg level:(GTMLoggerLevel)level {
  80. NSRange range = [msg rangeOfString:@"ignore"];
  81. return (range.location == NSNotFound);
  82. }
  83. @end // IgnoreFilter
  84. //
  85. // Begin test harness
  86. //
  87. @interface GTMLoggerTest : GTMTestCase {
  88. @private
  89. NSString *path_;
  90. }
  91. - (NSString *)stringFromFormatter:(id<GTMLogFormatter>)formatter
  92. level:(GTMLoggerLevel)level
  93. format:(NSString *)fmt, ... NS_FORMAT_FUNCTION(3,4);
  94. @end
  95. @implementation GTMLoggerTest
  96. - (void)setUp {
  97. path_ = [[NSTemporaryDirectory() stringByAppendingPathComponent:
  98. @"GTMLoggerUnitTest.log"] retain];
  99. STAssertNotNil(path_, nil);
  100. // Make sure we're cleaned up from the last run
  101. #if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
  102. [[NSFileManager defaultManager] removeFileAtPath:path_ handler:nil];
  103. #else
  104. [[NSFileManager defaultManager] removeItemAtPath:path_ error:NULL];
  105. #endif
  106. }
  107. - (void)tearDown {
  108. STAssertNotNil(path_, nil);
  109. #if GTM_MACOS_SDK && (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5)
  110. [[NSFileManager defaultManager] removeFileAtPath:path_ handler:nil];
  111. #else
  112. [[NSFileManager defaultManager] removeItemAtPath:path_ error:NULL];
  113. #endif
  114. [path_ release];
  115. path_ = nil;
  116. }
  117. - (void)testCreation {
  118. GTMLogger *logger1 = nil, *logger2 = nil;
  119. logger1 = [GTMLogger sharedLogger];
  120. logger2 = [GTMLogger sharedLogger];
  121. STAssertTrue(logger1 == logger2, nil);
  122. STAssertNotNil([logger1 writer], nil);
  123. STAssertNotNil([logger1 formatter], nil);
  124. STAssertNotNil([logger1 filter], nil);
  125. // Get a new instance; not the shared instance
  126. logger2 = [GTMLogger standardLogger];
  127. STAssertTrue(logger1 != logger2, nil);
  128. STAssertNotNil([logger2 writer], nil);
  129. STAssertNotNil([logger2 formatter], nil);
  130. STAssertNotNil([logger2 filter], nil);
  131. // Set the new instance to be the shared logger.
  132. [GTMLogger setSharedLogger:logger2];
  133. STAssertTrue(logger2 == [GTMLogger sharedLogger], nil);
  134. STAssertTrue(logger1 != [GTMLogger sharedLogger], nil);
  135. // Set the shared logger to nil, which should reset it to a new "standard"
  136. // logger.
  137. [GTMLogger setSharedLogger:nil];
  138. STAssertNotNil([GTMLogger sharedLogger], nil);
  139. STAssertTrue(logger2 != [GTMLogger sharedLogger], nil);
  140. STAssertTrue(logger1 != [GTMLogger sharedLogger], nil);
  141. GTMLogger *logger = [GTMLogger logger];
  142. STAssertNotNil(logger, nil);
  143. logger = [GTMLogger standardLoggerWithStderr];
  144. STAssertNotNil(logger, nil);
  145. logger = [GTMLogger standardLoggerWithPath:path_];
  146. STAssertNotNil(logger, nil);
  147. }
  148. - (void)testAccessors {
  149. GTMLogger *logger = [GTMLogger standardLogger];
  150. STAssertNotNil(logger, nil);
  151. STAssertNotNil([logger writer], nil);
  152. STAssertNotNil([logger formatter], nil);
  153. STAssertNotNil([logger filter], nil);
  154. [logger setWriter:nil];
  155. [logger setFormatter:nil];
  156. [logger setFilter:nil];
  157. // These attributes should NOT be nil. They should be set to their defaults.
  158. STAssertNotNil([logger writer], nil);
  159. STAssertNotNil([logger formatter], nil);
  160. STAssertNotNil([logger filter], nil);
  161. }
  162. - (void)testLogger {
  163. ArrayWriter *writer = [[[ArrayWriter alloc] init] autorelease];
  164. IgnoreFilter *filter = [[[IgnoreFilter alloc] init] autorelease];
  165. // We actually only need the array writer instance for this unit test to pass,
  166. // but we combine that writer with a stdout writer for two reasons:
  167. //
  168. // 1. To test the NSArray composite writer object
  169. // 2. To make debugging easier by sending output to stdout
  170. //
  171. // We also include in the array an object that is not a GTMLogWriter to make
  172. // sure that we don't crash when presented with an array of non-GTMLogWriters.
  173. NSArray *writers = [NSArray arrayWithObjects:writer,
  174. [NSFileHandle fileHandleWithStandardOutput],
  175. @"blah", nil];
  176. GTMLogger *logger = [GTMLogger loggerWithWriter:writers
  177. formatter:nil // basic formatter
  178. filter:filter];
  179. STAssertNotNil(logger, nil);
  180. // Log a few messages to test with
  181. [logger logInfo:@"hi"];
  182. [logger logDebug:@"foo"];
  183. [logger logError:@"blah"];
  184. [logger logAssert:@"baz"];
  185. // Makes sure the messages got logged
  186. NSArray *messages = [writer messages];
  187. STAssertNotNil(messages, nil);
  188. STAssertEquals([messages count], (NSUInteger)4, nil);
  189. STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil);
  190. STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil);
  191. STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil);
  192. STAssertEqualObjects([messages objectAtIndex:3], @"baz", nil);
  193. // Log a message that should be ignored, and make sure it did NOT get logged
  194. [logger logInfo:@"please ignore this"];
  195. messages = [writer messages];
  196. STAssertNotNil(messages, nil);
  197. STAssertEquals([messages count], (NSUInteger)4, nil);
  198. STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil);
  199. STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil);
  200. STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil);
  201. STAssertEqualObjects([messages objectAtIndex:3], @"baz", nil);
  202. // Change the formatter to our "dumb formatter"
  203. id<GTMLogFormatter> formatter = [[[DumbFormatter alloc] init] autorelease];
  204. [logger setFormatter:formatter];
  205. [logger logInfo:@"bleh"];
  206. messages = [writer messages];
  207. STAssertNotNil(messages, nil);
  208. STAssertEquals([messages count], (NSUInteger)5, nil); // Message count should increase
  209. // The previously logged messages should not change
  210. STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil);
  211. STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil);
  212. STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil);
  213. STAssertEqualObjects([messages objectAtIndex:3], @"baz", nil);
  214. STAssertEqualObjects([messages objectAtIndex:4], @"DUMB [2] bleh", nil);
  215. }
  216. - (void)testConvenienceMacros {
  217. ArrayWriter *writer = [[[ArrayWriter alloc] init] autorelease];
  218. NSArray *writers = [NSArray arrayWithObjects:writer,
  219. [NSFileHandle fileHandleWithStandardOutput], nil];
  220. [[GTMLogger sharedLogger] setWriter:writers];
  221. // Here we log a message using a convenience macro, which should log the
  222. // message along with the name of the function it was called from. Here we
  223. // test to make sure the logged message does indeed contain the name of the
  224. // current function "testConvenienceMacros".
  225. GTMLoggerError(@"test ========================");
  226. STAssertEquals([[writer messages] count], (NSUInteger)1, nil);
  227. NSRange rangeOfFuncName =
  228. [[[writer messages] objectAtIndex:0] rangeOfString:@"testConvenienceMacros"];
  229. STAssertTrue(rangeOfFuncName.location != NSNotFound, nil);
  230. [writer clear];
  231. [[GTMLogger sharedLogger] setFormatter:nil];
  232. GTMLoggerInfo(@"test %d", 1);
  233. GTMLoggerDebug(@"test %d", 2);
  234. GTMLoggerError(@"test %d", 3);
  235. GTMLoggerAssert(@"test %d", 4);
  236. NSArray *messages = [writer messages];
  237. STAssertNotNil(messages, nil);
  238. #ifdef DEBUG
  239. STAssertEquals([messages count], (NSUInteger)4, nil);
  240. STAssertEqualObjects([messages objectAtIndex:0], @"test 1", nil);
  241. STAssertEqualObjects([messages objectAtIndex:1], @"test 2", nil);
  242. STAssertEqualObjects([messages objectAtIndex:2], @"test 3", nil);
  243. STAssertEqualObjects([messages objectAtIndex:3], @"test 4", nil);
  244. #else
  245. // In Release builds, only the Error and Assert messages will be logged
  246. STAssertEquals([messages count], (NSUInteger)2, nil);
  247. STAssertEqualObjects([messages objectAtIndex:0], @"test 3", nil);
  248. STAssertEqualObjects([messages objectAtIndex:1], @"test 4", nil);
  249. #endif
  250. }
  251. - (void)testFileHandleWriter {
  252. NSFileHandle *fh = nil;
  253. fh = [NSFileHandle fileHandleForWritingAtPath:path_];
  254. STAssertNil(fh, nil);
  255. fh = [NSFileHandle fileHandleForLoggingAtPath:path_ mode:0644];
  256. STAssertNotNil(fh, nil);
  257. [fh logMessage:@"test 0" level:kGTMLoggerLevelUnknown];
  258. [fh logMessage:@"test 1" level:kGTMLoggerLevelDebug];
  259. [fh logMessage:@"test 2" level:kGTMLoggerLevelInfo];
  260. [fh logMessage:@"test 3" level:kGTMLoggerLevelError];
  261. [fh logMessage:@"test 4" level:kGTMLoggerLevelAssert];
  262. [fh closeFile];
  263. NSError *err = nil;
  264. NSString *contents = [NSString stringWithContentsOfFile:path_
  265. encoding:NSUTF8StringEncoding
  266. error:&err];
  267. STAssertNotNil(contents, @"Error loading log file: %@", err);
  268. STAssertEqualObjects(@"test 0\ntest 1\ntest 2\ntest 3\ntest 4\n", contents, nil);
  269. }
  270. - (void)testLoggerAdapterWriter {
  271. ArrayWriter *writer = [[[ArrayWriter alloc] init] autorelease];
  272. STAssertNotNil(writer, nil);
  273. GTMLogger *sublogger = [GTMLogger loggerWithWriter:writer
  274. formatter:nil
  275. filter:nil];
  276. STAssertNotNil(sublogger, nil);
  277. GTMLogger *logger = [GTMLogger loggerWithWriter:sublogger
  278. formatter:nil
  279. filter:nil];
  280. STAssertNotNil(logger, nil);
  281. // Log a few messages to test with
  282. [logger logInfo:@"hi"];
  283. [logger logDebug:@"foo"];
  284. [logger logError:@"blah"];
  285. [logger logAssert:@"assert"];
  286. // Makes sure the messages got logged
  287. NSArray *messages = [writer messages];
  288. STAssertNotNil(messages, nil);
  289. STAssertEquals([messages count], (NSUInteger)4, nil);
  290. STAssertEqualObjects([messages objectAtIndex:0], @"hi", nil);
  291. STAssertEqualObjects([messages objectAtIndex:1], @"foo", nil);
  292. STAssertEqualObjects([messages objectAtIndex:2], @"blah", nil);
  293. STAssertEqualObjects([messages objectAtIndex:3], @"assert", nil);
  294. }
  295. // Helper method to help testing GTMLogFormatters
  296. - (NSString *)stringFromFormatter:(id<GTMLogFormatter>)formatter
  297. level:(GTMLoggerLevel)level
  298. format:(NSString *)fmt, ... {
  299. va_list args;
  300. va_start(args, fmt);
  301. NSString *msg = [formatter stringForFunc:nil
  302. withFormat:fmt
  303. valist:args
  304. level:level];
  305. va_end(args);
  306. return msg;
  307. }
  308. - (void)testFunctionPrettifier {
  309. GTMLogBasicFormatter *fmtr = [[[GTMLogBasicFormatter alloc] init]
  310. autorelease];
  311. STAssertNotNil(fmtr, nil);
  312. // Nil, empty and whitespace
  313. STAssertEqualObjects([fmtr prettyNameForFunc:nil], @"(unknown)", nil);
  314. STAssertEqualObjects([fmtr prettyNameForFunc:@""], @"(unknown)", nil);
  315. STAssertEqualObjects([fmtr prettyNameForFunc:@" \n\t"], @"(unknown)", nil);
  316. // C99 __func__
  317. STAssertEqualObjects([fmtr prettyNameForFunc:@"main"], @"main()", nil);
  318. STAssertEqualObjects([fmtr prettyNameForFunc:@"main"], @"main()", nil);
  319. STAssertEqualObjects([fmtr prettyNameForFunc:@" main "], @"main()", nil);
  320. // GCC Obj-C __func__ and __PRETTY_FUNCTION__
  321. STAssertEqualObjects([fmtr prettyNameForFunc:@"+[Foo bar]"], @"+[Foo bar]",
  322. nil);
  323. STAssertEqualObjects([fmtr prettyNameForFunc:@" +[Foo bar] "], @"+[Foo bar]",
  324. nil);
  325. STAssertEqualObjects([fmtr prettyNameForFunc:@"-[Foo baz]"], @"-[Foo baz]",
  326. nil);
  327. STAssertEqualObjects([fmtr prettyNameForFunc:@" -[Foo baz] "], @"-[Foo baz]",
  328. nil);
  329. // GCC C++ __PRETTY_FUNCTION__
  330. STAssertEqualObjects([fmtr prettyNameForFunc:@"void a::sub(int)"],
  331. @"void a::sub(int)", nil);
  332. STAssertEqualObjects([fmtr prettyNameForFunc:@" void a::sub(int) "],
  333. @"void a::sub(int)", nil);
  334. }
  335. - (void)testBasicFormatter {
  336. id<GTMLogFormatter> fmtr = [[[GTMLogBasicFormatter alloc] init] autorelease];
  337. STAssertNotNil(fmtr, nil);
  338. NSString *msg = nil;
  339. msg = [self stringFromFormatter:fmtr
  340. level:kGTMLoggerLevelDebug
  341. format:@"test"];
  342. STAssertEqualObjects(msg, @"test", nil);
  343. msg = [self stringFromFormatter:fmtr
  344. level:kGTMLoggerLevelDebug
  345. format:@"test %d", 1];
  346. STAssertEqualObjects(msg, @"test 1", nil);
  347. msg = [self stringFromFormatter:fmtr
  348. level:kGTMLoggerLevelDebug
  349. format:@"test %@", @"foo"];
  350. STAssertEqualObjects(msg, @"test foo", nil);
  351. msg = [self stringFromFormatter:fmtr
  352. level:kGTMLoggerLevelDebug
  353. format:@""];
  354. STAssertEqualObjects(msg, @"", nil);
  355. msg = [self stringFromFormatter:fmtr
  356. level:kGTMLoggerLevelDebug
  357. format:@" "];
  358. STAssertEqualObjects(msg, @" ", nil);
  359. }
  360. - (void)testStandardFormatter {
  361. id<GTMLogFormatter> fmtr = [[[GTMLogStandardFormatter alloc] init] autorelease];
  362. STAssertNotNil(fmtr, nil);
  363. NSString * kFormatBasePattern;
  364. #if GTM_MACOS_SDK
  365. // E.g. 2008-01-04 09:16:26.906 otest[5567/0xa07d0f60] [lvl=1] (no func) test
  366. // E.g. 2009-10-26 22:26:25.086 otest-i386[53200/0xa0438500] [lvl=1] (no func) test
  367. kFormatBasePattern =
  368. @"[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3} ((otest)|(otest-i386)|(otest-x86_64)|(otest-ppc))\\[[0-9]+/0x[0-9a-f]+\\] \\[lvl=[0-3]\\] \\(unknown\\) ";
  369. #else // GTM_MACOS_SDK
  370. // E.g. 2008-01-04 09:16:26.906 otest[5567/0xa07d0f60] [lvl=1] (no func) test
  371. // 2011-11-29 12:32:24.129 GTMiPhoneUnitTestingOCUnitTestRig[31540/0xa04dd540] [lvl=1] (unknown) test
  372. kFormatBasePattern =
  373. @"[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3} (GTMiPhoneTest|GTMiPhoneUnitTestingOCUnitTestRig)\\[[0-9]+/0x[0-9a-f]+\\] \\[lvl=[0-3]\\] \\(unknown\\) ";
  374. #endif // GTM_MACOS_SDK
  375. NSString *msg = nil;
  376. msg = [self stringFromFormatter:fmtr
  377. level:kGTMLoggerLevelDebug
  378. format:@"test"];
  379. STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test"]],
  380. @"msg: %@", msg);
  381. msg = [self stringFromFormatter:fmtr
  382. level:kGTMLoggerLevelError
  383. format:@"test %d", 1];
  384. STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test 1"]],
  385. @"msg: %@", msg);
  386. msg = [self stringFromFormatter:fmtr
  387. level:kGTMLoggerLevelInfo
  388. format:@"test %@", @"hi"];
  389. STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test hi"]],
  390. @"msg: %@", msg);
  391. msg = [self stringFromFormatter:fmtr
  392. level:kGTMLoggerLevelUnknown
  393. format:@"test"];
  394. STAssertTrue([msg gtm_matchesPattern:[kFormatBasePattern stringByAppendingString:@"test"]],
  395. @"msg: %@", msg);
  396. }
  397. - (void)testNoFilter {
  398. id<GTMLogFilter> filter = [[[GTMLogNoFilter alloc] init] autorelease];
  399. STAssertNotNil(filter, nil);
  400. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown], nil);
  401. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug], nil);
  402. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo], nil);
  403. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError], nil);
  404. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert], nil);
  405. STAssertTrue([filter filterAllowsMessage:@"" level:kGTMLoggerLevelDebug], nil);
  406. STAssertTrue([filter filterAllowsMessage:nil level:kGTMLoggerLevelDebug], nil);
  407. }
  408. - (void)testMinimumFilter {
  409. id<GTMLogFilter> filter = [[[GTMLogMininumLevelFilter alloc]
  410. initWithMinimumLevel:kGTMLoggerLevelInfo]
  411. autorelease];
  412. STAssertNotNil(filter, nil);
  413. STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown],
  414. nil);
  415. STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug],
  416. nil);
  417. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo],
  418. nil);
  419. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError],
  420. nil);
  421. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert],
  422. nil);
  423. filter = [[[GTMLogMininumLevelFilter alloc]
  424. initWithMinimumLevel:kGTMLoggerLevelDebug] autorelease];
  425. STAssertNotNil(filter, nil);
  426. STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown],
  427. nil);
  428. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug],
  429. nil);
  430. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo],
  431. nil);
  432. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError],
  433. nil);
  434. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert],
  435. nil);
  436. // Cannot exceed min/max levels filter
  437. filter = [[[GTMLogMininumLevelFilter alloc]
  438. initWithMinimumLevel:kGTMLoggerLevelAssert + 1] autorelease];
  439. STAssertNil(filter, nil);
  440. filter = [[[GTMLogMininumLevelFilter alloc]
  441. initWithMinimumLevel:kGTMLoggerLevelUnknown - 1] autorelease];
  442. STAssertNil(filter, nil);
  443. }
  444. - (void)testMaximumFilter {
  445. id<GTMLogFilter> filter = [[[GTMLogMaximumLevelFilter alloc]
  446. initWithMaximumLevel:kGTMLoggerLevelInfo]
  447. autorelease];
  448. STAssertNotNil(filter, nil);
  449. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown],
  450. nil);
  451. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug],
  452. nil);
  453. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo],
  454. nil);
  455. STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError],
  456. nil);
  457. STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert],
  458. nil);
  459. filter = [[[GTMLogMaximumLevelFilter alloc]
  460. initWithMaximumLevel:kGTMLoggerLevelDebug] autorelease];
  461. STAssertNotNil(filter, nil);
  462. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelUnknown],
  463. nil);
  464. STAssertTrue([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelDebug],
  465. nil);
  466. STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelInfo],
  467. nil);
  468. STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelError],
  469. nil);
  470. STAssertFalse([filter filterAllowsMessage:@"hi" level:kGTMLoggerLevelAssert],
  471. nil);
  472. // Cannot exceed min/max levels filter
  473. filter = [[[GTMLogMaximumLevelFilter alloc]
  474. initWithMaximumLevel:kGTMLoggerLevelAssert + 1] autorelease];
  475. STAssertNil(filter, nil);
  476. filter = [[[GTMLogMaximumLevelFilter alloc]
  477. initWithMaximumLevel:kGTMLoggerLevelUnknown - 1] autorelease];
  478. STAssertNil(filter, nil);
  479. }
  480. - (void)testFileHandleCreation {
  481. NSFileHandle *fh = nil;
  482. fh = [NSFileHandle fileHandleForLoggingAtPath:nil mode:0644];
  483. STAssertNil(fh, nil);
  484. fh = [NSFileHandle fileHandleForLoggingAtPath:path_ mode:0644];
  485. STAssertNotNil(fh, nil);
  486. [fh logMessage:@"test 1" level:kGTMLoggerLevelInfo];
  487. [fh logMessage:@"test 2" level:kGTMLoggerLevelInfo];
  488. [fh logMessage:@"test 3" level:kGTMLoggerLevelInfo];
  489. [fh closeFile];
  490. // Re-open file and make sure our log messages get appended
  491. fh = [NSFileHandle fileHandleForLoggingAtPath:path_ mode:0644];
  492. STAssertNotNil(fh, nil);
  493. [fh logMessage:@"test 4" level:kGTMLoggerLevelInfo];
  494. [fh logMessage:@"test 5" level:kGTMLoggerLevelInfo];
  495. [fh logMessage:@"test 6" level:kGTMLoggerLevelInfo];
  496. [fh closeFile];
  497. NSError *err = nil;
  498. NSString *contents = [NSString stringWithContentsOfFile:path_
  499. encoding:NSUTF8StringEncoding
  500. error:&err];
  501. STAssertNotNil(contents, @"Error loading log file: %@", err);
  502. STAssertEqualObjects(@"test 1\ntest 2\ntest 3\ntest 4\ntest 5\ntest 6\n", contents, nil);
  503. }
  504. @end