X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=integration-test%2Fsrc%2Ftest%2Fgroovy%2Forg%2Fonap%2Fcps%2Fintegration%2Fperformance%2Fncmp%2FCmHandleQueryPerfTest.groovy;h=d518234f5cede48cd592ac1059888e647d848d55;hb=HEAD;hp=bcb2d2fe5dc4a02e805cfa16198292e864b3e181;hpb=7eae3fd589942c856f365600820aed18d104a98c;p=cps.git diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/performance/ncmp/CmHandleQueryPerfTest.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/performance/ncmp/CmHandleQueryPerfTest.groovy index bcb2d2fe5..db0e24e93 100644 --- a/integration-test/src/test/groovy/org/onap/cps/integration/performance/ncmp/CmHandleQueryPerfTest.groovy +++ b/integration-test/src/test/groovy/org/onap/cps/integration/performance/ncmp/CmHandleQueryPerfTest.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,35 +20,137 @@ package org.onap.cps.integration.performance.ncmp -import java.util.stream.Collectors import org.onap.cps.api.CpsQueryService -import org.onap.cps.integration.performance.base.NcmpRegistryPerfTestBase -import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS +import org.onap.cps.integration.ResourceMeter +import org.onap.cps.integration.performance.base.NcmpPerfTestBase + +import java.util.stream.Collectors + import static org.onap.cps.spi.FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS +import static org.onap.cps.spi.FetchDescendantsOption.OMIT_DESCENDANTS + +class CmHandleQueryPerfTest extends NcmpPerfTestBase { -class CmHandleQueryPerfTest extends NcmpRegistryPerfTestBase { + static def MILLISECONDS = 0.001 CpsQueryService objectUnderTest + ResourceMeter resourceMeter = new ResourceMeter() def setup() { objectUnderTest = cpsQueryService } + def 'JVM warmup.'() { + when: 'the JVM is warmed up' + def iterations = 2500 // set this to 15000 for very accurate results (but test takes much longer) + resourceMeter.start() + (1..iterations).forEach { + cpsDataService.getDataNodes(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_ANCHOR, + '/dmi-registry/cm-handles[@id="cm-' + it + '"]', OMIT_DESCENDANTS) + objectUnderTest.queryDataNodes(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_ANCHOR, + '/dmi-registry/cm-handles[@alternate-id="alt-' + it + '"]', OMIT_DESCENDANTS) + } + resourceMeter.stop() + then: 'resource usage is as expected' + recordAndAssertResourceUsage('JVM warmup for CmHandleQueryPerfTest', + 30, resourceMeter.totalTimeInSeconds, + 300, resourceMeter.totalMemoryUsageInMB) + } + def 'Query CM Handle IDs by a property name and value.'() { when: 'a cps-path query on name-value pair is performed (without getting descendants)' - stopWatch.start() + resourceMeter.start() def cpsPath = '//additional-properties[@name="neType" and @value="RadioNode"]/ancestor::cm-handles' def dataNodes = objectUnderTest.queryDataNodes(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_ANCHOR, cpsPath, OMIT_DESCENDANTS) and: 'the ids of the result are extracted and converted to xpath' def xpaths = dataNodes.stream().map(dataNode -> "/dmi-registry/cm-handles[@id='${dataNode.leaves.id}']".toString() ).collect(Collectors.toSet()) and: 'a single get is executed to get all the parent objects and their descendants' def result = cpsDataService.getDataNodesForMultipleXpaths(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_ANCHOR, xpaths, INCLUDE_ALL_DESCENDANTS) - stopWatch.stop() - def durationInMillis = stopWatch.getTotalTimeMillis() - then: 'the required operations are performed within 1200 ms' - recordAndAssertPerformance("CpsPath Registry attributes Query", 500, durationInMillis) - and: 'all but 1 (other node) are returned' - result.size() == 999 + resourceMeter.stop() + def durationInSeconds = resourceMeter.getTotalTimeInSeconds() + then: 'the required operations are performed within required time' + recordAndAssertResourceUsage("CpsPath Registry attributes Query", 3.96, durationInSeconds, 400, resourceMeter.getTotalMemoryUsageInMB()) + and: 'all nodes are returned' + result.size() == TOTAL_CM_HANDLES and: 'the tree contains all the expected descendants too' - assert countDataNodesInTree(result) == 5 * 999 + assert countDataNodesInTree(result) == 5 * TOTAL_CM_HANDLES + } + + def 'CM-handle is looked up by id.'() { + when: 'CM-handles are looked up by cm-handle-id 100 times' + int count = 0 + resourceMeter.start() + (1..100).each { + count += cpsDataService.getDataNodes(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_ANCHOR, + '/dmi-registry/cm-handles[@id="cm-' + it + '"]', OMIT_DESCENDANTS).size() + } + resourceMeter.stop() + then: + assert count == 100 + and: 'average performance is as expected' + def averageResponseTime = resourceMeter.totalTimeInSeconds / 100 + recordAndAssertResourceUsage('Look up CM-handle by id', + expectedAverageResponseTime, averageResponseTime, + 15, resourceMeter.totalMemoryUsageInMB) + where: + expectedAverageResponseTime = 8 * MILLISECONDS + } + + def 'CM-handle is looked up by alternate-id.'() { + when: 'CM-handles are looked up by alternate-id 100 times' + int count = 0 + resourceMeter.start() + (1..100).each { + count += cpsQueryService.queryDataNodes(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_ANCHOR, + '/dmi-registry/cm-handles[@alternate-id="alt-' + it + '"]', OMIT_DESCENDANTS).size() + } + resourceMeter.stop() + then: + assert count == 100 + and: 'average performance is as expected' + def averageResponseTime = resourceMeter.totalTimeInSeconds / 100 + recordAndAssertResourceUsage('Look up CM-handle by alternate-id', + expectedAverageResponseTime, averageResponseTime, + 15, resourceMeter.totalMemoryUsageInMB) + where: + expectedAverageResponseTime = 20 * MILLISECONDS + } + + def 'A batch of CM-handles is looked up by alternate-id.'() { + given: 'a CPS Path Query to look up 100 alternate-ids in a single operation' + def cpsPathQuery = '/dmi-registry/cm-handles[' + (1..100).collect { "@alternate-id='alt-${it}'" }.join(' or ') + ']' + when: 'CM-handles are looked up by alternate-ids in a single query' + resourceMeter.start() + def count = cpsQueryService.queryDataNodes(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_ANCHOR, cpsPathQuery, OMIT_DESCENDANTS).size() + resourceMeter.stop() + then: 'expected amount of data was returned' + assert count == 100 + then: 'average performance is as expected' + def averageResponseTime = resourceMeter.totalTimeInSeconds / 100 + recordAndAssertResourceUsage('Batch look up CM-handle by alternate-id', + expectedAverageResponseTime, averageResponseTime, + 15, resourceMeter.totalMemoryUsageInMB) + where: + expectedAverageResponseTime = 4 * MILLISECONDS + } + + def 'Find any CM-handle given moduleSetTag when there are 20K READY handles with same moduleSetTag.'() { + given: + def cpsPathQuery = "/dmi-registry/cm-handles[@module-set-tag='my-module-set-tag']" + when: 'CM-handles are looked up by module-set-tag 100 times' + int count = 0 + resourceMeter.start() + (1..100).each { + count += cpsQueryService.queryDataNodes(NCMP_PERFORMANCE_TEST_DATASPACE, REGISTRY_ANCHOR, cpsPathQuery, OMIT_DESCENDANTS).size() + } + resourceMeter.stop() + then: + assert count == TOTAL_CM_HANDLES * 100 + then: 'average performance is as expected' + def averageResponseTime = resourceMeter.totalTimeInSeconds / 100 + recordAndAssertResourceUsage('Look up CM-handles by module-set-tag', + expectedAverageResponseTime, averageResponseTime, + 500, resourceMeter.totalMemoryUsageInMB) + where: + expectedAverageResponseTime = 438 * MILLISECONDS } }