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  }