package http import ( "context" "encoding/json" "fmt" . "github.com/smartystreets/goconvey/convey" "go-common/app/service/live/wallet/model" "go-common/library/ecode" "net/url" "sync" "testing" "time" ) type TidRes struct { Code int `json:"code"` Resp *model.TidResp `json:"data"` } type TestTidParams struct { Biz string Time int64 } func getTestTidParams(biz string) *TestTidParams { return &TestTidParams{ Biz: biz, Time: time.Now().Unix(), } } func getTestRandServiceType() int32 { return r.Int31n(4) } func testWith(f func()) func() { once.Do(startHTTP) return f } func getTestParamsJson() string { params := getTestTidParams("gift") paramsBytes, _ := json.Marshal(params) paramsJson := string(paramsBytes[:]) return paramsJson } func queryGetTid(t *testing.T, serviceType int32, tidParams string) *TidRes { params := url.Values{} params.Set("type", fmt.Sprintf("%d", serviceType)) params.Set("params", tidParams) req, _ := client.NewRequest("POST", _getTidURL, "127.0.0.1", params) var res TidRes err := client.Do(context.TODO(), req, &res) if err != nil { t.Errorf("client.Do() error(%v)", err) t.FailNow() } return &res } func TestGetTid(t *testing.T) { Convey("normal", t, testWith(func() { serviceType := getTestRandServiceType() paramsJson := getTestParamsJson() res := queryGetTid(t, serviceType, paramsJson) So(res.Code, ShouldEqual, 0) So(res.Resp.TransactionId, ShouldNotEqual, "") })) Convey("Twice Same params 同样的参数调用getTid 得到的tid应该不一样", t, testWith(func() { serviceType := getTestRandServiceType() paramsJson := getTestParamsJson() res := queryGetTid(t, serviceType, paramsJson) So(res.Code, ShouldEqual, 0) So(res.Resp.TransactionId, ShouldNotEqual, "") res1 := queryGetTid(t, serviceType, paramsJson) So(res1.Code, ShouldEqual, 0) So(res1.Resp.TransactionId, ShouldNotEqual, res.Resp.TransactionId) })) Convey("Test multi Same params", t, testWith(func() { serviceType := getTestRandServiceType() paramsJson := getTestParamsJson() resMap := make(map[int]*TidRes) wg := sync.WaitGroup{} var mutex sync.Mutex times := 10 for i := 0; i < times; i++ { wg.Add(1) go func(i int) { mutex.Lock() resMap[i] = queryGetTid(t, serviceType, paramsJson) mutex.Unlock() wg.Done() }(i) } wg.Wait() tidMap := map[string]bool{} for _, res := range resMap { So(res.Code, ShouldEqual, 0) So(res.Resp.TransactionId, ShouldNotEqual, "") _, ok := tidMap[res.Resp.TransactionId] So(ok, ShouldEqual, false) // 应该找不到 因为同样的参数应该生成不同的tid tidMap[res.Resp.TransactionId] = true } })) Convey("params error", t, func() { Convey("serviceType 应该为 0 1 2 3 ", testWith(func() { wrongServiceTypes := []int32{-1, 5} for _, v := range wrongServiceTypes { paramsJson := getTestParamsJson() res := queryGetTid(t, v, paramsJson) So(res.Code, ShouldEqual, ecode.RequestErr.Code()) } })) Convey("param不为空", testWith(func() { st := getTestRandServiceType() params := "" res := queryGetTid(t, st, params) So(res.Code, ShouldEqual, ecode.RequestErr.Code()) })) }) }