cloudflare/cloudflared

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2019.5.0

Branches

Tags

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

Clone

HTTPS

Download ZIP

carrier/carrier_test.go

130lines · 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 options := &StartOptions{
52 OriginURL: "http://" + ts.Listener.Addr().String(),
53 Headers: nil,
54 }
55 err := StartClient(logger, buf, options)
56 assert.NoError(t, err)
57 buf.Write([]byte(message))
58
59 readBuffer := make([]byte, len(message))
60 buf.Read(readBuffer)
61 assert.Equal(t, message, string(readBuffer))
62}
63
64func TestStartServer(t *testing.T) {
65 listener, err := net.Listen("tcp", "localhost:")
66 if err != nil {
67 t.Fatalf("Error starting listener: %v", err)
68 }
69 message := "Good morning Austin! Time for another sunny day in the great state of Texas."
70 logger := logrus.New()
71 shutdownC := make(chan struct{})
72 ts := newTestWebSocketServer()
73 defer ts.Close()
74 options := &StartOptions{
75 OriginURL: "http://" + ts.Listener.Addr().String(),
76 Headers: nil,
77 }
78
79 go func() {
80 err := Serve(logger, listener, shutdownC, options)
81 if err != nil {
82 t.Fatalf("Error running server: %v", err)
83 }
84 }()
85
86 conn, err := net.Dial("tcp", listener.Addr().String())
87 conn.Write([]byte(message))
88
89 readBuffer := make([]byte, len(message))
90 conn.Read(readBuffer)
91 assert.Equal(t, string(readBuffer), message)
92}
93
94func newTestWebSocketServer() *httptest.Server {
95 upgrader := ws.Upgrader{
96 ReadBufferSize: 1024,
97 WriteBufferSize: 1024,
98 }
99
100 return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
101 conn, _ := upgrader.Upgrade(w, r, nil)
102 defer conn.Close()
103 for {
104 mt, message, err := conn.ReadMessage()
105 if err != nil {
106 break
107 }
108
109 if err := conn.WriteMessage(mt, []byte(message)); err != nil {
110 break
111 }
112 }
113 }))
114}
115
116func testRequest(t *testing.T, url string, stream io.ReadWriter) *http.Request {
117 req, err := http.NewRequest("GET", url, stream)
118 if err != nil {
119 t.Fatalf("testRequestHeader error")
120 }
121
122 req.Header.Add("Connection", "Upgrade")
123 req.Header.Add("Upgrade", "WebSocket")
124 req.Header.Add("Sec-Websocket-Key", testSecWebsocketKey)
125 req.Header.Add("Sec-Websocket-Protocol", "tunnel-protocol")
126 req.Header.Add("Sec-Websocket-Version", "13")
127 req.Header.Add("User-Agent", "curl/7.59.0")
128
129 return req
130}
131