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.

209 lines
5.2 KiB

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