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  }