[tor-commits] [snowflake/master] Test proxy-go interactions with broker

cohosh at torproject.org cohosh at torproject.org
Wed Nov 13 19:34:25 UTC 2019


commit 459286c143fbcaaa76e183362acd0bf69245ba79
Author: Cecylia Bocovich <cohosh at torproject.org>
Date:   Wed Jun 12 15:38:57 2019 -0400

    Test proxy-go interactions with broker
---
 proxy-go/proxy-go_test.go | 143 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 143 insertions(+)

diff --git a/proxy-go/proxy-go_test.go b/proxy-go/proxy-go_test.go
index d969acb..a09dcc3 100644
--- a/proxy-go/proxy-go_test.go
+++ b/proxy-go/proxy-go_test.go
@@ -1,15 +1,56 @@
 package main
 
 import (
+	"bytes"
+	"fmt"
 	"io"
+	"io/ioutil"
 	"net"
+	"net/http"
+	"net/url"
 	"strings"
 	"testing"
 
+	"git.torproject.org/pluggable-transports/snowflake.git/common/messages"
 	"github.com/pion/webrtc"
 	. "github.com/smartystreets/goconvey/convey"
 )
 
+// Set up a mock broker to communicate with
+type MockTransport struct {
+	statusOverride int
+	body           []byte
+}
+
+// Just returns a response with fake SDP answer.
+func (m *MockTransport) RoundTrip(req *http.Request) (*http.Response, error) {
+	s := ioutil.NopCloser(bytes.NewReader(m.body))
+	r := &http.Response{
+		StatusCode: m.statusOverride,
+		Body:       s,
+	}
+	return r, nil
+}
+
+// Set up a mock faulty transport
+type FaultyTransport struct {
+	statusOverride int
+	body           []byte
+}
+
+// Just returns a response with fake SDP answer.
+func (f *FaultyTransport) RoundTrip(req *http.Request) (*http.Response, error) {
+	return nil, fmt.Errorf("TransportFailed")
+}
+
+const SDP = "v=0\r\no=- 4358805017720277108 2 IN IP4 8.8.8.8\r\ns=-\r\nt=0 0\r\na=group:BUNDLE data\r\na=msid-semantic: WMS\r\nm=application 56688 DTLS/SCTP 5000\r\nc=IN IP4 8.8.8.8\r\na=candidate:3769337065 1 udp 2122260223 8.8.8.8 56688 typ host generation 0 network-id 1 network-cost 50\r\na=candidate:2921887769 1 tcp 1518280447 8.8.8.8 35441 typ host tcptype passive generation 0 network-id 1 network-cost 50\r\na=ice-ufrag:aMAZ\r\na=ice-pwd:jcHb08Jjgrazp2dzjdrvPPvV\r\na=ice-options:trickle\r\na=fingerprint:sha-256 C8:88:EE:B9:E7:02:2E:21:37:ED:7A:D1:EB:2B:A3:15:A2:3B:5B:1C:3D:D4:D5:1F:06:CF:52:40:03:F8:DD:66\r\na=setup:actpass\r\na=mid:data\r\na=sctpmap:5000 webrtc-datachannel 1024\r\n"
+
+const sampleSDP = `"v=0\r\no=- 4358805017720277108 2 IN IP4 8.8.8.8\r\ns=-\r\nt=0 0\r\na=group:BUNDLE data\r\na=msid-semantic: WMS\r\nm=application 56688 DTLS/SCTP 5000\r\nc=IN IP4 8.8.8.8\r\na=candidate:3769337065 1 udp 2122260223 8.8.8.8 56688 typ host generation 0 network-id 1 network-cost 50\r\na=candidate:2921887769 1 tcp 1518280447 8.8.8.8 35441 typ host tcptype passive generation 0 network-id 1 network-cost 50\r\na=ice-ufrag:aMAZ\r\na=ice-pwd:jcHb08Jjgrazp2dzjdrvPPvV\r\na=ice-options:trickle\r\na=fingerprint:sha-256 C8:88:EE:B9:E7:02:2E:21:37:ED:7A:D1:EB:2B:A3:15:A2:3B:5B:1C:3D:D4:D5:1F:06:CF:52:40:03:F8:DD:66\r\na=setup:actpass\r\na=mid:data\r\na=sctpmap:5000 webrtc-datachannel 1024\r\n"`
+
+var sampleOffer = `{"type":"offer","sdp":` + sampleSDP + `}`
+
+const sampleAnswer = `{"type":"answer","sdp":` + sampleSDP + `}`
+
 func TestRemoteIPFromSDP(t *testing.T) {
 	tests := []struct {
 		sdp      string
@@ -186,6 +227,108 @@ func TestSessionDescriptions(t *testing.T) {
 	})
 }
 
