RequestLine.java

1
package com.renomad.minum.web;
2
3
import com.renomad.minum.logging.ILogger;
4
import com.renomad.minum.security.ForbiddenUseException;
5
import com.renomad.minum.utils.StringUtils;
6
7
import java.util.*;
8
9
import static com.renomad.minum.utils.Invariants.mustNotBeNull;
10
11
/**
12
 * This class holds data and methods for dealing with the
13
 * "start line" in an HTTP request.  For example,
14
 * GET /foo HTTP/1.1
15
 */
16
public final class RequestLine {
17
18
    private final Method method;
19
    private final PathDetails pathDetails;
20
    private final HttpVersion version;
21
    private final String rawValue;
22
    private final ILogger logger;
23
    static final int MAX_QUERY_STRING_KEYS_COUNT = 50;
24
25
    /**
26
     * @param method GET, POST, etc.
27
     * @param pathDetails See {@link PathDetails}
28
     * @param version the version of HTTP (1.0 or 1.1) we're receiving
29
     * @param rawValue the entire raw string of the start line
30
     */
31
    public RequestLine(
32
            Method method,
33
            PathDetails pathDetails,
34
            HttpVersion version,
35
            String rawValue,
36
            ILogger logger
37
    ) {
38
        this.method = method;
39
        this.pathDetails = pathDetails;
40
        this.version = version;
41
        this.rawValue = rawValue;
42
        this.logger = logger;
43
    }
44
45
46
47
    public static final RequestLine EMPTY = new RequestLine(Method.NONE, PathDetails.empty, HttpVersion.NONE, "", null);
48
49
    /**
50
     * Returns a map of the key-value pairs in the URL,
51
     * for example in {@code http://foo.com?name=alice} you
52
     * have a key of name and a value of alice.
53
     */
54
    public Map<String, String> queryString() {
55 2 1. queryString : negated conditional → KILLED
2. queryString : negated conditional → KILLED
        if (pathDetails == null || pathDetails.getQueryString().isEmpty()) {
56
            return Map.of();
57
        } else {
58 1 1. queryString : replaced return value with Collections.emptyMap for com/renomad/minum/web/RequestLine::queryString → KILLED
            return new HashMap<>(pathDetails.getQueryString());
59
        }
60
61
    }
62
63
    /**
64
     * These are the HTTP methods we handle.
65
     */
66
    public enum Method {
67
        GET,
68
        POST,
69
        PUT,
70
        DELETE,
71
        TRACE,
72
        PATCH,
73
        OPTIONS,
74
        HEAD,
75
76
        /**
77
         * Represents the null value of Method
78
         */
79
        NONE;
80
81
        /**
82
         * Get the correct HTTP method for a string provided by the user
83
         */
84
        public static Method getMethod(String userSuppliedMethod) {
85
            // if the method they gave us is longer than the maximum method
86
            // we know about, it's invalid, and return NONE.
87 2 1. getMethod : changed conditional boundary → KILLED
2. getMethod : negated conditional → KILLED
            if (userSuppliedMethod.length() > 7) {
88 1 1. getMethod : replaced return value with null for com/renomad/minum/web/RequestLine$Method::getMethod → KILLED
                return NONE;
89
            }
90
            // necessary because we need to potentially convert to lowercase
91
            var sb = new StringBuilder(userSuppliedMethod.length());
92
93 2 1. getMethod : negated conditional → KILLED
2. getMethod : changed conditional boundary → KILLED
            for (int i = 0; i < userSuppliedMethod.length(); i++) {
94
                char c = userSuppliedMethod.charAt(i);
95 4 1. getMethod : negated conditional → KILLED
2. getMethod : changed conditional boundary → KILLED
3. getMethod : negated conditional → KILLED
4. getMethod : changed conditional boundary → KILLED
                if ((c >= 65 && c <= 90)) { // characters in methods are pure ascii, no UTF-8 to worry about
96
                    sb.append(c);
97 4 1. getMethod : changed conditional boundary → SURVIVED
2. getMethod : changed conditional boundary → KILLED
3. getMethod : negated conditional → KILLED
4. getMethod : negated conditional → KILLED
                } else if (c >= 97 && c <= 122) { // if characters are lower-case, make them upper-case
98 1 1. getMethod : Replaced integer subtraction with addition → KILLED
                    sb.append((char)(c - 32));
99
                } else {
100 1 1. getMethod : replaced return value with null for com/renomad/minum/web/RequestLine$Method::getMethod → KILLED
                    return NONE; // if any of the characters are non-ascii-alphabet, it's invalid, bail.
101
                }
102
            }
103 1 1. getMethod : replaced return value with null for com/renomad/minum/web/RequestLine$Method::getMethod → KILLED
            return switch (sb.toString()) {
104
                case "GET" -> GET;
105
                case "POST" -> POST;
106
                case "PUT" -> PUT;
107
                case "DELETE" -> DELETE;
108
                case "TRACE" -> TRACE;
109
                case "PATCH" -> PATCH;
110
                case "OPTIONS" -> OPTIONS;
111
                case "HEAD" -> HEAD;
112
                default -> NONE;
113
            };
114
        }
115
    }
116
117
    /**
118
     * Given the string value of a Request Line (like GET /hello HTTP/1.1)
119
     * validate and extract the values for our use.
120
     */
121
    public RequestLine extractRequestLine(String value) {
122
        mustNotBeNull(value);
123 1 1. extractRequestLine : negated conditional → KILLED
        if (value.isEmpty()) {
124 1 1. extractRequestLine : replaced return value with null for com/renomad/minum/web/RequestLine::extractRequestLine → KILLED
            return RequestLine.EMPTY;
125
        }
126
        RequestLineRawValues rawValues = requestLineTokenizer(value);
127 1 1. extractRequestLine : negated conditional → KILLED
        if (rawValues == null) {
128 1 1. extractRequestLine : replaced return value with null for com/renomad/minum/web/RequestLine::extractRequestLine → KILLED
            return RequestLine.EMPTY;
129
        }
130
        Method myMethod;
131
        myMethod = Method.getMethod(rawValues.method());
132 1 1. extractRequestLine : negated conditional → KILLED
        if (myMethod.equals(Method.NONE)) {
133
            logger.logDebug(() -> "Unable to convert method to enum.  Returning empty request line.  Method value provided: " + rawValues.method());
134 1 1. extractRequestLine : replaced return value with null for com/renomad/minum/web/RequestLine::extractRequestLine → KILLED
            return RequestLine.EMPTY;
135
        }
136
        PathDetails pd = extractPathDetails(rawValues.path());
137
        HttpVersion httpVersion = getHttpVersion(rawValues.protocol());
138 1 1. extractRequestLine : negated conditional → KILLED
        if (httpVersion.equals(HttpVersion.NONE)) {
139 1 1. extractRequestLine : replaced return value with null for com/renomad/minum/web/RequestLine::extractRequestLine → KILLED
            return RequestLine.EMPTY;
140
        }
141
142 1 1. extractRequestLine : replaced return value with null for com/renomad/minum/web/RequestLine::extractRequestLine → KILLED
        return new RequestLine(myMethod, pd, httpVersion, value, logger);
143
    }
144
145
    /**
146
     * Split the request line into three parts - a method (e.g. GET), a
147
     * path (e.g. "/" or "/helloworld/hi/foo?name=hello") and a protocol,
148
     * which is typically "HTTP/1.1" but might be "HTTP/1.0" in some cases
149
     * <br>
150
     * If we don't find exactly three parts, we will return null, which
151
     * is interpreted by the calling method to mean we didn't receive a
152
     * valid request line.
153
     * @param rawRequestLine the full string of the first line received
154
     *                       after the socket is connected to the client.
155
     */
156
    private RequestLineRawValues requestLineTokenizer(String rawRequestLine) {
157
        int firstSpace = rawRequestLine.indexOf(' ');
158 1 1. requestLineTokenizer : negated conditional → KILLED
        if (firstSpace == -1) {
159
            return null;
160
        }
161 1 1. requestLineTokenizer : Replaced integer addition with subtraction → KILLED
        int secondSpace = rawRequestLine.indexOf(' ', firstSpace + 1);
162 1 1. requestLineTokenizer : negated conditional → KILLED
        if (secondSpace == -1) {
163
            return null;
164
        }
165 1 1. requestLineTokenizer : Replaced integer addition with subtraction → KILLED
        int thirdSpace = rawRequestLine.indexOf(' ', secondSpace + 1);
166 1 1. requestLineTokenizer : negated conditional → KILLED
        if (thirdSpace != -1) {
167
            return null;
168
        }
169
        String myMethod = rawRequestLine.substring(0, firstSpace);
170 1 1. requestLineTokenizer : Replaced integer addition with subtraction → KILLED
        String path = rawRequestLine.substring(firstSpace + 1, secondSpace);
171 1 1. requestLineTokenizer : Replaced integer addition with subtraction → KILLED
        String protocol = rawRequestLine.substring(secondSpace + 1);
172 1 1. requestLineTokenizer : replaced return value with null for com/renomad/minum/web/RequestLine::requestLineTokenizer → KILLED
        return new RequestLineRawValues(myMethod, path, protocol);
173
    }
174
175
    private PathDetails extractPathDetails(String path) {
176
        PathDetails pd;
177
        // the request line will have a forward slash at the beginning of
178
        // the path.  Remove that here.
179
        String adjustedPath = path.substring(1);
180
        int locationOfQueryBegin = adjustedPath.indexOf("?");
181 2 1. extractPathDetails : changed conditional boundary → KILLED
2. extractPathDetails : negated conditional → KILLED
        if (locationOfQueryBegin >= 0) {
182
            // in this case, we found a question mark, suggesting that a query string exists
183 1 1. extractPathDetails : Replaced integer addition with subtraction → KILLED
            String rawQueryString = adjustedPath.substring(locationOfQueryBegin + 1);
184
            String isolatedPath = adjustedPath.substring(0, locationOfQueryBegin);
185
            Map<String, String> queryString = extractMapFromQueryString(rawQueryString);
186
            pd = new PathDetails(isolatedPath, rawQueryString, queryString);
187
        } else {
188
            // in this case, no question mark was found, thus no query string
189
            pd = new PathDetails(adjustedPath, null, null);
190
        }
191 1 1. extractPathDetails : replaced return value with null for com/renomad/minum/web/RequestLine::extractPathDetails → KILLED
        return pd;
192
    }
193
194
195
    /**
196
     * Given a string containing the combined key-values in
197
     * a query string (e.g. foo=bar&name=alice), split that
198
     * into a map of the key to value (e.g. foo to bar, and name to alice)
199
     */
200
    Map<String, String> extractMapFromQueryString(String rawQueryString) {
201
        Map<String, String> queryStrings = new HashMap<>();
202
        StringTokenizer tokenizer = new StringTokenizer(rawQueryString, "&");
203
        // we'll only take less than MAX_QUERY_STRING_KEYS_COUNT
204 2 1. extractMapFromQueryString : negated conditional → KILLED
2. extractMapFromQueryString : Changed increment from 1 to -1 → KILLED
        for (int i = 0; tokenizer.hasMoreTokens(); i++) {
205 2 1. extractMapFromQueryString : changed conditional boundary → KILLED
2. extractMapFromQueryString : negated conditional → KILLED
            if (i >= MAX_QUERY_STRING_KEYS_COUNT) throw new ForbiddenUseException("User tried providing too many query string keys.  max: " + MAX_QUERY_STRING_KEYS_COUNT);
206
            // this should give us a key and value joined with an equal sign, e.g. foo=bar
207
            String currentKeyValue = tokenizer.nextToken();
208
            int equalSignLocation = currentKeyValue.indexOf("=");
209 2 1. extractMapFromQueryString : changed conditional boundary → KILLED
2. extractMapFromQueryString : negated conditional → KILLED
            if (equalSignLocation <= 0) return Map.of();
210
            String key = currentKeyValue.substring(0, equalSignLocation);
211 1 1. extractMapFromQueryString : Replaced integer addition with subtraction → KILLED
            String myRawValue = currentKeyValue.substring(equalSignLocation + 1);
212
            try {
213
                String value = StringUtils.decode(myRawValue);
214
                queryStrings.put(key, value);
215
            } catch (IllegalArgumentException ex) {
216
                logger.logDebug(() -> "Query string parsing failed for key: (%s) value: (%s).  Skipping to next key-value pair. error message: %s".formatted(key, myRawValue, ex.getMessage()));
217
            }
218
        }
219 1 1. extractMapFromQueryString : replaced return value with Collections.emptyMap for com/renomad/minum/web/RequestLine::extractMapFromQueryString → KILLED
        return queryStrings;
220
    }
221
222
    /**
223
     * Extract the HTTP version from the start line
224
     */
225
    private HttpVersion getHttpVersion(String version) {
226 1 1. getHttpVersion : negated conditional → KILLED
        if (version.equals("HTTP/1.1")) {
227 1 1. getHttpVersion : replaced return value with null for com/renomad/minum/web/RequestLine::getHttpVersion → KILLED
            return HttpVersion.ONE_DOT_ONE;
228 1 1. getHttpVersion : negated conditional → KILLED
        } else if (version.equals("HTTP/1.0")) {
229 1 1. getHttpVersion : replaced return value with null for com/renomad/minum/web/RequestLine::getHttpVersion → KILLED
            return HttpVersion.ONE_DOT_ZERO;
230
        } else {
231 1 1. getHttpVersion : replaced return value with null for com/renomad/minum/web/RequestLine::getHttpVersion → KILLED
            return HttpVersion.NONE;
232
        }
233
    }
234
235
    /**
236
     * Return the method of this request-line.  For example, GET, PUT, POST...
237
     */
238
    public Method getMethod() {
239 1 1. getMethod : replaced return value with null for com/renomad/minum/web/RequestLine::getMethod → KILLED
        return method;
240
    }
241
242
    /**
243
     * This returns an object which contains essential information about the path
244
     * in the request line.  For example, if the request line is "GET /sample?foo=bar HTTP/1.1",
245
     * this would hold data for the path ("sample") and the query string ("foo=bar")
246
     */
247
    public PathDetails getPathDetails() {
248 1 1. getPathDetails : replaced return value with null for com/renomad/minum/web/RequestLine::getPathDetails → KILLED
        return pathDetails;
249
    }
250
251
    /**
252
     * Gets the HTTP version, either 1.0 or 1.1
253
     */
254
    public HttpVersion getVersion() {
255 1 1. getVersion : replaced return value with null for com/renomad/minum/web/RequestLine::getVersion → KILLED
        return this.version;
256
    }
257
258
    /**
259
     * Get the string value of this request line, such as "GET /sample.html HTTP/1.1"
260
     */
261
    public String getRawValue() {
262 1 1. getRawValue : replaced return value with "" for com/renomad/minum/web/RequestLine::getRawValue → KILLED
        return rawValue;
263
    }
264
265
    @Override
266
    public boolean equals(Object o) {
267 2 1. equals : negated conditional → TIMED_OUT
2. equals : replaced boolean return with false for com/renomad/minum/web/RequestLine::equals → KILLED
        if (this == o) return true;
268 3 1. equals : negated conditional → TIMED_OUT
2. equals : negated conditional → KILLED
3. equals : replaced boolean return with true for com/renomad/minum/web/RequestLine::equals → KILLED
        if (o == null || getClass() != o.getClass()) return false;
269
        RequestLine that = (RequestLine) o;
270 6 1. equals : negated conditional → TIMED_OUT
2. equals : replaced boolean return with true for com/renomad/minum/web/RequestLine::equals → TIMED_OUT
3. equals : negated conditional → KILLED
4. equals : negated conditional → KILLED
5. equals : negated conditional → KILLED
6. equals : negated conditional → KILLED
        return method == that.method && Objects.equals(pathDetails, that.pathDetails) && version == that.version && Objects.equals(rawValue, that.rawValue) && Objects.equals(logger, that.logger);
271
    }
272
273
    @Override
274
    public int hashCode() {
275 1 1. hashCode : replaced int return with 0 for com/renomad/minum/web/RequestLine::hashCode → TIMED_OUT
        return Objects.hash(method, pathDetails, version, rawValue, logger);
276
    }
277
278
    @Override
279
    public String toString() {
280 1 1. toString : replaced return value with "" for com/renomad/minum/web/RequestLine::toString → KILLED
        return "RequestLine{" +
281
                "method=" + method +
282
                ", pathDetails=" + pathDetails +
283
                ", version=" + version +
284
                ", rawValue='" + rawValue + '\'' +
285
                ", logger=" + logger +
286
                '}';
287
    }
288
}

