@@ -17,9 +17,11 @@ import (
1717 "bytes"
1818 "context"
1919 _ "embed"
20+ "fmt"
2021 "io"
2122 "net/http"
2223 "net/http/httptest"
24+ "sync"
2325 "testing"
2426
2527 "github.com/stretchr/testify/require"
@@ -268,3 +270,41 @@ func Test_InvokeHttp(t *testing.T) {
268270 })
269271 }
270272}
273+
274+ func TestEnsureConcurrency (t * testing.T ) {
275+ l := logger .NewLogger (t .Name ())
276+ var buf bytes.Buffer
277+ l .SetOutput (& buf )
278+
279+ s := httptest .NewServer (& handler {})
280+ defer s .Close ()
281+
282+ meta := metadata.Base {Properties : map [string ]string {"url" : urlHTTPFile }}
283+
284+ output := NewWasmOutput (l )
285+ defer output .(io.Closer ).Close ()
286+
287+ ctx := context .Background ()
288+
289+ err := output .Init (ctx , bindings.Metadata {Base : meta })
290+ require .NoError (t , err )
291+
292+ // Wasm is running in goroutine, use wait group to ensure all goroutines are finished
293+ wg := sync.WaitGroup {}
294+ // 100 is enough to trigger concurrency, and wasm should be executed run fast enough to not consuming too much time
295+ for i := 0 ; i < 100 ; i ++ {
296+ wg .Add (1 )
297+ go func (i int ) {
298+ request := & bindings.InvokeRequest {
299+ Metadata : map [string ]string {"args" : fmt .Sprintf ("%s/%d" , s .URL , i )},
300+ Operation : ExecuteOperation ,
301+ }
302+ expectedResp := fmt .Sprintf ("Status: 200\n Body: \n /%d\n " , i )
303+ resp , err := output .Invoke (ctx , request )
304+ require .NoError (t , err )
305+ require .Equal (t , expectedResp , string (resp .Data ))
306+ wg .Done ()
307+ }(i )
308+ }
309+ wg .Wait ()
310+ }
0 commit comments