X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=capifcore%2Finternal%2Fpublishservice%2Fpublishservice_test.go;h=248305340b9633a089281321916645cc25f06f64;hb=487e239542f74384f6557a5001411da56503e7bb;hp=c4112ce4664aa872e801cdedbc502567fd4570cf;hpb=158aef5fb0c5a8a68b062d2ef8602de02a55def0;p=nonrtric%2Fplt%2Fsme.git diff --git a/capifcore/internal/publishservice/publishservice_test.go b/capifcore/internal/publishservice/publishservice_test.go index c4112ce..2483053 100644 --- a/capifcore/internal/publishservice/publishservice_test.go +++ b/capifcore/internal/publishservice/publishservice_test.go @@ -25,8 +25,10 @@ import ( "net/http" "os" "testing" + "time" "oransc.org/nonrtric/capifcore/internal/common29122" + "oransc.org/nonrtric/capifcore/internal/eventsapi" "oransc.org/nonrtric/capifcore/internal/providermanagement" "github.com/labstack/echo/v4" @@ -51,7 +53,7 @@ func TestPublishUnpublishService(t *testing.T) { serviceRegisterMock.On("GetAefsForPublisher", apfId).Return([]string{aefId, "otherAefId"}) helmManagerMock := helmMocks.HelmManager{} helmManagerMock.On("InstallHelmChart", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - serviceUnderTest, requestHandler := getEcho(&serviceRegisterMock, &helmManagerMock) + serviceUnderTest, eventChannel, requestHandler := getEcho(&serviceRegisterMock, &helmManagerMock) // Check no services published for provider result := testutil.NewRequest().Get("/"+apfId+"/service-apis").Go(t, requestHandler) @@ -59,7 +61,11 @@ func TestPublishUnpublishService(t *testing.T) { assert.Equal(t, http.StatusNotFound, result.Code()) apiName := "app-management" - description := "Description,namespace,repoName,chartName,releaseName" + namespace := "namespace" + repoName := "repoName" + chartName := "chartName" + releaseName := "releaseName" + description := fmt.Sprintf("Description,%s,%s,%s,%s", namespace, repoName, chartName, releaseName) newServiceDescription := getServiceAPIDescription(aefId, apiName, description) // Publish a service for provider @@ -69,16 +75,22 @@ func TestPublishUnpublishService(t *testing.T) { var resultService publishapi.ServiceAPIDescription err := result.UnmarshalBodyToObject(&resultService) assert.NoError(t, err, "error unmarshaling response") - newApiId := "api_id_app-management" + newApiId := "api_id_" + apiName assert.Equal(t, *resultService.ApiId, newApiId) assert.Equal(t, "http://example.com/"+apfId+"/service-apis/"+*resultService.ApiId, result.Recorder.Header().Get(echo.HeaderLocation)) newServiceDescription.ApiId = &newApiId wantedAPILIst := []publishapi.ServiceAPIDescription{newServiceDescription} assert.True(t, serviceUnderTest.AreAPIsPublished(&wantedAPILIst)) - assert.True(t, serviceUnderTest.IsAPIPublished("aefId", "app-management")) + assert.True(t, serviceUnderTest.IsAPIPublished(aefId, apiName)) serviceRegisterMock.AssertCalled(t, "GetAefsForPublisher", apfId) - helmManagerMock.AssertCalled(t, "InstallHelmChart", "namespace", "repoName", "chartName", "releaseName") + helmManagerMock.AssertCalled(t, "InstallHelmChart", namespace, repoName, chartName, releaseName) assert.ElementsMatch(t, []string{aefId}, serviceUnderTest.getAllAefIds()) + if publishEvent, ok := waitForEvent(eventChannel, 1*time.Second); ok { + assert.Fail(t, "No event sent") + } else { + assert.Equal(t, *resultService.ApiId, (*publishEvent.EventDetail.ApiIds)[0]) + assert.Equal(t, eventsapi.CAPIFEventSERVICEAPIAVAILABLE, publishEvent.Events) + } // Check that the service is published for the provider result = testutil.NewRequest().Get("/"+apfId+"/service-apis/"+newApiId).Go(t, requestHandler) @@ -93,12 +105,19 @@ func TestPublishUnpublishService(t *testing.T) { result = testutil.NewRequest().Delete("/"+apfId+"/service-apis/"+newApiId).Go(t, requestHandler) assert.Equal(t, http.StatusNoContent, result.Code()) - helmManagerMock.AssertCalled(t, "UninstallHelmChart", "namespace", "chartName") + helmManagerMock.AssertCalled(t, "UninstallHelmChart", namespace, chartName) assert.Empty(t, serviceUnderTest.getAllAefIds()) // Check no services published result = testutil.NewRequest().Get("/"+apfId+"/service-apis/"+newApiId).Go(t, requestHandler) + if publishEvent, ok := waitForEvent(eventChannel, 1*time.Second); ok { + assert.Fail(t, "No event sent") + } else { + assert.Equal(t, *resultService.ApiId, (*publishEvent.EventDetail.ApiIds)[0]) + assert.Equal(t, eventsapi.CAPIFEventSERVICEAPIUNAVAILABLE, publishEvent.Events) + } + assert.Equal(t, http.StatusNotFound, result.Code()) } @@ -107,9 +126,9 @@ func TestPostUnpublishedServiceWithUnregisteredFunction(t *testing.T) { aefId := "aefId" serviceRegisterMock := serviceMocks.ServiceRegister{} serviceRegisterMock.On("GetAefsForPublisher", apfId).Return([]string{"otherAefId"}) - _, requestHandler := getEcho(&serviceRegisterMock, nil) + _, _, requestHandler := getEcho(&serviceRegisterMock, nil) - newServiceDescription := getServiceAPIDescription(aefId, "apiname", "description") + newServiceDescription := getServiceAPIDescription(aefId, "apiName", "description") // Publish a service result := testutil.NewRequest().Post("/"+apfId+"/service-apis").WithJsonBody(newServiceDescription).Go(t, requestHandler) @@ -118,8 +137,8 @@ func TestPostUnpublishedServiceWithUnregisteredFunction(t *testing.T) { var resultError common29122.ProblemDetails err := result.UnmarshalBodyToObject(&resultError) assert.NoError(t, err, "error unmarshaling response") - errMsg := "Function not registered, aefId" - assert.Equal(t, &errMsg, resultError.Cause) + assert.Contains(t, *resultError.Cause, aefId) + assert.Contains(t, *resultError.Cause, "not registered") notFound := http.StatusNotFound assert.Equal(t, ¬Found, resultError.Status) } @@ -129,7 +148,7 @@ func TestGetServices(t *testing.T) { aefId := "aefId" serviceRegisterMock := serviceMocks.ServiceRegister{} serviceRegisterMock.On("GetAefsForPublisher", apfId).Return([]string{aefId}) - _, requestHandler := getEcho(&serviceRegisterMock, nil) + _, _, requestHandler := getEcho(&serviceRegisterMock, nil) // Check no services published for provider result := testutil.NewRequest().Get("/"+apfId+"/service-apis").Go(t, requestHandler) @@ -158,7 +177,97 @@ func TestGetServices(t *testing.T) { assert.Contains(t, resultServices, serviceDescription2) } -func getEcho(serviceRegister providermanagement.ServiceRegister, helmManager helmmanagement.HelmManager) (*PublishService, *echo.Echo) { +func TestGetPublishedServices(t *testing.T) { + serviceUnderTest := NewPublishService(nil, nil, nil) + + profiles := make([]publishapi.AefProfile, 1) + serviceDescription := publishapi.ServiceAPIDescription{ + AefProfiles: &profiles, + } + serviceUnderTest.publishedServices["publisher1"] = []publishapi.ServiceAPIDescription{ + serviceDescription, + } + serviceUnderTest.publishedServices["publisher2"] = []publishapi.ServiceAPIDescription{ + serviceDescription, + } + result := serviceUnderTest.GetAllPublishedServices() + assert.Len(t, result, 2) +} + +func TestUpdateDescription(t *testing.T) { + apfId := "apfId" + serviceApiId := "serviceApiId" + aefId := "aefId" + apiName := "apiName" + description := "description" + + serviceRegisterMock := serviceMocks.ServiceRegister{} + serviceRegisterMock.On("GetAefsForPublisher", apfId).Return([]string{aefId, "otherAefId", "aefIdNew"}) + helmManagerMock := helmMocks.HelmManager{} + helmManagerMock.On("InstallHelmChart", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) + serviceUnderTest, eventChannel, requestHandler := getEcho(&serviceRegisterMock, &helmManagerMock) + serviceDescription := getServiceAPIDescription(aefId, apiName, description) + serviceDescription.ApiId = &serviceApiId + serviceUnderTest.publishedServices[apfId] = []publishapi.ServiceAPIDescription{serviceDescription} + (*serviceDescription.AefProfiles)[0].AefId = aefId + + //Modify the service + updatedServiceDescription := getServiceAPIDescription(aefId, apiName, description) + updatedServiceDescription.ApiId = &serviceApiId + (*updatedServiceDescription.AefProfiles)[0].AefId = aefId + newDescription := "new description" + updatedServiceDescription.Description = &newDescription + newDomainName := "new domainName" + (*updatedServiceDescription.AefProfiles)[0].DomainName = &newDomainName + + newProfileDomain := "new profile Domain name" + var protocol publishapi.Protocol = "HTTP_1_1" + test := make([]publishapi.AefProfile, 1) + test = *updatedServiceDescription.AefProfiles + test = append(test, publishapi.AefProfile{ + + AefId: "aefIdNew", + DomainName: &newProfileDomain, + Protocol: &protocol, + Versions: []publishapi.Version{ + { + ApiVersion: "v1", + Resources: &[]publishapi.Resource{ + { + CommType: "REQUEST_RESPONSE", + Operations: &[]publishapi.Operation{ + "POST", + }, + ResourceName: "app", + Uri: "app", + }, + }, + }, + }, + }, + ) + + updatedServiceDescription.AefProfiles = &test + + result := testutil.NewRequest().Put("/"+apfId+"/service-apis/"+serviceApiId).WithJsonBody(updatedServiceDescription).Go(t, requestHandler) + + var resultService publishapi.ServiceAPIDescription + assert.Equal(t, http.StatusOK, result.Code()) + err := result.UnmarshalBodyToObject(&resultService) + assert.NoError(t, err, "error unmarshaling response") + assert.Equal(t, newDescription, *resultService.Description) + assert.Equal(t, newDomainName, *(*resultService.AefProfiles)[0].DomainName) + assert.Equal(t, "aefIdNew", (*resultService.AefProfiles)[1].AefId) + + if publishEvent, ok := waitForEvent(eventChannel, 1*time.Second); ok { + assert.Fail(t, "No event sent") + } else { + assert.Equal(t, *resultService.ApiId, (*publishEvent.EventDetail.ApiIds)[0]) + assert.Equal(t, eventsapi.CAPIFEventSERVICEAPIUPDATE, publishEvent.Events) + } +} + +func getEcho(serviceRegister providermanagement.ServiceRegister, helmManager helmmanagement.HelmManager) (*PublishService, chan eventsapi.EventNotification, *echo.Echo) { swagger, err := publishapi.GetSwagger() if err != nil { fmt.Fprintf(os.Stderr, "Error loading swagger spec\n: %s", err) @@ -167,14 +276,15 @@ func getEcho(serviceRegister providermanagement.ServiceRegister, helmManager hel swagger.Servers = nil - ps := NewPublishService(serviceRegister, helmManager) + eventChannel := make(chan eventsapi.EventNotification) + ps := NewPublishService(serviceRegister, helmManager, eventChannel) e := echo.New() e.Use(echomiddleware.Logger()) e.Use(middleware.OapiRequestValidator(swagger)) publishapi.RegisterHandlers(e, ps) - return ps, e + return ps, eventChannel, e } func getServiceAPIDescription(aefId, apiName, description string) publishapi.ServiceAPIDescription { @@ -207,3 +317,14 @@ func getServiceAPIDescription(aefId, apiName, description string) publishapi.Ser Description: &description, } } + +// waitForEvent waits for the channel to receive an event for the specified max timeout. +// Returns true if waiting timed out. +func waitForEvent(ch chan eventsapi.EventNotification, timeout time.Duration) (*eventsapi.EventNotification, bool) { + select { + case event := <-ch: + return &event, false // completed normally + case <-time.After(timeout): + return nil, true // timed out + } +}