| 1 | module log |
| 2 | |
| 3 | fn log_mutable_statements(mut l Log) { |
| 4 | println(@FN + ' start') |
| 5 | l.info('info') |
| 6 | l.warn('warn') |
| 7 | l.error('error') |
| 8 | l.debug('no output for debug') |
| 9 | l.set_level(.debug) |
| 10 | l.debug('debug now') |
| 11 | l.set_level(level_from_tag('INFO') or { Level.disabled }) |
| 12 | l.info('info again') |
| 13 | l.set_level(level_from_tag('') or { Level.disabled }) |
| 14 | l.error('no output anymore') |
| 15 | println(@FN + ' end') |
| 16 | } |
| 17 | |
| 18 | fn logger_mutable_statements(mut l Logger) { |
| 19 | println(@FN + ' start') |
| 20 | // the given logger instance could have a level to filter some levels used here |
| 21 | l.info('info') |
| 22 | l.warn('warn') |
| 23 | l.error('error') |
| 24 | l.debug('no output for debug') |
| 25 | l.set_level(.debug) // change logging level, now part of the Logger interface |
| 26 | l.debug('output for debug now') |
| 27 | l.info('output for info now') |
| 28 | println(@FN + ' end') |
| 29 | } |
| 30 | |
| 31 | // Note that Log and Logger methods requires a mutable instance |
| 32 | |
| 33 | // new_log create and return a new Log reference |
| 34 | pub fn new_log() &Log { |
| 35 | return &Log{ |
| 36 | level: .info |
| 37 | } // reference needed for its parallel usage |
| 38 | } |
| 39 | |
| 40 | // new_log_as_logger create and return a new Log reference as a generic Logger |
| 41 | pub fn new_log_as_logger() &Logger { |
| 42 | return &Log{ |
| 43 | level: .info |
| 44 | } // reference needed for its parallel usage |
| 45 | } |
| 46 | |
| 47 | fn test_log_mutable() { |
| 48 | println(@FN + ' start') |
| 49 | mut l := Log{} |
| 50 | l.set_level(.info) |
| 51 | log_mutable_statements(mut l) |
| 52 | assert true |
| 53 | println(@FN + ' end') |
| 54 | } |
| 55 | |
| 56 | fn test_log_mutable_reference() { |
| 57 | println(@FN + ' start') |
| 58 | mut l := new_log() |
| 59 | assert typeof(l).name == '&log.Log' |
| 60 | t := spawn log_mutable_statements(mut l) |
| 61 | t.wait() |
| 62 | assert true |
| 63 | println(@FN + ' end') |
| 64 | } |
| 65 | |
| 66 | fn test_logger_mutable_reference() { |
| 67 | println(@FN + ' start') |
| 68 | // get log as Logger and use it |
| 69 | mut logger := new_log_as_logger() |
| 70 | logger.set_level(.warn) |
| 71 | assert typeof(logger).name == '&log.Logger' |
| 72 | t := spawn logger_mutable_statements(mut logger) |
| 73 | t.wait() |
| 74 | assert true |
| 75 | println(@FN + ' end') |
| 76 | } |
| 77 | |
| 78 | fn test_log_mutable_short_tag() { |
| 79 | println(@FN + ' start') |
| 80 | mut l := Log{} |
| 81 | l.set_level(.info) |
| 82 | l.set_short_tag(true) |
| 83 | log_mutable_statements(mut l) |
| 84 | assert true |
| 85 | println(@FN + ' end') |
| 86 | } |
| 87 | |
| 88 | fn test_level_from_tag() ? { |
| 89 | assert level_from_tag('INFO')? == .info |
| 90 | assert level_from_tag('FATAL')? == .fatal |
| 91 | assert level_from_tag('WARN')? == .warn |
| 92 | assert level_from_tag('ERROR')? == .error |
| 93 | assert level_from_tag('DEBUG')? == .debug |
| 94 | assert level_from_tag('I')? == .info |
| 95 | assert level_from_tag('F')? == .fatal |
| 96 | assert level_from_tag('W')? == .warn |
| 97 | assert level_from_tag('E')? == .error |
| 98 | assert level_from_tag('D')? == .debug |
| 99 | |
| 100 | invalid := ['', 'FOO', 'nope'] |
| 101 | |
| 102 | for value in invalid { |
| 103 | mut passed := false |
| 104 | level_from_tag(value) or { passed = true } |
| 105 | assert passed |
| 106 | } |
| 107 | } |
| 108 | |
| 109 | fn test_target_from_label() ? { |
| 110 | assert target_from_label('console')? == .console |
| 111 | assert target_from_label('file')? == .file |
| 112 | assert target_from_label('both')? == .both |
| 113 | |
| 114 | invalid := ['', 'FOO', 'nope'] |
| 115 | |
| 116 | for value in invalid { |
| 117 | mut passed := false |
| 118 | target_from_label(value) or { passed = true } |
| 119 | assert passed |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | fn test_log_time_format() { |
| 124 | println(@FN + ' start') |
| 125 | mut l := Log{} |
| 126 | l.set_level(.info) |
| 127 | l.set_time_format(.tf_rfc3339_nano) |
| 128 | assert TimeFormat.tf_rfc3339_nano == l.get_time_format() |
| 129 | l.info('${@FN} rfc3339_nano == YYYY-MM-DDTHH:mm:ss.123456789Z') |
| 130 | l.set_time_format(.tf_ymmdd) |
| 131 | assert TimeFormat.tf_ymmdd == l.get_time_format() |
| 132 | l.info('${@FN} ymmdd == YYYY-MM-DD') |
| 133 | l.set_custom_time_format('MMMM Do YY N kk:mm:ss A') |
| 134 | assert TimeFormat.tf_custom_format == l.get_time_format() |
| 135 | l.info('${@FN} custom like January 1st 22 AD 13:45:33 PM') |
| 136 | assert true |
| 137 | l.set_time_format(.tf_default) |
| 138 | l.set_local_time(true) |
| 139 | l.info('${@FN} time log in local time') |
| 140 | assert l.get_local_time() |
| 141 | l.set_local_time(false) |
| 142 | l.info('${@FN} time log in utc time') |
| 143 | assert !l.get_local_time() |
| 144 | println(@FN + ' end') |
| 145 | } |
| 146 | |
| 147 | fn make_error() ?string { |
| 148 | return 'ok' |
| 149 | } |
| 150 | |
| 151 | fn test_log_default_fatal_has_noreturn() { |
| 152 | _ := make_error() or { fatal('error') } |
| 153 | } |
| 154 | |