* Test coverage improvements
Implements #397 and #591, might help with #473
Test coverage for core is 97.6% with only real fringe cases remaining.
Improve `Fields` `isNilValue()` portability.
Added a new global handler `FatalExitFunc` to allow intercepting `Fatal()` messages.
Fixed CBOR float constants (removed the CBOR prefix)
Added tests for:
- global `FatalExitFunc` to allow intercepting Fatal messages (both for testing and public use).
- `Logger`
- `DisableSampling`
- `.With()` copying existing context if present.
- `.With().Fields()` all forms of `ErrorStackMarshaler` returns.
- `.WithLevel()` for `FatalLevel`, `PanicLevel`, and `DisabledLevel`.
- `.Err()` with `nil` and non-`nil` `error` and test the resulting log level.
- `.should()` covering `nil` writer.
- `.Output()` gets context values.
- `.UpdateContext()` on a disabled logger doesn't panic and is a nop.
- `.With()` all forms of `ErrorStackMarshaler` returns.
- with a `nil`writer.
- `.Hook()` passing no hooks.
- `Array`
- `.MarshalZerologArray` is a nop that won't panic.
- `Context`
- ` .Err()` and `.AnErr()` for `nil` errors and all forms of `ErrorStackMarshaler` returns.
- `Event`
- `.Caller()` to ensure we don't panic or add invalid information if `runtime.Caller()` fails
-` .Err()` and `.AnErr()` for `nil` errors and all forms of `ErrorStackMarshaler` returns.
- `Fields`
- ` .appendFields()` all forms of `ErrorStackMarshaler` returns.
- `HookLevel`
- `.Run()` methods.
- `LevelSampler`
- `.Sample() methods.
- `Syslog`
- `.Write()`, `.WriteLevel()`, and `.Close()` methods.
- `.WriteLevel()` with an `InvalidLevel`.
- `Writer`
- `.Write()` short write and error cases.
- `MultiLevelWriter` `.WriteLevel()` and for `.Write()` error and `.Close()` cases.
- test of unmarshalling a level byte returns correct error.
- CBOR decodeStream
- `.decodeFloat()`, `.binaryFmt()`, `.DecodeIfBinaryToString()`, `.DecodeObjectToStr()`, `.DecodeIfBinaryToBytes()`, `.decodeTagData()`, and `.decodeSimpleFloat()`
- handling of invalid UTF-8 sequences
- handling of UTC times.
- handling of timestamps
- handling of various map lengths
Restructure `Event` `.caller()` so we test for ok and eliminate untestable coverage hole.
Restructure `Context` `.Err()` when the `ErrorStackMarshaler` returns a `nil` so there's code to cover.
Inverted logic for`Event` `.Caller()`'s call to `runtime.Caller()` for simpler testing.
Inverted logic for `Array` `.putArray()` and `Event` `.putEvent()` so there isn't uncoverable code.
Restructure `Field` `.appendFieldList()` to early return when `ErrorStackMarshaler` returns a `nil`
Added comments for things we can't get coverage on.
Did a go fmt ./...
Coverage of core is now 100% on `Array`, `Context`, `Ctx`, `Event`, `Field`, `Hook`, and `Syslog`.
Coverage of `Globals`, `Log`, `Sampler`, and `Writer` is almost all except some real edge-cases.
JSON encoder coverage is 100%
CBOR encoder coverage is 96.3% with base, cbor, string, time and types at 100% and decode_stream (which is lacks coverage on some panic states, and two incorrect coverage-tool lapses)
* Fix CBOR tests for StackMarshaler
Forgot to use the `decodeIfBinaryToString()`
Add Ctx(context.Context) to Event and Context, allowing
log.Info().Ctx(ctx).Msg("hello"). Registered hooks can retrieve the
context from Event.GetCtx(). Facilitates writing hooks which fetch
tracing context from the go context.
The Discard method has been added to the Event type so it can be called
from a hook to prevent the event from behing printed. This new method
works outside of the context of a hook too.
Fixes#90