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

517 lines
15 KiB

  1. package container
  2. import (
  3. "errors"
  4. "github.com/go-xorm/xorm"
  5. "leit.com/LAPP_CHEERSSON_BACKEND/global"
  6. "reflect"
  7. "testing"
  8. )
  9. func TestNewTransactionBroker_Call_WithNull(t *testing.T) {
  10. out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
  11. parameters := []reflect.Value{reflect.ValueOf(&RequestContext{}), reflect.ValueOf(456)}
  12. synchronizer1 := NewSynchronizer()
  13. synchronizer2 := NewSynchronizer()
  14. callNumberOfTimes := 0
  15. transactionHandler := &TransactionHandlerMock{}
  16. transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
  17. userId := "userId"
  18. user := &global.User{UserId: userId}
  19. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  20. if err != nil {
  21. t.Fatalf("意外错误:%s", err.Error())
  22. }
  23. var inFromCalling []reflect.Value = nil
  24. caller := func(in []reflect.Value) []reflect.Value {
  25. callNumberOfTimes++
  26. synchronizer1.Awake()
  27. synchronizer2.Wait()
  28. inFromCalling = in
  29. return out
  30. }
  31. builder := NewNewTransactionBrokerBuilder()
  32. broker, err := builder.Build(sessionContext, caller)
  33. if err != nil {
  34. t.Fatalf("意外错误:%s", err.Error())
  35. }
  36. var result []reflect.Value = nil
  37. go func() {
  38. result = broker(parameters)
  39. synchronizer1.Awake()
  40. }()
  41. synchronizer1.Wait()
  42. if transactionHandler.beginNumberOfTimes != 1 {
  43. t.Fatalf("调用中开启次数错误!")
  44. }
  45. if callNumberOfTimes != 1 {
  46. t.Fatalf("调用中次数错误!")
  47. }
  48. if transactionHandler.commitNumberOfTimes != 0 {
  49. t.Fatalf("调用中提交次数错误!")
  50. }
  51. if transactionHandler.closeNumberOfTimes != 0 {
  52. t.Fatalf("调用中关闭次数错误!")
  53. }
  54. synchronizer2.Awake()
  55. synchronizer1.Wait()
  56. if transactionHandler.beginNumberOfTimes != 1 {
  57. t.Fatalf("结束时开启次数错误!")
  58. }
  59. if callNumberOfTimes != 1 {
  60. t.Fatalf("结束时调用次数错误!")
  61. }
  62. if transactionHandler.commitNumberOfTimes != 1 {
  63. t.Fatalf("结束时提交次数错误!")
  64. }
  65. if transactionHandler.closeNumberOfTimes != 1 {
  66. t.Fatalf("结束时关闭次数错误!")
  67. }
  68. // Begin 检查参数
  69. if len(parameters) != len(inFromCalling) {
  70. t.Fatalf("参数长度错误!")
  71. }
  72. requestContext, ok := inFromCalling[0].Interface().(*RequestContext)
  73. if !ok {
  74. t.Fatalf("第一个参数类型错误!")
  75. }
  76. if transactionHandler.session != requestContext.session {
  77. t.Fatalf("*RequestContext设置错误!")
  78. }
  79. for i := 1; i < len(parameters); i++ {
  80. if parameters[i].Interface() != inFromCalling[i].Interface() {
  81. t.Fatalf("参数内容错误!")
  82. }
  83. }
  84. // End 检查参数
  85. // Begin 检查返回值
  86. if len(result) != len(out) {
  87. t.Fatalf("返回值长度错误!")
  88. }
  89. lastReturnValue := result[0].Interface()
  90. if err, ok = lastReturnValue.(error); ok {
  91. t.Fatalf("意外错误:%s", err.Error())
  92. }
  93. for i := 0; i < len(result); i++ {
  94. if result[i].Kind() != reflect.Invalid {
  95. if out[i].Kind() != reflect.Invalid {
  96. if result[i].Interface() != out[i].Interface() {
  97. t.Fatalf("返回值内容错误!")
  98. }
  99. } else {
  100. t.Fatalf("返回值内容错误!")
  101. }
  102. } else {
  103. if out[i].Kind() != reflect.Invalid {
  104. t.Fatalf("返回值内容错误!")
  105. }
  106. }
  107. }
  108. // End 检查返回值
  109. }
  110. func TestNewTransactionBroker_Call_WithNullPointer(t *testing.T) {
  111. out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
  112. parameters := []reflect.Value{reflect.ValueOf(&RequestContext{}), reflect.ValueOf(456)}
  113. synchronizer1 := NewSynchronizer()
  114. synchronizer2 := NewSynchronizer()
  115. callNumberOfTimes := 0
  116. transactionHandler := &TransactionHandlerMock{}
  117. transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
  118. userId := "userId"
  119. user := &global.User{UserId: userId}
  120. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  121. if err != nil {
  122. t.Fatalf("意外错误:%s", err.Error())
  123. }
  124. var inFromCalling []reflect.Value = nil
  125. caller := func(in []reflect.Value) []reflect.Value {
  126. callNumberOfTimes++
  127. synchronizer1.Awake()
  128. synchronizer2.Wait()
  129. inFromCalling = in
  130. return out
  131. }
  132. builder := NewNewTransactionBrokerBuilder()
  133. broker, err := builder.Build(sessionContext, caller)
  134. if err != nil {
  135. t.Fatalf("意外错误:%s", err.Error())
  136. }
  137. var result []reflect.Value = nil
  138. go func() {
  139. result = broker(parameters)
  140. synchronizer1.Awake()
  141. }()
  142. synchronizer1.Wait()
  143. if transactionHandler.beginNumberOfTimes != 1 {
  144. t.Fatalf("调用中开启次数错误!")
  145. }
  146. if callNumberOfTimes != 1 {
  147. t.Fatalf("调用中次数错误!")
  148. }
  149. if transactionHandler.commitNumberOfTimes != 0 {
  150. t.Fatalf("调用中提交次数错误!")
  151. }
  152. if transactionHandler.closeNumberOfTimes != 0 {
  153. t.Fatalf("调用中关闭次数错误!")
  154. }
  155. synchronizer2.Awake()
  156. synchronizer1.Wait()
  157. if transactionHandler.beginNumberOfTimes != 1 {
  158. t.Fatalf("结束时开启次数错误!")
  159. }
  160. if callNumberOfTimes != 1 {
  161. t.Fatalf("结束时调用次数错误!")
  162. }
  163. if transactionHandler.commitNumberOfTimes != 1 {
  164. t.Fatalf("结束时提交次数错误!")
  165. }
  166. if transactionHandler.closeNumberOfTimes != 1 {
  167. t.Fatalf("结束时关闭次数错误!")
  168. }
  169. // Begin 检查参数
  170. if len(parameters) != len(inFromCalling) {
  171. t.Fatalf("参数长度错误!")
  172. }
  173. requestContext, ok := inFromCalling[0].Interface().(*RequestContext)
  174. if !ok {
  175. t.Fatalf("第一个参数类型错误!")
  176. }
  177. if transactionHandler.session != requestContext.session {
  178. t.Fatalf("*RequestContext设置错误!")
  179. }
  180. for i := 1; i < len(parameters); i++ {
  181. if parameters[i].Interface() != inFromCalling[i].Interface() {
  182. t.Fatalf("参数内容错误!")
  183. }
  184. }
  185. // End 检查参数
  186. // Begin 检查返回值
  187. if len(result) != len(out) {
  188. t.Fatalf("返回值长度错误!")
  189. }
  190. lastReturnValue := result[0].Interface()
  191. if err, ok = lastReturnValue.(error); ok {
  192. t.Fatalf("意外错误:%s", err.Error())
  193. }
  194. for i := 0; i < len(result); i++ {
  195. if result[i].Kind() != reflect.Invalid {
  196. if out[i].Kind() != reflect.Invalid {
  197. if result[i].Interface() != out[i].Interface() {
  198. t.Fatalf("返回值内容错误!")
  199. }
  200. } else {
  201. t.Fatalf("返回值内容错误!")
  202. }
  203. } else {
  204. if out[i].Kind() != reflect.Invalid {
  205. t.Fatalf("返回值内容错误!")
  206. }
  207. }
  208. }
  209. // End 检查返回值
  210. }
  211. func TestNewTransactionBroker_Call_Panic(t *testing.T) {
  212. transactionHandler := &TransactionHandlerMock{}
  213. transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
  214. userId := "userId"
  215. user := &global.User{UserId: userId}
  216. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  217. if err != nil {
  218. t.Fatalf("意外错误:%s", err.Error())
  219. }
  220. var panicValue = "模拟崩溃!"
  221. caller := func(in []reflect.Value) []reflect.Value {
  222. panic(panicValue)
  223. }
  224. builder := NewNewTransactionBrokerBuilder()
  225. broker, err := builder.Build(sessionContext, caller)
  226. if err != nil {
  227. t.Fatalf("意外错误:%s", err.Error())
  228. }
  229. defer func() {
  230. if p := recover(); p != nil && p != panicValue {
  231. t.Fatalf("意外崩溃:%v", p)
  232. }
  233. if transactionHandler.beginNumberOfTimes != 1 {
  234. t.Fatalf("崩溃时开启次数错误!")
  235. }
  236. if transactionHandler.commitNumberOfTimes != 0 {
  237. t.Fatalf("崩溃时提交次数错误!")
  238. }
  239. if transactionHandler.closeNumberOfTimes != 1 {
  240. t.Fatalf("崩溃时关闭次数错误!")
  241. }
  242. }()
  243. result := broker([]reflect.Value{reflect.ValueOf(&RequestContext{})})
  244. if len(result) > 0 {
  245. lastReturnValue := result[0].Interface()
  246. if lastReturnValue == nil {
  247. t.Fatalf("返回值为空!")
  248. }
  249. err, ok := lastReturnValue.(error)
  250. if ok {
  251. t.Fatalf("意外错误:%s", err.Error())
  252. }
  253. }
  254. t.Fatalf("意外未崩溃!")
  255. }
  256. func TestNewTransactionBroker_Call_Less(t *testing.T) {
  257. userId := "userId"
  258. user := &global.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 := NewNewTransactionBrokerBuilder()
  267. broker, err := builder.Build(sessionContext, caller)
  268. if err != nil {
  269. t.Fatalf("意外错误:%s", err.Error())
  270. }
  271. result := broker([]reflect.Value{})
  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 TestNewTransactionBroker_Call_ValueTypeError(t *testing.T) {
  288. userId := "userId"
  289. user := &global.User{UserId: userId}
  290. sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
  291. if err != nil {
  292. t.Fatalf("意外错误:%s", err.Error())
  293. }
  294. caller := func(in []reflect.Value) []reflect.Value {
  295. return in
  296. }
  297. builder := NewNewTransactionBrokerBuilder()
  298. broker, err := builder.Build(sessionContext, caller)
  299. if err != nil {
  300. t.Fatalf("意外错误:%s", err.Error())
  301. }
  302. result := broker([]reflect.Value{reflect.ValueOf(RequestContext{}), reflect.ValueOf("123")})
  303. if len(result) != 1 {
  304. t.Fatalf("返回值长度错误!")
  305. }
  306. lastReturnValue := result[0].Interface()
  307. if lastReturnValue == nil {
  308. t.Fatalf("返回值为空!")
  309. }
  310. err, ok := lastReturnValue.(error)
  311. if !ok {
  312. t.Fatalf("返回值类型错误!")
  313. }
  314. if err.Error() != "第一个参数类型错误!" {
  315. t.Fatalf("意外错误:%s", err.Error())
  316. }
  317. }
  318. func TestNewTransactionBroker_Call_PointerTypeError(t *testing.T) {
  319. transactionHandler := &TransactionHandlerMock{}
  320. userId := "userId"
  321. user := &global.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 := NewNewTransactionBrokerBuilder()
  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(transactionHandler)})
  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 TestNewTransactionBroker_Call_Repeated(t *testing.T) {
  351. transactionHandler := &TransactionHandlerMock{session: &xorm.Session{}}
  352. transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
  353. userId := "userId"
  354. user := &global.User{UserId: userId}
  355. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  356. if err != nil {
  357. t.Fatalf("意外错误:%s", err.Error())
  358. }
  359. caller := func(in []reflect.Value) []reflect.Value {
  360. return in
  361. }
  362. builder := NewNewTransactionBrokerBuilder()
  363. broker, err := builder.Build(sessionContext, caller)
  364. if err != nil {
  365. t.Fatalf("意外错误:%s", err.Error())
  366. }
  367. result := broker([]reflect.Value{reflect.ValueOf(&RequestContext{session: &xorm.Session{}})})
  368. if len(result) != 1 {
  369. t.Fatalf("返回值长度错误!")
  370. }
  371. lastReturnValue := result[0].Interface()
  372. if lastReturnValue == nil {
  373. t.Fatalf("返回值为空!")
  374. }
  375. err, ok := lastReturnValue.(error)
  376. if !ok {
  377. t.Fatalf("返回值类型错误!")
  378. }
  379. if err.Error() != "上下文的会话应当为空!" {
  380. t.Fatalf("意外错误:%s", err.Error())
  381. }
  382. }
  383. func TestNewTransactionBroker_Call_BeginError(t *testing.T) {
  384. beginError := errors.New("beginError")
  385. out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
  386. parameters := []reflect.Value{reflect.ValueOf(&RequestContext{}), reflect.ValueOf(456)}
  387. callNumberOfTimes := 0
  388. transactionHandler := &TransactionHandlerMock{beginError: beginError}
  389. transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
  390. userId := "userId"
  391. user := &global.User{UserId: userId}
  392. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  393. if err != nil {
  394. t.Fatalf("意外错误:%s", err.Error())
  395. }
  396. caller := func(in []reflect.Value) []reflect.Value {
  397. callNumberOfTimes++
  398. return out
  399. }
  400. builder := NewNewTransactionBrokerBuilder()
  401. broker, err := builder.Build(sessionContext, caller)
  402. if err != nil {
  403. t.Fatalf("意外错误:%s", err.Error())
  404. }
  405. result := broker(parameters)
  406. if len(result) != 1 {
  407. t.Fatalf("返回值长度错误!")
  408. }
  409. lastReturnValue := result[0].Interface()
  410. err, ok := lastReturnValue.(error)
  411. if !ok {
  412. t.Fatalf("意外的没有错误!")
  413. }
  414. if err != beginError {
  415. t.Fatalf("意外错误:%s", err.Error())
  416. }
  417. }
  418. func TestNewTransactionBroker_Call_CommitError(t *testing.T) {
  419. commitError := errors.New("commitError")
  420. out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
  421. parameters := []reflect.Value{reflect.ValueOf(&RequestContext{}), reflect.ValueOf(456)}
  422. callNumberOfTimes := 0
  423. transactionHandler := &TransactionHandlerMock{commitError: commitError}
  424. transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
  425. userId := "userId"
  426. user := &global.User{UserId: userId}
  427. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  428. if err != nil {
  429. t.Fatalf("意外错误:%s", err.Error())
  430. }
  431. caller := func(in []reflect.Value) []reflect.Value {
  432. callNumberOfTimes++
  433. return out
  434. }
  435. builder := NewNewTransactionBrokerBuilder()
  436. broker, err := builder.Build(sessionContext, caller)
  437. if err != nil {
  438. t.Fatalf("意外错误:%s", err.Error())
  439. }
  440. result := broker(parameters)
  441. lastReturnValue := result[0].Interface()
  442. err, ok := lastReturnValue.(error)
  443. if !ok {
  444. t.Fatalf("意外的没有错误!")
  445. }
  446. if err != commitError {
  447. t.Fatalf("意外错误:%s", err.Error())
  448. }
  449. }
  450. func TestNewTransactionBroker_Call_CreateError(t *testing.T) {
  451. out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
  452. createError := errors.New("createError")
  453. transactionHandlerFactory := &TransactionHandlerFactoryMock{createError: createError}
  454. userId := "userId"
  455. user := &global.User{UserId: userId}
  456. sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
  457. if err != nil {
  458. t.Fatalf("意外错误:%s", err.Error())
  459. }
  460. caller := func(in []reflect.Value) []reflect.Value {
  461. return out
  462. }
  463. builder := NewNewTransactionBrokerBuilder()
  464. broker, err := builder.Build(sessionContext, caller)
  465. if err != nil {
  466. t.Fatalf("意外错误:%s", err.Error())
  467. }
  468. result := broker([]reflect.Value{reflect.ValueOf(&RequestContext{})})
  469. if len(result) != 1 {
  470. t.Fatalf("返回值长度错误!")
  471. }
  472. lastReturnValue := result[0].Interface()
  473. if lastReturnValue == nil {
  474. t.Fatalf("返回值为空!")
  475. }
  476. err, ok := lastReturnValue.(error)
  477. if !ok {
  478. t.Fatalf("返回值类型错误!")
  479. }
  480. if err != createError {
  481. t.Fatalf("意外错误:%s", err.Error())
  482. }
  483. }