苏州瑞玛APS项目web后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
5.1 KiB

  1. package container
  2. import (
  3. "github.com/go-xorm/xorm"
  4. "reflect"
  5. "testing"
  6. )
  7. func TestLogBroker_Call_WithNull(t *testing.T) {
  8. out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
  9. parameters := []reflect.Value{reflect.ValueOf(nil), reflect.ValueOf(456)}
  10. synchronizer1 := NewSynchronizer()
  11. synchronizer2 := NewSynchronizer()
  12. userId := "userId"
  13. user := &models.User{UserId: userId}
  14. callNumberOfTimes := 0
  15. sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
  16. if err != nil {
  17. t.Fatalf("意外错误:%s", err.Error())
  18. }
  19. var inFromCalling []reflect.Value = nil
  20. caller := func(in []reflect.Value) []reflect.Value {
  21. callNumberOfTimes++
  22. synchronizer1.Awake()
  23. synchronizer2.Wait()
  24. inFromCalling = in
  25. return out
  26. }
  27. builder := new(LogBrokerBuilder)
  28. broker, err := builder.Build(sessionContext, caller)
  29. if err != nil {
  30. t.Fatalf("意外错误:%s", err.Error())
  31. }
  32. var result []reflect.Value = nil
  33. go func() {
  34. result = broker(parameters)
  35. synchronizer1.Awake()
  36. }()
  37. synchronizer1.Wait()
  38. if callNumberOfTimes != 1 {
  39. t.Fatalf("调用中次数错误!")
  40. }
  41. synchronizer2.Awake()
  42. synchronizer1.Wait()
  43. if callNumberOfTimes != 1 {
  44. t.Fatalf("结束时调用次数错误!")
  45. }
  46. // Begin 检查参数
  47. if len(parameters) != len(inFromCalling) {
  48. t.Fatalf("参数长度错误!")
  49. }
  50. for i := 1; i < len(parameters); i++ {
  51. if parameters[i].Interface() != inFromCalling[i].Interface() {
  52. t.Fatalf("参数内容错误!")
  53. }
  54. }
  55. // End 检查参数
  56. // Begin 检查返回值
  57. if len(result) != len(out) {
  58. t.Fatalf("返回值长度错误!")
  59. }
  60. lastReturnValue := result[0].Interface()
  61. if err, ok := lastReturnValue.(error); ok {
  62. t.Fatalf("意外错误:%s", err.Error())
  63. }
  64. for i := 0; i < len(result); i++ {
  65. if result[i].Kind() != reflect.Invalid {
  66. if out[i].Kind() != reflect.Invalid {
  67. if result[i].Interface() != out[i].Interface() {
  68. t.Fatalf("返回值内容错误!")
  69. }
  70. } else {
  71. t.Fatalf("返回值内容错误!")
  72. }
  73. } else {
  74. if out[i].Kind() != reflect.Invalid {
  75. t.Fatalf("返回值内容错误!")
  76. }
  77. }
  78. }
  79. // End 检查返回值
  80. }
  81. func TestLogBroker_Call_WithNullPointer(t *testing.T) {
  82. var nullSession *xorm.Session = nil
  83. out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
  84. parameters := []reflect.Value{reflect.ValueOf(nullSession), reflect.ValueOf(456)}
  85. synchronizer1 := NewSynchronizer()
  86. synchronizer2 := NewSynchronizer()
  87. userId := "userId"
  88. user := &models.User{UserId: userId}
  89. callNumberOfTimes := 0
  90. sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
  91. if err != nil {
  92. t.Fatalf("意外错误:%s", err.Error())
  93. }
  94. var inFromCalling []reflect.Value = nil
  95. caller := func(in []reflect.Value) []reflect.Value {
  96. callNumberOfTimes++
  97. synchronizer1.Awake()
  98. synchronizer2.Wait()
  99. inFromCalling = in
  100. return out
  101. }
  102. builder := new(LogBrokerBuilder)
  103. broker, err := builder.Build(sessionContext, caller)
  104. if err != nil {
  105. t.Fatalf("意外错误:%s", err.Error())
  106. }
  107. var result []reflect.Value = nil
  108. go func() {
  109. result = broker(parameters)
  110. synchronizer1.Awake()
  111. }()
  112. synchronizer1.Wait()
  113. if callNumberOfTimes != 1 {
  114. t.Fatalf("调用中次数错误!")
  115. }
  116. synchronizer2.Awake()
  117. synchronizer1.Wait()
  118. if callNumberOfTimes != 1 {
  119. t.Fatalf("结束时调用次数错误!")
  120. }
  121. // Begin 检查参数
  122. if len(parameters) != len(inFromCalling) {
  123. t.Fatalf("参数长度错误!")
  124. }
  125. for i := 1; i < len(parameters); i++ {
  126. if parameters[i].Interface() != inFromCalling[i].Interface() {
  127. t.Fatalf("参数内容错误!")
  128. }
  129. }
  130. // End 检查参数
  131. // Begin 检查返回值
  132. if len(result) != len(out) {
  133. t.Fatalf("返回值长度错误!")
  134. }
  135. lastReturnValue := result[0].Interface()
  136. if err, ok := lastReturnValue.(error); ok {
  137. t.Fatalf("意外错误:%s", err.Error())
  138. }
  139. for i := 0; i < len(result); i++ {
  140. if result[i].Kind() != reflect.Invalid {
  141. if out[i].Kind() != reflect.Invalid {
  142. if result[i].Interface() != out[i].Interface() {
  143. t.Fatalf("返回值内容错误!")
  144. }
  145. } else {
  146. t.Fatalf("返回值内容错误!")
  147. }
  148. } else {
  149. if out[i].Kind() != reflect.Invalid {
  150. t.Fatalf("返回值内容错误!")
  151. }
  152. }
  153. }
  154. // End 检查返回值
  155. }
  156. func TestLogBroker_Call_Panic(t *testing.T) {
  157. userId := "userId"
  158. user := &models.User{UserId: userId}
  159. sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
  160. if err != nil {
  161. t.Fatalf("意外错误:%s", err.Error())
  162. }
  163. var panicValue = "模拟崩溃!"
  164. caller := func(in []reflect.Value) []reflect.Value {
  165. panic(panicValue)
  166. }
  167. builder := new(LogBrokerBuilder)
  168. broker, err := builder.Build(sessionContext, caller)
  169. if err != nil {
  170. t.Fatalf("意外错误:%s", err.Error())
  171. }
  172. defer func() {
  173. if p := recover(); p != nil && p != panicValue {
  174. t.Fatalf("意外崩溃:%v", p)
  175. }
  176. }()
  177. result := broker([]reflect.Value{reflect.ValueOf(nil)})
  178. if len(result) > 0 {
  179. lastReturnValue := result[0].Interface()
  180. if lastReturnValue == nil {
  181. t.Fatalf("返回值为空!")
  182. }
  183. err, ok := lastReturnValue.(error)
  184. if ok {
  185. t.Fatalf("意外错误:%s", err.Error())
  186. }
  187. }
  188. t.Fatalf("意外未崩溃!")
  189. }