Skip to content
Snippets Groups Projects
http_test.go 6.13 KiB
Newer Older
  • Learn to ignore specific revisions
  • Manuel Kieweg's avatar
    Manuel Kieweg committed
    package nucleus
    
    import (
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"code.fbi.h-da.de/cocsn/gosdn/mocks"
    	"errors"
    	"github.com/google/uuid"
    	log "github.com/sirupsen/logrus"
    	"github.com/stretchr/testify/mock"
    	"net/http"
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	"testing"
    )
    
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    func testSetupHTTP() {
    
    	sbi = &OpenConfig{id: defaultSbiID}
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	sbi.Schema()
    	var err error
    
    	pnd, err = NewPND("test", "test pnd", defaultPndID, sbi)
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	if err != nil {
    		log.Fatal(err)
    	}
    	d = mockDevice()
    	tr := d.Transport.(*mocks.Transport)
    	mockError := errors.New("mock error")
    	tr.On("Get", mockContext, "/system/config/hostname").Return(mock.Anything, nil)
    	tr.On("Get", mockContext, "error").Return(mock.Anything, mockError)
    	tr.On("Set", mockContext, mock.Anything).Return(mock.Anything, nil)
    	tr.On("ProcessResponse", mock.Anything, mock.Anything, mock.Anything).Return(nil)
    	if err := pnd.AddDevice(&d); err != nil {
    		log.Fatal(err)
    	}
    
    	args = "&uuid=" + mdid.String() + "&pnd=" + defaultPndID.String() + "&sbi=" + defaultSbiID.String()
    	argsNotFound = "&uuid=" + uuid.New().String() + "&pnd=" + defaultPndID.String() + "&sbi=" + defaultSbiID.String()
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	if err := c.sbic.add(sbi); err != nil {
    		log.Fatal(err)
    	}
    	if err := c.pndc.add(pnd); err != nil {
    		log.Fatal(err)
    
    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
    		{
    			name:    "liveliness indicator",
    			request: apiEndpoint + "/livez",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "readyness indicator",
    			request: apiEndpoint + "/readyz",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "init",
    			request: apiEndpoint + "/api?q=init",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "get-ids",
    			request: apiEndpoint + "/api?q=getIDs",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "add-device",
    			request: apiEndpoint + "/api?q=addDevice" + args,
    			want:    &http.Response{StatusCode: http.StatusCreated},
    			wantErr: false,
    		},
    		{
    			name:    "request",
    			request: apiEndpoint + "/api?q=request" + args + "&path=/system/config/hostname",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "request not found",
    			request: apiEndpoint + "/api?q=request" + argsNotFound + "&path=/system/config/hostname",
    			want:    &http.Response{StatusCode: http.StatusNotFound},
    			wantErr: false,
    		},
    		{
    			name:    "request internal server error",
    			request: apiEndpoint + "/api?q=request" + args + "&path=error",
    			want:    &http.Response{StatusCode: http.StatusInternalServerError},
    			wantErr: false,
    		},
    		{
    			name:    "request-all",
    			request: apiEndpoint + "/api?q=requestAll" + args + "&path=/system/config/hostname",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "request-all internal server error",
    			request: apiEndpoint + "/api?q=requestAll" + args + "&path=error",
    			want:    &http.Response{StatusCode: http.StatusInternalServerError},
    			wantErr: false,
    		},
    
    		{
    			name:    "get-device",
    			request: apiEndpoint + "/api?q=getDevice" + args,
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "get-device not found",
    			request: apiEndpoint + "/api?q=getDevice" + argsNotFound,
    			want:    &http.Response{StatusCode: http.StatusNotFound},
    			wantErr: false,
    		},
    		{
    			name:    "set",
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    			request: apiEndpoint + "/api?q=update" + args + "&path=/system/config/hostname&value=ceos3000",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "replace",
    			request: apiEndpoint + "/api?q=replace" + args + "&path=/system/config/hostname&value=ceos3000",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "delete",
    			request: apiEndpoint + "/api?q=delete" + args + "&path=/system/config/hostname",
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		{
    			name:    "change list",
    			request: apiEndpoint + "/api?q=change-list" + args + "&path=/system/config/hostname",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "change list pending",
    			request: apiEndpoint + "/api?q=change-list-pending" + args + "&path=/system/config/hostname",
    			want:    &http.Response{StatusCode: http.StatusOK},
    			wantErr: false,
    		},
    		{
    			name:    "change commit",
    
    			request: apiEndpoint + "/api?q=change-commit" + args + "&cuid=" + cuid.String(),
    			// TODO: Mock Change for testing
    			want:    &http.Response{StatusCode: http.StatusInternalServerError},
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    			wantErr: false,
    		},
    		{
    			name:    "change confirm",
    
    			request: apiEndpoint + "/api?q=change-confirm" + args + "&cuid=" + cuid.String(),
    			// TODO: Mock Change for testing
    			want:    &http.Response{StatusCode: http.StatusInternalServerError},
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    			wantErr: false,
    		},
    		{
    			name:    "bad request",
    
    			request: apiEndpoint + "/api?q=bad-request" + args,
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    			want:    &http.Response{StatusCode: http.StatusBadRequest},
    			wantErr: false,
    		},
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		{
    			name:    "internal server errror: wrong pnd",
    			request: apiEndpoint + "/api?pnd=" + uuid.New().String(),
    			want:    &http.Response{StatusCode: http.StatusInternalServerError},
    			wantErr: false,
    		},
    		{
    			name:    "internal server errror: wrong sbi",
    			request: apiEndpoint + "/api?sbi=" + uuid.New().String(),
    			want:    &http.Response{StatusCode: http.StatusInternalServerError},
    			wantErr: false,
    		},
    	}
    
    	coreLock.Lock()
    
    	if err := httpAPI(); err != nil {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    		t.Errorf("httpApi() error = %v", err)
    		return
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    	}
    
    	coreLock.Unlock()
    
    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)
    			}
    			if tt.name == "add-device" {
    
    				for k := range pnd.(*pndImplementation).devices.store {
    
    Manuel Kieweg's avatar
    Manuel Kieweg committed
    					if k != mdid {
    						if err := pnd.RemoveDevice(k); err != nil {
    							t.Error(err)
    							return
    						}
    					}
    				}