Mutations

55

1.1
Location : queryString
Killed by : com.renomad.minum.web.EndpointTests.test_Endpoint_HappyPath(com.renomad.minum.web.EndpointTests)
negated conditional → KILLED

2.2
Location : queryString
Killed by : com.renomad.minum.web.EndpointTests.test_Endpoint_HappyPath(com.renomad.minum.web.EndpointTests)
negated conditional → KILLED

58

1.1
Location : queryString
Killed by : com.renomad.minum.web.EndpointTests.test_Endpoint_HappyPath(com.renomad.minum.web.EndpointTests)
replaced return value with Collections.emptyMap for com/renomad/minum/web/RequestLine::queryString → KILLED

87

1.1
Location : getMethod
Killed by : com.renomad.minum.web.WebPerformanceTests.test3(com.renomad.minum.web.WebPerformanceTests)
changed conditional boundary → KILLED

2.2
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

88

1.1
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
replaced return value with null for com/renomad/minum/web/RequestLine$Method::getMethod → KILLED

93

1.1
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

2.2
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
changed conditional boundary → KILLED

95

1.1
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

2.2
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
changed conditional boundary → KILLED

3.3
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

4.4
Location : getMethod
Killed by : com.renomad.minum.web.WebPerformanceTests.test3(com.renomad.minum.web.WebPerformanceTests)
changed conditional boundary → KILLED

