cloudflare/cloudflared

Public

mirrored from https://github.com/cloudflare/cloudflaredAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2019.2.1

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

carrier/carrier_test.go

122lines · modecode

1package carrier
2
3import (
4 "bytes"
5 "io"
6 "net"
7 "net/http"
8 "net/http/httptest"
9 "sync"
10 "testing"
11
12 ws "github.com/gorilla/websocket"
13 "github.com/sirupsen/logrus"
14 "github.com/stretchr/testify/assert"
15)
16
17const (
18 // example in Sec-Websocket-Key in rfc6455
19 testSecWebsocketKey = "dGhlIHNhbXBsZSBub25jZQ=="
20)
21
22type testStreamer struct {
23 buf *bytes.Buffer
24 l sync.RWMutex
25}
26
27func newTestStream() *testStreamer {
28 return &testStreamer{buf: new(bytes.Buffer)}
29}
30
31func (s *testStreamer) Read(p []byte) (int, error) {
32 s.l.RLock()
33 defer s.l.RUnlock()
34 return s.buf.Read(p)
35
36}
37
38func (s *testStreamer) Write(p []byte) (int, error) {
39 s.l.Lock()
40 defer s.l.Unlock()
41 return s.buf.Write(p)
42}
43
44func TestStartClient(t *testing.T) {
45 message := "Good morning Austin! Time for another sunny day in the great state of Texas."
46 logger := logrus.New()
47 ts := newTestWebSocketServer()
48 defer ts.Close()
49
50 buf := newTestStream()
51 err := StartClient(logger, "http://"+ts.Listener.Addr().String(), buf, nil)
52 assert.NoError(t, err)
53 buf.Write([]byte(message))
54
55 readBuffer := make([]byte, len(message))
56 buf.Read(readBuffer)
57 assert.Equal(t, message, string(readBuffer))
58}
59
60func TestStartServer(t *testing.T) {
61 listenerAddress := "localhost:1117"
62 message := "Good morning Austin! Time for another sunny day in the great state of Texas."
63 logger := logrus.New()
64 shutdownC := make(chan struct{})
65 ts := newTestWebSocketServer()
66 defer ts.Close()
67
68 go func() {
69 err := StartServer(logger, listenerAddress, "http://"+ts.Listener.Addr().String(), shutdownC, nil)
70 if err != nil {
71 t.Fatalf("Error starting server: %v", err)
72 }
73 }()
74
75 conn, err := net.Dial("tcp", listenerAddress)
76 if err != nil {
77 t.Fatalf("Error connecting to server: %v", err)
78 }
79 conn.Write([]byte(message))
80
81 readBuffer := make([]byte, len(message))
82 conn.Read(readBuffer)
83 assert.Equal(t, string(readBuffer), message)
84}
85
86func newTestWebSocketServer() *httptest.Server {
87 upgrader := ws.Upgrader{
88 ReadBufferSize: 1024,
89 WriteBufferSize: 1024,
90 }
91
92 return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
93 conn, _ := upgrader.Upgrade(w, r, nil)
94 defer conn.Close()
95 for {
96 mt, message, err := conn.ReadMessage()
97 if err != nil {
98 break
99 }
100
101 if err := conn.WriteMessage(mt, []byte(message)); err != nil {
102 break
103 }
104 }
105 }))
106}
107
108func testRequest(t *testing.T, url string, stream io.ReadWriter) *http.Request {
109 req, err := http.NewRequest("GET", url, stream)
110 if err != nil {
111 t.Fatalf("testRequestHeader error")
112 }
113
114 req.Header.Add("Connection", "Upgrade")
115 req.Header.Add("Upgrade", "WebSocket")
116 req.Header.Add("Sec-Websocket-Key", testSecWebsocketKey)
117 req.Header.Add("Sec-Websocket-Protocol", "tunnel-protocol")
118 req.Header.Add("Sec-Websocket-Version", "13")
119 req.Header.Add("User-Agent", "curl/7.59.0")
120
121 return req
122}
123