Skip to content

Commit

Permalink
Refactors API tests to use new WS library
Browse files Browse the repository at this point in the history
  • Loading branch information
ksysoev committed Aug 17, 2024
1 parent 6c566ed commit cd5719c
Showing 1 changed file with 125 additions and 39 deletions.
164 changes: 125 additions & 39 deletions api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,93 @@ package deriv

import (
"bufio"
"io"
"bytes"
"context"
"log"
"net/http"
"net/http/httptest"
"os"
"strings"
"sync"
"testing"
"time"

"github.com/coder/websocket"
"github.com/ksysoev/deriv-api/schema"
"golang.org/x/net/websocket"
)

func newMockWSServer(cb func(ws *websocket.Conn)) *httptest.Server {
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
c, err := websocket.Accept(w, r, &websocket.AcceptOptions{
OriginPatterns: []string{"*"},
})
if err != nil {
return
}
defer c.CloseNow()

cb(c)

c.Close(websocket.StatusNormalClosure, "")
})

return httptest.NewServer(handler)
}

func echoHandler(ws *websocket.Conn) {
defer ws.CloseNow()

for {
msgType, reader, err := ws.Reader(context.TODO())
if err != nil {
return
}

if msgType != websocket.MessageText {
continue
}

buffer := bytes.NewBuffer(make([]byte, 0))
_, err = buffer.ReadFrom(reader)
if err != nil {
return
}

err = ws.Write(context.Background(), msgType, buffer.Bytes())
if err != nil {
return
}
}
}

func onMessageHanler(cb func(ws *websocket.Conn, msgType websocket.MessageType, msg []byte)) func(ws *websocket.Conn) {
return func(ws *websocket.Conn) {
var wg sync.WaitGroup
defer wg.Wait()

for {
msgType, reader, err := ws.Reader(context.TODO())
if err != nil {
return
}

buffer := bytes.NewBuffer(make([]byte, 0))
_, err = buffer.ReadFrom(reader)
if err != nil {
return
}

msg := buffer.Bytes()
wg.Add(1)
go func() {
cb(ws, msgType, msg)
wg.Done()
}()
}

}
}

func TestNewDerivAPI(t *testing.T) {
// Valid endpoint and origin
endpoint := "wss://example.com/ws"
Expand Down Expand Up @@ -117,7 +192,7 @@ func TestGetNextRequestID(t *testing.T) {
}

func TestConnect(t *testing.T) {
server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) { io.Copy(ws, ws) }))
server := newMockWSServer(echoHandler)
url := "ws://" + server.Listener.Addr().String()

api, _ := NewDerivAPI(url, 123, "en", "http://example.com")
Expand Down Expand Up @@ -158,7 +233,7 @@ func TestConnect(t *testing.T) {
}

func TestDisconnect(t *testing.T) {
server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) { io.Copy(ws, ws) }))
server := newMockWSServer(echoHandler)
url := "ws://" + server.Listener.Addr().String()

defer server.Close()
Expand Down Expand Up @@ -188,7 +263,7 @@ func TestDisconnect(t *testing.T) {
}

func TestSend(t *testing.T) {
server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) { io.Copy(ws, ws) }))
server := newMockWSServer(echoHandler)
url := "ws://" + server.Listener.Addr().String()

defer server.Close()
Expand Down Expand Up @@ -223,7 +298,7 @@ func TestSend(t *testing.T) {
}

func TestSendToDisconnectedConnection(t *testing.T) {
server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) { io.Copy(ws, ws) }))
server := newMockWSServer(echoHandler)
url := "ws://" + server.Listener.Addr().String()
server.Close()

Expand All @@ -243,7 +318,7 @@ func TestSendToDisconnectedConnection(t *testing.T) {
}

func TestSendReqWhichNobodyWaits(t *testing.T) {
server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) { io.Copy(ws, ws) }))
server := newMockWSServer(echoHandler)
url := "ws://" + server.Listener.Addr().String()

api, _ := NewDerivAPI(url, 123, "en", "http://example.com")
Expand All @@ -263,11 +338,11 @@ func TestSendReqWhichNobodyWaits(t *testing.T) {
}