97

1.1
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
changed conditional boundary → KILLED

2.2
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

3.3
Location : getMethod
Killed by : none
changed conditional boundary → SURVIVED
Covering tests

4.4
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

98

1.1
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
Replaced integer subtraction with addition → KILLED

100

1.1
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
replaced return value with null for com/renomad/minum/web/RequestLine$Method::getMethod → KILLED

103

1.1
Location : getMethod
Killed by : com.renomad.minum.web.RequestLineTests.test_GetMethod_UnusualCapitalization(com.renomad.minum.web.RequestLineTests)
replaced return value with null for com/renomad/minum/web/RequestLine$Method::getMethod → KILLED

123

1.1
Location : extractRequestLine
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

124

1.1
Location : extractRequestLine
Killed by : com.renomad.minum.web.WebTests
replaced return value with null for com/renomad/minum/web/RequestLine::extractRequestLine → KILLED

127

1.1
Location : extractRequestLine
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

128

1.1
Location : extractRequestLine
Killed by : com.renomad.minum.web.WebTests
replaced return value with null for com/renomad/minum/web/RequestLine::extractRequestLine → KILLED

132

1.1
Location : extractRequestLine
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

134

1.1
Location : extractRequestLine
Killed by : com.renomad.minum.web.WebTests
replaced return value with null for com/renomad/minum/web/RequestLine::extractRequestLine → KILLED

