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  }