From 73f278aed2dc517fd015c8f361c6dacf334eb815 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Wed, 4 Oct 2017 10:17:07 -0700 Subject: [PATCH] tun2: make Server benchmarks, disabled for now --- internal/tun2/server.go | 18 ++++++-- internal/tun2/server_test.go | 90 ++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 5 deletions(-) diff --git a/internal/tun2/server.go b/internal/tun2/server.go index 810c1d0..587d796 100644 --- a/internal/tun2/server.go +++ b/internal/tun2/server.go @@ -135,7 +135,7 @@ func (s *Server) Wait() { // Listen passes this Server a given net.Listener to accept backend connections. func (s *Server) Listen(l net.Listener, isKCP bool) { - ctx := context.Background() + ctx := s.ctx f := ln.F{ "listener_addr": l.Addr(), @@ -143,6 +143,12 @@ func (s *Server) Listen(l net.Listener, isKCP bool) { } for { + select { + case <-ctx.Done(): + return + default: + } + conn, err := l.Accept() if err != nil { ln.Error(ctx, err, f, ln.Action("accept connection")) @@ -326,12 +332,14 @@ func (s *Server) HandleConn(c net.Conn, isKCP bool) { if err != nil { connection.cancel() } - case <-s.ctx.Done(): - s.removeConn(ctx, connection) - connection.Close() + // case <-s.ctx.Done(): + // ln.Log(ctx, connection, ln.Action("server context finished")) + // s.removeConn(ctx, connection) + // connection.Close() - return + // return case <-ctx.Done(): + ln.Log(ctx, connection, ln.Action("client context finished")) s.removeConn(ctx, connection) connection.Close() diff --git a/internal/tun2/server_test.go b/internal/tun2/server_test.go index 4ce5623..00a3464 100644 --- a/internal/tun2/server_test.go +++ b/internal/tun2/server_test.go @@ -232,3 +232,93 @@ func TestBackendRouting(t *testing.T) { }) } } + +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, false) + + return s, st, l, nil +} + +func BenchmarkHTTP200(b *testing.B) { + b.Skip("this benchmark doesn't work yet") + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + s, _, l, err := setupTestServer() + if err != nil { + b.Fatal(err) + } + defer s.Close() + defer l.Close() + + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) + 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 { + b.Fatal(err) + } + + go c.Connect(ctx) // TODO: fix the client library so this ends up actually getting cleaned up + + for { + r := s.GetBackendsForDomain(domain) + if len(r) == 0 { + time.Sleep(125 * time.Millisecond) + continue + } + + break + } + + req, err := http.NewRequest("GET", "http://cetacean.club/", nil) + if err != nil { + b.Fatal(err) + } + + _, err = s.RoundTrip(req) + if err != nil { + b.Fatalf("got error on initial request exchange: %v", err) + } + + for n := 0; n < b.N; n++ { + resp, err := s.RoundTrip(req) + if err != nil { + b.Fatalf("got error on %d: %v", n, err) + } + + if resp.StatusCode != http.StatusOK { + b.Fail() + b.Logf("got %d instead of 200", resp.StatusCode) + } + } +}