138

1.1
Location : extractRequestLine
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

139

1.1
Location : extractRequestLine
Killed by : com.renomad.minum.web.WebTests
replaced return value with null for com/renomad/minum/web/RequestLine::extractRequestLine → KILLED

142

1.1
Location : extractRequestLine
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
replaced return value with null for com/renomad/minum/web/RequestLine::extractRequestLine → KILLED

158

1.1
Location : requestLineTokenizer
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

161

1.1
Location : requestLineTokenizer
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
Replaced integer addition with subtraction → KILLED

162

1.1
Location : requestLineTokenizer
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

165

1.1
Location : requestLineTokenizer
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
Replaced integer addition with subtraction → KILLED

166

1.1
Location : requestLineTokenizer
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

170

1.1
Location : requestLineTokenizer
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
Replaced integer addition with subtraction → KILLED

171

1.1
Location : requestLineTokenizer
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
Replaced integer addition with subtraction → KILLED

172

1.1
Location : requestLineTokenizer
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
replaced return value with null for com/renomad/minum/web/RequestLine::requestLineTokenizer → KILLED

181

1.1
Location : extractPathDetails
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
changed conditional boundary → KILLED

2.2
Location : extractPathDetails
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

183

1.1
Location : extractPathDetails
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
Replaced integer addition with subtraction → KILLED

