@Override public String getMatchFailureDescriptionForRequests(RecordedHttpRequest incomingRequest, RecordedHttpRequest expectedRequest) { StringBuilder resultBuilder = new StringBuilder(); _matchRules.stream().forEach((rule) -> { if (!rule.test(incomingRequest, expectedRequest)) { resultBuilder.append(rule.getMatchFailureDescriptionForRequests(incomingRequest, expectedRequest)).append("\n"); } }); return resultBuilder.toString(); } }
@Override public boolean apply(MatchRule rule) { return rule.test(incomingRequest, expectedRequest); } });
/** * produces a string description for the match failure reason for a particular request * @param request incoming request that we are trying to match * @return a String describing the match failure reasons for the request */ public String getMatchFailureDescription(RecordedHttpRequest request) { List<String> failureDescriptionList = new ArrayList<>(); List<RecordedHttpExchange> exchangeList = _scene.getRecordedHttpExchangeList(); if (_scene.isSequential()) { if (_sequencePosition < exchangeList.size()) { failureDescriptionList.add(_matchRule.getMatchFailureDescriptionForRequests(request, exchangeList.get(_sequencePosition).getRecordedHttpRequest())); } else { failureDescriptionList.add("No more recorded requests in sequential scene"); } } else { for (int i = 0; i < exchangeList.size(); i++) { RecordedHttpExchange exchange = exchangeList.get(i); failureDescriptionList.add(String.format("Recorded Request %d:%n%s", i + 1, _matchRule.getMatchFailureDescriptionForRequests(request, exchange.getRecordedHttpRequest()))); } } return new StringBuilder().append("Could not find matching request in scene " + _scene.getName() + "%n") .append(String.join("%n", failureDescriptionList)) .toString(); }
/** * find matched request from scene * @param request incoming request that we'd like match in existing scene * @return position of list of HttpExchanges from the scene. return -1 if no match found * * */ private int findMatchRequest(final RecordedHttpRequest request) { if (_scene.isSequential()) { List<RecordedHttpExchange> exchangeList = _scene.getRecordedHttpExchangeList(); // In sequential playback mode, only test the request at the current sequence index if (_sequencePosition < exchangeList.size() && _matchRule .test(request, exchangeList.get(_sequencePosition).getRecordedHttpRequest())) { return _sequencePosition; } return -1; } else { return Iterables.indexOf(_scene.getRecordedHttpExchangeList(), input -> _matchRule.test(request, input.getRecordedHttpRequest())); } } }
@Test public void testUriBlacklistNotMatchDifferentOrder() throws Exception { RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, new URI("http://www.google.com/?b=b&c=c&a=a"), null, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, new URI("http://www.google.com/?b=z&a=a&c=c"), null, null); HashSet<String> blacklist = new HashSet<>(); blacklist.add("b"); MatchRule matchRule = MatchRuleUtils.matchUriWithQueryBlacklist(blacklist); Assert.assertFalse(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(matchRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("URI Mismatch (with Query Blacklist)")); }
@Test public void testUriBlacklistExactMatch() throws Exception { RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a"), null, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a"), null, null); MatchRule matchRule = MatchRuleUtils.matchUriWithQueryBlacklist(new HashSet<>()); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); }
@Test public void testUriBlacklistNotMatch() throws Exception { RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a&b=b&c=c"), null, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a&b=z&c=c"), null, null); HashSet<String> blacklist = new HashSet<>(); blacklist.add("c"); MatchRule matchRule = MatchRuleUtils.matchUriWithQueryBlacklist(blacklist); Assert.assertFalse(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(matchRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("URI Mismatch (with Query Blacklist)")); }
@Test public void testMatchDefaultPortHttps() throws Exception { RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, new URI("https://www.example.org/"), null, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, new URI("https://www.example.org:443/"), null, null); MatchRule matchRule = new MatchUri(); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); }
@Test public void testUriWhitelistNotMatch() throws Exception { RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a&b=b&c=c"), null, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a&b=z&c=c"), null, null); HashSet<String> whitelist = new HashSet<>(); whitelist.add("b"); MatchRule matchRule = MatchRuleUtils.matchUriWithQueryWhitelist(whitelist); Assert.assertFalse(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(matchRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("URI Mismatch (with Query Whitelist)")); }
@Test public void testUriBlacklistMatchWithNullParameter() throws Exception { RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a&b=b&c=c&e="), null, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a&b=z&c=c&e="), null, null); HashSet<String> blacklist = new HashSet<>(); blacklist.add("b"); blacklist.add("c"); blacklist.add("d"); MatchRule matchRule = MatchRuleUtils.matchUriWithQueryBlacklist(blacklist); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); }
@Test public void testUriWhitelistNotMatchDifferentOrder() throws Exception { RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, new URI("http://www.google.com/?b=b&c=c&a=a"), null, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, new URI("http://www.google.com/?b=z&a=a&c=c"), null, null); HashSet<String> whitelist = new HashSet<>(); whitelist.add("a"); whitelist.add("c"); MatchRule matchRule = MatchRuleUtils.matchUriWithQueryWhitelist(whitelist); Assert.assertFalse(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(matchRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("URI Mismatch (with Query Whitelist)")); }
@Test public void testUriWhitelistExactMatch() throws Exception { RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a"), null, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a"), null, null); MatchRule matchRule = MatchRuleUtils.matchUriWithQueryWhitelist(new HashSet<>()); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); }
@Test public void testDifferentURIs() throws Exception { Multimap<String, String> headers = LinkedHashMultimap.create(); headers.put("key1", "value1"); headers.put("key2", "value2"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest("GET", new URI("http://www.google.com/"), headers, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest("GET", new URI("http://www.google.com/foo/"), headers, null); MatchRule entireRequestRule = MatchRuleUtils.matchEntireRequest(); MatchRule methodUriRule = MatchRuleUtils.matchMethodUri(); Assert.assertFalse(entireRequestRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertFalse(methodUriRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(entireRequestRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("URI Mismatch")); Assert.assertTrue(entireRequestRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("URI Mismatch")); }
@Test public void testUriWhitelistMatch() throws Exception { RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a&b=b&c=c"), null, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a&b=z&c=c"), null, null); HashSet<String> whitelist = new HashSet<>(); whitelist.add("c"); whitelist.add("d"); MatchRule matchRule = MatchRuleUtils.matchUriWithQueryWhitelist(whitelist); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); }
@Test public void testHeaderWhitelistNotMatchWithOneHeaderNull() throws Exception { Multimap<String, String> headers1 = LinkedHashMultimap.create(); headers1.put("key1", "value1"); headers1.put("key3", "value3"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers1, null); Multimap<String, String> headers2 = LinkedHashMultimap.create(); headers2.put("key2", "value2"); headers2.put("key3", "value3"); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, null, headers2, null); Set<String> wList = new HashSet<>(); wList.add("key1"); MatchRule matchRule = MatchRuleUtils.matchHeadersWithWhitelist(wList); Assert.assertFalse(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(matchRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("HTTP Headers Mismatch (with Whitelist)")); }
@Test public void testMethodUriBodyWithAnyBoundaryMatchForNoBody() throws Exception { Multimap<String, String> headers = LinkedHashMultimap.create(); headers.put("key1", "value1"); headers.put("Content-Type", "multipart/form-data; boundary=wxyz1234abcd5e"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest("POST", new URI("http://www.google.com/"), headers, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest("POST", new URI("http://www.google.com/"), headers, null); MatchRule matchRule = MatchRuleUtils.matchMethodUriBodyWithAnyBoundary(); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); }
@Test public void testMethodUriBodyWithAnyBoundaryMatchForDifferentUri() throws Exception { Multimap<String, String> headers = LinkedHashMultimap.create(); headers.put("key1", "value1"); headers.put("Content-Type", "multipart/form-data; boundary=wxyz1234abcd5e"); RecordedHttpBody body = new RecordedStringHttpBody("------wxyz1234abcd5e\nContent-Disposition: form-data; name=\"org\" \ngoogle\n------wxyz1234abcd5e"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest("POST", new URI("http://www.linkedin.com/"), headers, body); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest("POST", new URI("http://www.google.com/"), headers, body); MatchRule matchRule = MatchRuleUtils.matchMethodUriBodyWithAnyBoundary(); Assert.assertFalse(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(matchRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("URI Mismatch")); }
@Test public void testEntireRequestMatchNoBody() throws Exception { Multimap<String, String> headers = LinkedHashMultimap.create(); headers.put("key1", "value1"); headers.put("key2", "value2"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest("POST", new URI("http://www.google.com/"), headers, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest("POST", new URI("http://www.google.com/"), headers, null); MatchRule entireRequestRule = MatchRuleUtils.matchEntireRequest(); MatchRule methodUriRule = MatchRuleUtils.matchMethodUri(); Assert.assertTrue(entireRequestRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(methodUriRule.test(recordedHttpRequest1, recordedHttpRequest2)); }
@Test public void testHeaderBlacklistNotMatchBL() throws Exception { Multimap<String, String> headers1 = LinkedHashMultimap.create(); headers1.put("key1", "value1"); headers1.put("key2", "value2"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers1, null); Multimap<String, String> headers2 = LinkedHashMultimap.create(); headers2.put("key1", "value1"); headers2.put("key2", "value2"); headers2.put("key3", "value3"); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, null, headers2, null); Set<String> blList = new HashSet<>(); blList.add("key1"); MatchRule matchRule = MatchRuleUtils.matchHeadersWithBlacklist(blList); Assert.assertFalse(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(matchRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("HTTP Headers Mismatch (with Blacklist)")); }
@Test public void testUriBlacklistMatch() throws Exception { RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a&b=b&c=c"), null, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, new URI("http://www.google.com/?a=a&b=z&c=c"), null, null); HashSet<String> blacklist = new HashSet<>(); blacklist.add("b"); blacklist.add("c"); blacklist.add("d"); MatchRule matchRule = MatchRuleUtils.matchUriWithQueryBlacklist(blacklist); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); }