fields_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package logx
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "sync"
  7. "sync/atomic"
  8. "testing"
  9. "github.com/stretchr/testify/assert"
  10. )
  11. func TestAddGlobalFields(t *testing.T) {
  12. var buf bytes.Buffer
  13. writer := NewWriter(&buf)
  14. old := Reset()
  15. SetWriter(writer)
  16. defer SetWriter(old)
  17. Info("hello")
  18. buf.Reset()
  19. AddGlobalFields(Field("a", "1"), Field("b", "2"))
  20. AddGlobalFields(Field("c", "3"))
  21. Info("world")
  22. var m map[string]interface{}
  23. assert.NoError(t, json.Unmarshal(buf.Bytes(), &m))
  24. assert.Equal(t, "1", m["a"])
  25. assert.Equal(t, "2", m["b"])
  26. assert.Equal(t, "3", m["c"])
  27. }
  28. func TestContextWithFields(t *testing.T) {
  29. ctx := ContextWithFields(context.Background(), Field("a", 1), Field("b", 2))
  30. vals := ctx.Value(fieldsContextKey)
  31. assert.NotNil(t, vals)
  32. fields, ok := vals.([]LogField)
  33. assert.True(t, ok)
  34. assert.EqualValues(t, []LogField{Field("a", 1), Field("b", 2)}, fields)
  35. }
  36. func TestWithFields(t *testing.T) {
  37. ctx := WithFields(context.Background(), Field("a", 1), Field("b", 2))
  38. vals := ctx.Value(fieldsContextKey)
  39. assert.NotNil(t, vals)
  40. fields, ok := vals.([]LogField)
  41. assert.True(t, ok)
  42. assert.EqualValues(t, []LogField{Field("a", 1), Field("b", 2)}, fields)
  43. }
  44. func TestWithFieldsAppend(t *testing.T) {
  45. var dummyKey struct{}
  46. ctx := context.WithValue(context.Background(), dummyKey, "dummy")
  47. ctx = ContextWithFields(ctx, Field("a", 1), Field("b", 2))
  48. ctx = ContextWithFields(ctx, Field("c", 3), Field("d", 4))
  49. vals := ctx.Value(fieldsContextKey)
  50. assert.NotNil(t, vals)
  51. fields, ok := vals.([]LogField)
  52. assert.True(t, ok)
  53. assert.Equal(t, "dummy", ctx.Value(dummyKey))
  54. assert.EqualValues(t, []LogField{
  55. Field("a", 1),
  56. Field("b", 2),
  57. Field("c", 3),
  58. Field("d", 4),
  59. }, fields)
  60. }
  61. func BenchmarkAtomicValue(b *testing.B) {
  62. b.ReportAllocs()
  63. var container atomic.Value
  64. vals := []LogField{
  65. Field("a", "b"),
  66. Field("c", "d"),
  67. Field("e", "f"),
  68. }
  69. container.Store(&vals)
  70. for i := 0; i < b.N; i++ {
  71. val := container.Load()
  72. if val != nil {
  73. _ = *val.(*[]LogField)
  74. }
  75. }
  76. }
  77. func BenchmarkRWMutex(b *testing.B) {
  78. b.ReportAllocs()
  79. var lock sync.RWMutex
  80. vals := []LogField{
  81. Field("a", "b"),
  82. Field("c", "d"),
  83. Field("e", "f"),
  84. }
  85. for i := 0; i < b.N; i++ {
  86. lock.RLock()
  87. _ = vals
  88. lock.RUnlock()
  89. }
  90. }