191

1.1
Location : extractPathDetails
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
replaced return value with null for com/renomad/minum/web/RequestLine::extractPathDetails → KILLED

204

1.1
Location : extractMapFromQueryString
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

2.2
Location : extractMapFromQueryString
Killed by : com.renomad.minum.web.WebPerformanceTests.test3(com.renomad.minum.web.WebPerformanceTests)
Changed increment from 1 to -1 → KILLED

205

1.1
Location : extractMapFromQueryString
Killed by : com.renomad.minum.web.WebPerformanceTests.test3(com.renomad.minum.web.WebPerformanceTests)
changed conditional boundary → KILLED

2.2
Location : extractMapFromQueryString
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

209

1.1
Location : extractMapFromQueryString
Killed by : com.renomad.minum.web.WebPerformanceTests.test3(com.renomad.minum.web.WebPerformanceTests)
changed conditional boundary → KILLED

2.2
Location : extractMapFromQueryString
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

211

1.1
Location : extractMapFromQueryString
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
Replaced integer addition with subtraction → KILLED

219

1.1
Location : extractMapFromQueryString
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
replaced return value with Collections.emptyMap for com/renomad/minum/web/RequestLine::extractMapFromQueryString → KILLED

226

1.1
Location : getHttpVersion
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
negated conditional → KILLED

