Skip to content
Snippets Groups Projects
http_test.go 1.56 KiB
Newer Older
  • Learn to ignore specific revisions
  • Manuel Kieweg's avatar
    Manuel Kieweg committed
    
    import (
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	"errors"
    	"net"
    
    Andre Sterba's avatar
    Andre Sterba committed
    	"net/http"
    	"testing"
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	"time"
    
    
    	"github.com/stretchr/testify/assert"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    )
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    func Test_httpApi(t *testing.T) {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	tests := []struct {
    		name    string
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		request string
    		want    *http.Response
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		wantErr bool
    	}{
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		{
    
    Malte Bauch's avatar
    Malte Bauch committed
    			name:    "/livez",
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    			request: apiEndpoint + "/livez",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    
    Malte Bauch's avatar
    Malte Bauch committed
    			name:    "/readyz",
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    			request: apiEndpoint + "/readyz",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    
    Malte Bauch's avatar
    Malte Bauch committed
    		{
    			name:    "/metrics",
    			request: apiEndpoint + "/metrics",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	}
    
    	coreLock.Lock()
    
    	defer coreLock.Unlock()
    	err := startHttpServer()
    	assert.NoError(t, err)
    
    	err = waitForHTTPServer()
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    	if err != nil {
    		t.Errorf("httpApi() error = %v", err)
    		return
    	}
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	for _, tt := range tests {
    		t.Run(tt.name, func(t *testing.T) {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    			got, err := http.Get(tt.request)
    			if (err != nil) != tt.wantErr {
    				t.Errorf("httpApi() error = %v, wantErr %v", err, tt.wantErr)
    				return
    			}
    			if got.StatusCode != tt.want.StatusCode {
    				t.Errorf("httpApi() got: %v, want %v", got.StatusCode, tt.want.StatusCode)
    			}
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		})
    	}
    }
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    
    // see: https://stackoverflow.com/a/56865986
    func waitForHTTPServer() error {
    	for i := 0; i < 10; i++ {
    		conn, err := net.DialTimeout("tcp", ":8080", 1*time.Second)
    		if err != nil {
    
    			time.Sleep(2 * time.Second)
    
    Fabian Seidl's avatar
    Fabian Seidl committed
    			continue
    		}
    		err = conn.Close()
    		if err != nil {
    			return err
    		}
    		return nil
    	}
    	return errors.New("http server could not be reached")
    }