helper_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license found in the LICENSE file.
  3. package codec
  4. // All non-std package dependencies related to testing live in this file,
  5. // so porting to different environment is easy (just update functions).
  6. //
  7. // This file sets up the variables used, including testInitFns.
  8. // Each file should add initialization that should be performed
  9. // after flags are parsed.
  10. //
  11. // init is a multi-step process:
  12. // - setup vars (handled by init functions in each file)
  13. // - parse flags
  14. // - setup derived vars (handled by pre-init registered functions - registered in init function)
  15. // - post init (handled by post-init registered functions - registered in init function)
  16. // This way, no one has to manage carefully control the initialization
  17. // using file names, etc.
  18. //
  19. // Tests which require external dependencies need the -tag=x parameter.
  20. // They should be run as:
  21. // go test -tags=x -run=. <other parameters ...>
  22. // Benchmarks should also take this parameter, to include the sereal, xdr, etc.
  23. // To run against codecgen, etc, make sure you pass extra parameters.
  24. // Example usage:
  25. // go test "-tags=x codecgen unsafe" -bench=. <other parameters ...>
  26. //
  27. // To fully test everything:
  28. // go test -tags=x -benchtime=100ms -tv -bg -bi -brw -bu -v -run=. -bench=.
  29. import (
  30. "errors"
  31. "flag"
  32. "fmt"
  33. "reflect"
  34. "sync"
  35. "testing"
  36. )
  37. const (
  38. testLogToT = true
  39. failNowOnFail = true
  40. )
  41. var (
  42. testNoopH = NoopHandle(8)
  43. testMsgpackH = &MsgpackHandle{}
  44. testBincH = &BincHandle{}
  45. testBincHNoSym = &BincHandle{}
  46. testBincHSym = &BincHandle{}
  47. testSimpleH = &SimpleHandle{}
  48. testCborH = &CborHandle{}
  49. testJsonH = &JsonHandle{}
  50. testPreInitFns []func()
  51. testPostInitFns []func()
  52. testOnce sync.Once
  53. )
  54. func init() {
  55. testBincHSym.AsSymbols = AsSymbolAll
  56. testBincHNoSym.AsSymbols = AsSymbolNone
  57. }
  58. func testInitAll() {
  59. flag.Parse()
  60. for _, f := range testPreInitFns {
  61. f()
  62. }
  63. for _, f := range testPostInitFns {
  64. f()
  65. }
  66. }
  67. func logT(x interface{}, format string, args ...interface{}) {
  68. if t, ok := x.(*testing.T); ok && t != nil && testLogToT {
  69. if testVerbose {
  70. t.Logf(format, args...)
  71. }
  72. } else if b, ok := x.(*testing.B); ok && b != nil && testLogToT {
  73. b.Logf(format, args...)
  74. } else {
  75. if len(format) == 0 || format[len(format)-1] != '\n' {
  76. format = format + "\n"
  77. }
  78. fmt.Printf(format, args...)
  79. }
  80. }
  81. func approxDataSize(rv reflect.Value) (sum int) {
  82. switch rk := rv.Kind(); rk {
  83. case reflect.Invalid:
  84. case reflect.Ptr, reflect.Interface:
  85. sum += int(rv.Type().Size())
  86. sum += approxDataSize(rv.Elem())
  87. case reflect.Slice:
  88. sum += int(rv.Type().Size())
  89. for j := 0; j < rv.Len(); j++ {
  90. sum += approxDataSize(rv.Index(j))
  91. }
  92. case reflect.String:
  93. sum += int(rv.Type().Size())
  94. sum += rv.Len()
  95. case reflect.Map:
  96. sum += int(rv.Type().Size())
  97. for _, mk := range rv.MapKeys() {
  98. sum += approxDataSize(mk)
  99. sum += approxDataSize(rv.MapIndex(mk))
  100. }
  101. case reflect.Struct:
  102. //struct size already includes the full data size.
  103. //sum += int(rv.Type().Size())
  104. for j := 0; j < rv.NumField(); j++ {
  105. sum += approxDataSize(rv.Field(j))
  106. }
  107. default:
  108. //pure value types
  109. sum += int(rv.Type().Size())
  110. }
  111. return
  112. }
  113. // ----- functions below are used only by tests (not benchmarks)
  114. func checkErrT(t *testing.T, err error) {
  115. if err != nil {
  116. logT(t, err.Error())
  117. failT(t)
  118. }
  119. }
  120. func checkEqualT(t *testing.T, v1 interface{}, v2 interface{}, desc string) (err error) {
  121. if err = deepEqual(v1, v2); err != nil {
  122. logT(t, "Not Equal: %s: %v. v1: %v, v2: %v", desc, err, v1, v2)
  123. failT(t)
  124. }
  125. return
  126. }
  127. func failT(t *testing.T) {
  128. if failNowOnFail {
  129. t.FailNow()
  130. } else {
  131. t.Fail()
  132. }
  133. }
  134. func deepEqual(v1, v2 interface{}) (err error) {
  135. if !reflect.DeepEqual(v1, v2) {
  136. err = errors.New("Not Match")
  137. }
  138. return
  139. }