Work on testing for AMQP

This commit is contained in:
Sonja Happ 2020-11-02 16:55:22 +01:00
parent d0c6cca76c
commit 2e64946869
2 changed files with 204 additions and 12 deletions

View file

@ -55,8 +55,7 @@ type Action struct {
} `json:"properties"`
}
type ICUpdate struct {
Status *struct {
type ICStatus struct {
UUID string `json:"uuid"`
State *string `json:"state"`
Name *string `json:"name"`
@ -67,7 +66,10 @@ type ICUpdate struct {
API_url *string `json:"api_url"`
Description *string `json:"description"`
Uptime *float64 `json:"uptime"` // TODO check if data type of uptime is float64 or int
} `json:"status"`
}
type ICUpdate struct {
Status *ICStatus `json:"status"`
// TODO add JSON start parameter scheme
}

View file

@ -22,13 +22,16 @@
package infrastructure_component
import (
"encoding/json"
"fmt"
"git.rwth-aachen.de/acs/public/villas/web-backend-go/helper"
"github.com/jinzhu/gorm/dialects/postgres"
"github.com/streadway/amqp"
"github.com/stretchr/testify/assert"
"log"
"os"
"testing"
"time"
"github.com/gin-gonic/gin"
@ -53,6 +56,21 @@ type ICRequest struct {
ManagedExternally *bool `json:"managedexternally,omitempty"`
}
type ICAction struct {
Act string `json:"action,omitempty"`
When int64 `json:"when,omitempty"`
Properties struct {
UUID *string `json:"uuid,omitempty"`
Name *string `json:"name,omitempty"`
Category *string `json:"category,omitempty"`
Type *string `json:"type,omitempty"`
Location *string `json:"location,omitempty"`
WS_url *string `json:"ws_url,omitempty"`
API_url *string `json:"api_url,omitempty"`
Description *string `json:"description,omitempty"`
} `json:"properties,omitempty"`
}
func TestMain(m *testing.M) {
err := configuration.InitConfig()
if err != nil {
@ -82,6 +100,9 @@ func TestMain(m *testing.M) {
log.Println("AMQP URI is", amqpURI)
err = ConnectAMQP(amqpURI)
if err != nil {
panic(m)
}
os.Exit(m.Run())
}
@ -539,3 +560,172 @@ func TestGetConfigsOfIC(t *testing.T) {
assert.NoError(t, err)
assert.Equalf(t, 404, code, "Response body: \n%v\n", resp)
}
func TestSendActionToIC(t *testing.T) {
database.DropTables()
database.MigrateModels()
assert.NoError(t, helper.DBAddAdminAndUserAndGuest())
// authenticate as admin
token, err := helper.AuthenticateForTest(router,
"/api/authenticate", "POST", helper.AdminCredentials)
assert.NoError(t, err)
// test POST ic/ $newICA
newICA := ICRequest{
UUID: helper.ICA.UUID,
WebsocketURL: helper.ICA.WebsocketURL,
Type: helper.ICA.Type,
Name: helper.ICA.Name,
Category: helper.ICA.Category,
State: helper.ICA.State,
Location: helper.ICA.Location,
Description: helper.ICA.Description,
StartParameterScheme: helper.ICA.StartParameterScheme,
ManagedExternally: &helper.ICA.ManagedExternally,
}
code, resp, err := helper.TestEndpoint(router, token,
"/api/ic", "POST", helper.KeyModels{"ic": newICA})
assert.NoError(t, err)
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
// Read newIC's ID from the response
newICID, err := helper.GetResponseID(resp)
assert.NoError(t, err)
// create action to be sent to IC
action1 := ICAction{
Act: "start",
When: time.Now().Unix(),
}
action1.Properties.UUID = new(string)
*action1.Properties.UUID = newICA.UUID
actions := [1]ICAction{action1}
// Send action to IC
code, resp, err = helper.TestEndpoint(router, token,
fmt.Sprintf("/api/ic/%v/action", newICID), "POST", actions)
assert.NoError(t, err)
assert.Equalf(t, 200, code, "Response body: \n%v\n", resp)
// Send malformed actions array to IC (should yield bad request)
code, resp, err = helper.TestEndpoint(router, token,
fmt.Sprintf("/api/ic/%v/action", newICID), "POST", action1)
assert.NoError(t, err)
assert.Equalf(t, 400, code, "Response body: \n%v\n", resp)
}
func TestCreateUpdateDeleteViaAMQPRecv(t *testing.T) {
database.DropTables()
database.MigrateModels()
assert.NoError(t, helper.DBAddAdminAndUserAndGuest())
// fake an IC update message
var update ICUpdate
update.Status = new(ICStatus)
update.Status.UUID = helper.ICA.UUID
update.Status.State = new(string)
*update.Status.State = "idle"
update.Status.Name = new(string)
*update.Status.Name = helper.ICA.Name
update.Status.Category = new(string)
*update.Status.Category = helper.ICA.Category
update.Status.Type = new(string)
*update.Status.Type = helper.ICA.Type
payload, err := json.Marshal(update)
assert.NoError(t, err)
msg := amqp.Publishing{
DeliveryMode: 2,
Timestamp: time.Now(),
ContentType: "application/json",
ContentEncoding: "utf-8",
Priority: 0,
Body: payload,
}
err = CheckConnection()
assert.NoError(t, err)
err = client.channel.Publish(VILLAS_EXCHANGE,
"",
false,
false,
msg)
assert.NoError(t, err)
time.Sleep(4 * time.Second)
// authenticate as admin
token, err := helper.AuthenticateForTest(router,
"/api/authenticate", "POST", helper.AdminCredentials)
assert.NoError(t, err)
// get the length of the GET all ICs response for user
number, err := helper.LengthOfResponse(router, token,
"/api/ic", "GET", nil)
assert.NoError(t, err)
assert.Equal(t, 1, number)
// modify status update
*update.Status.Name = "This is the new name"
payload, err = json.Marshal(update)
assert.NoError(t, err)
msg = amqp.Publishing{
DeliveryMode: 2,
Timestamp: time.Now(),
ContentType: "application/json",
ContentEncoding: "utf-8",
Priority: 0,
Body: payload,
}
err = client.channel.Publish(VILLAS_EXCHANGE,
"",
false,
false,
msg)
assert.NoError(t, err)
time.Sleep(4 * time.Second)
// get the length of the GET all ICs response for user
number, err = helper.LengthOfResponse(router, token,
"/api/ic", "GET", nil)
assert.NoError(t, err)
assert.Equal(t, 1, number)
// modify status update to state "gone"
*update.Status.State = "gone"
payload, err = json.Marshal(update)
assert.NoError(t, err)
msg = amqp.Publishing{
DeliveryMode: 2,
Timestamp: time.Now(),
ContentType: "application/json",
ContentEncoding: "utf-8",
Priority: 0,
Body: payload,
}
err = client.channel.Publish(VILLAS_EXCHANGE,
"",
false,
false,
msg)
assert.NoError(t, err)
time.Sleep(4 * time.Second)
// get the length of the GET all ICs response for user
number, err = helper.LengthOfResponse(router, token,
"/api/ic", "GET", nil)
assert.NoError(t, err)
assert.Equal(t, 0, number)
}
func TestCreateDeleteViaAMQPSend(t *testing.T) {
}