227

1.1
Location : getHttpVersion
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
replaced return value with null for com/renomad/minum/web/RequestLine::getHttpVersion → KILLED

228

1.1
Location : getHttpVersion
Killed by : com.renomad.minum.web.WebTests
negated conditional → KILLED

229

1.1
Location : getHttpVersion
Killed by : com.renomad.minum.web.WebTests
replaced return value with null for com/renomad/minum/web/RequestLine::getHttpVersion → KILLED

231

1.1
Location : getHttpVersion
Killed by : com.renomad.minum.web.WebTests
replaced return value with null for com/renomad/minum/web/RequestLine::getHttpVersion → KILLED

239

1.1
Location : getMethod
Killed by : com.renomad.minum.web.WebPerformanceTests.test3(com.renomad.minum.web.WebPerformanceTests)
replaced return value with null for com/renomad/minum/web/RequestLine::getMethod → KILLED

248

1.1
Location : getPathDetails
Killed by : com.renomad.minum.web.RequestLineTests.test_QueryStringOnOtherwiseEmpty(com.renomad.minum.web.RequestLineTests)
replaced return value with null for com/renomad/minum/web/RequestLine::getPathDetails → KILLED

255

1.1
Location : getVersion
Killed by : com.renomad.minum.web.WebPerformanceTests.test3(com.renomad.minum.web.WebPerformanceTests)
replaced return value with null for com/renomad/minum/web/RequestLine::getVersion → KILLED

262

1.1
Location : getRawValue
Killed by : com.renomad.minum.web.RequestLineTests.test_GetRawValue(com.renomad.minum.web.RequestLineTests)
replaced return value with "" for com/renomad/minum/web/RequestLine::getRawValue → KILLED

267

1.1
Location : equals
Killed by : none
negated conditional → TIMED_OUT

2.2
Location : equals
Killed by : com.renomad.minum.web.RequestTests.testSimplerRequest(com.renomad.minum.web.RequestTests)
replaced boolean return with false for com/renomad/minum/web/RequestLine::equals → KILLED

268

1.1
Location : equals
Killed by : none
negated conditional → TIMED_OUT

2.2
Location : equals
Killed by : com.renomad.minum.web.RequestTests.equalsTest(com.renomad.minum.web.RequestTests)
negated conditional → KILLED

3.3
Location : equals
Killed by : com.renomad.minum.EqualsTests.equalsTest(com.renomad.minum.EqualsTests)
replaced boolean return with true for com/renomad/minum/web/RequestLine::equals → KILLED

270

1.1
Location : equals
Killed by : com.renomad.minum.web.RequestTests.equalsTest(com.renomad.minum.web.RequestTests)
negated conditional → KILLED

2.2
Location : equals
Killed by : none
negated conditional → TIMED_OUT

3.3
Location : equals
Killed by : none
replaced boolean return with true for com/renomad/minum/web/RequestLine::equals → TIMED_OUT

4.4
Location : equals
Killed by : com.renomad.minum.web.RequestTests.equalsTest(com.renomad.minum.web.RequestTests)
negated conditional → KILLED

5.5
Location : equals
Killed by : com.renomad.minum.web.RequestTests.equalsTest(com.renomad.minum.web.RequestTests)
negated conditional → KILLED

6.6
Location : equals
Killed by : com.renomad.minum.web.RequestTests.equalsTest(com.renomad.minum.web.RequestTests)
negated conditional → KILLED

275

1.1
Location : hashCode
Killed by : none
replaced int return with 0 for com/renomad/minum/web/RequestLine::hashCode → TIMED_OUT

280

1.1
Location : toString
Killed by : com.renomad.minum.web.RequestTests.test_Request_ToString(com.renomad.minum.web.RequestTests)
replaced return value with "" for com/renomad/minum/web/RequestLine::toString → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0