Skip to content
Snippets Groups Projects
Commit 0e861ab6 authored by Manuel Kieweg's avatar Manuel Kieweg
Browse files

tests for http api

parent f5d1b6f9
Branches
Tags
3 merge requests!120Resolve "Code Quality",!119Draft: Resolve "Tests for HTTP API and CLI",!90Develop
Pipeline #67260 passed with warnings
...@@ -47,6 +47,7 @@ func TestMain(m *testing.M) { ...@@ -47,6 +47,7 @@ func TestMain(m *testing.M) {
testSetupPnd() testSetupPnd()
testSetupStore() testSetupStore()
testSetupSbi() testSetupSbi()
testSetupHttp()
testSetupIntegration() testSetupIntegration()
os.Exit(m.Run()) os.Exit(m.Run())
} }
......
...@@ -10,13 +10,11 @@ import ( ...@@ -10,13 +10,11 @@ import (
"net/url" "net/url"
) )
const basePath = "/api"
// deprecated // deprecated
func httpApi() (err error) { func httpApi() (err error) {
http.HandleFunc(basePath, httpHandler) http.HandleFunc("/api", httpHandler)
http.HandleFunc("/livez", healthCheck) http.HandleFunc("/livez", healthCheck)
http.HandleFunc("/readyz", healthCheck) http.HandleFunc("/readyz", readynessCheck)
go func() { go func() {
err = http.ListenAndServe(":8080", nil) err = http.ListenAndServe(":8080", nil)
...@@ -31,6 +29,10 @@ func healthCheck(writer http.ResponseWriter, request *http.Request) { ...@@ -31,6 +29,10 @@ func healthCheck(writer http.ResponseWriter, request *http.Request) {
writer.WriteHeader(http.StatusOK) writer.WriteHeader(http.StatusOK)
} }
func readynessCheck(writer http.ResponseWriter, request *http.Request) {
writer.WriteHeader(http.StatusOK)
}
// nolint // nolint
func httpHandler(writer http.ResponseWriter, request *http.Request) { func httpHandler(writer http.ResponseWriter, request *http.Request) {
log.WithFields(log.Fields{ log.WithFields(log.Fields{
...@@ -40,6 +42,7 @@ func httpHandler(writer http.ResponseWriter, request *http.Request) { ...@@ -40,6 +42,7 @@ func httpHandler(writer http.ResponseWriter, request *http.Request) {
query, err := url.ParseQuery(request.URL.RawQuery) query, err := url.ParseQuery(request.URL.RawQuery)
if err != nil { if err != nil {
log.Error(err) log.Error(err)
writer.WriteHeader(http.StatusBadRequest)
return return
} }
...@@ -64,9 +67,19 @@ func httpHandler(writer http.ResponseWriter, request *http.Request) { ...@@ -64,9 +67,19 @@ func httpHandler(writer http.ResponseWriter, request *http.Request) {
pnd, err = c.pndc.get(pid) pnd, err = c.pndc.get(pid)
if err != nil { if err != nil {
log.Error(err) log.Error(err)
writer.WriteHeader(http.StatusInternalServerError)
return
} }
sbic := pnd.GetSBIs() sbic := pnd.GetSBIs()
sbi, err = sbic.(*sbiStore).get(sid) sbi, err = sbic.(*sbiStore).get(sid)
if err != nil {
log.WithFields(log.Fields{
"requested uuid": sid,
"available uuids": sbic.(*sbiStore).UUIDs(),
}).Error(err)
writer.WriteHeader(http.StatusInternalServerError)
return
}
} }
switch query.Get("q") { switch query.Get("q") {
...@@ -84,7 +97,7 @@ func httpHandler(writer http.ResponseWriter, request *http.Request) { ...@@ -84,7 +97,7 @@ func httpHandler(writer http.ResponseWriter, request *http.Request) {
}) })
err = pnd.AddDevice(d) err = pnd.AddDevice(d)
if err != nil { if err != nil {
writer.WriteHeader(http.StatusBadRequest) writer.WriteHeader(http.StatusInternalServerError)
log.Error(err) log.Error(err)
return return
} }
......
package nucleus
import (
"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"
"testing"
)
const apiEndpoint = "http://localhost:8080"
var sbi SouthboundInterface
var pnd PrincipalNetworkDomain
var args string
var argsNotFound string
var d Device
func testSetupHttp() {
testSetupPnd()
sbi = &OpenConfig{id: defaultSbiId}
sbi.Schema()
var err error
pnd, err = NewPND("test", "test pnd", defaultPndId, sbi)
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()
c = &Core{
pndc: pndStore{store{}},
sbic: sbiStore{store{}},
}
if err := c.sbic.add(sbi); err != nil {
log.Fatal(err)
}
if err := c.pndc.add(pnd); err != nil {
log.Fatal(err)
}
}
func Test_httpApi(t *testing.T) {
tests := []struct {
name string
request string
want *http.Response
wantErr bool
}{
{
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",
request: apiEndpoint + "/api?q=set" + args + "&path=/system/config/hostname&value=ceos3000",
want: &http.Response{StatusCode: http.StatusOK},
wantErr: false,
},
{
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,
},
}
if err := httpApi(); err != nil {
t.Errorf("httpApi() error = %v", err)
return
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
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{
if k != mdid {
if err := pnd.RemoveDevice(k); err != nil {
t.Error(err)
return
}
}
}
}
})
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment