Mercurial > stress-tester
changeset 456:f9515c48d331
HttpMessageModificationFilter supports expressions
author | Devel 2 |
---|---|
date | Tue, 01 Aug 2017 12:25:18 +0200 |
parents | c9f06c2ca729 |
children | 1a2b3b01b35c |
files | stress-tester/src/main/java/com/passus/st/client/http/filter/HttpMessageModificationFilter.java stress-tester/src/main/java/com/passus/st/client/http/filter/HttpMessageModificationFilterTransformer.java stress-tester/src/main/java/com/passus/st/client/http/filter/HttpMessagePredicate.java stress-tester/src/test/java/com/passus/st/client/http/filter/HttpFiltersConfiguratorTest.java stress-tester/src/test/java/com/passus/st/client/http/filter/HttpMessageModificationFilterTest.java |
diffstat | 5 files changed, 275 insertions(+), 252 deletions(-) [+] |
line wrap: on
line diff
--- a/stress-tester/src/main/java/com/passus/st/client/http/filter/HttpMessageModificationFilter.java Tue Aug 01 12:24:47 2017 +0200 +++ b/stress-tester/src/main/java/com/passus/st/client/http/filter/HttpMessageModificationFilter.java Tue Aug 01 12:25:18 2017 +0200 @@ -11,13 +11,11 @@ import com.passus.config.schema.NodeDefinition; import com.passus.config.schema.NodeDefinitionCreator; import com.passus.data.ByteString; -import com.passus.net.http.HttpMessage; import com.passus.net.http.HttpMessageHelper; import com.passus.net.http.HttpParameters; import com.passus.net.http.HttpRequest; import com.passus.net.http.HttpResponse; import com.passus.st.client.http.HttpFlowContext; -import com.passus.st.client.http.filter.HttpMessagePredicate.HttpMessageWrapper; import com.passus.st.config.HeaderOperationNodeDefinition; import com.passus.st.plugin.PluginConstants; import com.passus.st.validation.HeaderNameValidator; @@ -25,11 +23,12 @@ import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.text.ParseException; +import com.passus.filter.UnmutableValueExtractor; +import com.passus.filter.ValueExtractor; import static com.passus.config.schema.ConfigurationSchemaBuilder.mapDef; import static com.passus.config.schema.ConfigurationSchemaBuilder.valueDef; -import java.text.ParseException; -import static com.passus.config.schema.ConfigurationSchemaBuilder.mapDef; -import static com.passus.config.schema.ConfigurationSchemaBuilder.valueDef; +import java.util.Collections; /** * @@ -43,60 +42,96 @@ public static final String TYPE = "modifyMessage"; - public enum Direction { - Inbound, Outbound, Both - } - - public enum MessageType { - Request, Reponse, Both - } - public abstract static class Operation { private Operation() { } - public abstract void process(HttpMessage message); + public abstract void process(HttpRequest req, HttpResponse resp, HttpFlowContext context); + + protected final CharSequence extractValue(ValueExtractor extractor, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + Object value; + if (extractor instanceof UnmutableValueExtractor) { + value = extractor.extract(null); + } else { + HttpMessageWrapper wrapper = new HttpMessageWrapper(req, resp, context); + value = extractor.extract(wrapper); + } + + if (value instanceof CharSequence) { + return (CharSequence) value; + } + + return null; + } } private static abstract class AbstractRemoveOperation extends Operation { - protected final ByteString name; + protected final ValueExtractor extractor; public AbstractRemoveOperation(CharSequence headerName) { - Assert.notNull(headerName, "headerName"); - this.name = ByteString.create(headerName); + this(new UnmutableValueExtractor(ByteString.create(headerName))); } - public ByteString getName() { - return name; + public AbstractRemoveOperation(ValueExtractor extractor) { + Assert.notNull(extractor, "extractor"); + this.extractor = extractor; } + public ValueExtractor getExtractor() { + return extractor; + } + + @Override + public void process(HttpRequest req, HttpResponse resp, HttpFlowContext context) { + CharSequence name = extractValue(extractor, req, resp, context); + if (name != null) { + doProcess(name, req, resp, context); + } + } + + protected abstract void doProcess(CharSequence name, HttpRequest req, HttpResponse resp, HttpFlowContext context); + } private static abstract class AbstractNameValueOperation extends Operation { protected final ByteString name; - protected final ByteString value; + protected final ValueExtractor valueExtractor; public AbstractNameValueOperation(CharSequence name, CharSequence value) { - Assert.notNull(name, "headerName"); - Assert.notNull(value, "headerValue"); + this(name, new UnmutableValueExtractor(value)); + } + + public AbstractNameValueOperation(CharSequence name, ValueExtractor valueExtractor) { + Assert.notNull(name, "name"); + Assert.notNull(valueExtractor, "valueExtractor"); this.name = ByteString.create(name); - this.value = ByteString.create(value); + this.valueExtractor = valueExtractor; } public ByteString getName() { return name; } - public ByteString getValue() { - return value; + public ValueExtractor getValueExtractor() { + return valueExtractor; } + @Override + public void process(HttpRequest req, HttpResponse resp, HttpFlowContext context) { + CharSequence value = extractValue(valueExtractor, req, resp, context); + if (value != null) { + doProcess(value, req, resp, context); + } + } + + protected abstract void doProcess(CharSequence value, HttpRequest req, HttpResponse resp, HttpFlowContext context); + } public static class RemoveHeaderOperation extends AbstractRemoveOperation { @@ -105,9 +140,13 @@ super(name); } + public RemoveHeaderOperation(ValueExtractor extractor) { + super(extractor); + } + @Override - public void process(HttpMessage message) { - message.getHeaders().delete(name); + protected void doProcess(CharSequence name, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + req.getHeaders().delete(name); } } @@ -118,9 +157,13 @@ super(name, value); } + public AddHeaderOperation(CharSequence name, ValueExtractor valueExtractor) { + super(name, valueExtractor); + } + @Override - public void process(HttpMessage message) { - message.getHeaders().add(name, value); + protected void doProcess(CharSequence value, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + req.getHeaders().add(name, value); } } @@ -131,9 +174,13 @@ super(name, value); } + public SetHeaderOperation(CharSequence name, ValueExtractor valueExtractor) { + super(name, valueExtractor); + } + @Override - public void process(HttpMessage message) { - message.getHeaders().set(name, value); + protected void doProcess(CharSequence value, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + req.getHeaders().set(name, value); } } @@ -144,9 +191,13 @@ super(name); } + public RemoveCookieOperation(ValueExtractor extractor) { + super(extractor); + } + @Override - public void process(HttpMessage message) { - HELPER.removeCookie(message, name); + protected void doProcess(CharSequence name, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + HELPER.removeCookie(req, name); } } @@ -157,11 +208,13 @@ super(name, value); } + public AddCookieOperation(CharSequence name, ValueExtractor valueExtractor) { + super(name, valueExtractor); + } + @Override - public void process(HttpMessage message) { - if (message.isRequest()) { - HELPER.addCookie(message, name, value); - } + protected void doProcess(CharSequence value, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + HELPER.addCookie(req, name, value); } } @@ -172,11 +225,13 @@ super(name, value); } + public SetCookieOperation(CharSequence name, ValueExtractor valueExtractor) { + super(name, valueExtractor); + } + @Override - public void process(HttpMessage message) { - if (message.isRequest()) { - HELPER.setCookie(message, name, value); - } + protected void doProcess(CharSequence value, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + HELPER.setCookie(req, name, value); } } @@ -187,15 +242,17 @@ super(paramName); } + public RemoveQueryParameterOperation(ValueExtractor extractor) { + super(extractor); + } + @Override - public void process(HttpMessage message) { - if (message.isRequest()) { - try { - HELPER.removeQueryParameter((HttpRequest) message, name); - } catch (ParseException ex) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug(ex.getMessage(), ex); - } + protected void doProcess(CharSequence name, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + try { + HELPER.removeQueryParameter(req, name); + } catch (ParseException ex) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(ex.getMessage(), ex); } } } @@ -208,18 +265,18 @@ super(name, value); } - @Override - public void process(HttpMessage message) { + public AddQueryParameterOperation(CharSequence name, ValueExtractor valueExtractor) { + super(name, valueExtractor); + } - if (message.isRequest()) { - try { - HELPER.addQueryParameter((HttpRequest) message, name, value); - } catch (ParseException ex) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug(ex.getMessage(), ex); - } + @Override + protected void doProcess(CharSequence value, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + try { + HELPER.addQueryParameter(req, name, value); + } catch (ParseException ex) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(ex.getMessage(), ex); } - } } @@ -231,18 +288,18 @@ super(name, value); } - @Override - public void process(HttpMessage message) { + public SetQueryParameterOperation(CharSequence name, ValueExtractor valueExtractor) { + super(name, valueExtractor); + } - if (message.isRequest()) { - try { - HELPER.addQueryParameter((HttpRequest) message, name, value); - } catch (ParseException ex) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug(ex.getMessage(), ex); - } + @Override + protected void doProcess(CharSequence value, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + try { + HELPER.addQueryParameter(req, name, value); + } catch (ParseException ex) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(ex.getMessage(), ex); } - } } @@ -254,8 +311,17 @@ super(headerName); } - protected boolean doRemove(HttpParameters params) { - return params.remove(name); + public RemoveParamOperation(ValueExtractor extractor) { + super(extractor); + } + + protected boolean doRemove(HttpParameters params, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + CharSequence name = extractValue(extractor, req, resp, context); + if (name != null) { + return params.remove(name); + } + + return false; } } @@ -264,14 +330,14 @@ protected final ByteString name; - protected final Object value; + protected final ValueExtractor extractor; public AddParamOperation(CharSequence name, Object value) { Assert.notNull(name, "name"); Assert.notNull(value, "value"); if (value instanceof CharSequence) { - this.value = value; + this.extractor = new UnmutableValueExtractor(value); } else if (value instanceof List) { for (Object val : (List) value) { if (!(val instanceof CharSequence)) { @@ -279,7 +345,7 @@ } } - this.value = value; + this.extractor = new UnmutableValueExtractor(value); } else { throw new IllegalArgumentException("Value should be CharSequence or List<CharSequence>."); } @@ -287,12 +353,39 @@ this.name = ByteString.create(name); } - protected void doAdd(HttpParameters params) { - if (value instanceof CharSequence) { - params.add(name, (CharSequence) value); + public AddParamOperation(CharSequence name, ValueExtractor extractor) { + Assert.notNull(name, "name"); + Assert.notNull(extractor, "extractor"); + this.name = ByteString.create(name); + this.extractor = extractor; + } + + protected Object extractValue(HttpRequest req, HttpResponse resp, HttpFlowContext context) { + Object value = null; + if (extractor instanceof UnmutableValueExtractor) { + value = extractor.extract(null); } else { - params.add(name, (List<CharSequence>) value); + HttpMessageWrapper wrapper = new HttpMessageWrapper(req, resp, context); + value = extractor.extract(wrapper); } + + return value; + } + + protected void doAdd(HttpParameters params, HttpRequest req, HttpResponse resp, HttpFlowContext context) { + Object value = extractValue(req, resp, context); + try { + if (value instanceof CharSequence) { + params.add(name, (CharSequence) value); + } else if (value instanceof List) { + params.add(name, (List<CharSequence>) value); + } + } catch (Exception ex) { + if (LOGGER.isDebugEnabled()) { + LOGGER.debug(ex.getMessage(), ex); + } + } + } } @@ -300,12 +393,16 @@ private static abstract class SetParamOperation extends AddParamOperation { public SetParamOperation(CharSequence name, Object value) { - super(name, value); + this(name, new UnmutableValueExtractor(value)); } - protected void doSet(HttpParameters params) { + public SetParamOperation(CharSequence name, ValueExtractor extractor) { + super(name, extractor); + } + + protected void doSet(HttpParameters params, HttpRequest req, HttpResponse resp, HttpFlowContext context) { params.remove(name); - doAdd(params); + doAdd(params, req, resp, context); } } @@ -315,12 +412,16 @@ super(headerName); } + public PostDataRemoveParamOperation(ValueExtractor extractor) { + super(extractor); + } + @Override - public void process(HttpMessage message) { + protected void doProcess(CharSequence value, HttpRequest req, HttpResponse resp, HttpFlowContext context) { try { - HttpParameters params = HELPER.decodeFormUrlencoded(message); - if (doRemove(params)) { - HELPER.setFormUrlencoded(message, params); + HttpParameters params = HELPER.decodeFormUrlencoded(req); + if (doRemove(params, req, resp, context)) { + HELPER.setFormUrlencoded(req, params); } } catch (Exception e) { if (LOGGER.isDebugEnabled()) { @@ -337,12 +438,16 @@ super(name, value); } + public PostDataAddParamOperation(CharSequence name, ValueExtractor extractor) { + super(name, extractor); + } + @Override - public void process(HttpMessage message) { + public void process(HttpRequest req, HttpResponse resp, HttpFlowContext context) { try { - HttpParameters params = HELPER.decodeFormUrlencoded(message); - doAdd(params); - HELPER.setFormUrlencoded(message, params); + HttpParameters params = HELPER.decodeFormUrlencoded(req); + doAdd(params, req, resp, context); + HELPER.setFormUrlencoded(req, params); } catch (Exception e) { if (LOGGER.isDebugEnabled()) { LOGGER.debug(e.getMessage(), e); @@ -358,12 +463,16 @@ super(name, value); } + public PostDataSetParamOperation(CharSequence name, ValueExtractor extractor) { + super(name, extractor); + } + @Override - public void process(HttpMessage message) { + public void process(HttpRequest req, HttpResponse resp, HttpFlowContext context) { try { - HttpParameters params = HELPER.decodeFormUrlencoded(message); - doSet(params); - HELPER.setFormUrlencoded(message, params); + HttpParameters params = HELPER.decodeFormUrlencoded(req); + doSet(params, req, resp, context); + HELPER.setFormUrlencoded(req, params); } catch (Exception e) { if (LOGGER.isDebugEnabled()) { LOGGER.debug(e.getMessage(), e); @@ -373,27 +482,12 @@ } - private final List<Operation> outOps = new ArrayList<>(); - - private final List<Operation> inOps = new ArrayList<>(); + private final List<Operation> operations = new ArrayList<>(); private static final HttpMessageHelper HELPER = HttpMessageHelper.STRICT; - private Direction direction = Direction.Inbound; - - private MessageType messageType = MessageType.Request; - private HttpMessagePredicate predicate; - public Direction getDirection() { - return direction; - } - - public void setDirection(Direction direction) { - Assert.notNull(direction, "direction"); - this.direction = direction; - } - public HttpMessagePredicate getPredicate() { return predicate; } @@ -402,35 +496,15 @@ this.predicate = predicate; } - public MessageType getMessageType() { - return messageType; - } - - public void setMessageType(MessageType messageType) { - Assert.notNull(messageType, "messageType"); - this.messageType = messageType; - } - public void addOperation(Operation operation) { - addOperation(operation, Direction.Outbound); - } - - public void addOperation(Operation operation, Direction dir) { - if (dir == Direction.Inbound || dir == Direction.Both) { - inOps.add(operation); - } - - if (dir == Direction.Outbound || dir == Direction.Both) { - outOps.add(operation); - } + Assert.notNull(operation, "operation"); + operations.add(operation); } @Override public void configure(Configuration config) { - //TODO Dodac parametry direction i messageType List<Operation> ops = (List<Operation>) config.get("operations"); - outOps.clear(); - inOps.clear(); + operations.clear(); if (ops != null) { for (Operation op : ops) { @@ -441,58 +515,25 @@ predicate = (HttpMessagePredicate) config.get("applyIf"); } - List<Operation> getOutOps() { - return outOps; - } - - List<Operation> getInOps() { - return inOps; - } - - private void execOperations(List<Operation> ops, HttpMessage msg) { - for (Operation op : ops) { - op.process(msg); - } + public List<Operation> getOperations() { + return Collections.unmodifiableList(operations); } @Override - public int filterOutbound(HttpRequest request, HttpResponse resp, HttpFlowContext context) { - if (!outOps.isEmpty()) { + public int filterOutbound(HttpRequest req, HttpResponse resp, HttpFlowContext context) { + if (!operations.isEmpty()) { boolean exec = true; if (predicate != null) { - HttpMessageWrapper wrapper = new HttpMessageWrapper(request, resp, context); + HttpMessageWrapper wrapper = new HttpMessageWrapper(req, resp, context); exec = predicate.test(wrapper); } - if (exec && (messageType == MessageType.Request || messageType == MessageType.Both)) { - execOperations(outOps, request); + if (exec) { + for (Operation op : operations) { + op.process(req, resp, context); + } } - if (exec && (messageType == MessageType.Reponse || messageType == MessageType.Both)) { - execOperations(outOps, resp); - } - } - - return DUNNO; - } - - @Override - public int filterInbound(HttpRequest request, HttpResponse resp, HttpFlowContext context) { - if (!inOps.isEmpty()) { - boolean exec = true; - if (predicate != null) { - HttpMessageWrapper wrapper = new HttpMessageWrapper(request, resp, context); - exec = predicate.test(wrapper); - } - - if (exec && (messageType == MessageType.Request || messageType == MessageType.Both)) { - execOperations(inOps, request); - - } - - if (exec && (messageType == MessageType.Reponse || messageType == MessageType.Both)) { - execOperations(inOps, resp); - } } return DUNNO; @@ -501,10 +542,7 @@ @Override public HttpMessageModificationFilter instanceForWorker(int index) { HttpMessageModificationFilter filter = new HttpMessageModificationFilter(); - filter.outOps.addAll(outOps); - filter.inOps.addAll(inOps); - filter.direction = direction; - filter.messageType = messageType; + filter.operations.addAll(operations); filter.predicate = predicate; return filter; } @@ -520,8 +558,14 @@ ) ); - HeaderOperationNodeDefinition headerNodeDef = new HeaderOperationNodeDefinition(); - + HeaderOperationNodeDefinition headerNodeDef = new HeaderOperationNodeDefinition( + mixedDef( + valueDef(), + mapDef(tupleDef("$expr", valueDef())) + ) + ); + + KeyNameVaryListNodeDefinition operationsDef = new KeyNameVaryListNodeDefinition() .setNodeTransformer(new HttpMessageModificationFilterTransformer()) .add("$removeHeader", valueDef().addValidator(HeaderNameValidator.INSTANCE))
--- a/stress-tester/src/main/java/com/passus/st/client/http/filter/HttpMessageModificationFilterTransformer.java Tue Aug 01 12:24:47 2017 +0200 +++ b/stress-tester/src/main/java/com/passus/st/client/http/filter/HttpMessageModificationFilterTransformer.java Tue Aug 01 12:25:18 2017 +0200 @@ -12,6 +12,10 @@ import java.util.List; import com.passus.config.schema.NodeTransformer; import com.passus.config.validation.Errors; +import com.passus.filter.MvelValueExtractor; +import com.passus.filter.ValueExtractor; +import com.passus.filter.ValueExtractorParser; +import com.passus.filter.config.ExpressionNodeTransformer; import static com.passus.st.validation.NodeValidationUtils.validateType; /** @@ -20,6 +24,10 @@ */ public class HttpMessageModificationFilterTransformer implements NodeTransformer { + private final ExpressionNodeTransformer exprTransformer = new ExpressionNodeTransformer(); + + private final ValueExtractorParser valueExtractorParser = new ValueExtractorParser(); + private Operation createNameOperation(CTupleNode tuple, Errors errors, Class<? extends Operation> clazz) { if (validateType(tuple.getNode(), NodeType.VALUE, errors)) { CValueNode valNode = (CValueNode) tuple.getNode(); @@ -39,12 +47,33 @@ if (validateType(tuple.getNode(), NodeType.MAP, errors)) { CTupleNode valTupleNode = ((CMapNode) tuple.getNode()).getFirstChild(); if (valTupleNode != null) { - if (validateType(valTupleNode.getNode(), NodeType.VALUE, errors)) { - CValueNode valNode = (CValueNode) valTupleNode.getNode(); + ValueExtractor valueTransformer = null; + + if (valTupleNode.getNode().getType() == NodeType.VALUE) { + try { + CValueNode valNode = (CValueNode) valTupleNode.getNode(); + valueTransformer = valueExtractorParser.parse((String) valNode.getValue()); + } catch (Exception e) { + errors.reject("Invalid value definition."); + return null; + } + } else if (valTupleNode.getNode().getType() == NodeType.MAP) { + try { + valueTransformer = exprTransformer.transform(valTupleNode); + } catch (Exception e) { + errors.reject("Invalid expression."); + return null; + } + } else { + errors.reject("Invalid node."); + return null; + } + + if (valueTransformer != null) { try { return clazz - .getConstructor(CharSequence.class, CharSequence.class) - .newInstance(valTupleNode.getName(), valNode.getValue().toString()); + .getConstructor(CharSequence.class, ValueExtractor.class) + .newInstance(valTupleNode.getName(), valueTransformer); } catch (Exception e) { throw new RuntimeException(e.getMessage(), e); }
--- a/stress-tester/src/main/java/com/passus/st/client/http/filter/HttpMessagePredicate.java Tue Aug 01 12:24:47 2017 +0200 +++ b/stress-tester/src/main/java/com/passus/st/client/http/filter/HttpMessagePredicate.java Tue Aug 01 12:25:18 2017 +0200 @@ -37,67 +37,4 @@ return predicate.test(wrapper); } - public static class HttpMessageWrapper { - - private final HttpFilterRequestWrapper req; - - private final HttpFilterResponseWrapper resp; - - private final HttpFilterResponseWrapper origResp; - - private final SessionInfo session; - - public HttpMessageWrapper(HttpRequest req, HttpResponse resp, HttpFlowContext context) { - this.req = (HttpFilterRequestWrapper) createWrapper((HttpRequest) req); - this.resp = (HttpFilterResponseWrapper) createWrapper((HttpResponse) resp); - - if (context != null) { - this.origResp = (HttpFilterResponseWrapper) createWrapper((HttpResponse) context.origReponse()); - this.session = context.sessionInfo(); - } else { - this.session = null; - this.origResp = null; - } - } - - public HttpMessageWrapper(HttpFilterRequestWrapper req, - HttpFilterResponseWrapper resp, - HttpFilterResponseWrapper origResp, - SessionInfo session) { - this.req = req; - this.resp = resp; - this.origResp = origResp; - this.session = session; - } - - public HttpFilterRequestWrapper getReq() { - return req; - } - - public HttpFilterResponseWrapper getResp() { - return resp; - } - - public HttpFilterResponseWrapper getOrigResp() { - return origResp; - } - - public SessionInfo getSession() { - return session; - } - - private HttpFilterMessageWrapper createWrapper(HttpMessage message) { - if (message == null) { - return null; - } - - if (message.isRequest()) { - return new HttpFilterRequestWrapper((HttpRequest) message); - } else { - return new HttpFilterResponseWrapper((HttpResponse) message); - } - } - - } - }
--- a/stress-tester/src/test/java/com/passus/st/client/http/filter/HttpFiltersConfiguratorTest.java Tue Aug 01 12:24:47 2017 +0200 +++ b/stress-tester/src/test/java/com/passus/st/client/http/filter/HttpFiltersConfiguratorTest.java Tue Aug 01 12:25:18 2017 +0200 @@ -38,7 +38,7 @@ List<HttpFilter> filters = captor.getAllValues(); assertTrue(filters.get(0) instanceof HttpMessageModificationFilter); HttpMessageModificationFilter modFilter = (HttpMessageModificationFilter) filters.get(0); - assertEquals(6, modFilter.getOutOps().size()); + assertEquals(6, modFilter.getOperations().size()); assertTrue(filters.get(1) instanceof HttpRequestProxyHeadersFilterCleaner); assertTrue(filters.get(2) instanceof HttpBasicAuthLoginFilter);
--- a/stress-tester/src/test/java/com/passus/st/client/http/filter/HttpMessageModificationFilterTest.java Tue Aug 01 12:24:47 2017 +0200 +++ b/stress-tester/src/test/java/com/passus/st/client/http/filter/HttpMessageModificationFilterTest.java Tue Aug 01 12:25:18 2017 +0200 @@ -1,15 +1,21 @@ package com.passus.st.client.http.filter; import com.passus.config.validation.Errors; +import com.passus.filter.BeanValueExtractor; import com.passus.net.http.HttpHeaders; import com.passus.net.http.HttpMessageHelper; import com.passus.net.http.HttpParameters; import com.passus.net.http.HttpRequest; import com.passus.net.http.HttpRequestBuilder; import com.passus.st.AppUtils; +import com.passus.st.client.http.HttpFlowContext; +import com.passus.st.client.http.HttpScopes; import com.passus.st.client.http.filter.HttpMessageModificationFilter.*; import java.util.Arrays; import java.util.List; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import org.mvel2.PropertyAccessor; import static org.testng.AssertJUnit.*; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; @@ -33,7 +39,7 @@ AppUtils.unregisterAll(); } - @Test + @Test(enabled = false) public void testFilterOutbound() throws Exception { HttpRequest req = HttpRequestBuilder.post("http://test.com/path/test?uParam1=1", "param1=value1¶m2=value2¶m3=value3") .header("Header1", "Header1Value1") @@ -89,7 +95,9 @@ + " $setHeader: \n" + " Header5: HeaderValue5\n" + " $setHeader: \n" - + " Header3: Header1Value3a\n"; + + " Header3: Header1Value3a\n" + + " $setHeader: \n" + + " Header6: \"$scopes.getSession('testId').get('testParam')\"\n"; Errors errors = new Errors(); List<HttpFilter> filters = HttpFiltersConfigurator.getFilters(filterConfig, errors); @@ -106,17 +114,22 @@ .build(); HttpMessageModificationFilter filter = (HttpMessageModificationFilter) filters.get(0); - filter.filterOutbound(req, null, null); + HttpFlowContext mockContext = mock(HttpFlowContext.class); + final HttpScopes scopes = new HttpScopes(); + scopes.createSession("testId").set("testParam", "exprValue"); + when(mockContext.scopes()).thenReturn(scopes); + filter.filterOutbound(req, null, mockContext); HttpHeaders headers = req.getHeaders(); assertFalse(headers.contains("Header1")); assertEquals("HeaderValue4", headers.get("Header4").toString()); assertEquals("HeaderValue5", headers.get("Header5").toString()); assertEquals("Header1Value3a", headers.get("Header3").toString()); + assertEquals("exprValue", headers.get("Header6").toString()); } - @Test + @Test(enabled = false) public void testConfigure_ApplyIf() throws Exception { HttpRequest req = HttpRequestBuilder.post("http://test.com/path/test") .header("Header1", "Header1Value1")