github.com/Jeffail/benthos/v3@v3.65.0/lib/input/reader/websocket_test.go (about) 1 package reader 2 3 import ( 4 "net/http" 5 "net/http/httptest" 6 "net/url" 7 "sync" 8 "testing" 9 "time" 10 11 "github.com/Jeffail/benthos/v3/lib/log" 12 "github.com/Jeffail/benthos/v3/lib/metrics" 13 "github.com/Jeffail/benthos/v3/lib/types" 14 "github.com/gorilla/websocket" 15 ) 16 17 func TestWebsocketBasic(t *testing.T) { 18 expMsgs := []string{ 19 "foo", 20 "bar", 21 "baz", 22 } 23 24 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 25 upgrader := websocket.Upgrader{} 26 27 var ws *websocket.Conn 28 var err error 29 if ws, err = upgrader.Upgrade(w, r, nil); err != nil { 30 return 31 } 32 33 defer ws.Close() 34 35 for _, msg := range expMsgs { 36 if err = ws.WriteMessage(websocket.BinaryMessage, []byte(msg)); err != nil { 37 t.Error(err) 38 } 39 } 40 })) 41 42 conf := NewWebsocketConfig() 43 if wsURL, err := url.Parse(server.URL); err != nil { 44 t.Fatal(err) 45 } else { 46 wsURL.Scheme = "ws" 47 conf.URL = wsURL.String() 48 } 49 50 m, err := NewWebsocket(conf, log.Noop(), metrics.Noop()) 51 if err != nil { 52 t.Fatal(err) 53 } 54 55 if err = m.Connect(); err != nil { 56 t.Fatal(err) 57 } 58 59 for _, exp := range expMsgs { 60 var actMsg types.Message 61 if actMsg, err = m.Read(); err != nil { 62 t.Error(err) 63 } else if act := string(actMsg.Get(0).Get()); act != exp { 64 t.Errorf("Wrong result: %v != %v", act, exp) 65 } 66 if err = m.Acknowledge(nil); err != nil { 67 t.Error(err) 68 } 69 } 70 71 m.CloseAsync() 72 if err = m.WaitForClose(time.Second); err != nil { 73 t.Error(err) 74 } 75 } 76 77 func TestWebsocketOpenMsg(t *testing.T) { 78 expMsgs := []string{ 79 "foo", 80 "bar", 81 "baz", 82 } 83 84 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 85 upgrader := websocket.Upgrader{} 86 87 var ws *websocket.Conn 88 var err error 89 if ws, err = upgrader.Upgrade(w, r, nil); err != nil { 90 return 91 } 92 93 defer ws.Close() 94 95 _, data, err := ws.ReadMessage() 96 if err != nil { 97 t.Fatal(err) 98 } 99 if exp, act := "hello world", string(data); exp != act { 100 t.Errorf("Wrong open message: %v != %v", act, exp) 101 } 102 103 for _, msg := range expMsgs { 104 if err = ws.WriteMessage(websocket.BinaryMessage, []byte(msg)); err != nil { 105 t.Error(err) 106 } 107 } 108 })) 109 110 conf := NewWebsocketConfig() 111 conf.OpenMsg = "hello world" 112 if wsURL, err := url.Parse(server.URL); err != nil { 113 t.Fatal(err) 114 } else { 115 wsURL.Scheme = "ws" 116 conf.URL = wsURL.String() 117 } 118 119 m, err := NewWebsocket(conf, log.Noop(), metrics.Noop()) 120 if err != nil { 121 t.Fatal(err) 122 } 123 124 if err = m.Connect(); err != nil { 125 t.Fatal(err) 126 } 127 128 for _, exp := range expMsgs { 129 var actMsg types.Message 130 if actMsg, err = m.Read(); err != nil { 131 t.Error(err) 132 } else if act := string(actMsg.Get(0).Get()); act != exp { 133 t.Errorf("Wrong result: %v != %v", act, exp) 134 } 135 if err = m.Acknowledge(nil); err != nil { 136 t.Error(err) 137 } 138 } 139 140 m.CloseAsync() 141 if err = m.WaitForClose(time.Second); err != nil { 142 t.Error(err) 143 } 144 } 145 146 func TestWebsocketClose(t *testing.T) { 147 closeChan := make(chan struct{}) 148 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 149 upgrader := websocket.Upgrader{} 150 151 var ws *websocket.Conn 152 var err error 153 if ws, err = upgrader.Upgrade(w, r, nil); err != nil { 154 return 155 } 156 157 defer ws.Close() 158 <-closeChan 159 })) 160 161 conf := NewWebsocketConfig() 162 if wsURL, err := url.Parse(server.URL); err != nil { 163 t.Fatal(err) 164 } else { 165 wsURL.Scheme = "ws" 166 conf.URL = wsURL.String() 167 } 168 169 m, err := NewWebsocket(conf, log.Noop(), metrics.Noop()) 170 if err != nil { 171 t.Fatal(err) 172 } 173 174 if err = m.Connect(); err != nil { 175 t.Fatal(err) 176 } 177 178 wg := sync.WaitGroup{} 179 wg.Add(1) 180 go func() { 181 m.CloseAsync() 182 if cErr := m.WaitForClose(time.Second); cErr != nil { 183 t.Error(cErr) 184 } 185 wg.Done() 186 }() 187 188 if _, err = m.Read(); err != types.ErrTypeClosed && err != types.ErrNotConnected { 189 t.Errorf("Wrong error: %v != %v", err, types.ErrTypeClosed) 190 } 191 192 wg.Wait() 193 close(closeChan) 194 }