From 828f6b1b6dc662cbae46328df20532f3bb0acec1 Mon Sep 17 00:00:00 2001 From: Feng Sun Date: Sun, 24 Nov 2024 20:19:34 -0800 Subject: [PATCH] Enable Non String values in JsonFieldPatternBuilder --- .../com/ebay/ejmask/api/IPatternBuilder.java | 12 ++ .../com/ebay/ejmask/api/PatternEntity.java | 53 +++++ .../ebay/ejmask/core/EJMaskInitializer.java | 14 +- .../json/JsonBooleanFieldPatternBuilder.java | 115 +++++++++++ .../builder/json/JsonFieldPatternBuilder.java | 72 ++++++- .../json/JsonNumericFieldPatternBuilder.java | 115 +++++++++++ .../JsonBooleanFieldPatternBuilderTest.java | 160 +++++++++++++++ .../json/JsonFieldPatternBuilderTest.java | 97 ++++++++- .../JsonNumericFieldPatternBuilderTest.java | 185 ++++++++++++++++++ 9 files changed, 805 insertions(+), 18 deletions(-) create mode 100644 ejmask-api/src/main/java/com/ebay/ejmask/api/PatternEntity.java create mode 100644 ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonBooleanFieldPatternBuilder.java create mode 100644 ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonNumericFieldPatternBuilder.java create mode 100644 ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonBooleanFieldPatternBuilderTest.java create mode 100644 ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonNumericFieldPatternBuilderTest.java diff --git a/ejmask-api/src/main/java/com/ebay/ejmask/api/IPatternBuilder.java b/ejmask-api/src/main/java/com/ebay/ejmask/api/IPatternBuilder.java index 2f7897d..4628150 100644 --- a/ejmask-api/src/main/java/com/ebay/ejmask/api/IPatternBuilder.java +++ b/ejmask-api/src/main/java/com/ebay/ejmask/api/IPatternBuilder.java @@ -1,5 +1,8 @@ package com.ebay.ejmask.api; +import java.util.Arrays; +import java.util.List; + /** * Copyright (c) 2023 eBay Inc. *

@@ -36,6 +39,15 @@ public interface IPatternBuilder { */ String buildReplacement(int visibleCharacters, String... fieldNames); + /** + * Build pattern to match + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return list of pattern entities + */ + default List buildPatternEntities(int visibleCharacters, String... fieldNames) { + return Arrays.asList(new PatternEntity(buildPattern(visibleCharacters, fieldNames), buildReplacement(visibleCharacters, fieldNames))); + } /** * Set true if the build can be groupable. * diff --git a/ejmask-api/src/main/java/com/ebay/ejmask/api/PatternEntity.java b/ejmask-api/src/main/java/com/ebay/ejmask/api/PatternEntity.java new file mode 100644 index 0000000..dd84541 --- /dev/null +++ b/ejmask-api/src/main/java/com/ebay/ejmask/api/PatternEntity.java @@ -0,0 +1,53 @@ +package com.ebay.ejmask.api; + +import javax.annotation.Nonnull; + +/** + * Copyright (c) 2023 eBay Inc. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +public class PatternEntity { + + private final String patternTemplate; + + private final String replacementTemplate; + + /** + * Constructor + * @param patternTemplate as instance of String + * @param replacementTemplate as instance of String + */ + public PatternEntity(@Nonnull String patternTemplate, @Nonnull String replacementTemplate) { + this.patternTemplate = patternTemplate; + this.replacementTemplate = replacementTemplate; + } + + /** + * Get pattern template + * + * @return match pattern + */ + public String getPatternTemplate() { + return patternTemplate; + } + + /** + * Get replacement template + * + * @return replacement pattern + */ + public String getReplacementTemplate() { + return replacementTemplate; + } +} diff --git a/ejmask-core/src/main/java/com/ebay/ejmask/core/EJMaskInitializer.java b/ejmask-core/src/main/java/com/ebay/ejmask/core/EJMaskInitializer.java index 1be875c..50de4f3 100644 --- a/ejmask-core/src/main/java/com/ebay/ejmask/core/EJMaskInitializer.java +++ b/ejmask-core/src/main/java/com/ebay/ejmask/core/EJMaskInitializer.java @@ -20,6 +20,7 @@ import com.ebay.ejmask.api.IFilter; import com.ebay.ejmask.api.IPatternBuilder; import com.ebay.ejmask.api.MaskingPattern; +import com.ebay.ejmask.api.PatternEntity; import com.ebay.ejmask.core.util.CommonUtils; import com.ebay.ejmask.core.util.LoggerUtil; @@ -33,6 +34,8 @@ import java.util.List; import java.util.Map; +import static com.ebay.ejmask.core.util.CommonUtils.emptyIfNull; + /** * The objective of this class it to wrap all complications in adding and * maintaining masking fields inside this class and keep the recurring jobs @@ -104,7 +107,7 @@ public static void addContentProcessor(IContentProcessor... contentProcessors) { * @param contentProcessors new value of contentProcessors */ public static synchronized void addContentProcessors(Collection contentProcessors) { - for (IContentProcessor contentPreProcessor : CommonUtils.emptyIfNull(contentProcessors)) { + for (IContentProcessor contentPreProcessor : emptyIfNull(contentProcessors)) { EJMask.register(contentPreProcessor); LoggerUtil.info("data-filter-initializer", "processors", "adding " + contentPreProcessor.getName()); } @@ -137,10 +140,11 @@ public static synchronized void addFilters(Collection filters) { //avoid empty due to duplicate if (CommonUtils.isNotEmpty(filter.getFieldNames())) { final String[] fieldNames = toArray(filter.getFieldNames()); - final String pattern = filter.getBuilder().buildPattern(filter.getVisibleCharacters(), fieldNames); - final String replacement = filter.getBuilder().buildReplacement(filter.getVisibleCharacters(), fieldNames); - //add masking pattern to data masking utility - addMaskingPattern(filter.getOrder(), pattern, replacement); + List patternEntityList = filter.getBuilder().buildPatternEntities(filter.getVisibleCharacters(), fieldNames); + emptyIfNull(patternEntityList).forEach(patternEntity -> { + //add masking pattern to data masking utility + addMaskingPattern(filter.getOrder(), patternEntity.getPatternTemplate(), patternEntity.getReplacementTemplate()); + }); } } addNonGroupedFilters(filters); diff --git a/ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonBooleanFieldPatternBuilder.java b/ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonBooleanFieldPatternBuilder.java new file mode 100644 index 0000000..429d9f5 --- /dev/null +++ b/ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonBooleanFieldPatternBuilder.java @@ -0,0 +1,115 @@ +package com.ebay.ejmask.extenstion.builder.json; +/** + * Copyright (c) 2024 eBay Inc. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.ebay.ejmask.api.PatternEntity; +import com.ebay.ejmask.extenstion.builder.AbstractRegexPatternBuilder; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +/** + * An implementation of IPatternBuilder to support sensitive JSON field, whose value need to be partially masked. + * This builder is for masking the field value with a Boolean type. + * + * @author fsun1 + */ +public class JsonBooleanFieldPatternBuilder extends AbstractRegexPatternBuilder { + + private static final List PATTERN_ENTITY_LIST = Arrays.asList( + /** + * Boolean field with value to be masked + * @see Regular Expresseion For Testing + */ + new PatternEntity("\\\"(%s)(\\\\*\\\"\\s*:\\s*\\\\*)(\\b(true|TRUE|True|false|FALSE|False)\\b)([^\\\"]{1,3})[^\\\"]*(\\\\?\\\"|)", "\"$1$2\"xxxx\"$5$6") + ); + + /** + * Build pattern to match + * + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return match pattern + */ + @Override + public String buildPattern(int visibleCharacters, String... fieldNames) { + return this.buildPattern(null, visibleCharacters, fieldNames); + } + + /** + * Build pattern to match + * + * @param patternEntity as instance of PatternEntity + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return + */ + private String buildPattern(PatternEntity patternEntity, int visibleCharacters, String... fieldNames) { + if (visibleCharacters < 1) { + throw new IllegalArgumentException("visibleCharacters must be a possessive value instead of " + visibleCharacters); + } + if (patternEntity == null) { + patternEntity = PATTERN_ENTITY_LIST.get(0); + } + return String.format(patternEntity.getPatternTemplate(), super.buildFieldNamesForRegexOr(fieldNames), visibleCharacters); + } + + + /** + * Build pattern to replace. + * + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return match pattern + */ + @Override + public String buildReplacement(int visibleCharacters, String... fieldNames) { + return this.buildReplacement(null, visibleCharacters, fieldNames); + } + + /** + * Build pattern to replace. + * + * @param patternEntity as instance of PatternEntity + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return match pattern + */ + private String buildReplacement(PatternEntity patternEntity, int visibleCharacters, String... fieldNames) { + if (patternEntity == null) { + patternEntity = PATTERN_ENTITY_LIST.get(0); + } + return patternEntity.getReplacementTemplate(); + } + + /** + * Build list of PatternEntity + * + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return match pattern list + */ + @Override + public List buildPatternEntities(int visibleCharacters, String... fieldNames) { + List result = new LinkedList<>(); + PATTERN_ENTITY_LIST.forEach(patternEntity -> { + result.add(new PatternEntity(this.buildPattern(patternEntity, visibleCharacters, fieldNames), this.buildReplacement(patternEntity, visibleCharacters, fieldNames))); + }); + return result; + } + +} diff --git a/ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonFieldPatternBuilder.java b/ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonFieldPatternBuilder.java index 894bc17..82228bf 100644 --- a/ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonFieldPatternBuilder.java +++ b/ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonFieldPatternBuilder.java @@ -15,22 +15,28 @@ * limitations under the License. */ +import com.ebay.ejmask.api.PatternEntity; import com.ebay.ejmask.extenstion.builder.AbstractRegexPatternBuilder; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + /** * An implementation of IPatternBuilder to support sensitive JSON field, whose value need to be partially masked. + * This builder is for masking the field value with a String type. * * @author prakv */ public class JsonFieldPatternBuilder extends AbstractRegexPatternBuilder { - //https://regex101.com/r/ZDQWod/5 - //unescaped string --------------------------> \"(%s)(\\*\"\s*:\s*\\*\")([^\"]{1,%d})[^\"]*(\\?\"|) - private static final String PATTERN_TEMPLATE = "\\\"(%s)(\\\\*\\\"\\s*:\\s*\\\\*\\\")([^\\\"]{1,%d})[^\\\"]*(\\\\?\\\"|)"; - //group $1 = field name - //group $2 = ":" (with json serialization support) - //group $3 = masked sting - private static final String REPLACEMENT_TEMPLATE = "\"$1$2$3-xxxx$4"; + private static final List PATTERN_ENTITY_LIST = Arrays.asList( + /** + * String field with value to be masked + * @see Regular Expresseion For Testing + */ + new PatternEntity("\\\"(%s)(\\\\*\\\"\\s*:\\s*\\\\*\\\")([^\\\"]{1,%d})[^\\\"]*(\\\\?\\\"|)", "\"$1$2$3-xxxx$4") + ); /** * Build pattern to match @@ -41,12 +47,28 @@ public class JsonFieldPatternBuilder extends AbstractRegexPatternBuilder { */ @Override public String buildPattern(int visibleCharacters, String... fieldNames) { + return this.buildPattern(null, visibleCharacters, fieldNames); + } + + /** + * Build pattern to match + * + * @param patternEntity as instance of PatternEntity + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return + */ + private String buildPattern(PatternEntity patternEntity, int visibleCharacters, String... fieldNames) { if (visibleCharacters < 1) { throw new IllegalArgumentException("visibleCharacters must be a possessive value instead of " + visibleCharacters); } - return String.format(PATTERN_TEMPLATE, super.buildFieldNamesForRegexOr(fieldNames), visibleCharacters); + if (patternEntity == null) { + patternEntity = PATTERN_ENTITY_LIST.get(0); + } + return String.format(patternEntity.getPatternTemplate(), super.buildFieldNamesForRegexOr(fieldNames), visibleCharacters); } + /** * Build pattern to replace. * @@ -56,6 +78,38 @@ public String buildPattern(int visibleCharacters, String... fieldNames) { */ @Override public String buildReplacement(int visibleCharacters, String... fieldNames) { - return REPLACEMENT_TEMPLATE; + return this.buildReplacement(null, visibleCharacters, fieldNames); + } + + /** + * Build pattern to replace. + * + * @param patternEntity as instance of PatternEntity + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return match pattern + */ + private String buildReplacement(PatternEntity patternEntity, int visibleCharacters, String... fieldNames) { + if (patternEntity == null) { + patternEntity = PATTERN_ENTITY_LIST.get(0); + } + return patternEntity.getReplacementTemplate(); } + + /** + * Build list of PatternEntity + * + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return match pattern list + */ + @Override + public List buildPatternEntities(int visibleCharacters, String... fieldNames) { + List result = new LinkedList<>(); + PATTERN_ENTITY_LIST.forEach(patternEntity -> { + result.add(new PatternEntity(this.buildPattern(patternEntity, visibleCharacters, fieldNames), this.buildReplacement(patternEntity, visibleCharacters, fieldNames))); + }); + return result; + } + } diff --git a/ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonNumericFieldPatternBuilder.java b/ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonNumericFieldPatternBuilder.java new file mode 100644 index 0000000..eb09cd9 --- /dev/null +++ b/ejmask-extensions/src/main/java/com/ebay/ejmask/extenstion/builder/json/JsonNumericFieldPatternBuilder.java @@ -0,0 +1,115 @@ +package com.ebay.ejmask.extenstion.builder.json; +/** + * Copyright (c) 2024 eBay Inc. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import com.ebay.ejmask.api.PatternEntity; +import com.ebay.ejmask.extenstion.builder.AbstractRegexPatternBuilder; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +/** + * An implementation of IPatternBuilder to support sensitive JSON field, whose value need to be partially masked. + * This builder is for masking the field value with a Numeric type. + * + * @author fsun1 + */ +public class JsonNumericFieldPatternBuilder extends AbstractRegexPatternBuilder { + + private static final List PATTERN_ENTITY_LIST = Arrays.asList( + /** + * Numeric field with value to be masked + * @see Regular Expresseion For Testing + */ + new PatternEntity("\\\"(%s)(\\\\*\\\"\\s*:\\s*\\\\*)(-?\\b\\d+(\\.\\d+)?(e-?\\d+)?\\b)([^\\\"]{1,2})", "\"$1$2\"xxxx\"$6") + ); + + /** + * Build pattern to match + * + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return match pattern + */ + @Override + public String buildPattern(int visibleCharacters, String... fieldNames) { + return this.buildPattern(null, visibleCharacters, fieldNames); + } + + /** + * Build pattern to match + * + * @param patternEntity as instance of PatternEntity + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return + */ + private String buildPattern(PatternEntity patternEntity, int visibleCharacters, String... fieldNames) { + if (visibleCharacters < 1) { + throw new IllegalArgumentException("visibleCharacters must be a possessive value instead of " + visibleCharacters); + } + if (patternEntity == null) { + patternEntity = PATTERN_ENTITY_LIST.get(0); + } + return String.format(patternEntity.getPatternTemplate(), super.buildFieldNamesForRegexOr(fieldNames), visibleCharacters); + } + + + /** + * Build pattern to replace. + * + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return match pattern + */ + @Override + public String buildReplacement(int visibleCharacters, String... fieldNames) { + return this.buildReplacement(null, visibleCharacters, fieldNames); + } + + /** + * Build pattern to replace. + * + * @param patternEntity as instance of PatternEntity + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return match pattern + */ + private String buildReplacement(PatternEntity patternEntity, int visibleCharacters, String... fieldNames) { + if (patternEntity == null) { + patternEntity = PATTERN_ENTITY_LIST.get(0); + } + return patternEntity.getReplacementTemplate(); + } + + /** + * Build list of PatternEntity + * + * @param visibleCharacters as no of characters to be visible. + * @param fieldNames as list of field names + * @return match pattern list + */ + @Override + public List buildPatternEntities(int visibleCharacters, String... fieldNames) { + List result = new LinkedList<>(); + PATTERN_ENTITY_LIST.forEach(patternEntity -> { + result.add(new PatternEntity(this.buildPattern(patternEntity, visibleCharacters, fieldNames), this.buildReplacement(patternEntity, visibleCharacters, fieldNames))); + }); + return result; + } + +} diff --git a/ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonBooleanFieldPatternBuilderTest.java b/ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonBooleanFieldPatternBuilderTest.java new file mode 100644 index 0000000..c5827e5 --- /dev/null +++ b/ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonBooleanFieldPatternBuilderTest.java @@ -0,0 +1,160 @@ +package com.ebay.ejmask.extenstion.builder.json; + +import com.ebay.ejmask.api.PatternEntity; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +/** + * @author fsun1 + */ +public class JsonBooleanFieldPatternBuilderTest { + + public static final JsonBooleanFieldPatternBuilder instance = new JsonBooleanFieldPatternBuilder(); + public static final String[] fieldNames = new String[]{"firstName", "lastName", "number", "boolValue"}; + + + /** + * Test of buildPattern method, of class JsonFieldPatternBuilder. + */ + @Test + public void testBuildPattern() { + int visibleCharacters = 12; + String result = instance.buildPattern(visibleCharacters, fieldNames); + Assertions.assertEquals("\\\"(firstName|lastName|number|boolValue)(\\\\*\\\"\\s*:\\s*\\\\*)(\\b(true|TRUE|True|false|FALSE|False)\\b)([^\\\"]{1,3})[^\\\"]*(\\\\?\\\"|)", result); + } + + /** + * Test of buildPattern method, of class JsonFieldPatternBuilder. + */ + @Test + public void testBuildPattern_without_visible_characters() { + int visibleCharacters = 0; + Assertions.assertThrows(IllegalArgumentException.class, () -> instance.buildPattern(visibleCharacters, fieldNames)); + } + + /** + * Test of buildReplacement method, of class JsonFieldPatternBuilder. + */ + @Test + public void testBuildReplacement() { + int visibleCharacters = 0; + String result = instance.buildReplacement(visibleCharacters, fieldNames); + Assertions.assertEquals("\"$1$2\"xxxx\"$5$6", result); + } + + @ParameterizedTest + @MethodSource("dataForTestMatch") + public void testMatch(String name, String data, String expected) { + String regex = instance.buildPattern(2, fieldNames); + String replacement = instance.buildReplacement(2, fieldNames); + Pattern pattern = Pattern.compile(regex); + String result = pattern.matcher(data).replaceAll(replacement); + Assertions.assertEquals(expected, result); + } + + @ParameterizedTest + @MethodSource("dataForTestMatch") + public void testMatchForPatternList(String name, String data, String expected) { + List patternEntityList = instance.buildPatternEntities(2, fieldNames); + String result = data; + for (PatternEntity patternEntity : patternEntityList) { + Pattern pattern = Pattern.compile(patternEntity.getPatternTemplate()); + result = pattern.matcher(result).replaceAll(patternEntity.getReplacementTemplate()); + } + Assertions.assertEquals(expected, result); + } + + static Stream dataForTestMatch() { + return Stream.of( + Arguments.arguments( + "test with normal json", + "{\"firstName\":\"sensitive data\",\"lastName\":\"sensitive data\",\"nonSensitiveData\":\"firstName\"}", + "{\"firstName\":\"sensitive data\",\"lastName\":\"sensitive data\",\"nonSensitiveData\":\"firstName\"}" + ), + Arguments.arguments( + "test with empty values", + "{\"firstName\":\"\",\"lastName\":null,\"nonSensitiveData\":\"firstName\"}", + "{\"firstName\":\"\",\"lastName\":null,\"nonSensitiveData\":\"firstName\"}" + ), + Arguments.arguments( + "test with space", + "{\"firstName\" : \"sensitive data\", \"lastName\" :\"sensitive data\",\"nonSensitiveData\":\"firstName\"}", + "{\"firstName\" : \"sensitive data\", \"lastName\" :\"sensitive data\",\"nonSensitiveData\":\"firstName\"}" + ), + Arguments.arguments( + "test with json encoded json", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data\\\",\\\"nonSensitiveData\\\":\\\"firstName\\\"}", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data\\\",\\\"nonSensitiveData\\\":\\\"firstName\\\"}" + + ), + Arguments.arguments( + "test with double json encoded json", + "{\\\\\\\"firstName\\\\\\\":\\\\\\\"sensitive data\\\\\\\",\\\\\\\"lastName\\\\\\\":\\\\\\\"sensitive data\\\\\\\",\\\\\\\"nonSensitiveData\\\\\\\":\\\\\\\"firstName\\\\\\\"}", + "{\\\\\\\"firstName\\\\\\\":\\\\\\\"sensitive data\\\\\\\",\\\\\\\"lastName\\\\\\\":\\\\\\\"sensitive data\\\\\\\",\\\\\\\"nonSensitiveData\\\\\\\":\\\\\\\"firstName\\\\\\\"}" + ), + Arguments.arguments( + "test with encoded broken json", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data" + ), + Arguments.arguments( + "test with encoded broken json 2", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data\\", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data\\" + ), + Arguments.arguments( + "test with normal json for integer", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"}", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"}" + ), + Arguments.arguments( + "test with broken json for integer", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"" + ), + Arguments.arguments( + "test with normal json for flot", + "{\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}", + "{\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}" + ), + Arguments.arguments( + "test with broken json for flot", + "\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}", + "\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}" + ), + Arguments.arguments( + "test with normal json for scientific notation", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"}", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"}" + ), + Arguments.arguments( + "test with broken json for scientific notation", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"" + ), + Arguments.arguments( + "test with normal json for boolean in all lower case", + "{\"serializedStr\":\"dink\",\"boolValue\":true,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":false }\"}", + "{\"serializedStr\":\"dink\",\"boolValue\":\"xxxx\",\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":\"xxxx\" }\"}" + ), + Arguments.arguments( + "test with normal json for boolean in all capital case", + "{\"serializedStr\":\"dink\",\"boolValue\":TRUE,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":FALSE }\"}", + "{\"serializedStr\":\"dink\",\"boolValue\":\"xxxx\",\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":\"xxxx\" }\"}" + ), + Arguments.arguments( + "test with normal json for boolean in first capital case", + "{\"serializedStr\":\"dink\",\"boolValue\":True,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":False }\"}", + "{\"serializedStr\":\"dink\",\"boolValue\":\"xxxx\",\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":\"xxxx\" }\"}" + ) + ); + } + +} diff --git a/ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonFieldPatternBuilderTest.java b/ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonFieldPatternBuilderTest.java index 6d7bf8c..f6d278b 100644 --- a/ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonFieldPatternBuilderTest.java +++ b/ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonFieldPatternBuilderTest.java @@ -1,11 +1,13 @@ package com.ebay.ejmask.extenstion.builder.json; +import com.ebay.ejmask.api.PatternEntity; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import java.util.List; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -15,7 +17,7 @@ public class JsonFieldPatternBuilderTest { public static final JsonFieldPatternBuilder instance = new JsonFieldPatternBuilder(); - public static final String[] fieldNames = new String[]{"firstName", "lastName"}; + public static final String[] fieldNames = new String[]{"firstName", "lastName", "number", "boolValue"}; /** @@ -25,7 +27,7 @@ public class JsonFieldPatternBuilderTest { public void testBuildPattern() { int visibleCharacters = 12; String result = instance.buildPattern(visibleCharacters, fieldNames); - Assertions.assertEquals("\\\"(firstName|lastName)(\\\\*\\\"\\s*:\\s*\\\\*\\\")([^\\\"]{1,12})[^\\\"]*(\\\\?\\\"|)", result); + Assertions.assertEquals("\\\"(firstName|lastName|number|boolValue)(\\\\*\\\"\\s*:\\s*\\\\*\\\")([^\\\"]{1,12})[^\\\"]*(\\\\?\\\"|)", result); } /** @@ -58,6 +60,18 @@ public void testMatch(String name, String data, String expected) { Assertions.assertEquals(expected, result); } + @ParameterizedTest + @MethodSource("dataForTestMatch") + public void testMatchForPatternList(String name, String data, String expected) { + List patternEntityList = instance.buildPatternEntities(2, fieldNames); + String result = data; + for (PatternEntity patternEntity : patternEntityList) { + Pattern pattern = Pattern.compile(patternEntity.getPatternTemplate()); + result = pattern.matcher(result).replaceAll(patternEntity.getReplacementTemplate()); + } + Assertions.assertEquals(expected, result); + } + static Stream dataForTestMatch() { return Stream.of( Arguments.arguments( @@ -135,7 +149,82 @@ static Stream dataForTestMatch() { "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data\\", //"{\\\"firstName\\\":\\\"se-xxxx\\\",\\\"lastName\\\":\\\"se-xxxx\\", "{\\\"firstName\\\":\\\"se-xxxx\",\\\"lastName\\\":\\\"se-xxxx" - )); + ), + Arguments.arguments( + "test with normal json for integer", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"}", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"}" + ), + Arguments.arguments( + "test with broken json for integer", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"" + ), + Arguments.arguments( + "test with normal json for flot", + "{\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}", + "{\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}" + ), + Arguments.arguments( + "test with broken json for flot", + "\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}", + "\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}" + ), + Arguments.arguments( + "test with normal json for scientific notation", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"}", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"}" + ), + Arguments.arguments( + "test with broken json for scientific notation", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"" + ), + Arguments.arguments( + "test with normal json for integer", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"}", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"}" + ), + Arguments.arguments( + "test with broken json for integer", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"" + ), + Arguments.arguments( + "test with normal json for flot", + "{\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}", + "{\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}" + ), + Arguments.arguments( + "test with broken json for flot", + "\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}", + "\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}" + ), + Arguments.arguments( + "test with normal json for scientific notation", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"}", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"}" + ), + Arguments.arguments( + "test with broken json for scientific notation", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"" + ), + Arguments.arguments( + "test with normal json for boolean in all lower case", + "{\"serializedStr\":\"dink\",\"boolValue\":true,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":false }\"}", + "{\"serializedStr\":\"dink\",\"boolValue\":true,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":false }\"}" + ), + Arguments.arguments( + "test with normal json for boolean in all capital case", + "{\"serializedStr\":\"dink\",\"boolValue\":TRUE,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":FALSE }\"}", + "{\"serializedStr\":\"dink\",\"boolValue\":TRUE,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":FALSE }\"}" + ), + Arguments.arguments( + "test with normal json for boolean in first capital case", + "{\"serializedStr\":\"dink\",\"boolValue\":True,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":False }\"}", + "{\"serializedStr\":\"dink\",\"boolValue\":True,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":False }\"}" + ) + ); } - } diff --git a/ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonNumericFieldPatternBuilderTest.java b/ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonNumericFieldPatternBuilderTest.java new file mode 100644 index 0000000..ab287a1 --- /dev/null +++ b/ejmask-extensions/src/test/java/com/ebay/ejmask/extenstion/builder/json/JsonNumericFieldPatternBuilderTest.java @@ -0,0 +1,185 @@ +package com.ebay.ejmask.extenstion.builder.json; + +import com.ebay.ejmask.api.PatternEntity; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.List; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +/** + * @author fsun1 + */ +public class JsonNumericFieldPatternBuilderTest { + + public static final JsonNumericFieldPatternBuilder instance = new JsonNumericFieldPatternBuilder(); + public static final String[] fieldNames = new String[]{"firstName", "lastName", "number", "boolValue"}; + + + /** + * Test of buildPattern method, of class JsonFieldPatternBuilder. + */ + @Test + public void testBuildPattern() { + int visibleCharacters = 12; + String result = instance.buildPattern(visibleCharacters, fieldNames); + Assertions.assertEquals("\\\"(firstName|lastName|number|boolValue)(\\\\*\\\"\\s*:\\s*\\\\*)(-?\\b\\d+(\\.\\d+)?(e-?\\d+)?\\b)([^\\\"]{1,2})", result); + } + + /** + * Test of buildPattern method, of class JsonFieldPatternBuilder. + */ + @Test + public void testBuildPattern_without_visible_characters() { + int visibleCharacters = 0; + Assertions.assertThrows(IllegalArgumentException.class, () -> instance.buildPattern(visibleCharacters, fieldNames)); + } + + /** + * Test of buildReplacement method, of class JsonFieldPatternBuilder. + */ + @Test + public void testBuildReplacement() { + int visibleCharacters = 0; + String result = instance.buildReplacement(visibleCharacters, fieldNames); + Assertions.assertEquals("\"$1$2\"xxxx\"$6", result); + } + + @ParameterizedTest + @MethodSource("dataForTestMatch") + public void testMatch(String name, String data, String expected) { + String regex = instance.buildPattern(2, fieldNames); + String replacement = instance.buildReplacement(2, fieldNames); + Pattern pattern = Pattern.compile(regex); + String result = pattern.matcher(data).replaceAll(replacement); + Assertions.assertEquals(expected, result); + } + + @ParameterizedTest + @MethodSource("dataForTestMatch") + public void testMatchForPatternList(String name, String data, String expected) { + List patternEntityList = instance.buildPatternEntities(2, fieldNames); + String result = data; + for (PatternEntity patternEntity : patternEntityList) { + Pattern pattern = Pattern.compile(patternEntity.getPatternTemplate()); + result = pattern.matcher(result).replaceAll(patternEntity.getReplacementTemplate()); + } + Assertions.assertEquals(expected, result); + } + + static Stream dataForTestMatch() { + return Stream.of( + Arguments.arguments( + "test with normal json", + "{\"firstName\":\"sensitive data\",\"lastName\":\"sensitive data\",\"nonSensitiveData\":\"firstName\"}", + "{\"firstName\":\"sensitive data\",\"lastName\":\"sensitive data\",\"nonSensitiveData\":\"firstName\"}" + + ), + Arguments.arguments( + "test with empty values", + "{\"firstName\":\"\",\"lastName\":null,\"nonSensitiveData\":\"firstName\"}", + "{\"firstName\":\"\",\"lastName\":null,\"nonSensitiveData\":\"firstName\"}" + + ), + Arguments.arguments( + "test with space", + "{\"firstName\" : \"sensitive data\", \"lastName\" :\"sensitive data\",\"nonSensitiveData\":\"firstName\"}", + "{\"firstName\" : \"sensitive data\", \"lastName\" :\"sensitive data\",\"nonSensitiveData\":\"firstName\"}" + + ), + Arguments.arguments( + "test with line break", + "{\n" + + " \"firstName\": \"sensitive data\",\n" + + " \"lastName\": \"sensitive data\",\n" + + " \"nonSensitiveData\": \"firstName\"\n" + + "}", + "{\n" + + " \"firstName\": \"sensitive data\",\n" + + " \"lastName\": \"sensitive data\",\n" + + " \"nonSensitiveData\": \"firstName\"\n" + + "}" + ), + Arguments.arguments( + "test with broken json", + "{\"firstName\":\"sensitive data\",\"lastName\":\"sensitive data", + "{\"firstName\":\"sensitive data\",\"lastName\":\"sensitive data" + ), + Arguments.arguments( + "test with normal json", + "{\"firstName\":\"sensitive data\",\"lastName\":\"sensitive data\",\"nonSensitiveData\":\"firstName\"}", + "{\"firstName\":\"sensitive data\",\"lastName\":\"sensitive data\",\"nonSensitiveData\":\"firstName\"}" + ), + Arguments.arguments( + "test with json encoded json", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data\\\",\\\"nonSensitiveData\\\":\\\"firstName\\\"}", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data\\\",\\\"nonSensitiveData\\\":\\\"firstName\\\"}" + ), + Arguments.arguments( + "test with double json encoded json", + "{\\\\\\\"firstName\\\\\\\":\\\\\\\"sensitive data\\\\\\\",\\\\\\\"lastName\\\\\\\":\\\\\\\"sensitive data\\\\\\\",\\\\\\\"nonSensitiveData\\\\\\\":\\\\\\\"firstName\\\\\\\"}", + "{\\\\\\\"firstName\\\\\\\":\\\\\\\"sensitive data\\\\\\\",\\\\\\\"lastName\\\\\\\":\\\\\\\"sensitive data\\\\\\\",\\\\\\\"nonSensitiveData\\\\\\\":\\\\\\\"firstName\\\\\\\"}" + ), + Arguments.arguments( + "test with encoded broken json", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data" + ), + Arguments.arguments( + "test with encoded broken json 2", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data\\", + "{\\\"firstName\\\":\\\"sensitive data\\\",\\\"lastName\\\":\\\"sensitive data\\" + ), + Arguments.arguments( + "test with normal json for boolean in all lower case", + "{\"serializedStr\":\"dink\",\"boolValue\":true,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":false }\"}", + "{\"serializedStr\":\"dink\",\"boolValue\":true,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":false }\"}" + ), + Arguments.arguments( + "test with normal json for boolean in all capital case", + "{\"serializedStr\":\"dink\",\"boolValue\":TRUE,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":FALSE }\"}", + "{\"serializedStr\":\"dink\",\"boolValue\":TRUE,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":FALSE }\"}" + ), + Arguments.arguments( + "test with normal json for boolean in first capital case", + "{\"serializedStr\":\"dink\",\"boolValue\":True,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":False }\"}", + "{\"serializedStr\":\"dink\",\"boolValue\":True,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"boolValue\\\\\\\":False }\"}" + ), + Arguments.arguments( + "test with normal json for integer", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"}", + "{\"serializedStr\":\"dink\",\"number\":\"xxxx\",\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":\"xxxx\" }\"}" + ), + Arguments.arguments( + "test with broken json for integer", + "{\"serializedStr\":\"dink\",\"number\":123975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":123975 }\"", + "{\"serializedStr\":\"dink\",\"number\":\"xxxx\",\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":\"xxxx\" }\"" + ), + Arguments.arguments( + "test with normal json for flot", + "{\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}", + "{\"serializedStr\":\"dink\",\"number\":\"xxxx\",\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":\"xxxx\" }\"}" + ), + Arguments.arguments( + "test with broken json for flot", + "\"serializedStr\":\"dink\",\"number\":123.975,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-123.975 }\"}", + "\"serializedStr\":\"dink\",\"number\":\"xxxx\",\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":\"xxxx\" }\"}" + ), + Arguments.arguments( + "test with normal json for scientific notation", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"}", + "{\"serializedStr\":\"dink\",\"number\":\"xxxx\",\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":\"xxxx\" }\"}" + ), + Arguments.arguments( + "test with broken json for scientific notation", + "{\"serializedStr\":\"dink\",\"number\":0.123e10,\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":-0.123e10 }\"", + "{\"serializedStr\":\"dink\",\"number\":\"xxxx\",\"serializedStringNumber\":\"{\\\\\\\"serializedStr\\\\\\\":\\\\\\\"dink\\\\\\\", \\\\\\\"number\\\\\\\":\"xxxx\" }\"" + ) + ); + } + +}