~mna/kick-archived-see-github

f1a5602a18bd0bbee7f2191f2a0e03504b512467 — Martin Angers 1 year, 7 months ago e3f133a
Fix tests and lint
5 files changed, 48 insertions(+), 30 deletions(-)

M .gitignore
M README.md
M builder/gddo_header.go
M kick.go
M kick_test.go
M .gitignore => .gitignore +3 -0
@@ 3,3 3,6 @@

# output files, e.g. for test coverage, profiles, etc.
*.out

# localhost mkcert-generated certificates
/certs

M README.md => README.md +7 -0
@@ 26,6 26,13 @@ The following enviroment variables should be set:
* `KICK_TEST_LOCALHOST_CERT` should point to the localhost certificate file.
* `KICK_TEST_LOCALHOST_KEY` should point to the localhost certificate key file.

E.g.:

```
$ mkcert -cert-file ${KICK_TEST_LOCALHOST_CERT} -key-file ${KICK_TEST_LOCALHOST_KEY} localhost 127.0.0.1 ::1

```

Additionally, to use Go modules with Go 1.11+:

* `GO111MODULE=on`

M builder/gddo_header.go => builder/gddo_header.go +2 -2
@@ 44,8 44,8 @@ func init() {
		var t octetType
		isCtl := c <= 31 || c == 127
		isChar := 0 <= c && c <= 127
		isSeparator := strings.IndexRune(" \t\"(),/:;<=>?@[]\\{}", rune(c)) >= 0
		if strings.IndexRune(" \t\r\n", rune(c)) >= 0 {
		isSeparator := strings.ContainsRune(" \t\"(),/:;<=>?@[]\\{}", rune(c))
		if strings.ContainsRune(" \t\r\n", rune(c)) {
			t |= isSpace
		}
		if isChar && !isCtl && !isSeparator {

M kick.go => kick.go +5 -0
@@ 221,6 221,11 @@ func (s *Server) ListenAndServe(ctx context.Context) error {
			err = srv.Close()
		}
		<-ch

		// if there is no Shutdown or Close error, then return the ctx.Err
		if err == nil {
			err = ctx.Err()
		}
		return err

	case <-ch:

M kick_test.go => kick_test.go +31 -28
@@ 63,14 63,12 @@ func TestServer_HTTP2(t *testing.T) {
	defer cancel()

	var wg sync.WaitGroup
	var lasErr error
	wg.Add(1)
	go func() {
		defer wg.Done()

		err := s.ListenAndServe(ctx)
		if err != nil {
			t.Fatalf("want no server error, got %s", err)
		}
		lasErr = s.ListenAndServe(ctx)
	}()

	time.Sleep(requestAfter)


@@ 89,6 87,9 @@ func TestServer_HTTP2(t *testing.T) {

	cancel()
	wg.Wait()
	if want := context.Canceled; lasErr != want {
		t.Fatalf("want ListenAndServe error to be %v; got %v", want, lasErr)
	}
}

func TestServer_HTTP2Disabled(t *testing.T) {


@@ 116,14 117,12 @@ func TestServer_HTTP2Disabled(t *testing.T) {
	defer cancel()

	var wg sync.WaitGroup
	var lasErr error
	wg.Add(1)
	go func() {
		defer wg.Done()

		err := s.ListenAndServe(ctx)
		if err != nil {
			t.Fatalf("want no server error, got %s", err)
		}
		lasErr = s.ListenAndServe(ctx)
	}()

	time.Sleep(requestAfter)


@@ 142,6 141,9 @@ func TestServer_HTTP2Disabled(t *testing.T) {

	cancel()
	wg.Wait()
	if want := context.Canceled; lasErr != want {
		t.Fatalf("want ListenAndServe error to be %v; got %v", want, lasErr)
	}
}

func TestServer_TLS(t *testing.T) {


@@ 152,7 154,7 @@ func TestServer_TLS(t *testing.T) {

	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(404)
		w.Write([]byte("ok"))
		_, _ = w.Write([]byte("ok"))
	})

	modes := []kick.TLSMode{kick.TLSDefault, kick.TLSIntermediate, kick.TLSModern}


@@ 177,14 179,12 @@ func TestServer_TLS(t *testing.T) {
			defer cancel()

			var wg sync.WaitGroup
			var lasErr error
			wg.Add(1)
			go func() {
				defer wg.Done()

				err := s.ListenAndServe(ctx)
				if err != nil {
					t.Fatalf("want no server error, got %s", err)
				}
				lasErr = s.ListenAndServe(ctx)
			}()

			time.Sleep(requestAfter)


@@ 206,6 206,9 @@ func TestServer_TLS(t *testing.T) {
			}
			cancel()
			wg.Wait()
			if want := context.Canceled; lasErr != want {
				t.Fatalf("want ListenAndServe error to be %v; got %v", want, lasErr)
			}
		})
	}
}


@@ 221,7 224,7 @@ func TestServer_GracefulShutdownSignal(t *testing.T) {

	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		time.Sleep(replyAfter)
		w.Write([]byte("ok"))
		_, _ = w.Write([]byte("ok"))
	})
	s := kick.Server{
		Builders: builder.Default,


@@ 256,7 259,7 @@ func TestServer_GracefulShutdownSignal(t *testing.T) {
	go func() {
		time.Sleep(signalAfter)
		if err := proc.Signal(syscall.SIGUSR1); err != nil {
			t.Fatalf("failed to send signal: %s", err)
			panic(fmt.Sprintf("failed to send signal: %s", err))
		}
		wg.Done()
	}()


@@ 276,12 279,12 @@ func TestServer_GracefulShutdownSignal(t *testing.T) {
	}

	wg.Wait()
	if lasErr != context.DeadlineExceeded {
		t.Fatalf("want server error %s, got %s", context.DeadlineExceeded, lasErr)
	if want := context.Canceled; lasErr != want {
		t.Fatalf("want server error %v; got %v", want, lasErr)
	}
	minDur := signalAfter + shutdownTimeout - time.Millisecond
	if dur < minDur || dur >= 2*minDur {
		// NOTE: Shutdown waits at least timeout duration or 500ms
	minDur := signalAfter
	maxDur := minDur + shutdownTimeout
	if dur < minDur || dur > maxDur {
		t.Fatalf("want server duration %s, got %s", minDur, dur)
	}
}


@@ 296,7 299,7 @@ func TestServer_GracefulShutdownCtx(t *testing.T) {

	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		time.Sleep(replyAfter)
		w.Write([]byte("ok"))
		_, _ = w.Write([]byte("ok"))
	})
	s := kick.Server{
		Builders: builder.Default,


@@ 342,9 345,9 @@ func TestServer_GracefulShutdownCtx(t *testing.T) {
	if lasErr != context.DeadlineExceeded {
		t.Fatalf("want server error %s, got %s", context.DeadlineExceeded, lasErr)
	}
	minDur := shutdownAfter + shutdownTimeout - time.Millisecond
	if dur < minDur || dur >= 2*minDur {
		// NOTE: Shutdown waits at least timeout duration or 500ms
	minDur := shutdownAfter
	maxDur := minDur + shutdownTimeout
	if dur < minDur || dur > maxDur {
		t.Fatalf("want server duration %s, got %s", minDur, dur)
	}
}


@@ 411,8 414,8 @@ func TestServer_ServerState(t *testing.T) {

	// should start and stop properly until cancelled
	err := s.ListenAndServe(ctx)
	if err != nil {
		t.Fatalf("want no error, got %s", err)
	if want := context.DeadlineExceeded; err != want {
		t.Fatalf("want ListeAndServe error %v; got %v", want, err)
	}
	const wantStates = "StateNewStateListeningStateShutdownStateClosed"
	if states != wantStates {


@@ 489,8 492,8 @@ func TestServer_DefaultBuilders(t *testing.T) {
	start := time.Now()
	err := s.ListenAndServe(ctx)
	dur := time.Since(start)
	if err != nil {
		t.Fatalf("want no error, got %s", err)
	if want := context.DeadlineExceeded; err != want {
		t.Fatalf("want ListenAndServe error %v; got %v", want, err)
	}
	minDur := timeout - time.Millisecond
	if dur < minDur || dur >= 2*minDur {