tun2: make Server benchmarks, disabled for now

This commit is contained in:
Cadey Ratio 2017-10-04 10:17:07 -07:00
parent 0b46f035c6
commit 73f278aed2
2 changed files with 103 additions and 5 deletions

View File

@ -135,7 +135,7 @@ func (s *Server) Wait() {
// Listen passes this Server a given net.Listener to accept backend connections. // Listen passes this Server a given net.Listener to accept backend connections.
func (s *Server) Listen(l net.Listener, isKCP bool) { func (s *Server) Listen(l net.Listener, isKCP bool) {
ctx := context.Background() ctx := s.ctx
f := ln.F{ f := ln.F{
"listener_addr": l.Addr(), "listener_addr": l.Addr(),
@ -143,6 +143,12 @@ func (s *Server) Listen(l net.Listener, isKCP bool) {
} }
for { for {
select {
case <-ctx.Done():
return
default:
}
conn, err := l.Accept() conn, err := l.Accept()
if err != nil { if err != nil {
ln.Error(ctx, err, f, ln.Action("accept connection")) 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 { if err != nil {
connection.cancel() connection.cancel()
} }
case <-s.ctx.Done(): // case <-s.ctx.Done():
s.removeConn(ctx, connection) // ln.Log(ctx, connection, ln.Action("server context finished"))
connection.Close() // s.removeConn(ctx, connection)
// connection.Close()
return // return
case <-ctx.Done(): case <-ctx.Done():
ln.Log(ctx, connection, ln.Action("client context finished"))
s.removeConn(ctx, connection) s.removeConn(ctx, connection)
connection.Close() connection.Close()

View File

@ -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)
}
}
}