aboutsummaryrefslogtreecommitdiff
path: root/tun2/backend_test.go
diff options
context:
space:
mode:
authorChristine Dodrill <me@christine.website>2018-10-05 10:02:55 -0700
committerChristine Dodrill <me@christine.website>2018-10-05 14:31:22 -0700
commitf84de97aac5865fc17ee28cb1af7f25005ee321b (patch)
tree92c767bacd170ba8fbff07794abb5f0951af5eb2 /tun2/backend_test.go
parentd0007f122fe353a6d3796b12f8c7dbdb753811ac (diff)
downloadx-f84de97aac5865fc17ee28cb1af7f25005ee321b.tar.xz
x-f84de97aac5865fc17ee28cb1af7f25005ee321b.zip
import libraries
Diffstat (limited to 'tun2/backend_test.go')
-rw-r--r--tun2/backend_test.go211
1 files changed, 211 insertions, 0 deletions
diff --git a/tun2/backend_test.go b/tun2/backend_test.go
new file mode 100644
index 0000000..72f4467
--- /dev/null
+++ b/tun2/backend_test.go
@@ -0,0 +1,211 @@
+package tun2
+
+import (
+ "bytes"
+ "context"
+ "encoding/json"
+ "net"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "testing"
+ "time"
+)
+
+func TestBackendAuthV1(t *testing.T) {
+ st := MockStorage()
+
+ s, err := NewServer(&ServerConfig{
+ Storage: st,
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer s.Close()
+
+ st.AddRoute(domain, user)
+ st.AddToken(token, user, []string{"connect"})
+ st.AddToken(noPermToken, user, nil)
+ st.AddToken(otherUserToken, "cadey", []string{"connect"})
+
+ cases := []struct {
+ name string
+ auth Auth
+ wantErr bool
+ }{
+ {
+ name: "basic everything should work",
+ auth: Auth{
+ Token: token,
+ Domain: domain,
+ },
+ wantErr: false,
+ },
+ {
+ name: "invalid domain",
+ auth: Auth{
+ Token: token,
+ Domain: "aw.heck",
+ },
+ wantErr: true,
+ },
+ {
+ name: "invalid token",
+ auth: Auth{
+ Token: "asdfwtweg",
+ Domain: domain,
+ },
+ wantErr: true,
+ },
+ {
+ name: "invalid token scopes",
+ auth: Auth{
+ Token: noPermToken,
+ Domain: domain,
+ },
+ wantErr: true,
+ },
+ {
+ name: "user token doesn't match domain owner",
+ auth: Auth{
+ Token: otherUserToken,
+ Domain: domain,
+ },
+ wantErr: true,
+ },
+ }
+
+ for _, cs := range cases {
+ t.Run(cs.name, func(t *testing.T) {
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ data, err := json.Marshal(cs.auth)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ _, _, err = s.backendAuthv1(ctx, bytes.NewBuffer(data))
+
+ if cs.wantErr && err == nil {
+ t.Fatalf("auth did not err as expected")
+ }
+
+ if !cs.wantErr && err != nil {
+ t.Fatalf("unexpected auth err: %v", err)
+ }
+ })
+ }
+}
+
+func TestBackendRouting(t *testing.T) {
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ st := MockStorage()
+
+ st.AddRoute(domain, user)
+ st.AddToken(token, user, []string{"connect"})
+
+ s, err := NewServer(&ServerConfig{
+ Storage: st,
+ })
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer s.Close()
+
+ l, err := net.Listen("tcp", "127.0.0.1:0")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer l.Close()
+
+ go s.Listen(l)
+
+ cases := []struct {
+ name string
+ wantStatusCode int
+ handler http.HandlerFunc
+ }{
+ {
+ name: "200 everything's okay",
+ wantStatusCode: http.StatusOK,
+ handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ http.Error(w, "HTTP 200, everything is okay :)", http.StatusOK)
+ }),
+ },
+ {
+ name: "500 internal error",
+ wantStatusCode: http.StatusInternalServerError,
+ handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ http.Error(w, "HTTP 500, the world is on fire", http.StatusInternalServerError)
+ }),
+ },
+ }
+
+ for _, cs := range cases {
+ t.Run(cs.name, func(t *testing.T) {
+ ts := httptest.NewServer(cs.handler)
+ defer ts.Close()
+
+ cc := &ClientConfig{
+ ConnType: "tcp",
+ ServerAddr: l.Addr().String(),
+ Token: token,
+ BackendURL: ts.URL,
+ Domain: domain,
+
+ forceTCPClear: true,
+ }
+
+ c, err := NewClient(cc)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ go c.Connect(ctx) // TODO: fix the client library so this ends up actually getting cleaned up
+
+ time.Sleep(125 * time.Millisecond)
+
+ req, err := http.NewRequest("GET", "http://cetacean.club/", nil)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ resp, err := s.RoundTrip(req)
+ if err != nil {
+ t.Fatalf("error in doing round trip: %v", err)
+ }
+
+ if cs.wantStatusCode != resp.StatusCode {
+ resp.Write(os.Stdout)
+ t.Fatalf("got status %d instead of %d", resp.StatusCode, cs.wantStatusCode)
+ }
+ })
+ }
+}
+
+func setupTestServer() (*Server, *mockStorage, net.Listener, error) {
+ st := MockStorage()
+
+ st.AddRoute(domain, user)
+ st.AddToken(token, user, []string{"connect"})
+
+ s, err := NewServer(&ServerConfig{
+ Storage: st,
+ })
+ if err != nil {
+ return nil, nil, nil, err
+ }
+ defer s.Close()
+
+ l, err := net.Listen("tcp", "127.0.0.1:0")
+ if err != nil {
+ return nil, nil, nil, err
+ }
+
+ go s.Listen(l)
+
+ return s, st, l, nil
+}