Skip to content

Commit d03a88a

Browse files
committed
finished support for retrieving log messages by request
1 parent da2b2a3 commit d03a88a

File tree

19 files changed

+590
-246
lines changed

19 files changed

+590
-246
lines changed

mockserver-core/src/main/java/org/mockserver/filters/LogFilter.java

Lines changed: 48 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.google.common.base.Function;
44
import com.google.common.base.Predicate;
55
import com.google.common.collect.EvictingQueue;
6-
import com.google.common.collect.Lists;
76
import com.google.common.collect.Queues;
87
import org.mockserver.client.serialization.HttpRequestSerializer;
98
import org.mockserver.log.model.*;
@@ -18,38 +17,63 @@
1817
import java.util.*;
1918

2019
import static org.mockserver.character.Character.NEW_LINE;
21-
import static org.mockserver.model.HttpRequest.request;
2220

2321
/**
2422
* @author jamesdbloom
2523
*/
2624
public class LogFilter {
2725

28-
public final static List<Class<? extends LogEntry>> REQUEST_LOG_TYPES = Arrays.asList(
26+
private final static List<Class<? extends LogEntry>> MESSAGE_LOG_TYPES = Collections.<Class<? extends LogEntry>>singletonList(
27+
MessageLogEntry.class
28+
);
29+
private final static List<Class<? extends LogEntry>> REQUEST_LOG_TYPES = Arrays.asList(
2930
RequestLogEntry.class,
3031
RequestResponseLogEntry.class,
3132
ExpectationMatchLogEntry.class
3233
);
33-
public final static List<Class<? extends LogEntry>> EXPECTATION_LOG_TYPES = Arrays.<Class<? extends LogEntry>>asList(
34+
private final static List<Class<? extends LogEntry>> EXPECTATION_LOG_TYPES = Arrays.<Class<? extends LogEntry>>asList(
3435
RequestResponseLogEntry.class,
3536
ExpectationMatchLogEntry.class
3637
);
37-
private final LoggingFormatter logFormatter;
38-
private Queue<LogEntry> requestLog = Queues.synchronizedQueue(EvictingQueue.<LogEntry>create(100));
39-
private MatcherBuilder matcherBuilder;
40-
private HttpRequestSerializer httpRequestSerializer = new HttpRequestSerializer();
41-
42-
private Function<LogEntry, HttpRequest> logEntryToHttpRequestFunction = new Function<LogEntry, HttpRequest>() {
38+
static Predicate<LogEntry> messageLogPredicate = new Predicate<LogEntry>() {
39+
public boolean apply(LogEntry input) {
40+
return MESSAGE_LOG_TYPES.contains(input.getClass());
41+
}
42+
};
43+
private static Function<LogEntry, HttpRequest> logEntryToRequest = new Function<LogEntry, HttpRequest>() {
4344
public HttpRequest apply(LogEntry logEntry) {
4445
return logEntry.getHttpRequest();
4546
}
4647
};
47-
48-
private Predicate<LogEntry> notMessageLogEntryPredicate = new Predicate<LogEntry>() {
48+
static Predicate<LogEntry> requestLogPredicate = new Predicate<LogEntry>() {
49+
public boolean apply(LogEntry input) {
50+
return REQUEST_LOG_TYPES.contains(input.getClass());
51+
}
52+
};
53+
private static Function<LogEntry, Expectation> logEntryToExpectation = new Function<LogEntry, Expectation>() {
54+
public Expectation apply(LogEntry logEntry) {
55+
return ((ExpectationLogEntry) logEntry).getExpectation();
56+
}
57+
};
58+
static Predicate<LogEntry> expectationLogPredicate = new Predicate<LogEntry>() {
59+
public boolean apply(LogEntry input) {
60+
return EXPECTATION_LOG_TYPES.contains(input.getClass());
61+
}
62+
};
63+
public static Predicate<LogEntry> notMessageLogEntryPredicate = new Predicate<LogEntry>() {
4964
public boolean apply(LogEntry logEntry) {
5065
return !(logEntry instanceof MessageLogEntry);
5166
}
5267
};
68+
private final LoggingFormatter logFormatter;
69+
private Queue<LogEntry> requestLog = Queues.synchronizedQueue(EvictingQueue.<LogEntry>create(100));
70+
private MatcherBuilder matcherBuilder;
71+
private HttpRequestSerializer httpRequestSerializer = new HttpRequestSerializer();
72+
private Function<LogEntry, String> logEntryToMessage = new Function<LogEntry, String>() {
73+
public String apply(LogEntry logEntry) {
74+
return ((MessageLogEntry) logEntry).getMessage();
75+
}
76+
};
5377

5478
public LogFilter(LoggingFormatter logFormatter) {
5579
this.logFormatter = logFormatter;
@@ -77,34 +101,24 @@ public void clear(HttpRequest request) {
77101
}
78102
}
79103

80-
public List<HttpRequest> retrieveRequests(HttpRequest httpRequest) {
81-
return Lists.transform(
82-
retrieveLogEntries(httpRequest, REQUEST_LOG_TYPES),
83-
logEntryToHttpRequestFunction
84-
);
104+
public List<String> retrieveMessages(HttpRequest httpRequest) {
105+
return retrieveLogEntries(httpRequest, messageLogPredicate, logEntryToMessage);
85106
}
86107

87-
public List<Expectation> retrieveExpectations(HttpRequest httpRequest) {
88-
List<Expectation> matchingExpectations = new ArrayList<>();
89-
List<LogEntry> logEntries = retrieveLogEntries(httpRequest, EXPECTATION_LOG_TYPES);
90-
for (LogEntry logEntry : logEntries) {
91-
matchingExpectations.add(((ExpectationLogEntry) logEntry).getExpectation());
92-
}
93-
return matchingExpectations;
108+
public List<HttpRequest> retrieveRequests(HttpRequest httpRequest) {
109+
return retrieveLogEntries(httpRequest, requestLogPredicate, logEntryToRequest);
94110
}
95111

96-
public List<LogEntry> retrieveLogEntries(HttpRequest httpRequest) {
97-
return retrieveLogEntries(httpRequest, Collections.<Class<? extends LogEntry>>emptyList());
112+
public List<Expectation> retrieveExpectations(HttpRequest httpRequest) {
113+
return retrieveLogEntries(httpRequest, expectationLogPredicate, logEntryToExpectation);
98114
}
99115

100-
public List<LogEntry> retrieveLogEntries(HttpRequest httpRequest, List<Class<? extends LogEntry>> types) {
101-
List<LogEntry> requestLog = new LinkedList<>(this.requestLog);
102-
103-
List<LogEntry> matchingLogEntries = new ArrayList<>();
116+
<T> List<T> retrieveLogEntries(HttpRequest httpRequest, Predicate<LogEntry> logEntryPredicate, Function<LogEntry, T> logEntryToTypeFunction) {
117+
List<T> matchingLogEntries = new ArrayList<>();
104118
HttpRequestMatcher httpRequestMatcher = matcherBuilder.transformsToMatcher(httpRequest);
105-
for (LogEntry logEntry : requestLog) {
106-
if ((types.isEmpty() || types.contains(logEntry.getClass())) && httpRequestMatcher.matches(logEntry.getHttpRequest(), true)) {
107-
matchingLogEntries.add(logEntry);
119+
for (LogEntry logEntry : new LinkedList<>(this.requestLog)) {
120+
if (logEntryPredicate.apply(logEntry) && httpRequestMatcher.matches(logEntry.getHttpRequest(), false)) {
121+
matchingLogEntries.add(logEntryToTypeFunction.apply(logEntry));
108122
}
109123
}
110124
return matchingLogEntries;
@@ -155,7 +169,7 @@ public String verify(VerificationSequence verificationSequence) {
155169
boolean foundRequest = false;
156170
for (; !foundRequest && requestLogCounter < requestLog.size(); requestLogCounter++) {
157171
LogEntry logEntry = requestLog.get(requestLogCounter);
158-
if (!(logEntry instanceof MessageLogEntry) && httpRequestMatcher.matches(logEntry.getHttpRequest(), true)) {
172+
if (!(logEntry instanceof MessageLogEntry) && httpRequestMatcher.matches(logEntry.getHttpRequest(), false)) {
159173
// move on to next request
160174
foundRequest = true;
161175
}

mockserver-core/src/main/java/org/mockserver/formatting/StringFormatter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public static String[] indentAndToString(Object... objects) {
2525
public static String formatLogMessage(String message, Object... arguments) {
2626
StringBuilder errorMessage = new StringBuilder();
2727
Object[] formattedArguments = indentAndToString(arguments);
28-
String[] messageParts = (message + NEW_LINE).split("\\{\\}");
28+
String[] messageParts = message.split("\\{\\}");
2929
for (int messagePartIndex = 0; messagePartIndex < messageParts.length; messagePartIndex++) {
3030
errorMessage.append(messageParts[messagePartIndex]);
3131
if (formattedArguments.length > messagePartIndex) {

mockserver-core/src/main/java/org/mockserver/logging/LoggingFormatter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,18 @@ public LoggingFormatter(Logger logger, HttpStateHandler httpStateHandler) {
2525

2626
public void traceLog(String message, Object... arguments) {
2727
if (logger.isTraceEnabled()) {
28-
logger.trace(formatLogMessage(message + NEW_LINE + NEW_LINE, arguments));
28+
logger.trace(formatLogMessage(message, arguments));
2929
}
3030
}
3131

3232
public void infoLog(HttpRequest request, String message, Object... arguments) {
33-
String logMessage = formatLogMessage(message + NEW_LINE, arguments);
33+
String logMessage = formatLogMessage(message, arguments);
3434
logger.info(logMessage);
3535
addLogEvents(request, logMessage);
3636
}
3737

3838
public void infoLog(List<HttpRequest> requests, String message, Object... arguments) {
39-
String logMessage = formatLogMessage(message + NEW_LINE, arguments);
39+
String logMessage = formatLogMessage(message, arguments);
4040
logger.info(logMessage);
4141
addLogEvents(requests, logMessage);
4242
}

mockserver-core/src/main/java/org/mockserver/matchers/HttpRequestMatcher.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ private void withSsl(Boolean isSsl) {
156156
}
157157

158158
public boolean matches(HttpRequest request) {
159-
return matches(request, false);
159+
return matches(request, true);
160160
}
161161

162162
public boolean matches(HttpRequest request, boolean logMatchResults) {
@@ -200,25 +200,25 @@ public boolean matches(HttpRequest request, boolean logMatchResults) {
200200
boolean totalResult = methodMatches && pathMatches && queryStringParametersMatches && bodyMatches && headersMatch && cookiesMatch && keepAliveMatches && sslMatches;
201201
boolean totalResultAfterNotOperatorApplied = request.isNot() == (this.httpRequest.isNot() == (not != totalResult));
202202

203-
if (logMatchResults && logger.isInfoEnabled()) {
203+
if (logMatchResults) {
204204
if (!totalResultAfterNotOperatorApplied) {
205205
StringBuilder becauseBuilder = new StringBuilder();
206-
becauseBuilder.append("method matches = ").append(methodMatches).append(NEW_LINE);
207-
becauseBuilder.append("path matches = ").append(pathMatches).append(NEW_LINE);
208-
becauseBuilder.append("query string parameters match = ").append(queryStringParametersMatches).append(NEW_LINE);
209-
becauseBuilder.append("body matches = ").append(bodyMatches).append(NEW_LINE);
210-
becauseBuilder.append("headers match = ").append(headersMatch).append(NEW_LINE);
211-
becauseBuilder.append("cookies match = ").append(cookiesMatch).append(NEW_LINE);
212-
becauseBuilder.append("keep-alive matches = ").append(keepAliveMatches).append(NEW_LINE);
213-
becauseBuilder.append("ssl matches = ").append(sslMatches).append(NEW_LINE);
206+
becauseBuilder.append("method matches = ").append(methodMatches);
207+
becauseBuilder.append(NEW_LINE).append("path matches = ").append(pathMatches);
208+
becauseBuilder.append(NEW_LINE).append("query string parameters match = ").append(queryStringParametersMatches);
209+
becauseBuilder.append(NEW_LINE).append("body matches = ").append(bodyMatches);
210+
becauseBuilder.append(NEW_LINE).append("headers match = ").append(headersMatch);
211+
becauseBuilder.append(NEW_LINE).append("cookies match = ").append(cookiesMatch);
212+
becauseBuilder.append(NEW_LINE).append("keep-alive matches = ").append(keepAliveMatches);
213+
becauseBuilder.append(NEW_LINE).append("ssl matches = ").append(sslMatches);
214214
if (request.isNot()) {
215-
becauseBuilder.append("request \'not\' operator is enabled").append(NEW_LINE);
215+
becauseBuilder.append(NEW_LINE).append("request \'not\' operator is enabled");
216216
}
217217
if (this.httpRequest.isNot()) {
218-
becauseBuilder.append("expectation's request \'not\' operator is enabled").append(NEW_LINE);
218+
becauseBuilder.append(NEW_LINE).append("expectation's request \'not\' operator is enabled");
219219
}
220220
if (not) {
221-
becauseBuilder.append("expectation's request matcher \'not\' operator is enabled").append(NEW_LINE);
221+
becauseBuilder.append(NEW_LINE).append("expectation's request matcher \'not\' operator is enabled");
222222
}
223223
logFormatter.infoLog(request, "request:{}" + NEW_LINE + " did" + (totalResult ? "" : " not") + " match expectation:{}" + NEW_LINE + " because:{}", request, this, becauseBuilder.toString());
224224
} else {

mockserver-core/src/main/java/org/mockserver/mock/Expectation.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.mockserver.mock;
22

3+
import com.fasterxml.jackson.annotation.JsonIgnore;
34
import org.mockserver.matchers.TimeToLive;
45
import org.mockserver.matchers.Times;
56
import org.mockserver.model.*;
@@ -267,6 +268,7 @@ public Expectation thenCallback(HttpObjectCallback httpObjectCallback) {
267268
return this;
268269
}
269270

271+
@JsonIgnore
270272
public boolean isActive() {
271273
return hasRemainingMatches() && isStillAlive();
272274
}

0 commit comments

Comments
 (0)