func TestSendRequestTimeout(t *testing.T) {
server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) {
var msg string
_ = websocket.Message.Receive(ws, &msg) // wait for request
time.Sleep(time.Second) // to keep the connection open
}))
server := newMockWSServer(
onMessageHanler(func(_ *websocket.Conn, _ websocket.MessageType, _ []byte) {
time.Sleep(time.Second)
}),
)
defer server.Close()
url := "ws://" + server.Listener.Addr().String()

Expand All @@ -286,12 +361,14 @@ func TestSendRequestTimeout(t *testing.T) {

func TestSendRequestAndGotInvalidJSON(t *testing.T) {
testResp := `{Corrupted JSON}`
server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) {
var msg string
_ = websocket.Message.Receive(ws, &msg) // wait for request
ws.Write([]byte(testResp))
time.Sleep(time.Second) // to keep the connection open
}))
server := newMockWSServer(
onMessageHanler(func(ws *websocket.Conn, _ websocket.MessageType, _ []byte) {
err := ws.Write(context.Background(), websocket.MessageText, []byte(testResp))
if err != nil {
return
}
time.Sleep(time.Second) // to keep the connection open
}))
url := "ws://" + server.Listener.Addr().String()
defer server.Close()

Expand Down Expand Up @@ -325,12 +402,14 @@ func TestSendRequest(t *testing.T) {
"ping": "pong",
"req_id": 1
}`
server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) {
var msg string
_ = websocket.Message.Receive(ws, &msg) // wait for request
ws.Write([]byte(testResp))
time.Sleep(time.Second) // to keep the connection open
}))
server := newMockWSServer(
onMessageHanler(func(ws *websocket.Conn, _ websocket.MessageType, _ []byte) {
err := ws.Write(context.Background(), websocket.MessageText, []byte(testResp))
if err != nil {
return
}
time.Sleep(time.Second) // to keep the connection open
}))
defer server.Close()

url := "ws://" + server.Listener.Addr().String()
Expand Down Expand Up @@ -358,12 +437,14 @@ func TestSendRequest(t *testing.T) {
}

func TestSendRequestFailed(t *testing.T) {
server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) {
var msg string
_ = websocket.Message.Receive(ws, &msg) // wait for request
ws.Write([]byte(""))
time.Sleep(time.Second) // to keep the connection open
}))
server := newMockWSServer(
onMessageHanler(func(ws *websocket.Conn, _ websocket.MessageType, _ []byte) {
err := ws.Write(context.Background(), websocket.MessageText, []byte(""))
if err != nil {
return
}
time.Sleep(time.Second) // to keep the connection open
}))
url := "ws://" + server.Listener.Addr().String()
server.Close()

Expand All @@ -381,21 +462,26 @@ func TestSendRequestFailed(t *testing.T) {

func TestKeepConnectionAlive(t *testing.T) {
resChan := make(chan string)
server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) {
var msg string
_ = websocket.Message.Receive(ws, &msg) // wait for request
resChan <- msg
ws.Write([]byte(`{
testResp := `{
"echo_req": {
"ping": 1,
"req_id": 1
},
"msg_type": "ping",
"ping": "pong",
"req_id": 1
}`))
time.Sleep(time.Second) // to keep the connection open
}))
}`

server := newMockWSServer(
onMessageHanler(func(ws *websocket.Conn, _ websocket.MessageType, msg []byte) {
resChan <- string(msg)

err := ws.Write(context.Background(), websocket.MessageText, []byte(testResp))
if err != nil {
return
}
time.Sleep(time.Second) // to keep the connection open
}))

url := "ws://" + server.Listener.Addr().String()
defer server.Close()
Expand Down Expand Up @@ -434,7 +520,7 @@ func TestDebugLogs(t *testing.T) {
log.SetOutput(writer)
scanner := bufio.NewScanner(reader)

server := httptest.NewServer(websocket.Handler(func(ws *websocket.Conn) { io.Copy(ws, ws) }))
server := newMockWSServer(echoHandler)
url := "ws://" + server.Listener.Addr().String()

api, _ := NewDerivAPI(url, 123, "en", "http://example.com", Debug)
Expand Down

0 comments on commit cd5719c

Please sign in to comment.