Skip to content

Commit

Permalink
fix the testcase by go sse
Browse files Browse the repository at this point in the history
  • Loading branch information
peze committed Feb 25, 2025
1 parent 1c68728 commit 787ba7e
Show file tree
Hide file tree
Showing 6 changed files with 239 additions and 131 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/go.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:
- name: Build
run: go mod tidy
- name: Test
run: go test -race -coverprofile=coverage.txt -covermode=atomic ./client/...
run: go test -race -coverprofile=coverage.txt -covermode=atomic ./client/... ./utils/...
- uses: codecov/codecov-action@v4
with:
flags: golang # optional
Expand Down
31 changes: 10 additions & 21 deletions golang/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -1523,7 +1523,9 @@ func (client *Client) Execute(params *openapiutil.Params, request *openapiutil.O
return _result, _resultErr
}

func (client *Client) CallSSEApi(params *openapiutil.Params, request *openapiutil.OpenApiRequest, runtime *dara.RuntimeOptions) (_result <-chan *SSEResponse, _err error) {
func (client *Client) CallSSEApi(params *openapiutil.Params, request *openapiutil.OpenApiRequest, runtime *dara.RuntimeOptions, _yield chan *SSEResponse, _yieldErr chan error) {
defer close(_yield)
defer close(_yieldErr)
_runtime := dara.NewRuntimeObject(map[string]interface{}{
"key": dara.ToString(dara.Default(dara.StringValue(runtime.Key), dara.StringValue(client.Key))),
"cert": dara.ToString(dara.Default(dara.StringValue(runtime.Cert), dara.StringValue(client.Cert))),
Expand Down Expand Up @@ -1710,9 +1712,7 @@ func (client *Client) CallSSEApi(params *openapiutil.Params, request *openapiuti
continue
}

_yield := make(chan *SSEResponse)
_yieldErr := make(chan error, 1)
go callSSEApi_opResponse(_yield, _yieldErr, response_)
callSSEApi_opResponse(_yield, _yieldErr, response_)
_err = <-_yieldErr
if _err != nil {
retriesAttempted++
Expand All @@ -1726,13 +1726,10 @@ func (client *Client) CallSSEApi(params *openapiutil.Params, request *openapiuti
continue
}

_result = _yield
return _result, _err
}
if dara.BoolValue(client.DisableSDKError) != true {
_resultErr = dara.TeaSDKError(_resultErr)
return
}
return _result, _resultErr
_yieldErr <- _resultErr
return
}


Expand Down Expand Up @@ -2428,9 +2425,7 @@ func doRequest_opResponse (response_ *dara.Response, client *Client, params *ope

}

func callSSEApi_opResponse(_yield chan<- *SSEResponse, _yieldErr chan<- error, response_ *dara.Response) {
defer close(_yield)
defer close(_yieldErr)
func callSSEApi_opResponse(_yield chan *SSEResponse, _yieldErr chan error, response_ *dara.Response) {
if (dara.IntValue(response_.StatusCode) >= 400) && (dara.IntValue(response_.StatusCode) < 600) {
err := map[string]interface{}{}
if !dara.IsNil(response_.Headers["content-type"]) && dara.StringValue(response_.Headers["content-type"]) == "text/xml;charset=utf-8" {
Expand Down Expand Up @@ -2464,14 +2459,8 @@ func callSSEApi_opResponse(_yield chan<- *SSEResponse, _yieldErr chan<- error, r
return
}

events, _err := dara.ReadAsSSE(response_.Body)
if _err != nil {
for tmpErr := range _err {
_yieldErr <- tmpErr
}
return
}

events := make(chan *dara.SSEEvent, 1)
dara.ReadAsSSE(response_.Body, events, _yieldErr)
for event := range events {
_yield <- &SSEResponse{
StatusCode: response_.StatusCode,
Expand Down
136 changes: 128 additions & 8 deletions golang/client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import (
"strings"
"testing"
"time"
"fmt"

pop "github.com/alibabacloud-go/alibabacloud-gateway-pop/client"
openapiutil "github.com/alibabacloud-go/darabonba-openapi/v2/utils"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
"github.com/alibabacloud-go/tea/dara"
tea_util "github.com/alibabacloud-go/tea/utils"
credential "github.com/aliyun/credentials-go/credentials"
)
Expand All @@ -22,7 +24,53 @@ type mockHandler struct {
content string
}

func (mock *mockHandler) handleSSE(w http.ResponseWriter, req *http.Request) {
headers := map[string]string{
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
}
w.WriteHeader(200)
for key, value := range headers {
w.Header().Set(key, value)
}

flusher, ok := w.(http.Flusher)
if !ok {
http.Error(w, "Streaming not supported", http.StatusInternalServerError)
return
}

count := 0
ticker := time.NewTicker(100 * time.Millisecond)
defer ticker.Stop()

for range ticker.C {
if count >= 5 {
break
}

_, err := fmt.Fprintf(w, "data: %s\nevent: flow\nid: sse-test\nretry: 3\n:heartbeat\n\n", fmt.Sprintf(`{"count": %d}`, count))
if err != nil {
fmt.Println("Error writing to client:", err)
break
}

flusher.Flush()
count++
}

// Ensure any buffered data is sent to client before closing
flusher.Flush()
}


func (mock *mockHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
if req.URL.Path == "/sse" {
mock.handleSSE(w, req)
return
}

if req.Header != nil {
nv := 0
for k, vv := range req.Header {
Expand Down Expand Up @@ -454,7 +502,7 @@ func TestCallApiForRPCWithV2Sign_AK_Form(t *testing.T) {
find := regx.FindAllString(tea.StringValue(str), -1)
tea_util.AssertNotNil(t, find)
str, _ = util.AssertAsString(headers["user-agent"])
has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent")
has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent")
tea_util.AssertEqual(t, true, has)
tea_util.AssertEqual(t, "global-value", headers["global-key"])
tea_util.AssertEqual(t, "2022-06-01", headers["x-acs-version"])
Expand Down Expand Up @@ -500,6 +548,11 @@ func TestCallApiForRPCWithV2Sign_AK_Form(t *testing.T) {
err := _err.(*tea.SDKError)
tea_util.AssertEqual(t, "InvalidCredentials", tea.StringValue(err.Code))
tea_util.AssertEqual(t, "Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.", tea.StringValue(err.Message))
client.DisableSDKError = tea.Bool(true);
_, _err = client.CallApi(params, request, runtime)
err2 := _err.(*ClientError)
tea_util.AssertEqual(t, "InvalidCredentials", tea.StringValue(err2.GetCode()))
tea_util.AssertEqual(t, "Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.", err2.Error())
}

func TestCallApiForRPCWithV2Sign_Anonymous_JSON(t *testing.T) {
Expand Down Expand Up @@ -543,7 +596,7 @@ func TestCallApiForRPCWithV2Sign_Anonymous_JSON(t *testing.T) {
find := regx.FindAllString(tea.StringValue(str), -1)
tea_util.AssertNotNil(t, find)
str, _ = util.AssertAsString(headers["user-agent"])
has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent")
has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent")
tea_util.AssertEqual(t, true, has)
tea_util.AssertEqual(t, "global-value", headers["global-key"])
tea_util.AssertEqual(t, "extends-value", headers["extends-key"])
Expand Down Expand Up @@ -606,7 +659,7 @@ func TestCallApiForROAWithV2Sign_HTTPS_AK_Form(t *testing.T) {
tea_util.AssertEqual(t, "key1=value&key2=1&key3=true", headers["raw-body"])
tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"])
str, _ := util.AssertAsString(headers["user-agent"])
has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent")
has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent")
tea_util.AssertEqual(t, true, has)
str, _ = util.AssertAsString(headers["authorization"])
has = strings.Contains(tea.StringValue(str), "acs ak:")
Expand Down Expand Up @@ -748,7 +801,7 @@ func TestCallApiForROAWithV2Sign_Anonymous_JSON(t *testing.T) {
tea_util.AssertEqual(t, "{\"key1\":\"value\",\"key2\":1,\"key3\":true}", headers["raw-body"])
tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"])
str, _ := util.AssertAsString(headers["user-agent"])
has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent")
has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent")
tea_util.AssertEqual(t, true, has)
tea_util.AssertEqual(t, "global-value", headers["global-key"])
tea_util.AssertEqual(t, "extends-value", headers["extends-key"])
Expand Down Expand Up @@ -816,7 +869,7 @@ func TestCallApiForRPCWithV3Sign_AK_Form(t *testing.T) {
tea_util.AssertEqual(t, "key1=value&key2=1&key3=true", headers["raw-body"])
tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"])
str, _ := util.AssertAsString(headers["user-agent"])
has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent")
has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent")
tea_util.AssertEqual(t, true, has)
str, _ = util.AssertAsString(headers["authorization"])
has = strings.Contains(tea.StringValue(str), "ACS3-HMAC-SHA256 Credential=ak,"+
Expand Down Expand Up @@ -916,7 +969,7 @@ func TestCallApiForRPCWithV3Sign_Anonymous_JSON(t *testing.T) {
tea_util.AssertEqual(t, "{\"key1\":\"value\",\"key2\":1,\"key3\":true}", headers["raw-body"])
tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"])
str, _ := util.AssertAsString(headers["user-agent"])
has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent")
has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent")
tea_util.AssertEqual(t, true, has)
tea_util.AssertEqual(t, "sdk", headers["for-test"])
tea_util.AssertEqual(t, "global-value", headers["global-key"])
Expand Down Expand Up @@ -983,7 +1036,7 @@ func TestCallApiForROAWithV3Sign_AK_Form(t *testing.T) {
tea_util.AssertEqual(t, "key1=value&key2=1&key3=true", headers["raw-body"])
tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"])
str, _ := util.AssertAsString(headers["user-agent"])
has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent")
has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent")
tea_util.AssertEqual(t, true, has)
str, _ = util.AssertAsString(headers["authorization"])
has = strings.Contains(tea.StringValue(str), "ACS3-HMAC-SHA256 Credential=ak,"+
Expand Down Expand Up @@ -1084,7 +1137,7 @@ func TestCallApiForROAWithV3Sign_Anonymous_JSON(t *testing.T) {
tea_util.AssertEqual(t, "{\"key1\":\"value\",\"key2\":1,\"key3\":true}", headers["raw-body"])
tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"])
str, _ := util.AssertAsString(headers["user-agent"])
has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent")
has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent")
tea_util.AssertEqual(t, true, has)
tea_util.AssertEqual(t, "sdk", headers["for-test"])
tea_util.AssertEqual(t, "global-value", headers["global-key"])
Expand Down Expand Up @@ -1552,7 +1605,14 @@ func TestRetryWithError(t *testing.T) {
tea_util.AssertNotNil(t, _err)
err := _err.(*tea.SDKError)
tea_util.AssertEqual(t, "code: 500, error message request id: A45EE076-334D-5012-9746-A8F828D20FD4", tea.StringValue(err.Message))
client.DisableSDKError = tea.Bool(true);
_, _err = client.CallApi(params, request, runtime)
err2 := _err.(*ServerError)
tea_util.AssertEqual(t, 500, tea.IntValue(err2.GetStatusCode()))
tea_util.AssertEqual(t, "A45EE076-334D-5012-9746-A8F828D20FD4", tea.StringValue(err2.GetRequestId()))
tea_util.AssertEqual(t, "code: 500, error message request id: A45EE076-334D-5012-9746-A8F828D20FD4", err2.Error())

client.DisableSDKError = tea.Bool(false);
params = &Params{
Action: tea.String("TestAPI"),
Version: tea.String("2022-06-01"),
Expand Down Expand Up @@ -1603,3 +1663,63 @@ func TestRetryWithError(t *testing.T) {
_, _err = client.Execute(params, request, runtime)
tea_util.AssertNotNil(t, _err)
}

func TestCallSSeApiWithV3Sign_AK_Form(t *testing.T) {
mux := http.NewServeMux()
mux.Handle("/sse", &mockHandler{content: "json"})
var server *http.Server
server = &http.Server{
Addr: ":9014",
WriteTimeout: time.Second * 60,
Handler: mux,
}
go server.ListenAndServe()
config := CreateConfig()
runtime := CreateRuntimeOptions()
config.Protocol = tea.String("HTTP")
config.Endpoint = tea.String("127.0.0.1:9014")
client, _err := NewClient(config)
tea_util.AssertNil(t, _err)
request := CreateOpenApiRequest()
params := &Params{
Action: tea.String("TestAPI"),
Version: tea.String("2022-06-01"),
Protocol: tea.String("HTTPS"),
Pathname: tea.String("/sse"),
Method: tea.String("GET"),
AuthType: tea.String("AK"),
Style: tea.String("ROA"),
ReqBodyType: tea.String("formData"),
BodyType: tea.String("json"),
}


// fmt.Println("response:", result)
// fmt.Println("response error:", _err)
// tea_util.AssertNil(t, _err)
events := []*dara.SSEEvent{}

result := make(chan *SSEResponse, 1)
yieldErr := make(chan error, 1)
go client.CallSSEApi(params, request, runtime, result, yieldErr)

for resp := range result {
events = append(events, resp.Event)
}

_err = <- yieldErr
tea_util.AssertNil(t, _err)


// for _err = range yieldErr {
// tea_util.AssertNil(t, _err)
// }
tea_util.AssertEqual(t, len(events), 5)

for index, event := range events {
data := fmt.Sprintf(`{"count": %d}`, index)
tea_util.AssertEqual(t, data, tea.StringValue(event.Data))
tea_util.AssertEqual(t, "sse-test", tea.StringValue(event.ID))
tea_util.AssertEqual(t, "flow", tea.StringValue(event.Event))
}
}
2 changes: 1 addition & 1 deletion golang/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ require (
github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5
github.com/alibabacloud-go/openapi-util v0.1.0
github.com/alibabacloud-go/tea v1.3.2-0.20250217084427-cf679a8bddfe
github.com/alibabacloud-go/tea v1.3.2
github.com/alibabacloud-go/tea-utils/v2 v2.0.7
github.com/aliyun/credentials-go v1.3.10
github.com/tjfoc/gmsm v1.4.1
Expand Down
2 changes: 2 additions & 0 deletions golang/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ github.com/alibabacloud-go/tea v1.1.20/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy
github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZLAQdpmpXMgwk=
github.com/alibabacloud-go/tea v1.3.2-0.20250217084427-cf679a8bddfe h1:oJzdVpaDzOrDdQv1d6HNjP0R9A+ez69LlqNSDY63Hjc=
github.com/alibabacloud-go/tea v1.3.2-0.20250217084427-cf679a8bddfe/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg=
github.com/alibabacloud-go/tea v1.3.2-0.20250225033757-8d3b5385f0fa h1:O/+WQGqi2yvNtAavN1ypOlUbpBLPS+Y2gzV3Hiql/5o=
github.com/alibabacloud-go/tea v1.3.2-0.20250225033757-8d3b5385f0fa/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg=
github.com/alibabacloud-go/tea-utils v1.3.1 h1:iWQeRzRheqCMuiF3+XkfybB3kTgUXkXX+JMrqfLeB2I=
github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE=
github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4=
Expand Down
Loading

0 comments on commit 787ba7e

Please sign in to comment.