github.com/isyscore/isc-gobase@v1.5.3-0.20231218061332-cbc7451899e9/websocket/test/client_test.go (about) 1 package test 2 3 import ( 4 "log" 5 "net/url" 6 "testing" 7 "time" 8 9 "github.com/gorilla/websocket" 10 ) 11 12 const ( 13 writeWait = 10 * time.Second 14 maxMessageSize = 8192 15 pongWait = 15 * time.Second 16 pingPeriod = (pongWait * 9) / 10 17 closeGracePeriod = 10 * time.Second 18 19 WSURL = "127.0.0.1:8082" 20 ) 21 22 func TestWebSocketClient(t *testing.T) { 23 24 u := url.URL{Scheme: "ws", Host: WSURL, Path: "/ws"} 25 log.Printf("connecting to %s", u.String()) 26 ws, _, err := websocket.DefaultDialer.Dial(u.String(), nil) 27 if err != nil { 28 log.Fatal("dial:", err) 29 return 30 } 31 defer func(ws *websocket.Conn) { _ = ws.Close() }(ws) 32 33 done := make(chan bool) 34 35 // ping 36 go ping(ws, done) 37 go func() { 38 for { 39 _, message, err := ws.ReadMessage() 40 if err != nil { 41 log.Println("read error:", err) 42 return 43 } 44 log.Printf("recv: %s", message) 45 } 46 }() 47 48 message := []byte("hello, world") 49 err = ws.WriteMessage(websocket.TextMessage, message) 50 if err != nil { 51 log.Fatal(err) 52 } 53 log.Printf("Send: %s\n", message) 54 55 time.Sleep(time.Second * 30) 56 done <- true 57 58 log.Println("over") 59 } 60 61 func ping(ws *websocket.Conn, done chan bool) { 62 ticker := time.NewTicker(pingPeriod) 63 go func(t *time.Ticker) { 64 defer t.Stop() 65 for { 66 select { 67 case <-ticker.C: 68 if err := ws.WriteControl( 69 websocket.PingMessage, 70 []byte("ping"), 71 time.Now().Add(writeWait)); err != nil { 72 log.Println("ping:", err) 73 } else { 74 log.Println("ping ok") 75 } 76 77 case <-done: 78 log.Println("done") 79 return 80 } 81 } 82 }(ticker) 83 }