| // Copyright 2018 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Server unit tests |
| |
| package http |
| |
| import ( |
| "fmt" |
| "testing" |
| "time" |
| ) |
| |
| func TestServerTLSHandshakeTimeout(t *testing.T) { |
| tests := []struct { |
| s *Server |
| want time.Duration |
| }{ |
| { |
| s: &Server{}, |
| want: 0, |
| }, |
| { |
| s: &Server{ |
| ReadTimeout: -1, |
| }, |
| want: 0, |
| }, |
| { |
| s: &Server{ |
| ReadTimeout: 5 * time.Second, |
| }, |
| want: 5 * time.Second, |
| }, |
| { |
| s: &Server{ |
| ReadTimeout: 5 * time.Second, |
| WriteTimeout: -1, |
| }, |
| want: 5 * time.Second, |
| }, |
| { |
| s: &Server{ |
| ReadTimeout: 5 * time.Second, |
| WriteTimeout: 4 * time.Second, |
| }, |
| want: 4 * time.Second, |
| }, |
| { |
| s: &Server{ |
| ReadTimeout: 5 * time.Second, |
| ReadHeaderTimeout: 2 * time.Second, |
| WriteTimeout: 4 * time.Second, |
| }, |
| want: 2 * time.Second, |
| }, |
| } |
| for i, tt := range tests { |
| got := tt.s.tlsHandshakeTimeout() |
| if got != tt.want { |
| t.Errorf("%d. got %v; want %v", i, got, tt.want) |
| } |
| } |
| } |
| |
| func BenchmarkServerMatch(b *testing.B) { |
| fn := func(w ResponseWriter, r *Request) { |
| fmt.Fprintf(w, "OK") |
| } |
| mux := NewServeMux() |
| mux.HandleFunc("/", fn) |
| mux.HandleFunc("/index", fn) |
| mux.HandleFunc("/home", fn) |
| mux.HandleFunc("/about", fn) |
| mux.HandleFunc("/contact", fn) |
| mux.HandleFunc("/robots.txt", fn) |
| mux.HandleFunc("/products/", fn) |
| mux.HandleFunc("/products/1", fn) |
| mux.HandleFunc("/products/2", fn) |
| mux.HandleFunc("/products/3", fn) |
| mux.HandleFunc("/products/3/image.jpg", fn) |
| mux.HandleFunc("/admin", fn) |
| mux.HandleFunc("/admin/products/", fn) |
| mux.HandleFunc("/admin/products/create", fn) |
| mux.HandleFunc("/admin/products/update", fn) |
| mux.HandleFunc("/admin/products/delete", fn) |
| |
| paths := []string{"/", "/notfound", "/admin/", "/admin/foo", "/contact", "/products", |
| "/products/", "/products/3/image.jpg"} |
| b.StartTimer() |
| for i := 0; i < b.N; i++ { |
| if h, p := mux.match(paths[i%len(paths)]); h != nil && p == "" { |
| b.Error("impossible") |
| } |
| } |
| b.StopTimer() |
| } |