summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gson/checkstyle-suppressions.xml39
-rw-r--r--gson/pom.xml6
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java33
-rw-r--r--gson/src/main/java/org/onap/policy/common/gson/internal/ClassWalker.java8
-rw-r--r--gson/src/test/java/org/onap/policy/common/gson/internal/AdapterTest.java76
-rw-r--r--gson/src/test/java/org/onap/policy/common/gson/internal/ClassWalkerTest.java13
6 files changed, 107 insertions, 68 deletions
diff --git a/gson/checkstyle-suppressions.xml b/gson/checkstyle-suppressions.xml
deleted file mode 100644
index 0705e0e6..00000000
--- a/gson/checkstyle-suppressions.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0"?>
-<!--
- ============LICENSE_START=======================================================
- Copyright (C) 2019 AT&T Technologies. All rights reserved.
- ================================================================================
- 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
-
- http://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.
-
- SPDX-License-Identifier: Apache-2.0
- ============LICENSE_END=========================================================
--->
-
-<!--
- NOTE: The sole purpose of this supression file is to allow "$" in field and method
- names so that the gson class tests can verify that those fields are ignored
- when doing serialization and de-serialization.
- -->
-
-<!DOCTYPE suppressions PUBLIC
- "-//Puppy Crawl//DTD Suppressions 1.0//EN"
- "http://www.puppycrawl.com/dtds/suppressions_1_0.dtd">
-
-<suppressions>
- <suppress checks="MemberName"
- files="AdapterTest.java|ClassWalkerTest.java"
- lines="1-9999"/>
- <suppress checks="MethodName"
- files="AdapterTest.java"
- lines="1-9999"/>
-</suppressions>
diff --git a/gson/pom.xml b/gson/pom.xml
index 1c630ca8..45ea110f 100644
--- a/gson/pom.xml
+++ b/gson/pom.xml
@@ -57,6 +57,11 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.powermock</groupId>
+ <artifactId>powermock-api-mockito</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
@@ -120,7 +125,6 @@
<includeTestResources>true</includeTestResources>
<excludes>
</excludes>
- <suppressionsLocation>${project.basedir}/checkstyle-suppressions.xml</suppressionsLocation>
<consoleOutput>true</consoleOutput>
<failsOnViolation>true</failsOnViolation>
<violationSeverity>warning</violationSeverity>
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java b/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java
index c7b3bc98..174b4912 100644
--- a/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/Adapter.java
@@ -42,6 +42,11 @@ public class Adapter {
private static final Pattern VALID_NAME_PAT = Pattern.compile("[a-zA-Z_]\\w*");
/**
+ * Factory to access objects. Overridden by junit tests.
+ */
+ private static Factory factory = new Factory();
+
+ /**
* Name of the property within the json structure containing the item.
*/
private final String propName;
@@ -157,7 +162,7 @@ public class Adapter {
* @return {@code true} if the field is managed by the walker, {@code false} otherwise
*/
public static boolean isManaged(Field field) {
- return VALID_NAME_PAT.matcher(field.getName()).matches();
+ return VALID_NAME_PAT.matcher(factory.getName(field)).matches();
}
/**
@@ -168,7 +173,7 @@ public class Adapter {
* otherwise
*/
public static boolean isManaged(Method method) {
- return VALID_NAME_PAT.matcher(method.getName()).matches();
+ return VALID_NAME_PAT.matcher(factory.getName(method)).matches();
}
/**
@@ -185,7 +190,7 @@ public class Adapter {
}
// no name provided - use it as is
- return (isManaged(field) ? field.getName() : null);
+ return (isManaged(field) ? factory.getName(field) : null);
}
/**
@@ -204,7 +209,7 @@ public class Adapter {
return null;
}
- String name = method.getName();
+ String name = factory.getName(method);
if (name.startsWith("get")) {
return name.substring(3);
@@ -238,7 +243,7 @@ public class Adapter {
return null;
}
- String name = method.getName();
+ String name = factory.getName(method);
if (name.startsWith("set")) {
return name.substring(3);
@@ -284,7 +289,7 @@ public class Adapter {
* @return the field fully qualified name
*/
public static String getQualifiedName(Field field) {
- return (field.getDeclaringClass().getName() + "." + field.getName());
+ return (field.getDeclaringClass().getName() + "." + factory.getName(field));
}
/**
@@ -294,7 +299,7 @@ public class Adapter {
* @return the method's fully qualified name
*/
public static String getQualifiedName(Method method) {
- return (method.getDeclaringClass().getName() + "." + method.getName());
+ return (method.getDeclaringClass().getName() + "." + factory.getName(method));
}
/**
@@ -340,4 +345,18 @@ public class Adapter {
return conv;
}
}
+
+ /**
+ * Factory used to access various objects.
+ */
+ public static class Factory {
+
+ public String getName(Field field) {
+ return field.getName();
+ }
+
+ public String getName(Method method) {
+ return method.getName();
+ }
+ }
}
diff --git a/gson/src/main/java/org/onap/policy/common/gson/internal/ClassWalker.java b/gson/src/main/java/org/onap/policy/common/gson/internal/ClassWalker.java
index 89e4f89d..ef4eaae3 100644
--- a/gson/src/main/java/org/onap/policy/common/gson/internal/ClassWalker.java
+++ b/gson/src/main/java/org/onap/policy/common/gson/internal/ClassWalker.java
@@ -241,7 +241,7 @@ public class ClassWalker {
return;
}
- String name = Adapter.detmPropName(field);
+ String name = detmPropName(field);
if (name == null) {
// invalid name
return;
@@ -386,4 +386,10 @@ public class ClassWalker {
private String getFqdn(Method method) {
return (method.getDeclaringClass().getName() + "." + method.getName());
}
+
+ // these may be overridden by junit tests
+
+ protected String detmPropName(Field field) {
+ return Adapter.detmPropName(field);
+ }
}
diff --git a/gson/src/test/java/org/onap/policy/common/gson/internal/AdapterTest.java b/gson/src/test/java/org/onap/policy/common/gson/internal/AdapterTest.java
index 33160007..fc98017e 100644
--- a/gson/src/test/java/org/onap/policy/common/gson/internal/AdapterTest.java
+++ b/gson/src/test/java/org/onap/policy/common/gson/internal/AdapterTest.java
@@ -23,6 +23,9 @@ package org.onap.policy.common.gson.internal;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -31,24 +34,34 @@ import com.google.gson.JsonPrimitive;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
+import org.junit.After;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.onap.policy.common.gson.JacksonExclusionStrategy;
import org.onap.policy.common.gson.annotation.GsonJsonProperty;
+import org.onap.policy.common.gson.internal.Adapter.Factory;
import org.onap.policy.common.gson.internal.DataAdapterFactory.Data;
import org.onap.policy.common.gson.internal.DataAdapterFactory.DerivedData;
+import org.powermock.reflect.Whitebox;
public class AdapterTest {
+ private static final String GET_INVALID_NAME = "get$InvalidName";
+ private static final String SET_INVALID_NAME = "set$InvalidName";
private static final String EMPTY_ALIAS = "emptyAlias";
private static final String GET_VALUE = ".getValue";
private static final String GET_VALUE_NAME = "getValue";
+ private static final String SET_VALUE_NAME = "setValue";
private static final String VALUE_NAME = "value";
private static final String MY_NAME = AdapterTest.class.getName();
+ private static final String FACTORY_FIELD = "factory";
private static DataAdapterFactory dataAdapter = new DataAdapterFactory();
private static Gson gson = new GsonBuilder().registerTypeAdapterFactory(dataAdapter)
.setExclusionStrategies(new JacksonExclusionStrategy()).create();
+ private static Factory saveFactory;
+
/*
* The remaining fields are just used within the tests.
*/
@@ -64,26 +77,44 @@ public class AdapterTest {
protected String unaliased;
- protected String $invalidFieldName;
-
private List<Data> listField;
private Data dataField;
+ @BeforeClass
+ public static void setUpBeforeClass() {
+ saveFactory = Whitebox.getInternalState(Adapter.class, FACTORY_FIELD);
+ }
+
+ @After
+ public void tearDown() {
+ Whitebox.setInternalState(Adapter.class, FACTORY_FIELD, saveFactory);
+ }
@Test
public void testIsManagedField() {
assertTrue(Adapter.isManaged(field(VALUE_NAME)));
- assertFalse(Adapter.isManaged(field("$invalidFieldName")));
+ // return an invalid field name
+ Factory factory = mock(Factory.class);
+ when(factory.getName(any(Field.class))).thenReturn("$invalidFieldName");
+ Whitebox.setInternalState(Adapter.class, FACTORY_FIELD, factory);
+ assertFalse(Adapter.isManaged(field(VALUE_NAME)));
}
@Test
public void testIsManagedMethod() {
assertTrue(Adapter.isManaged(mget(GET_VALUE_NAME)));
- assertFalse(Adapter.isManaged(mget("get$InvalidName")));
- assertFalse(Adapter.isManaged(mset("set$InvalidName")));
+ // return an invalid method name
+ Factory factory = mock(Factory.class);
+ Whitebox.setInternalState(Adapter.class, FACTORY_FIELD, factory);
+
+ when(factory.getName(any(Method.class))).thenReturn(GET_INVALID_NAME);
+ assertFalse(Adapter.isManaged(mget(GET_VALUE_NAME)));
+
+ when(factory.getName(any(Method.class))).thenReturn(SET_INVALID_NAME);
+ assertFalse(Adapter.isManaged(mset(SET_VALUE_NAME)));
}
@Test
@@ -178,7 +209,7 @@ public class AdapterTest {
// test setter
- adapter = new Adapter(gson, mset("setValue"), String.class);
+ adapter = new Adapter(gson, mset(SET_VALUE_NAME), String.class);
assertEquals(VALUE_NAME, adapter.getPropName());
assertEquals(MY_NAME + ".setValue", adapter.getFullName());
@@ -205,7 +236,12 @@ public class AdapterTest {
assertEquals(EMPTY_ALIAS, Adapter.detmPropName(field(EMPTY_ALIAS)));
assertEquals("name-with-alias", Adapter.detmPropName(field("nameWithAlias")));
assertEquals("unaliased", Adapter.detmPropName(field("unaliased")));
- assertEquals(null, Adapter.detmPropName(field("$invalidFieldName")));
+
+ // return an invalid field name
+ Factory factory = mock(Factory.class);
+ when(factory.getName(any(Field.class))).thenReturn("$invalidFieldName");
+ Whitebox.setInternalState(Adapter.class, FACTORY_FIELD, factory);
+ assertEquals(null, Adapter.detmPropName(field(VALUE_NAME)));
}
@Test
@@ -218,7 +254,13 @@ public class AdapterTest {
assertEquals(null, Adapter.detmGetterPropName(mget("isString")));
assertEquals(null, Adapter.detmGetterPropName(mget("noGet")));
assertEquals(null, Adapter.detmGetterPropName(mget("get")));
- assertEquals(null, Adapter.detmGetterPropName(mget("get$InvalidName")));
+
+ // return an invalid method name
+ Factory factory = mock(Factory.class);
+ Whitebox.setInternalState(Adapter.class, FACTORY_FIELD, factory);
+
+ when(factory.getName(any(Method.class))).thenReturn(GET_INVALID_NAME);
+ assertEquals(null, Adapter.detmGetterPropName(mget(GET_VALUE_NAME)));
}
@Test
@@ -228,7 +270,13 @@ public class AdapterTest {
assertEquals("plain", Adapter.detmSetterPropName(mset("setPlain")));
assertEquals(null, Adapter.detmSetterPropName(mset("noSet")));
assertEquals(null, Adapter.detmSetterPropName(mset("set")));
- assertEquals(null, Adapter.detmSetterPropName(mset("set$InvalidName")));
+
+ // return an invalid method name
+ Factory factory = mock(Factory.class);
+ Whitebox.setInternalState(Adapter.class, FACTORY_FIELD, factory);
+
+ when(factory.getName(any(Method.class))).thenReturn(SET_INVALID_NAME);
+ assertEquals(null, Adapter.detmSetterPropName(mset(SET_VALUE_NAME)));
}
@Test
@@ -335,11 +383,6 @@ public class AdapterTest {
return "";
}
- // name has a bogus character
- protected String get$InvalidName() {
- return "";
- }
-
protected void setValue(String text) {
// do nothing
@@ -371,11 +414,6 @@ public class AdapterTest {
// do nothing
}
- // name has a bogus character
- protected void set$InvalidName(String text) {
- // do nothing
- }
-
// returns a list
protected List<Data> getMyList() {
return listField;
diff --git a/gson/src/test/java/org/onap/policy/common/gson/internal/ClassWalkerTest.java b/gson/src/test/java/org/onap/policy/common/gson/internal/ClassWalkerTest.java
index 6af4ae4f..a1350643 100644
--- a/gson/src/test/java/org/onap/policy/common/gson/internal/ClassWalkerTest.java
+++ b/gson/src/test/java/org/onap/policy/common/gson/internal/ClassWalkerTest.java
@@ -46,6 +46,7 @@ import org.onap.policy.common.gson.annotation.GsonJsonProperty;
public class ClassWalkerTest {
private static final String SET_OVERRIDE = ".setOverride";
+ private static final String INVALID_FIELD_NAME = "invalidFieldName";
private MyWalker walker;
@@ -205,6 +206,15 @@ public class ClassWalkerTest {
super.examine(method);
}
+
+ @Override
+ protected String detmPropName(Field field) {
+ if (INVALID_FIELD_NAME.equals(field.getName())) {
+ return null;
+ }
+
+ return super.detmPropName(field);
+ }
}
protected static interface Intfc1 {
@@ -223,7 +233,8 @@ public class ClassWalkerTest {
private int id;
public String value;
- public String invalid$fieldName;
+ // this is not actually invalid, but will be treated as if it were
+ public String invalidFieldName;
@GsonJsonProperty("exposed")
private String exposedField;