From c6dfb03f66eb4573c6fcea761e2414aadaaf7878 Mon Sep 17 00:00:00 2001 From: danielhanrahan Date: Wed, 15 Nov 2023 13:21:34 +0000 Subject: Make performance tests measure PEAK memory usage Presently, performance tests measure CURRENT memory usage instead of PEAK memory usage, leading to under-reporting if garbage collector runs during a test. This patch fixes it, so that memory reported will now be at least the memory of live objects at that time. - Add tests for ResourceMeter class - ResourceMeter measures peak memory usage instead of current Issue-ID: CPS-1967 Signed-off-by: danielhanrahan Change-Id: I36e9ea2196420b84877ecabc1b7331c5d3e2e252 --- .../cps/integration/ResourceMeterPerfTest.groovy | 83 ++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 integration-test/src/test/groovy/org/onap/cps/integration/ResourceMeterPerfTest.groovy (limited to 'integration-test/src/test/groovy/org/onap') diff --git a/integration-test/src/test/groovy/org/onap/cps/integration/ResourceMeterPerfTest.groovy b/integration-test/src/test/groovy/org/onap/cps/integration/ResourceMeterPerfTest.groovy new file mode 100644 index 000000000..c42bfd7be --- /dev/null +++ b/integration-test/src/test/groovy/org/onap/cps/integration/ResourceMeterPerfTest.groovy @@ -0,0 +1,83 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2023 Nordix Foundation + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.integration + +import java.util.concurrent.TimeUnit +import spock.lang.Specification + +class ResourceMeterPerfTest extends Specification { + + final int MEGABYTE = 1_000_000 + + def resourceMeter = new ResourceMeter() + + def 'ResourceMeter accurately measures duration'() { + when: 'we measure how long a known operation takes' + resourceMeter.start() + TimeUnit.SECONDS.sleep(2) + resourceMeter.stop() + then: 'ResourceMeter reports a duration within 10ms of the expected duration' + assert resourceMeter.getTotalTimeInSeconds() >= 2 + assert resourceMeter.getTotalTimeInSeconds() <= 2.01 + } + + def 'ResourceMeter reports memory usage when allocating a large byte array'() { + when: 'the resource meter is started' + resourceMeter.start() + and: 'some memory is allocated' + byte[] array = new byte[50 * MEGABYTE] + and: 'the resource meter is stopped' + resourceMeter.stop() + then: 'the reported memory usage is close to the amount of memory allocated' + assert resourceMeter.getTotalMemoryUsageInMB() >= 50 + assert resourceMeter.getTotalMemoryUsageInMB() <= 55 + } + + def 'ResourceMeter measures PEAK memory usage when garbage collector runs'() { + when: 'the resource meter is started' + resourceMeter.start() + and: 'some memory is allocated' + byte[] array = new byte[50 * MEGABYTE] + and: 'the memory is garbage collected' + array = null + ResourceMeter.performGcAndWait() + and: 'the resource meter is stopped' + resourceMeter.stop() + then: 'the reported memory usage is close to the peak amount of memory allocated' + assert resourceMeter.getTotalMemoryUsageInMB() >= 50 + assert resourceMeter.getTotalMemoryUsageInMB() <= 55 + } + + def 'ResourceMeter measures memory increase only during measurement'() { + given: '50 megabytes is allocated before measurement' + byte[] arrayBefore = new byte[50 * MEGABYTE] + when: 'memory is allocated during measurement' + resourceMeter.start() + byte[] arrayDuring = new byte[40 * MEGABYTE] + resourceMeter.stop() + and: '50 megabytes is allocated after measurement' + byte[] arrayAfter = new byte[50 * MEGABYTE] + then: 'the reported memory usage is close to the amount allocated DURING measurement' + assert resourceMeter.getTotalMemoryUsageInMB() >= 40 + assert resourceMeter.getTotalMemoryUsageInMB() <= 45 + } + +} -- cgit 1.2.3-korg