/* * Copyright (c) LinkedIn Corporation. All rights reserved. Licensed under the BSD-2 Clause license. * See LICENSE in the project root for license information. */ package com.linkedin.flashback.matchrules; import com.linkedin.flashback.serializable.RecordedHttpBody; import com.linkedin.flashback.serializable.RecordedHttpRequest; import com.linkedin.flashback.serializable.RecordedStringHttpBody; import java.net.URI; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.testng.Assert; import org.testng.annotations.Test; /** * @author dvinegra */ public class MatchRuleUtilsTest { @Test public void testEntireRequestMatch() throws Exception { Map<String, String> headers = new HashMap<>(); headers.put("key1", "value1"); headers.put("key2", "value2"); RecordedHttpBody body = new RecordedStringHttpBody("body"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest("POST", new URI("http://www.google.com/"), headers, body); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest("POST", new URI("http://www.google.com/"), headers, body); MatchRule entireRequestRule = MatchRuleUtils.matchEntireRequest(); MatchRule methodUriRule = MatchRuleUtils.matchMethodUri(); Assert.assertTrue(entireRequestRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(methodUriRule.test(recordedHttpRequest1, recordedHttpRequest2)); } @Test public void testEntireRequestMatchNoBody() throws Exception { Map<String, String> headers = new HashMap<>(); 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 testDifferentMethods() throws Exception { Map<String, String> headers = new HashMap<>(); headers.put("key1", "value1"); headers.put("key2", "value2"); RecordedHttpBody body = new RecordedStringHttpBody("body"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest("POST", new URI("http://www.google.com/"), headers, body); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest("PUT", new URI("http://www.google.com/"), headers, body); 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("HTTP Method Mismatch")); Assert.assertTrue(methodUriRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("HTTP Method Mismatch")); } @Test public void testDifferentHeaders() throws Exception { Map<String, String> headers1 = new HashMap<>(); headers1.put("key1", "value1"); headers1.put("key2", "value2"); Map<String, String> headers2 = new HashMap<>(); headers2.put("key1", "value1"); headers2.put("key3", "value3"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest("GET", new URI("http://www.google.com/"), headers1, null); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest("GET", new URI("http://www.google.com/"), headers2, null); MatchRule entireRequestRule = MatchRuleUtils.matchEntireRequest(); MatchRule methodUriRule = MatchRuleUtils.matchMethodUri(); Assert.assertFalse(entireRequestRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(methodUriRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(entireRequestRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("HTTP Headers Mismatch")); } @Test public void testDifferentURIs() throws Exception { Map<String, String> headers = new HashMap<>(); 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 testDifferentBody() throws Exception { Map<String, String> headers = new HashMap<>(); headers.put("key1", "value1"); headers.put("key2", "value2"); RecordedHttpBody body1 = new RecordedStringHttpBody("body1"); RecordedHttpBody body2 = new RecordedStringHttpBody("body2"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest("POST", new URI("http://www.google.com/"), headers, body1); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest("POST", new URI("http://www.google.com/"), headers, body2); MatchRule entireRequestRule = MatchRuleUtils.matchEntireRequest(); MatchRule methodUriRule = MatchRuleUtils.matchMethodUri(); Assert.assertFalse(entireRequestRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(methodUriRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(entireRequestRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("HTTP Body Mismatch")); } @Test public void testHeaderWhitelistMatch() throws Exception { Map<String, String> headers1 = new HashMap<>(); headers1.put("key1", "value1"); headers1.put("key2", "value2"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers1, null); Map<String, String> headers2 = new HashMap<>(); headers2.put("key1", "value1"); headers2.put("key2", "value2"); headers2.put("key3", "value3"); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, null, headers2, null); Set<String> wList = new HashSet<>(); wList.add("key1"); wList.add("key2"); MatchRule matchRule = MatchRuleUtils.matchHeadersWithWhitelist(wList); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); } @Test public void testHeaderWhitelistMatchWithNoneInWL() throws Exception { Map<String, String> headers1 = new HashMap(); headers1.put("key3", "value3"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers1, null); Map<String, String> headers2 = new HashMap<>(); 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.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); } @Test public void testHeaderWhitelistNotMatchWithOneHeaderNull() throws Exception { Map<String, String> headers1 = new HashMap<>(); headers1.put("key1", "value1"); headers1.put("key3", "value3"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers1, null); Map<String, String> headers2 = new HashMap<>(); 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 testHeaderBlacklistMatch() throws Exception { Map<String, String> headers1 = new HashMap<>(); headers1.put("key2", "value2"); headers1.put("key3", "value3"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers1, null); Map<String, String> headers2 = new HashMap<>(); 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.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); } @Test public void testHeaderBlacklistMatchEmptyBL() throws Exception { Map<String, String> headers1 = new HashMap<>(); headers1.put("key1", "value1"); headers1.put("key2", "value2"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers1, null); Map<String, String> headers2 = new HashMap<>(); headers2.put("key1", "value1"); headers2.put("key2", "value2"); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, null, headers2, null); Set<String> blList = new HashSet<>(); MatchRule matchRule = MatchRuleUtils.matchHeadersWithBlacklist(blList); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); } @Test public void testHeaderBlacklistMatchNullBL() { Map<String, String> headers1 = new HashMap<>(); headers1.put("key1", "value1"); headers1.put("key2", "value2"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers1, null); Map<String, String> headers2 = new HashMap<>(); headers2.put("key1", "value1"); headers2.put("key2", "value2"); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, null, headers2, null); MatchRule matchRule = MatchRuleUtils.matchHeadersWithBlacklist(null); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); } @Test public void testHeaderBlacklistNotMatchBL() throws Exception { Map<String, String> headers1 = new HashMap<>(); headers1.put("key1", "value1"); headers1.put("key2", "value2"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers1, null); Map<String, String> headers2 = new HashMap<>(); 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 testPostParameterWhitelistMatch() throws Exception { RecordedStringHttpBody stringHttpBody1 = new RecordedStringHttpBody("a=a&b=b&c=c"); RecordedStringHttpBody stringHttpBody2 = new RecordedStringHttpBody("a=a&b=x&c=c&d=d"); Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/x-www-form-urlencoded"); Set<String> whitelist = new HashSet<>(); whitelist.add("a"); whitelist.add("c"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers, stringHttpBody1); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, null, headers, stringHttpBody2); MatchRule matchRule = MatchRuleUtils.matchBodyPostParametersWithWhitelist(whitelist); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); } @Test public void testPostParameterWhitelistMatchWithNullParameter() throws Exception { RecordedStringHttpBody stringHttpBody1 = new RecordedStringHttpBody("a=a&b=b&c=c&e="); RecordedStringHttpBody stringHttpBody2 = new RecordedStringHttpBody("a=a&b=x&c=c&d=d&e="); Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/x-www-form-urlencoded"); Set<String> whitelist = new HashSet<>(); whitelist.add("a"); whitelist.add("c"); whitelist.add("e"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers, stringHttpBody1); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, null, headers, stringHttpBody2); MatchRule matchRule = MatchRuleUtils.matchBodyPostParametersWithWhitelist(whitelist); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); } @Test public void testPostParameterWhitelistNotMatch() throws Exception { RecordedStringHttpBody stringHttpBody1 = new RecordedStringHttpBody("a=a&b=b&c=c"); RecordedStringHttpBody stringHttpBody2 = new RecordedStringHttpBody("a=a&b=x&c=c"); Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/x-www-form-urlencoded"); Set<String> whitelist = new HashSet<>(); whitelist.add("a"); whitelist.add("b"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers, stringHttpBody1); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, null, headers, stringHttpBody2); MatchRule matchRule = MatchRuleUtils.matchBodyPostParametersWithWhitelist(whitelist); Assert.assertFalse(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(matchRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("HTTP Body Parameters Mismatch (with Whitelist)")); } @Test public void testPostParameterBlacklistMatch() throws Exception { RecordedStringHttpBody stringHttpBody1 = new RecordedStringHttpBody("a=a&b=b&c=c"); RecordedStringHttpBody stringHttpBody2 = new RecordedStringHttpBody("a=a&b=x&c=c&d=d"); Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/x-www-form-urlencoded"); Set<String> blackList = new HashSet<>(); blackList.add("b"); blackList.add("d"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers, stringHttpBody1); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, null, headers, stringHttpBody2); MatchRule matchRule = MatchRuleUtils.matchBodyPostParametersWithBlacklist(blackList); Assert.assertTrue(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); } @Test public void testPostParameterBlacklistNotMatch() throws Exception { RecordedStringHttpBody stringHttpBody1 = new RecordedStringHttpBody("a=a&b=b&c=c"); RecordedStringHttpBody stringHttpBody2 = new RecordedStringHttpBody("a=a&b=x&c=c"); Map<String, String> headers = new HashMap<>(); headers.put("Content-Type", "application/x-www-form-urlencoded"); Set<String> blackList = new HashSet<>(); blackList.add("c"); RecordedHttpRequest recordedHttpRequest1 = new RecordedHttpRequest(null, null, headers, stringHttpBody1); RecordedHttpRequest recordedHttpRequest2 = new RecordedHttpRequest(null, null, headers, stringHttpBody2); MatchRule matchRule = MatchRuleUtils.matchBodyPostParametersWithBlacklist(blackList); Assert.assertFalse(matchRule.test(recordedHttpRequest1, recordedHttpRequest2)); Assert.assertTrue(matchRule.getMatchFailureDescriptionForRequests(recordedHttpRequest1, recordedHttpRequest2).contains("HTTP Body Parameters Mismatch (with Blacklist)")); } @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 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 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 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 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 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)); } @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 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 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)")); } }