package test.com.xceptance.xlt.common.util.action.data; import java.io.IOException; import java.util.Arrays; import java.util.List; import org.junit.Assert; import org.junit.Test; import com.xceptance.xlt.api.data.GeneralDataProvider; import com.xceptance.xlt.api.util.XltProperties; import com.xceptance.xlt.common.util.action.data.URLActionData; import com.xceptance.xlt.common.util.action.data.URLActionDataBuilder; import com.xceptance.xlt.common.util.action.data.URLActionDataListBuilder; import com.xceptance.xlt.common.util.bsh.ParameterInterpreter; /** * Some trivial tests for the caching feature of {@link URLActionDataListBuilder}. */ public class URLActionDataListBuilderTest { @Test public void testParseOnlyOnce_SameBuilder() throws Throwable { final DummyBuilder builder = new DummyBuilder("doesnotexist.txt", new ParameterInterpreter(XltProperties.getInstance(), GeneralDataProvider.getInstance()), new URLActionDataBuilder()); final List<URLActionData> l1 = builder.buildURLActionDataList(); final List<URLActionData> l2 = builder.buildURLActionDataList(); // Validate number of invocations (parseData() should have been called only once) Assert.assertEquals(2, builder.nbInvocations_buildActions); Assert.assertEquals(1, builder.nbInvocations_parseData); // Validate action lists Assert.assertNotNull(l1); Assert.assertNotNull(l2); Assert.assertEquals(1, l1.size()); Assert.assertEquals(1, l2.size()); Assert.assertNotSame(l1, l2); final URLActionData action1 = l1.get(0); final URLActionData action2 = l2.get(0); // Make sure that actions are not the same, but the URL strings are Assert.assertNotSame(action1, action2); Assert.assertEquals(action1.getUrlString(), action2.getUrlString()); } @Test public void testParseOnlyOnce_DifferentBuilder() throws Throwable { final DummyBuilder builder1 = new DummyBuilder("doesnotexist1.txt", new ParameterInterpreter(XltProperties.getInstance(), GeneralDataProvider.getInstance()), new URLActionDataBuilder()); final DummyBuilder builder2 = new DummyBuilder("doesnotexist1.txt", new ParameterInterpreter(XltProperties.getInstance(), GeneralDataProvider.getInstance()), new URLActionDataBuilder()); final List<URLActionData> l1 = builder1.buildURLActionDataList(); final List<URLActionData> l2 = builder2.buildURLActionDataList(); // Validate number of invocations (one invocation of 'buildURLActionDataList()' for each builder) Assert.assertEquals(1, builder1.nbInvocations_buildActions); Assert.assertEquals(1, builder2.nbInvocations_buildActions); // ... one invocation of 'parseData()' for the first builder as it was called first Assert.assertEquals(1, builder1.nbInvocations_parseData); // ... but no invocation of 'parseData()' for the second builder as data should be served from cache Assert.assertEquals(0, builder2.nbInvocations_parseData); // Validate action lists Assert.assertNotNull(l1); Assert.assertNotNull(l2); Assert.assertEquals(1, l1.size()); Assert.assertEquals(1, l2.size()); Assert.assertNotSame(l1, l2); final URLActionData action1 = l1.get(0); final URLActionData action2 = l2.get(0); // Make sure that actions are not the same, but the URL strings are Assert.assertNotSame(action1, action2); Assert.assertEquals(action1.getUrlString(), action2.getUrlString()); } private static class DummyBuilder extends URLActionDataListBuilder { private int nbInvocations_buildActions = 0; private int nbInvocations_parseData = 0; public DummyBuilder(String filePath, ParameterInterpreter interpreter, URLActionDataBuilder actionBuilder) { super(filePath, interpreter, actionBuilder); } @Override public List<URLActionData> buildURLActionDataList() { ++nbInvocations_buildActions; try { final Object o = getOrParseData(); this.actionBuilder.setUrl((String) o); this.actionBuilder.setName("TEST"); this.actionBuilder.setInterpreter(this.interpreter); return Arrays.asList(this.actionBuilder.build()); } catch (final Throwable t) { throw new IllegalArgumentException(t); } } @Override protected Object parseData() throws IOException { ++nbInvocations_parseData; return "http://localhost:1234/foobar"; } } }