X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=integration-test%2Fsrc%2Ftest%2Fgroovy%2Forg%2Fonap%2Fcps%2Fintegration%2Fbase%2FCpsIntegrationSpecBase.groovy;h=1577524f2cc0d0caf5db590e9e0c01ea6e19ce1a;hb=8e6218198950381dff5b028ac6760238f91755f9;hp=567b33cb460226636048081bc44a739ae43cd641;hpb=2e29e4f1942df9e13c38ce8f4e29c5753096c946;p=cps.git diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy index 567b33cb4..1577524f2 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/base/CpsIntegrationSpecBase.groovy @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2023 Nordix Foundation + * Copyright (C) 2023-2024 Nordix Foundation * ================================================================================ * Licensed under the Apache License, Version 2.0 (the 'License'); * you may not use this file except in compliance with the License. @@ -20,63 +20,121 @@ package org.onap.cps.integration.base -import org.onap.cps.api.impl.CpsAdminServiceImpl -import org.onap.cps.api.impl.CpsDataServiceImpl -import org.onap.cps.api.impl.CpsModuleServiceImpl +import java.time.OffsetDateTime +import org.onap.cps.api.CpsAnchorService +import org.onap.cps.api.CpsDataService +import org.onap.cps.api.CpsDataspaceService +import org.onap.cps.api.CpsModuleService +import org.onap.cps.api.CpsQueryService import org.onap.cps.integration.DatabaseTestContainer +import org.onap.cps.ncmp.api.NetworkCmProxyCmHandleQueryService +import org.onap.cps.ncmp.api.NetworkCmProxyDataService +import org.onap.cps.ncmp.api.NetworkCmProxyQueryService +import org.onap.cps.ncmp.api.impl.inventory.CmHandleState +import org.onap.cps.ncmp.api.impl.inventory.sync.ModuleSyncWatchdog +import org.onap.cps.ncmp.api.models.DmiPluginRegistration +import org.onap.cps.ncmp.api.models.NcmpServiceCmHandle +import org.onap.cps.spi.exceptions.DataspaceNotFoundException import org.onap.cps.spi.model.DataNode import org.onap.cps.spi.repository.DataspaceRepository -import org.onap.cps.spi.impl.utils.CpsValidatorImpl +import org.onap.cps.spi.utils.SessionManager import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.autoconfigure.EnableAutoConfiguration import org.springframework.boot.autoconfigure.domain.EntityScan +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc import org.springframework.boot.test.context.SpringBootTest import org.springframework.context.annotation.ComponentScan -import org.springframework.context.annotation.Lazy import org.springframework.data.jpa.repository.config.EnableJpaRepositories +import org.springframework.http.HttpStatus +import org.springframework.http.MediaType +import org.springframework.test.web.client.MockRestServiceServer +import org.springframework.test.web.servlet.MockMvc +import org.springframework.web.client.RestTemplate import org.testcontainers.spock.Testcontainers import spock.lang.Shared import spock.lang.Specification +import spock.util.concurrent.PollingConditions -@SpringBootTest(classes = [TestConfig, CpsAdminServiceImpl, CpsValidatorImpl]) +import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo +import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK, classes = [CpsDataspaceService]) @Testcontainers @EnableAutoConfiguration +@AutoConfigureMockMvc @EnableJpaRepositories(basePackageClasses = [DataspaceRepository]) -@ComponentScan(basePackages = ["org.onap.cps.api", "org.onap.cps.spi.repository"]) -@EntityScan("org.onap.cps.spi.entities") -class CpsIntegrationSpecBase extends Specification { +@ComponentScan(basePackages = ['org.onap.cps']) +@EntityScan('org.onap.cps.spi.entities') +abstract class CpsIntegrationSpecBase extends Specification { @Shared DatabaseTestContainer databaseTestContainer = DatabaseTestContainer.getInstance() @Autowired - @Lazy - CpsAdminServiceImpl cpsAdminService + MockMvc mvc; + + @Autowired + CpsDataspaceService cpsDataspaceService + + @Autowired + CpsAnchorService cpsAnchorService + + @Autowired + CpsDataService cpsDataService @Autowired - @Lazy - CpsDataServiceImpl cpsDataService + CpsModuleService cpsModuleService @Autowired - @Lazy - CpsModuleServiceImpl cpsModuleService + CpsQueryService cpsQueryService - def static GENERAL_TEST_DATASPACE = 'generalTestDataSpace' - def static BOOKSTORE_DATASPACE = 'bookstoreDataspace' + @Autowired + SessionManager sessionManager + + @Autowired + NetworkCmProxyCmHandleQueryService networkCmProxyCmHandleQueryService + + @Autowired + NetworkCmProxyDataService networkCmProxyDataService + + @Autowired + NetworkCmProxyQueryService networkCmProxyQueryService + + @Autowired + RestTemplate restTemplate + + @Autowired + ModuleSyncWatchdog moduleSyncWatchdog + + MockRestServiceServer mockDmiServer = null + + static final DMI_URL = 'http://mock-dmi-server' + + def static GENERAL_TEST_DATASPACE = 'generalTestDataspace' def static BOOKSTORE_SCHEMA_SET = 'bookstoreSchemaSet' - def static BOOKSTORE_ANCHOR = 'bookstoreAnchor' def static initialized = false + def now = OffsetDateTime.now() def setup() { if (!initialized) { - cpsAdminService.createDataspace(GENERAL_TEST_DATASPACE) - def bookstoreModelFileContent = readResourceFile('bookstore.yang') - cpsModuleService.createSchemaSet(GENERAL_TEST_DATASPACE, BOOKSTORE_SCHEMA_SET, [bookstore : bookstoreModelFileContent]) - initialized = true; + cpsDataspaceService.createDataspace(GENERAL_TEST_DATASPACE) + createStandardBookStoreSchemaSet(GENERAL_TEST_DATASPACE) + initialized = true } + mockDmiServer = MockRestServiceServer.createServer(restTemplate) } + def cleanup() { + mockDmiServer.reset() + } + + def static readResourceDataFile(filename) { + return new File('src/test/resources/data/' + filename).text + } + + // *** CPS Integration Test Utilities *** + def static countDataNodesInTree(DataNode dataNode) { return 1 + countDataNodesInTree(dataNode.getChildDataNodes()) } @@ -89,7 +147,77 @@ class CpsIntegrationSpecBase extends Specification { return nodeCount } - def static readResourceFile(filename) { - return new File('src/test/resources/data/' + filename).text + def getBookstoreYangResourcesNameToContentMap() { + def bookstoreModelFileContent = readResourceDataFile('bookstore/bookstore.yang') + def bookstoreTypesFileContent = readResourceDataFile('bookstore/bookstore-types.yang') + return [bookstore: bookstoreModelFileContent, bookstoreTypes: bookstoreTypesFileContent] + } + + def createStandardBookStoreSchemaSet(targetDataspace) { + cpsModuleService.createSchemaSet(targetDataspace, BOOKSTORE_SCHEMA_SET, getBookstoreYangResourcesNameToContentMap()) + } + + def createStandardBookStoreSchemaSet(targetDataspace, targetSchemaSet) { + cpsModuleService.createSchemaSet(targetDataspace, targetSchemaSet, getBookstoreYangResourcesNameToContentMap()) + } + + def dataspaceExists(dataspaceName) { + try { + cpsDataspaceService.getDataspace(dataspaceName) + } catch (DataspaceNotFoundException ignored) { + return false + } + return true + } + + def addAnchorsWithData(numberOfAnchors, dataspaceName, schemaSetName, anchorNamePrefix, data) { + (1..numberOfAnchors).each { + cpsAnchorService.createAnchor(dataspaceName, schemaSetName, anchorNamePrefix + it) + cpsDataService.saveData(dataspaceName, anchorNamePrefix + it, data.replace("Easons", "Easons-"+it.toString()), OffsetDateTime.now()) + } + } + + def createJsonArray(name, numberOfElements, keyName, keyValuePrefix, dataPerKey) { + def innerJson = (1..numberOfElements).collect { + '{"' + keyName + '":"' + keyValuePrefix + '-' + it + '"' + (dataPerKey.empty? '': ',' + dataPerKey) + '}' + }.join(',') + return '{"' + name + '":[' + innerJson + ']}' + } + + def createLeafList(name, numberOfElements, valuePrefix) { + def innerJson = (1..numberOfElements).collect {'"' + valuePrefix + '-' + it + '"'}.join(',') + return '"' + name + '":[' + innerJson + ']' + } + + // *** NCMP Integration Test Utilities *** + + def registerCmHandle(dmiPlugin, cmHandleId, moduleSetTag, dmiModuleReferencesResponse, dmiModuleResourcesResponse) { + def cmHandleToCreate = new NcmpServiceCmHandle(cmHandleId: cmHandleId, moduleSetTag: moduleSetTag) + networkCmProxyDataService.updateDmiRegistrationAndSyncModule(new DmiPluginRegistration(dmiPlugin: dmiPlugin, createdCmHandles: [cmHandleToCreate])) + mockDmiResponsesForRegistration(dmiPlugin, cmHandleId, dmiModuleReferencesResponse, dmiModuleResourcesResponse) + moduleSyncWatchdog.moduleSyncAdvisedCmHandles() + new PollingConditions().within(3, () -> { + CmHandleState.READY == networkCmProxyDataService.getCmHandleCompositeState(cmHandleId).cmHandleState + }) + mockDmiServer.reset() + } + + def deregisterCmHandle(dmiPlugin, cmHandleId) { + deregisterCmHandles(dmiPlugin, [cmHandleId]) + } + + def deregisterCmHandles(dmiPlugin, cmHandleIds) { + networkCmProxyDataService.updateDmiRegistrationAndSyncModule(new DmiPluginRegistration(dmiPlugin: dmiPlugin, removedCmHandles: cmHandleIds)) + } + + def mockDmiResponsesForRegistration(dmiPlugin, cmHandleId, dmiModuleReferencesResponse, dmiModuleResourcesResponse) { + if (dmiModuleReferencesResponse != null) { + mockDmiServer.expect(requestTo("${dmiPlugin}/dmi/v1/ch/${cmHandleId}/modules")) + .andRespond(withStatus(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body(dmiModuleReferencesResponse)) + } + if (dmiModuleResourcesResponse != null) { + mockDmiServer.expect(requestTo("${dmiPlugin}/dmi/v1/ch/${cmHandleId}/moduleResources")) + .andRespond(withStatus(HttpStatus.OK).contentType(MediaType.APPLICATION_JSON).body(dmiModuleResourcesResponse)) + } } }