github.com/GuanceCloud/cliutils@v1.1.21/dialtesting/websocket_test.go (about) 1 // Unless explicitly stated otherwise all files in this repository are licensed 2 // under the MIT License. 3 // This product includes software developed at Guance Cloud (https://www.guance.com/). 4 // Copyright 2021-present Guance, Inc. 5 6 package dialtesting 7 8 import ( 9 "fmt" 10 "net/http" 11 "net/http/httptest" 12 "net/url" 13 "strings" 14 "testing" 15 16 "github.com/gorilla/websocket" 17 ) 18 19 var cases = []struct { 20 t *WebsocketTask 21 fail bool 22 reasonCnt int 23 }{ 24 { 25 fail: false, 26 reasonCnt: 0, 27 t: &WebsocketTask{ 28 SuccessWhen: []*WebsocketSuccess{ 29 { 30 ResponseTime: []*WebsocketResponseTime{{ 31 Target: "10s", 32 }}, 33 }, 34 }, 35 ExternalID: "xxxx", Frequency: "10s", Name: "success", 36 }, 37 }, 38 { 39 fail: false, 40 reasonCnt: 1, 41 t: &WebsocketTask{ 42 SuccessWhen: []*WebsocketSuccess{ 43 { 44 ResponseTime: []*WebsocketResponseTime{{ 45 Target: "1us", 46 }}, 47 }, 48 }, 49 ExternalID: "xxxx", Frequency: "10s", Name: "response_time_large", 50 }, 51 }, 52 } 53 54 func TestWebsocket(t *testing.T) { 55 for _, c := range cases { 56 server := websocketServer() 57 defer server.Close() 58 59 urlParsed, _ := url.Parse(server.URL) 60 61 urlParsed.Scheme = "ws" 62 c.t.URL = urlParsed.String() 63 64 if err := c.t.Check(); err != nil { 65 if c.fail == false { 66 t.Errorf("case: %s, failed: %s", c.t.Name, err) 67 } else { 68 t.Logf("expected: %s", err.Error()) 69 } 70 continue 71 } 72 73 err := c.t.Run() 74 if err != nil { 75 if c.fail == false { 76 t.Errorf("case %s failed: %s", c.t.Name, err) 77 } else { 78 t.Logf("expected: %s", err.Error()) 79 } 80 continue 81 } 82 83 tags, fields := c.t.GetResults() 84 85 t.Logf("ts: %+#v \n fs: %+#v \n ", tags, fields) 86 87 reasons, _ := c.t.CheckResult() 88 if len(reasons) != c.reasonCnt { 89 t.Errorf("case %s expect %d reasons, but got %d reasons:\n\t%s", 90 c.t.Name, c.reasonCnt, len(reasons), strings.Join(reasons, "\n\t")) 91 } else if len(reasons) > 0 { 92 t.Logf("case %s reasons:\n\t%s", 93 c.t.Name, strings.Join(reasons, "\n\t")) 94 } 95 } 96 } 97 98 func websocketServer() *httptest.Server { 99 upgrader := websocket.Upgrader{} 100 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 101 // username, password, ok := r.BasicAuth() 102 // fmt.Println(username, password, ok) 103 c, err := upgrader.Upgrade(w, r, nil) 104 if err != nil { 105 fmt.Println(err) 106 return 107 } 108 defer c.Close() 109 for { 110 mt, message, err := c.ReadMessage() 111 if err != nil { 112 fmt.Println("read:", err) 113 break 114 } 115 err = c.WriteMessage(mt, message) 116 if err != nil { 117 fmt.Println(err) 118 break 119 } 120 } 121 })) 122 123 return ts 124 }