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.
 
 

414 lines
11 KiB

package container
import (
"LAPP_LF_MOM_BACKEND/web/models"
"errors"
"github.com/go-xorm/xorm"
"reflect"
"testing"
)
func TestNewSessionBroker_Call_WithNull(t *testing.T) {
out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
parameters := []reflect.Value{reflect.ValueOf(&RequestContext{}), reflect.ValueOf(456)}
synchronizer1 := NewSynchronizer()
synchronizer2 := NewSynchronizer()
callNumberOfTimes := 0
transactionHandler := &TransactionHandlerMock{}
transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
userId := "userId"
user := &models.Usertab{Userid: userId}
sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
var inFromCalling []reflect.Value = nil
caller := func(in []reflect.Value) []reflect.Value {
callNumberOfTimes++
synchronizer1.Awake()
synchronizer2.Wait()
inFromCalling = in
return out
}
builder := NewNewSessionBrokerBuilder()
broker, err := builder.Build(sessionContext, caller)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
var result []reflect.Value = nil
go func() {
result = broker(parameters)
synchronizer1.Awake()
}()
synchronizer1.Wait()
if callNumberOfTimes != 1 {
t.Fatalf("调用中次数错误!")
}
if transactionHandler.closeNumberOfTimes != 0 {
t.Fatalf("调用中关闭次数错误!")
}
synchronizer2.Awake()
synchronizer1.Wait()
if callNumberOfTimes != 1 {
t.Fatalf("结束时调用次数错误!")
}
if transactionHandler.closeNumberOfTimes != 1 {
t.Fatalf("结束时关闭次数错误!")
}
// Begin 检查参数
if len(parameters) != len(inFromCalling) {
t.Fatalf("参数长度错误!")
}
requestContext, ok := inFromCalling[0].Interface().(*RequestContext)
if !ok {
t.Fatalf("第一个参数类型错误!")
}
if transactionHandler.session != requestContext.session {
t.Fatalf("*RequestContext设置错误!")
}
for i := 1; i < len(parameters); i++ {
if parameters[i].Interface() != inFromCalling[i].Interface() {
t.Fatalf("参数内容错误!")
}
}
// End 检查参数
// Begin 检查返回值
if len(result) != len(out) {
t.Fatalf("返回值长度错误!")
}
lastReturnValue := result[0].Interface()
if err, ok := lastReturnValue.(error); ok {
t.Fatalf("意外错误:%s", err.Error())
}
for i := 0; i < len(result); i++ {
if result[i].Kind() != reflect.Invalid {
if out[i].Kind() != reflect.Invalid {
if result[i].Interface() != out[i].Interface() {
t.Fatalf("返回值内容错误!")
}
} else {
t.Fatalf("返回值内容错误!")
}
} else {
if out[i].Kind() != reflect.Invalid {
t.Fatalf("返回值内容错误!")
}
}
}
// End 检查返回值
}
func TestNewSessionBroker_Call_WithNullPointer(t *testing.T) {
out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
parameters := []reflect.Value{reflect.ValueOf(&RequestContext{}), reflect.ValueOf(456)}
synchronizer1 := NewSynchronizer()
synchronizer2 := NewSynchronizer()
callNumberOfTimes := 0
transactionHandler := &TransactionHandlerMock{}
transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
userId := "userId"
user := &models.Usertab{Userid: userId}
sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
var inFromCalling []reflect.Value = nil
caller := func(in []reflect.Value) []reflect.Value {
callNumberOfTimes++
synchronizer1.Awake()
synchronizer2.Wait()
inFromCalling = in
return out
}
builder := NewNewSessionBrokerBuilder()
broker, err := builder.Build(sessionContext, caller)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
var result []reflect.Value = nil
go func() {
result = broker(parameters)
synchronizer1.Awake()
}()
synchronizer1.Wait()
if callNumberOfTimes != 1 {
t.Fatalf("调用中次数错误!")
}
if transactionHandler.closeNumberOfTimes != 0 {
t.Fatalf("调用中关闭次数错误!")
}
synchronizer2.Awake()
synchronizer1.Wait()
if callNumberOfTimes != 1 {
t.Fatalf("结束时调用次数错误!")
}
if transactionHandler.closeNumberOfTimes != 1 {
t.Fatalf("结束时关闭次数错误!")
}
// Begin 检查参数
if len(parameters) != len(inFromCalling) {
t.Fatalf("参数长度错误!")
}
requestContext, ok := inFromCalling[0].Interface().(*RequestContext)
if !ok {
t.Fatalf("第一个参数类型错误!")
}
if transactionHandler.session != requestContext.session {
t.Fatalf("*RequestContext设置错误!")
}
for i := 1; i < len(parameters); i++ {
if parameters[i].Interface() != inFromCalling[i].Interface() {
t.Fatalf("参数内容错误!")
}
}
// End 检查参数
// Begin 检查返回值
if len(result) != len(out) {
t.Fatalf("返回值长度错误!")
}
lastReturnValue := result[0].Interface()
if err, ok := lastReturnValue.(error); ok {
t.Fatalf("意外错误:%s", err.Error())
}
for i := 0; i < len(result); i++ {
if result[i].Kind() != reflect.Invalid {
if out[i].Kind() != reflect.Invalid {
if result[i].Interface() != out[i].Interface() {
t.Fatalf("返回值内容错误!")
}
} else {
t.Fatalf("返回值内容错误!")
}
} else {
if out[i].Kind() != reflect.Invalid {
t.Fatalf("返回值内容错误!")
}
}
}
// End 检查返回值
}
func TestNewSessionBroker_Call_Panic(t *testing.T) {
transactionHandler := &TransactionHandlerMock{}
transactionHandlerFactory := &TransactionHandlerFactoryMock{handler: transactionHandler}
userId := "userId"
user := &models.Usertab{Userid: userId}
sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
var panicValue = "模拟崩溃!"
caller := func(in []reflect.Value) []reflect.Value {
panic(panicValue)
}
builder := NewNewSessionBrokerBuilder()
broker, err := builder.Build(sessionContext, caller)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
defer func() {
if p := recover(); p != nil && p != panicValue {
t.Fatalf("意外崩溃:%v", p)
}
if transactionHandler.closeNumberOfTimes != 1 {
t.Fatalf("崩溃时关闭次数错误!")
}
}()
result := broker([]reflect.Value{reflect.ValueOf(&RequestContext{})})
if len(result) > 0 {
lastReturnValue := result[0].Interface()
if lastReturnValue == nil {
t.Fatalf("返回值为空!")
}
err, ok := lastReturnValue.(error)
if ok {
t.Fatalf("意外错误:%s", err.Error())
}
}
t.Fatalf("意外未崩溃!")
}
func TestNewSessionBroker_Call_Less(t *testing.T) {
userId := "userId"
user := &models.Usertab{Userid: userId}
sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
caller := func(in []reflect.Value) []reflect.Value {
return in
}
builder := NewNewSessionBrokerBuilder()
broker, err := builder.Build(sessionContext, caller)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
result := broker([]reflect.Value{})
if len(result) != 1 {
t.Fatalf("返回值长度错误!")
}
lastReturnValue := result[0].Interface()
if lastReturnValue == nil {
t.Fatalf("返回值为空!")
}
err, ok := lastReturnValue.(error)
if !ok {
t.Fatalf("返回值类型错误!")
}
if err.Error() != "参数长度错误!" {
t.Fatalf("意外错误:%s", err.Error())
}
}
func TestNewSessionBroker_Call_ValueTypeError(t *testing.T) {
userId := "userId"
user := &models.Usertab{Userid: userId}
sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
caller := func(in []reflect.Value) []reflect.Value {
return in
}
builder := NewNewSessionBrokerBuilder()
broker, err := builder.Build(sessionContext, caller)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
result := broker([]reflect.Value{reflect.ValueOf(RequestContext{}), reflect.ValueOf("123")})
if len(result) != 1 {
t.Fatalf("返回值长度错误!")
}
lastReturnValue := result[0].Interface()
if lastReturnValue == nil {
t.Fatalf("返回值为空!")
}
err, ok := lastReturnValue.(error)
if !ok {
t.Fatalf("返回值类型错误!")
}
if err.Error() != "第一个参数类型错误!" {
t.Fatalf("意外错误:%s", err.Error())
}
}
func TestNewSessionBroker_Call_PointerTypeError(t *testing.T) {
transactionHandler := &TransactionHandlerMock{}
userId := "userId"
user := &models.Usertab{Userid: userId}
sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
caller := func(in []reflect.Value) []reflect.Value {
return in
}
builder := NewNewSessionBrokerBuilder()
broker, err := builder.Build(sessionContext, caller)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
result := broker([]reflect.Value{reflect.ValueOf(transactionHandler)})
if len(result) != 1 {
t.Fatalf("返回值长度错误!")
}
lastReturnValue := result[0].Interface()
if lastReturnValue == nil {
t.Fatalf("返回值为空!")
}
err, ok := lastReturnValue.(error)
if !ok {
t.Fatalf("返回值类型错误!")
}
if err.Error() != "第一个参数类型不正确!" {
t.Fatalf("意外错误:%s", err.Error())
}
}
func TestNewSessionBroker_Call_Repeated(t *testing.T) {
userId := "userId"
user := &models.Usertab{Userid: userId}
sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
caller := func(in []reflect.Value) []reflect.Value {
return in
}
builder := NewNewSessionBrokerBuilder()
broker, err := builder.Build(sessionContext, caller)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
result := broker([]reflect.Value{reflect.ValueOf(&RequestContext{session: &xorm.Session{}})})
if len(result) != 1 {
t.Fatalf("返回值长度错误!")
}
lastReturnValue := result[0].Interface()
if lastReturnValue == nil {
t.Fatalf("返回值为空!")
}
err, ok := lastReturnValue.(error)
if !ok {
t.Fatalf("返回值类型错误!")
}
if err.Error() != "上下文的会话应当为空!" {
t.Fatalf("意外错误:%s", err.Error())
}
}
func TestNewSessionBroker_Call_CreateError(t *testing.T) {
out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)}
createError := errors.New("createError")
transactionHandlerFactory := &TransactionHandlerFactoryMock{createError: createError}
userId := "userId"
user := &models.Usertab{Userid: userId}
sessionContext, err := NewSessionContext(user, transactionHandlerFactory)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
caller := func(in []reflect.Value) []reflect.Value {
return out
}
builder := NewNewSessionBrokerBuilder()
broker, err := builder.Build(sessionContext, caller)
if err != nil {
t.Fatalf("意外错误:%s", err.Error())
}
result := broker([]reflect.Value{reflect.ValueOf(&RequestContext{})})
if len(result) != 1 {
t.Fatalf("返回值长度错误!")
}
lastReturnValue := result[0].Interface()
if lastReturnValue == nil {
t.Fatalf("返回值为空!")
}
err, ok := lastReturnValue.(error)
if !ok {
t.Fatalf("返回值类型错误!")
}
if err != createError {
t.Fatalf("意外错误:%s", err.Error())
}
}