blob: 679fa8564be62003d725312d3f3cd58de8af6bf5 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you 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.
*/
package org.apache.jmeter.control
import io.mockk.every
import io.mockk.mockk
import org.apache.jmeter.junit.stubs.TestSampler
import org.apache.jmeter.samplers.Sampler
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.Disabled
import org.junit.jupiter.api.Test
import kotlin.math.ceil
import kotlin.system.measureTimeMillis
class RunTimeTest {
val sut = RunTime()
@Test
@Disabled("It fails too often due to timing issues")
fun `RunTime stops within a tolerance after specified runtime`() {
sut.runtime = 1
val runTimeMillis = 1000L
val expectedLoops = 5
val tolerance = ceil(0.1 * expectedLoops)
val samplerWaitTime: Long = runTimeMillis / expectedLoops
val samp1 = TestSampler("Sample 1", samplerWaitTime)
val samp2 = TestSampler("Sample 2", samplerWaitTime)
val sampler1Loops = 2
val loop1 = LoopController().apply {
loops = sampler1Loops
setContinueForever(false)
addTestElement(samp1)
}
val loop2 = LoopController().apply {
loops = expectedLoops * 2
setContinueForever(false)
addTestElement(samp2)
}
sut.addTestElement(loop1)
sut.addTestElement(loop2)
sut.isRunningVersion = true
loop1.isRunningVersion = true
loop2.isRunningVersion = true
sut.initialize()
// when:
var loopCount = 0
val elapsed = measureTimeMillis {
while (true) {
val sampler = sut.next() ?: break
loopCount++
sampler.sample(null)
}
}
// then:
assertEquals(1, sut.iterCount, ".iterCount")
assertEquals(expectedLoops.toDouble(), loopCount.toDouble(), tolerance, "loopCount")
assertEquals(elapsed.toDouble(), runTimeMillis.toDouble(), tolerance * samplerWaitTime, "elapsedMillis")
assertEquals(sampler1Loops, samp1.samples, "samp1.samples")
assertEquals(
(expectedLoops - sampler1Loops).toDouble(),
samp2.samples.toDouble(),
tolerance,
"samp2.samples should be expectedLoops - sampler1Loops"
)
}
@Test
fun `Immediately returns null when runtime is set to 0`() {
sut.runtime = 0
sut.addTestElement(mockk<Sampler>())
assertNull(sut.next(), ".next()")
}
@Test
fun `Immediately returns null if only Controllers are present`() {
sut.runtime = 10
sut.addTestElement(
mockk<Controller> {
every { next() } returns null
every { isDone } returns true
}
)
sut.addTestElement(
mockk<Controller> {
every { next() } returns null
every { isDone } returns true
}
)
assertNull(sut.next(), ".next()")
}
@Test
fun `within time limit samplers are returned until empty`() {
val mockSampler = mockk<Sampler>()
sut.runtime = 10
sut.addTestElement(mockSampler)
sut.addTestElement(mockSampler)
assertEquals(
listOf(mockSampler, mockSampler, null),
listOf(sut.next(), sut.next(), sut.next()),
"there are two elements, so first two .next() should return them, then null"
)
}
@Test
fun `RunTime immediately returns null when there are no test elements`() {
sut.runtime = 10
assertNull(sut.next(), ".next()")
}
}