package container import ( "LAPP_LF_MOM_BACKEND/web/models" "github.com/go-xorm/xorm" "reflect" "testing" ) func TestLogBroker_Call_WithNull(t *testing.T) { out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)} parameters := []reflect.Value{reflect.ValueOf(nil), reflect.ValueOf(456)} synchronizer1 := NewSynchronizer() synchronizer2 := NewSynchronizer() userId := "userId" user := &models.Usertab{Userid: userId} callNumberOfTimes := 0 sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock) 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 := new(LogBrokerBuilder) 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("调用中次数错误!") } synchronizer2.Awake() synchronizer1.Wait() if callNumberOfTimes != 1 { t.Fatalf("结束时调用次数错误!") } // Begin 检查参数 if len(parameters) != len(inFromCalling) { t.Fatalf("参数长度错误!") } 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 TestLogBroker_Call_WithNullPointer(t *testing.T) { var nullSession *xorm.Session = nil out := []reflect.Value{reflect.ValueOf(123), reflect.ValueOf("456"), reflect.ValueOf(nil)} parameters := []reflect.Value{reflect.ValueOf(nullSession), reflect.ValueOf(456)} synchronizer1 := NewSynchronizer() synchronizer2 := NewSynchronizer() userId := "userId" user := &models.Usertab{Userid: userId} callNumberOfTimes := 0 sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock) 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 := new(LogBrokerBuilder) 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("调用中次数错误!") } synchronizer2.Awake() synchronizer1.Wait() if callNumberOfTimes != 1 { t.Fatalf("结束时调用次数错误!") } // Begin 检查参数 if len(parameters) != len(inFromCalling) { t.Fatalf("参数长度错误!") } 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 TestLogBroker_Call_Panic(t *testing.T) { userId := "userId" user := &models.Usertab{Userid: userId} sessionContext, err := NewSessionContext(user, transactionHandlerFactoryMock) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } var panicValue = "模拟崩溃!" caller := func(in []reflect.Value) []reflect.Value { panic(panicValue) } builder := new(LogBrokerBuilder) 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) } }() result := broker([]reflect.Value{reflect.ValueOf(nil)}) 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("意外未崩溃!") }