/*
* -----------------------------------------------------------------------\
* PerfCake
*
* Copyright (C) 2010 - 2016 the original author or authors.
*
* 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.
* -----------------------------------------------------------------------/
*/
package org.perfcake.scenario;
import org.perfcake.PerfCakeConst;
import org.perfcake.RunInfo;
import org.perfcake.TestSetup;
import org.perfcake.common.BoundPeriod;
import org.perfcake.common.PeriodType;
import org.perfcake.message.Message;
import org.perfcake.message.generator.AbstractMessageGenerator;
import org.perfcake.message.generator.DefaultMessageGenerator;
import org.perfcake.message.sender.MessageSender;
import org.perfcake.message.sender.TestSender;
import org.perfcake.reporting.destination.CsvDestination;
import org.perfcake.reporting.reporter.Reporter;
import org.perfcake.reporting.reporter.ResponseTimeStatsReporter;
import org.perfcake.reporting.reporter.ThroughputStatsReporter;
import org.perfcake.reporting.reporter.WarmUpReporter;
import org.perfcake.util.Utils;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.lang.reflect.Field;
import java.util.Collections;
import java.util.Properties;
/**
* Verifies the correct parsing of DSL scenarios.
*
* @author <a href="mailto:marvenec@gmail.com">Martin Večeřa</a>
*/
@Test(groups = { "unit" })
public class DslFactoryTest extends TestSetup {
final Properties emptyProperties = new Properties();
@Test
public void testDslScenarioParsing() throws Exception {
System.setProperty(PerfCakeConst.SCENARIO_PROPERTY, "test-scenario");
final Scenario s = ScenarioLoader.load("stub_test_scenario");
s.init();
Assert.assertTrue(s.getGenerator() instanceof DefaultMessageGenerator);
Assert.assertEquals(((DefaultMessageGenerator) s.getGenerator()).getSenderTaskQueueSize(), 3000);
Assert.assertEquals(s.getGenerator().getThreads(), 4);
final Field runInfoField = AbstractMessageGenerator.class.getDeclaredField("runInfo");
runInfoField.setAccessible(true);
final RunInfo r = (RunInfo) runInfoField.get(s.getGenerator());
Assert.assertEquals(r.getThreads(), 4);
Assert.assertEquals(r.getDuration().getPeriodType(), PeriodType.TIME);
Assert.assertEquals(r.getDuration().getPeriod(), 10 * 1000);
final MessageSender ms = s.getMessageSenderManager().acquireSender();
Assert.assertTrue(ms instanceof TestSender);
Assert.assertEquals(((TestSender) ms).getDelay(), 12 * 1000);
Assert.assertEquals(((TestSender) ms).getTarget(), "httpbin.org");
final Reporter[] reporters = s.getReportManager().getReporters().toArray(new Reporter[1]);
Assert.assertEquals(reporters.length, 3);
Assert.assertTrue(reporters[0] instanceof WarmUpReporter);
Assert.assertTrue(reporters[1] instanceof ThroughputStatsReporter);
Assert.assertTrue(reporters[2] instanceof ResponseTimeStatsReporter);
Assert.assertFalse(((ThroughputStatsReporter) reporters[1]).isMinimumEnabled());
// only one destination should appear here as the other one is disabled
BoundPeriod[] periods = reporters[1].getReportingPeriods().toArray(new BoundPeriod[1]);
Assert.assertEquals(periods.length, 1);
Assert.assertTrue(periods[0].getBinding() instanceof CsvDestination);
Assert.assertEquals(((CsvDestination) periods[0].getBinding()).getPath(), "test-scenario-stats.csv");
Assert.assertEquals(periods[0].getPeriodType(), PeriodType.TIME);
Assert.assertEquals(periods[0].getPeriod(), 3 * 1000);
periods = reporters[2].getReportingPeriods().toArray(new BoundPeriod[1]);
Assert.assertEquals(periods.length, 1);
Assert.assertEquals(periods[0].getPeriodType(), PeriodType.PERCENTAGE);
Assert.assertEquals(periods[0].getPeriod(), 10);
Assert.assertEquals(s.getMessageStore().size(), 4);
Assert.assertEquals(s.getMessageStore().get(0).getMessage().getPayload(), Utils.readFilteredContent(Utils.locationToUrl("message1.xml", PerfCakeConst.MESSAGES_DIR_PROPERTY, "", "")));
Assert.assertEquals((long) s.getMessageStore().get(0).getMultiplicity(), 10);
Assert.assertEquals(s.getMessageStore().get(0).getMessage().getProperties().size(), 0);
Assert.assertEquals(s.getMessageStore().get(0).getMessage().getHeaders().size(), 0);
Assert.assertEquals(s.getMessageStore().get(0).getValidatorIds().size(), 0);
Assert.assertEquals(s.getMessageStore().get(1).getMessage().getPayload(), "Hello World");
Assert.assertEquals(s.getMessageStore().get(1).getMessage().getProperties().size(), 1);
Assert.assertEquals(s.getMessageStore().get(1).getMessage().getProperties().get("values"), new int[] { 1, 2, 3 });
Assert.assertEquals(s.getMessageStore().get(1).getMessage().getHeaders().size(), 0);
Assert.assertEquals(s.getMessageStore().get(1).getValidatorIds().size(), 0);
Assert.assertEquals(s.getMessageStore().get(2).getMessage().getPayload(), Utils.readFilteredContent(Utils.locationToUrl("message2.txt", PerfCakeConst.MESSAGES_DIR_PROPERTY, "", "")));
Assert.assertEquals(s.getMessageStore().get(2).getMessage().getProperties().size(), 0);
Assert.assertEquals(s.getMessageStore().get(2).getMessage().getHeaders().size(), 0);
Assert.assertEquals(s.getMessageStore().get(2).getValidatorIds().size(), 2);
Assert.assertEquals(s.getMessageStore().get(2).getValidatorIds().get(0), "text1");
Assert.assertEquals(s.getMessageStore().get(2).getValidatorIds().get(1), "text2");
Assert.assertEquals(s.getMessageStore().get(3).getMessage().getPayload(), "Simple text");
Assert.assertEquals(s.getMessageStore().get(3).getMessage().getProperties().size(), 1);
Assert.assertEquals(s.getMessageStore().get(3).getMessage().getProperty("propA"), "kukuk");
Assert.assertEquals(s.getMessageStore().get(3).getMessage().getHeaders().size(), 2);
Assert.assertEquals(s.getMessageStore().get(3).getMessage().getHeader("name"), "Franta");
Assert.assertEquals(s.getMessageStore().get(3).getMessage().getHeaders().get("count"), 10);
Assert.assertEquals(s.getMessageStore().get(3).getValidatorIds().size(), 2);
Assert.assertEquals(s.getMessageStore().get(3).getValidatorIds().get(0), "text1");
Assert.assertEquals(s.getMessageStore().get(3).getValidatorIds().get(1), "text2");
Assert.assertFalse(s.getValidationManager().isEnabled());
Assert.assertTrue(s.getValidationManager().isFastForward());
final Message toValidate = new Message();
toValidate.setPayload("I am a fish!");
Assert.assertTrue(s.getValidationManager().getValidators(Collections.singletonList("text1")).get(0).isValid(null, toValidate, emptyProperties));
toValidate.setPayload("I was a fish!");
Assert.assertTrue(s.getValidationManager().getValidators(Collections.singletonList("text2")).get(0).isValid(null, toValidate, emptyProperties));
System.clearProperty(PerfCakeConst.SCENARIO_PROPERTY);
}
}