DDLogMessageTests.m 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. // Software License Agreement (BSD License)
  2. //
  3. // Copyright (c) 2010-2025, Deusty, LLC
  4. // All rights reserved.
  5. //
  6. // Redistribution and use of this software in source and binary forms,
  7. // with or without modification, are permitted provided that the following conditions are met:
  8. //
  9. // * Redistributions of source code must retain the above copyright notice,
  10. // this list of conditions and the following disclaimer.
  11. //
  12. // * Neither the name of Deusty nor the names of its contributors may be used
  13. // to endorse or promote products derived from this software without specific
  14. // prior written permission of Deusty, LLC.
  15. @import XCTest;
  16. #import <CocoaLumberjack/DDLog.h>
  17. #import <sys/qos.h>
  18. static NSString * const kDefaultMessage = @"Log message";
  19. @interface DDLogMessage (TestHelpers)
  20. - (instancetype)initWithNoArgsMessage:(NSString *)message
  21. level:(DDLogLevel)level
  22. flag:(DDLogFlag)flag
  23. context:(NSInteger)context
  24. file:(NSString *)file
  25. function:(nullable NSString *)function
  26. line:(NSUInteger)line
  27. tag:(nullable id)tag
  28. options:(DDLogMessageOptions)options
  29. timestamp:(nullable NSDate *)timestamp;
  30. + (instancetype)test_message;
  31. + (instancetype)test_messageWithMessage:(NSString *)message;
  32. + (instancetype)test_messageWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
  33. + (instancetype)test_messageWithFunction:(NSString *)function options:(DDLogMessageOptions)options;
  34. + (instancetype)test_messageWithFile:(NSString *)file options:(DDLogMessageOptions)options;
  35. @end
  36. @implementation DDLogMessage (TestHelpers)
  37. - (instancetype)initWithNoArgsMessage:(NSString *)message
  38. level:(DDLogLevel)level
  39. flag:(DDLogFlag)flag
  40. context:(NSInteger)context
  41. file:(NSString *)file
  42. function:(nullable NSString *)function
  43. line:(NSUInteger)line
  44. tag:(nullable id)tag
  45. options:(DDLogMessageOptions)options
  46. timestamp:(nullable NSDate *)timestamp {
  47. self = [self initWithFormat:message
  48. formatted:message
  49. level:level
  50. flag:flag
  51. context:context
  52. file:file
  53. function:function
  54. line:line
  55. tag:tag
  56. options:options
  57. timestamp:timestamp];
  58. return self;
  59. }
  60. + (instancetype)test_message {
  61. return [[DDLogMessage alloc] initWithNoArgsMessage:kDefaultMessage
  62. level:DDLogLevelDebug
  63. flag:DDLogFlagError
  64. context:1
  65. file:@(__FILE__)
  66. function:@(__func__)
  67. line:__LINE__
  68. tag:NULL
  69. options:(DDLogMessageOptions)0
  70. timestamp:nil];
  71. }
  72. + (instancetype)test_messageWithMessage:(NSString *)message {
  73. return [[DDLogMessage alloc] initWithNoArgsMessage:message
  74. level:DDLogLevelDebug
  75. flag:DDLogFlagError
  76. context:1
  77. file:@(__FILE__)
  78. function:@(__func__)
  79. line:__LINE__
  80. tag:NULL
  81. options:(DDLogMessageOptions)0
  82. timestamp:nil];
  83. }
  84. + (instancetype)test_messageWithFormat:(NSString *)format, ... {
  85. va_list args;
  86. va_start(args, format);
  87. __auto_type msg = [[DDLogMessage alloc] initWithFormat:format
  88. args:args
  89. level:DDLogLevelDebug
  90. flag:DDLogFlagError
  91. context:1
  92. file:@(__FILE__)
  93. function:@(__func__)
  94. line:__LINE__
  95. tag:NULL
  96. options:(DDLogMessageOptions)0
  97. timestamp:nil];
  98. va_end(args);
  99. return msg;
  100. }
  101. + (instancetype)test_messageWithFunction:(NSString *)function
  102. options:(DDLogMessageOptions)options {
  103. return [[DDLogMessage alloc] initWithNoArgsMessage:kDefaultMessage
  104. level:DDLogLevelDebug
  105. flag:DDLogFlagError
  106. context:1
  107. file:@(__FILE__)
  108. function:function
  109. line:__LINE__
  110. tag:NULL
  111. options:options
  112. timestamp:nil];
  113. }
  114. + (instancetype)test_messageWithWithoutFunction {
  115. return [[DDLogMessage alloc] initWithNoArgsMessage:kDefaultMessage
  116. level:DDLogLevelDebug
  117. flag:DDLogFlagError
  118. context:1
  119. file:@(__FILE__)
  120. function:nil
  121. line:__LINE__
  122. tag:NULL
  123. options:(DDLogMessageOptions)0
  124. timestamp:nil];
  125. }
  126. + (instancetype)test_messageWithFile:(NSString *)file
  127. options:(DDLogMessageOptions)options {
  128. return [[DDLogMessage alloc] initWithNoArgsMessage:kDefaultMessage
  129. level:DDLogLevelDebug
  130. flag:DDLogFlagError
  131. context:1
  132. file:file
  133. function:@(__func__)
  134. line:__LINE__
  135. tag:NULL
  136. options:options
  137. timestamp:nil];
  138. }
  139. + (instancetype)test_messageWithTimestamp:(NSDate *)timestamp {
  140. return [[DDLogMessage alloc] initWithNoArgsMessage:kDefaultMessage
  141. level:DDLogLevelDebug
  142. flag:DDLogFlagError
  143. context:1
  144. file:@(__FILE__)
  145. function:@(__func__)
  146. line:__LINE__
  147. tag:NULL
  148. options:(DDLogMessageOptions)0
  149. timestamp:timestamp];
  150. }
  151. @end
  152. @interface DDLogMessageTests : XCTestCase
  153. @property (nonatomic, strong, readwrite) DDLogMessage *message;
  154. @end
  155. @implementation DDLogMessageTests
  156. - (void)setUp {
  157. [super setUp];
  158. self.message = [DDLogMessage test_message];
  159. }
  160. - (void)tearDown {
  161. [super tearDown];
  162. self.message = nil;
  163. }
  164. #pragma mark - Message creation
  165. - (void)testInitSetsAllPassedParameters {
  166. __auto_type referenceDate = [NSDate dateWithTimeIntervalSince1970:0];
  167. self.message = [[DDLogMessage alloc] initWithNoArgsMessage:kDefaultMessage
  168. level:DDLogLevelDebug
  169. flag:DDLogFlagError
  170. context:1
  171. file:@"DDLogMessageTests.m"
  172. function:@"testInitSetsAllPassedParameters"
  173. line:50
  174. tag:NULL
  175. options:DDLogMessageCopyFile
  176. timestamp:referenceDate];
  177. XCTAssertEqualObjects(self.message.message, @"Log message");
  178. XCTAssertEqual(self.message.level, DDLogLevelDebug);
  179. XCTAssertEqual(self.message.flag, DDLogFlagError);
  180. XCTAssertEqual(self.message.context, 1);
  181. XCTAssertEqualObjects(self.message.file, @"DDLogMessageTests.m");
  182. XCTAssertEqualObjects(self.message.function, @"testInitSetsAllPassedParameters");
  183. XCTAssertEqual(self.message.line, 50);
  184. XCTAssertEqualObjects(self.message.representedObject, NULL);
  185. #pragma clang diagnostic push
  186. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  187. XCTAssertEqualObjects(self.message.tag, NULL);
  188. #pragma clang diagnostic pop
  189. XCTAssertEqual(self.message.options, DDLogMessageCopyFile);
  190. XCTAssertEqualObjects(self.message.timestamp, referenceDate);
  191. }
  192. - (void)testFormatPreserved {
  193. self.message = [DDLogMessage test_messageWithFormat:@"Formatted with this %@ and this %d", @"Arg1", 42];
  194. XCTAssertEqualObjects(self.message.message, @"Formatted with this Arg1 and this 42");
  195. XCTAssertEqualObjects(self.message.messageFormat, @"Formatted with this %@ and this %d");
  196. }
  197. - (void)testInitCopyMessageParameter {
  198. __auto_type message = [NSMutableString stringWithString:@"Log message"];
  199. self.message = [DDLogMessage test_messageWithMessage:message];
  200. [message appendString:@" changed"];
  201. XCTAssertEqualObjects(self.message.message, @"Log message");
  202. }
  203. - (void)testInitSetsCurrentDateToTimestampIfItIsNotProvided {
  204. XCTAssertLessThanOrEqual(fabs([self.message.timestamp timeIntervalSinceNow]), 5);
  205. }
  206. - (void)testInitSetsThreadIDToCurrentThreadID {
  207. XCTAssertNotNil(self.message.threadID);
  208. }
  209. - (void)testInitSetsThreadNameToCurrentThreadName {
  210. XCTAssertEqualObjects(self.message.threadName, NSThread.currentThread.name);
  211. }
  212. - (void)testInitSetsThreadQOSToCurrentThreadQOS {
  213. XCTAssertEqual(self.message.qos, qos_class_self());
  214. }
  215. - (void)testInitSetsFileNameToFilenameWithoutExtensionIfItHasExtension {
  216. XCTAssertEqualObjects(self.message.fileName, @"DDLogMessageTests");
  217. }
  218. - (void)testInitSetsFileNameToFilenameIfItHasNotExtension {
  219. self.message = [DDLogMessage test_messageWithFile:@"no-extenstion" options:(DDLogMessageOptions)0];
  220. XCTAssertEqualObjects(self.message.fileName, @"no-extenstion");
  221. }
  222. //TODO: How to test this for different SDK versions? (pavel, Sat 18 Apr 15:35:46 2015)
  223. - (void)testInitSetsQueueLabelToQueueWeCurrentlyRun {
  224. // We're running on main thread
  225. XCTAssertEqualObjects(self.message.queueLabel, @"com.apple.main-thread");
  226. }
  227. - (void)testInitAssignsFileParameterWithoutCopyFileOption {
  228. __auto_type file = [NSMutableString stringWithString:@"file"];
  229. self.message = [DDLogMessage test_messageWithFile:file options:(DDLogMessageOptions)0];
  230. XCTAssertEqualObjects(self.message.file, @"file");
  231. [file appendString:@"file"];
  232. XCTAssertEqualObjects(self.message.file, @"filefile");
  233. }
  234. - (void)testInitCopyFileParameterWithCopyFileOption {
  235. __auto_type file = [NSMutableString stringWithString:@"file"];
  236. self.message = [DDLogMessage test_messageWithFile:file options:DDLogMessageCopyFile];
  237. XCTAssertEqualObjects(self.message.file, @"file");
  238. [file appendString:@"file"];
  239. XCTAssertEqualObjects(self.message.file, @"file");
  240. }
  241. - (void)testInitAssignFunctionParameterWithoutCopyFunctionOption {
  242. __auto_type function = [NSMutableString stringWithString:@"function"];
  243. self.message = [DDLogMessage test_messageWithFunction:function options:(DDLogMessageOptions)0];
  244. XCTAssertEqualObjects(self.message.function, @"function");
  245. [function appendString:@"function"];
  246. XCTAssertEqualObjects(self.message.function, @"functionfunction");
  247. }
  248. - (void)testInitCopyFunctionParameterWithCopyFunctionOption {
  249. __auto_type function = [NSMutableString stringWithString:@"function"];
  250. self.message = [DDLogMessage test_messageWithFunction:function options:DDLogMessageCopyFunction];
  251. XCTAssertEqualObjects(self.message.function, @"function");
  252. [function appendString:@"function"];
  253. XCTAssertEqualObjects(self.message.function, @"function");
  254. }
  255. - (void)testCopyWithZoneCreatesValidCopy {
  256. __auto_type copy = (typeof(self.message))[self.message copy];
  257. XCTAssertEqualObjects(self.message.messageFormat, copy.messageFormat);
  258. XCTAssertEqualObjects(self.message.message, copy.message);
  259. XCTAssertEqual(self.message.level, copy.level);
  260. XCTAssertEqual(self.message.flag, copy.flag);
  261. XCTAssertEqual(self.message.context, copy.context);
  262. XCTAssertEqualObjects(self.message.file, copy.file);
  263. XCTAssertEqualObjects(self.message.fileName, copy.fileName);
  264. XCTAssertEqualObjects(self.message.function, copy.function);
  265. XCTAssertEqual(self.message.line, copy.line);
  266. XCTAssertEqualObjects(self.message.representedObject, copy.representedObject);
  267. #pragma clang diagnostic push
  268. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  269. XCTAssertEqualObjects(self.message.tag, copy.tag);
  270. #pragma clang diagnostic pop
  271. XCTAssertEqual(self.message.options, copy.options);
  272. XCTAssertEqualObjects(self.message.timestamp, copy.timestamp);
  273. XCTAssertEqualObjects(self.message.threadID, copy.threadID);
  274. XCTAssertEqualObjects(self.message.threadName, copy.threadName);
  275. XCTAssertEqualObjects(self.message.queueLabel, copy.queueLabel);
  276. XCTAssertEqual(self.message.qos, copy.qos);
  277. XCTAssertEqual(self.message.hash, copy.hash);
  278. XCTAssertEqualObjects(self.message, copy);
  279. }
  280. - (void)testEqualityCopyWithoutFunction {
  281. __auto_type message = [DDLogMessage test_messageWithWithoutFunction];
  282. __auto_type copy = (typeof(message))[message copy];
  283. XCTAssertEqual(message.hash, copy.hash);
  284. XCTAssertEqualObjects(message, copy);
  285. }
  286. @end