/* * 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.timers; import static org.junit.Assert.assertEquals; import java.util.UUID; import org.apache.jmeter.threads.JMeterContextService; import org.apache.jmeter.threads.TestJMeterContextService; import org.apache.jmeter.util.BeanShellInterpreter; import org.apache.jmeter.util.ScriptingTestElement; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ConstantThroughputTimerTest { private static final Logger log = LoggerFactory.getLogger(ConstantThroughputTimerTest.class); @Test public void testTimer1() throws Exception { ConstantThroughputTimer timer = new ConstantThroughputTimer(); assertEquals(0,timer.getCalcMode());// Assume this thread only timer.setThroughput(60.0);// 1 per second long start = System.currentTimeMillis(); long delay = timer.delay(); // Initialise assertEquals(0,delay); // The test tries to check if the calculated delay is correct. // If the build machine is busy, then the sleep(500) may take longer in // which case the calculated delay should be shorter. // Since the test aims at 1 per second, the delay should be 1000 - elapsed. // The test currently assumes elapsed is 500. Thread.sleep(500); long elapsed = System.currentTimeMillis() - start; long expected = 1000-elapsed; // 1 second less what has already elapsed if (expected < 0) { expected = 0; } assertEquals("Expected delay of approx 500", expected, timer.delay(), 50); } @Test public void testTimer2() throws Exception { ConstantThroughputTimer timer = new ConstantThroughputTimer(); assertEquals(0,timer.getCalcMode());// Assume this thread only timer.setThroughput(60.0);// 1 per second assertEquals(1000,timer.calculateCurrentTarget(0)); // Should delay for 1 second timer.setThroughput(60000.0);// 1 per milli-second assertEquals(1,timer.calculateCurrentTarget(0)); // Should delay for 1 milli-second } @Test public void testTimer3() throws Exception { ConstantThroughputTimer timer = new ConstantThroughputTimer(); timer.setMode(ConstantThroughputTimer.Mode.AllActiveThreads); //$NON-NLS-1$ - all threads assertEquals(1,timer.getCalcMode());// All threads for(int i=1; i<=10; i++){ TestJMeterContextService.incrNumberOfThreads(); } assertEquals(10,JMeterContextService.getNumberOfThreads()); timer.setThroughput(600.0);// 10 per second assertEquals(1000,timer.calculateCurrentTarget(0)); // Should delay for 1 second timer.setThroughput(600000.0);// 10 per milli-second assertEquals(1,timer.calculateCurrentTarget(0)); // Should delay for 1 milli-second for(int i=1; i<=990; i++){ TestJMeterContextService.incrNumberOfThreads(); } assertEquals(1000,JMeterContextService.getNumberOfThreads()); timer.setThroughput(60000000.0);// 1000 per milli-second assertEquals(1,timer.calculateCurrentTarget(0)); // Should delay for 1 milli-second } @Test public void testTimerBSH() throws Exception { if (!BeanShellInterpreter.isInterpreterPresent()){ final String msg = "BeanShell jar not present, test ignored"; log.warn(msg); return; } BeanShellTimer timer = new BeanShellTimer(); timer.setScript("\"60\""); assertEquals(60, timer.delay()); timer.setScript("60"); assertEquals(60, timer.delay()); timer.setScript("5*3*4"); assertEquals(60,timer.delay()); } @Test public void testTimerJSR223Timer() throws Exception { JSR223Timer timer = new JSR223Timer(); timer.setScriptLanguage(ScriptingTestElement.DEFAULT_SCRIPT_LANGUAGE); timer.setCacheKey(UUID.randomUUID().toString()); timer.setScript("\"60\""); assertEquals(60, timer.delay()); timer.setScript("60"); assertEquals(60, timer.delay()); timer.setScript("5*3*4"); assertEquals(60,timer.delay()); } @Test public void testUniformRandomTimer() throws Exception { UniformRandomTimer timer = new UniformRandomTimer(); timer.setDelay("1000"); timer.setRange(100d); timer.iterationStart(null); long delay = timer.delay(); Assert.assertTrue("delay:"+delay +" is not in expected range", delay >= 1000 && delay <=1100); } @Test public void testConstantTimer() throws Exception { ConstantTimer timer = new ConstantTimer(); timer.setDelay("1000"); timer.iterationStart(null); assertEquals(1000, timer.delay()); } @Test public void testPoissonRandomTimerRangeHigherThan30() throws Exception { PoissonRandomTimer timer = new PoissonRandomTimer(); timer.setDelay("300"); timer.setRange(100d); timer.iterationStart(null); long delay = timer.delay(); Assert.assertTrue("delay:"+delay +" is not in expected range", delay >= 356 && delay <=457); } @Test public void testPoissonRandomTimerRangeLowerThan30() throws Exception { PoissonRandomTimer timer = new PoissonRandomTimer(); timer.setDelay("300"); timer.setRange(30d); timer.iterationStart(null); long delay = timer.delay(); Assert.assertTrue("delay:"+delay +" is not in expected range", delay >= 305 && delay <=362); } }