苏州瑞玛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.

413 lines
11 KiB

  1. package container
  2. import (
  3. "errors"
  4. "github.com/go-xorm/xorm"
  5. "reflect"
  6. "testing"
  7. )
  8. func TestNewSessionBroker_Call_WithNull(t *testing.T) {
  9. out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
  10. parameters := []reflect.Value{reflect.ValueOf(&RequestContext{}), reflect.ValueOf(456)}
  11. synchronizer1 := NewSynchronizer()
  12. synchronizer2 := NewSynchronizer()
  13. callNumberOfTimes := 0
  14. transactionHandler := &TransactionHandlerMock{}
  15. transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
  16. userId := "userId"
  17. user := &models.User{UserId: userId}
  18. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  19. if err != nil {
  20. t.Fatalf("意外错误:%s", err.Error())
  21. }
  22. var inFromCalling []reflect.Value = nil
  23. caller := func(in []reflect.Value) []reflect.Value {
  24. callNumberOfTimes++
  25. synchronizer1.Awake()
  26. synchronizer2.Wait()
  27. inFromCalling = in
  28. return out
  29. }
  30. builder := NewNewSessionBrokerBuilder()
  31. broker, err := builder.Build(sessionContext, caller)
  32. if err != nil {
  33. t.Fatalf("意外错误:%s", err.Error())
  34. }
  35. var result []reflect.Value = nil
  36. go func() {
  37. result = broker(parameters)
  38. synchronizer1.Awake()
  39. }()
  40. synchronizer1.Wait()
  41. if callNumberOfTimes != 1 {
  42. t.Fatalf("调用中次数错误!")
  43. }
  44. if transactionHandler.closeNumberOfTimes != 0 {
  45. t.Fatalf("调用中关闭次数错误!")
  46. }
  47. synchronizer2.Awake()
  48. synchronizer1.Wait()
  49. if callNumberOfTimes != 1 {
  50. t.Fatalf("结束时调用次数错误!")
  51. }
  52. if transactionHandler.closeNumberOfTimes != 1 {
  53. t.Fatalf("结束时关闭次数错误!")
  54. }
  55. // Begin 检查参数
  56. if len(parameters) != len(inFromCalling) {
  57. t.Fatalf("参数长度错误!")
  58. }
  59. requestContext, ok := inFromCalling[0].Interface().(*RequestContext)
  60. if !ok {
  61. t.Fatalf("第一个参数类型错误!")
  62. }
  63. if transactionHandler.session != requestContext.session {
  64. t.Fatalf("*RequestContext设置错误!")
  65. }
  66. for i := 1; i < len(parameters); i++ {
  67. if parameters[i].Interface() != inFromCalling[i].Interface() {
  68. t.Fatalf("参数内容错误!")
  69. }
  70. }
  71. // End 检查参数
  72. // Begin 检查返回值
  73. if len(result) != len(out) {
  74. t.Fatalf("返回值长度错误!")
  75. }
  76. lastReturnValue := result[0].Interface()
  77. if err, ok := lastReturnValue.(error); ok {
  78. t.Fatalf("意外错误:%s", err.Error())
  79. }
  80. for i := 0; i < len(result); i++ {
  81. if result[i].Kind() != reflect.Invalid {
  82. if out[i].Kind() != reflect.Invalid {
  83. if result[i].Interface() != out[i].Interface() {
  84. t.Fatalf("返回值内容错误!")
  85. }
  86. } else {
  87. t.Fatalf("返回值内容错误!")
  88. }
  89. } else {
  90. if out[i].Kind() != reflect.Invalid {
  91. t.Fatalf("返回值内容错误!")
  92. }
  93. }
  94. }
  95. // End 检查返回值
  96. }
  97. func TestNewSessionBroker_Call_WithNullPointer(t *testing.T) {
  98. out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
  99. parameters := []reflect.Value{reflect.ValueOf(&RequestContext{}), reflect.ValueOf(456)}
  100. synchronizer1 := NewSynchronizer()
  101. synchronizer2 := NewSynchronizer()
  102. callNumberOfTimes := 0
  103. transactionHandler := &TransactionHandlerMock{}
  104. transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
  105. userId := "userId"
  106. user := &models.User{UserId: userId}
  107. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  108. if err != nil {
  109. t.Fatalf("意外错误:%s", err.Error())
  110. }
  111. var inFromCalling []reflect.Value = nil
  112. caller := func(in []reflect.Value) []reflect.Value {
  113. callNumberOfTimes++
  114. synchronizer1.Awake()
  115. synchronizer2.Wait()
  116. inFromCalling = in
  117. return out
  118. }
  119. builder := NewNewSessionBrokerBuilder()
  120. broker, err := builder.Build(sessionContext, caller)
  121. if err != nil {
  122. t.Fatalf("意外错误:%s", err.Error())
  123. }
  124. var result []reflect.Value = nil
  125. go func() {
  126. result = broker(parameters)
  127. synchronizer1.Awake()
  128. }()
  129. synchronizer1.Wait()
  130. if callNumberOfTimes != 1 {
  131. t.Fatalf("调用中次数错误!")
  132. }
  133. if transactionHandler.closeNumberOfTimes != 0 {
  134. t.Fatalf("调用中关闭次数错误!")
  135. }
  136. synchronizer2.Awake()
  137. synchronizer1.Wait()
  138. if callNumberOfTimes != 1 {
  139. t.Fatalf("结束时调用次数错误!")
  140. }
  141. if transactionHandler.closeNumberOfTimes != 1 {
  142. t.Fatalf("结束时关闭次数错误!")
  143. }
  144. // Begin 检查参数
  145. if len(parameters) != len(inFromCalling) {
  146. t.Fatalf("参数长度错误!")
  147. }
  148. requestContext, ok := inFromCalling[0].Interface().(*RequestContext)
  149. if !ok {
  150. t.Fatalf("第一个参数类型错误!")
  151. }
  152. if transactionHandler.session != requestContext.session {
  153. t.Fatalf("*RequestContext设置错误!")
  154. }
  155. for i := 1; i < len(parameters); i++ {
  156. if parameters[i].Interface() != inFromCalling[i].Interface() {
  157. t.Fatalf("参数内容错误!")
  158. }
  159. }
  160. // End 检查参数
  161. // Begin 检查返回值
  162. if len(result) != len(out) {
  163. t.Fatalf("返回值长度错误!")
  164. }
  165. lastReturnValue := result[0].Interface()
  166. if err, ok := lastReturnValue.(error); ok {
  167. t.Fatalf("意外错误:%s", err.Error())
  168. }
  169. for i := 0; i < len(result); i++ {
  170. if result[i].Kind() != reflect.Invalid {
  171. if out[i].Kind() != reflect.Invalid {
  172. if result[i].Interface() != out[i].Interface() {
  173. t.Fatalf("返回值内容错误!")
  174. }
  175. } else {
  176. t.Fatalf("返回值内容错误!")
  177. }
  178. } else {
  179. if out[i].Kind() != reflect.Invalid {
  180. t.Fatalf("返回值内容错误!")
  181. }
  182. }
  183. }
  184. // End 检查返回值
  185. }
  186. func TestNewSessionBroker_Call_Panic(t *testing.T) {
  187. transactionHandler := &TransactionHandlerMock{}
  188. transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
  189. userId := "userId"
  190. user := &models.User{UserId: userId}
  191. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  192. if err != nil {
  193. t.Fatalf("意外错误:%s", err.Error())
  194. }
  195. var panicValue = "模拟崩溃!"
  196. caller := func(in []reflect.Value) []reflect.Value {
  197. panic(panicValue)
  198. }
  199. builder := NewNewSessionBrokerBuilder()
  200. broker, err := builder.Build(sessionContext, caller)
  201. if err != nil {
  202. t.Fatalf("意外错误:%s", err.Error())
  203. }
  204. defer func() {
  205. if p := recover(); p != nil && p != panicValue {
  206. t.Fatalf("意外崩溃:%v", p)
  207. }
  208. if transactionHandler.closeNumberOfTimes != 1 {
  209. t.Fatalf("崩溃时关闭次数错误!")
  210. }
  211. }()
  212. result := broker([]reflect.Value{reflect.ValueOf(&RequestContext{})})
  213. if len(result) > 0 {
  214. lastReturnValue := result[0].Interface()
  215. if lastReturnValue == nil {
  216. t.Fatalf("返回值为空!")
  217. }
  218. err, ok := lastReturnValue.(error)
  219. if ok {
  220. t.Fatalf("意外错误:%s", err.Error())
  221. }
  222. }
  223. t.Fatalf("意外未崩溃!")
  224. }
  225. func TestNewSessionBroker_Call_Less(t *testing.T) {
  226. userId := "userId"
  227. user := &models.User{UserId: userId}
  228. sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
  229. if err != nil {
  230. t.Fatalf("意外错误:%s", err.Error())
  231. }
  232. caller := func(in []reflect.Value) []reflect.Value {
  233. return in
  234. }
  235. builder := NewNewSessionBrokerBuilder()
  236. broker, err := builder.Build(sessionContext, caller)
  237. if err != nil {
  238. t.Fatalf("意外错误:%s", err.Error())
  239. }
  240. result := broker([]reflect.Value{})
  241. if len(result) != 1 {
  242. t.Fatalf("返回值长度错误!")
  243. }
  244. lastReturnValue := result[0].Interface()
  245. if lastReturnValue == nil {
  246. t.Fatalf("返回值为空!")
  247. }
  248. err, ok := lastReturnValue.(error)
  249. if !ok {
  250. t.Fatalf("返回值类型错误!")
  251. }
  252. if err.Error() != "参数长度错误!" {
  253. t.Fatalf("意外错误:%s", err.Error())
  254. }
  255. }
  256. func TestNewSessionBroker_Call_ValueTypeError(t *testing.T) {
  257. userId := "userId"
  258. user := &models.User{UserId: userId}
  259. sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
  260. if err != nil {
  261. t.Fatalf("意外错误:%s", err.Error())
  262. }
  263. caller := func(in []reflect.Value) []reflect.Value {
  264. return in
  265. }
  266. builder := NewNewSessionBrokerBuilder()
  267. broker, err := builder.Build(sessionContext, caller)
  268. if err != nil {
  269. t.Fatalf("意外错误:%s", err.Error())
  270. }
  271. result := broker([]reflect.Value{reflect.ValueOf(RequestContext{}), reflect.ValueOf("123")})
  272. if len(result) != 1 {
  273. t.Fatalf("返回值长度错误!")
  274. }
  275. lastReturnValue := result[0].Interface()
  276. if lastReturnValue == nil {
  277. t.Fatalf("返回值为空!")
  278. }
  279. err, ok := lastReturnValue.(error)
  280. if !ok {
  281. t.Fatalf("返回值类型错误!")
  282. }
  283. if err.Error() != "第一个参数类型错误!" {
  284. t.Fatalf("意外错误:%s", err.Error())
  285. }
  286. }
  287. func TestNewSessionBroker_Call_PointerTypeError(t *testing.T) {
  288. transactionHandler := &TransactionHandlerMock{}
  289. userId := "userId"
  290. user := &models.User{UserId: userId}
  291. sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
  292. if err != nil {
  293. t.Fatalf("意外错误:%s", err.Error())
  294. }
  295. caller := func(in []reflect.Value) []reflect.Value {
  296. return in
  297. }
  298. builder := NewNewSessionBrokerBuilder()
  299. broker, err := builder.Build(sessionContext, caller)
  300. if err != nil {
  301. t.Fatalf("意外错误:%s", err.Error())
  302. }
  303. result := broker([]reflect.Value{reflect.ValueOf(transactionHandler)})
  304. if len(result) != 1 {
  305. t.Fatalf("返回值长度错误!")
  306. }
  307. lastReturnValue := result[0].Interface()
  308. if lastReturnValue == nil {
  309. t.Fatalf("返回值为空!")
  310. }
  311. err, ok := lastReturnValue.(error)
  312. if !ok {
  313. t.Fatalf("返回值类型错误!")
  314. }
  315. if err.Error() != "第一个参数类型不正确!" {
  316. t.Fatalf("意外错误:%s", err.Error())
  317. }
  318. }
  319. func TestNewSessionBroker_Call_Repeated(t *testing.T) {
  320. userId := "userId"
  321. user := &models.User{UserId: userId}
  322. sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
  323. if err != nil {
  324. t.Fatalf("意外错误:%s", err.Error())
  325. }
  326. caller := func(in []reflect.Value) []reflect.Value {
  327. return in
  328. }
  329. builder := NewNewSessionBrokerBuilder()
  330. broker, err := builder.Build(sessionContext, caller)
  331. if err != nil {
  332. t.Fatalf("意外错误:%s", err.Error())
  333. }
  334. result := broker([]reflect.Value{reflect.ValueOf(&RequestContext{session: &xorm.Session{}})})
  335. if len(result) != 1 {
  336. t.Fatalf("返回值长度错误!")
  337. }
  338. lastReturnValue := result[0].Interface()
  339. if lastReturnValue == nil {
  340. t.Fatalf("返回值为空!")
  341. }
  342. err, ok := lastReturnValue.(error)
  343. if !ok {
  344. t.Fatalf("返回值类型错误!")
  345. }
  346. if err.Error() != "上下文的会话应当为空!" {
  347. t.Fatalf("意外错误:%s", err.Error())
  348. }
  349. }
  350. func TestNewSessionBroker_Call_CreateError(t *testing.T) {
  351. out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
  352. createError := errors.New("createError")
  353. transactionHandlerFactory := &TransactionHandlerFactoryMock{createError: createError}
  354. userId := "userId"
  355. user := &models.User{UserId: userId}
  356. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  357. if err != nil {
  358. t.Fatalf("意外错误:%s", err.Error())
  359. }
  360. caller := func(in []reflect.Value) []reflect.Value {
  361. return out
  362. }
  363. builder := NewNewSessionBrokerBuilder()
  364. broker, err := builder.Build(sessionContext, caller)
  365. if err != nil {
  366. t.Fatalf("意外错误:%s", err.Error())
  367. }
  368. result := broker([]reflect.Value{reflect.ValueOf(&RequestContext{})})
  369. if len(result) != 1 {
  370. t.Fatalf("返回值长度错误!")
  371. }
  372. lastReturnValue := result[0].Interface()
  373. if lastReturnValue == nil {
  374. t.Fatalf("返回值为空!")
  375. }
  376. err, ok := lastReturnValue.(error)
  377. if !ok {
  378. t.Fatalf("返回值类型错误!")
  379. }
  380. if err != createError {
  381. t.Fatalf("意外错误:%s", err.Error())
  382. }
  383. }