+func TestBrokerInteractions(t *testing.T) {
+	Convey("Proxy connections to broker", t, func() {
+		broker := new(Broker)
+		broker.url, _ = url.Parse("localhost")
+
+		//Mock peerConnection
+		config = webrtc.Configuration{
+			ICEServers: []webrtc.ICEServer{
+				{
+					URLs: []string{"stun:stun.l.google.com:19302"},
+				},
+			},
+		}
+		pc, _ := webrtc.NewPeerConnection(config)
+		offer := deserializeSessionDescription(sampleOffer)
+		pc.SetRemoteDescription(*offer)
+		answer, _ := pc.CreateAnswer(nil)
+		pc.SetLocalDescription(answer)
+
+		Convey("polls broker correctly", func() {
+			var err error
+
+			b, err := messages.EncodePollResponse(sampleOffer, true)
+			So(err, ShouldEqual, nil)
+			broker.transport = &MockTransport{
+				http.StatusOK,
+				b,
+			}
+
+			sdp := broker.pollOffer(sampleOffer)
+			So(sdp.SDP, ShouldEqual, SDP)
+		})
+		Convey("handles poll error", func() {
+			var err error
+
+			b := []byte("test")
+			So(err, ShouldEqual, nil)
+			broker.transport = &MockTransport{
+				http.StatusOK,
+				b,
+			}
+
+			sdp := broker.pollOffer(sampleOffer)
+			So(sdp, ShouldBeNil)
+		})
+		Convey("sends answer to broker", func() {
+			var err error
+
+			b, err := messages.EncodeAnswerResponse(true)
+			So(err, ShouldEqual, nil)
+			broker.transport = &MockTransport{
+				http.StatusOK,
+				b,
+			}
+
+			err = broker.sendAnswer(sampleAnswer, pc)
+			So(err, ShouldEqual, nil)
+
+			b, err = messages.EncodeAnswerResponse(false)
+			So(err, ShouldEqual, nil)
+			broker.transport = &MockTransport{
+				http.StatusOK,
+				b,
+			}
+
+			err = broker.sendAnswer(sampleAnswer, pc)
+			So(err, ShouldNotBeNil)
+		})
+		Convey("handles answer error", func() {
+			//Error if faulty transport
+			broker.transport = &FaultyTransport{}
+			err := broker.sendAnswer(sampleAnswer, pc)
+			So(err, ShouldNotBeNil)
+
+			//Error if status code is not ok
+			broker.transport = &MockTransport{
+				http.StatusGone,
+				[]byte(""),
+			}
+			err = broker.sendAnswer("test", pc)
+			So(err, ShouldNotEqual, nil)
+			So(err.Error(), ShouldResemble, "broker returned 410")
+
+			//Error if we can't parse broker message
+			broker.transport = &MockTransport{
+				http.StatusOK,
+				[]byte("test"),
+			}
+			err = broker.sendAnswer("test", pc)
+			So(err, ShouldNotBeNil)
+
+			//Error if broker message surpasses read limit
+			broker.transport = &MockTransport{
+				http.StatusOK,
+				make([]byte, 100001),
+			}
+			err = broker.sendAnswer("test", pc)
+			So(err, ShouldNotBeNil)
+		})
+	})
+}
+
 func TestUtilityFuncs(t *testing.T) {
 	Convey("LimitedRead", t, func() {
 		c, s := net.Pipe()





More information about the tor-commits mailing list