Fix cyclic CategoryParameterOption::hashCode 90/79790/1
authorIttay Stern <ittay.stern@att.com>
Wed, 6 Mar 2019 12:25:02 +0000 (14:25 +0200)
committerIttay Stern <ittay.stern@att.com>
Wed, 6 Mar 2019 15:54:56 +0000 (17:54 +0200)
Issue-ID: VID-430
Change-Id: Ib49b71726fe508f1ec9bfe8c60836af1c5ca786b
Signed-off-by: Ittay Stern <ittay.stern@att.com>
vid-app-common/src/main/java/org/onap/vid/model/CategoryParameterOption.java
vid-app-common/src/test/java/org/onap/vid/model/CategoryParameterOptionTest.java
vid-app-common/src/test/java/org/onap/vid/model/CategoryParameterTest.java
vid-app-common/src/test/java/org/onap/vid/testUtils/TestUtils.java

index 2377479..70f7b5a 100644 (file)
 
 package org.onap.vid.model;
 
-import org.onap.portalsdk.core.domain.support.DomainVo;
-
-import javax.persistence.*;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.Set;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import org.onap.portalsdk.core.domain.support.DomainVo;
 
 @Entity
 @Table(name = "vid_category_parameter_option")
@@ -124,24 +131,39 @@ public class CategoryParameterOption extends DomainVo {
 
     @Override
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
 
         CategoryParameterOption that = (CategoryParameterOption) o;
 
-        if (getAppId() != null ? !getAppId().equals(that.getAppId()) : that.getAppId() != null) return false;
-        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) return false;
-        return getCategoryParameter() != null ? getCategoryParameter().equals(that.getCategoryParameter()) : that.getCategoryParameter() == null;
+        if (getAppId() != null ? !getAppId().equals(that.getAppId()) : that.getAppId() != null) {
+            return false;
+        }
+        if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) {
+            return false;
+        }
+        return getCategoryParameter() != null ? getCategoryParameter().equals(that.getCategoryParameter())
+            : that.getCategoryParameter() == null;
     }
 
     @Override
     public int hashCode() {
         int result = getAppId() != null ? getAppId().hashCode() : 0;
         result = 31 * result + (getName() != null ? getName().hashCode() : 0);
-        result = 31 * result + (getCategoryParameter() != null ? getCategoryParameter().hashCode() : 0);
+        result = 31 * result + hashCodeOfParentCategoryParameter();
         return result;
     }
 
+    private int hashCodeOfParentCategoryParameter() {
+        // Don't use getCategoryParameter's hashCode, as it might loop back to self's hasCode
+        return (getCategoryParameter() == null || getCategoryParameter().getId() == null)
+                ? 0 : getCategoryParameter().getId().hashCode();
+    }
+
     @Override
     public String toString() {
         return "CategoryParameterOption{" +
index 5fe3927..a3a14a2 100644 (file)
 
 package org.onap.vid.model;
 
-import java.io.Serializable;
-import java.util.Date;
-import java.util.Set;
+import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanEqualsExcluding;
+import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanHashCodeExcluding;
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
+import static org.hamcrest.MatcherAssert.assertThat;
 
-import org.junit.Assert;
+import org.apache.commons.lang3.ArrayUtils;
 import org.junit.Test;
+import org.onap.portalsdk.core.domain.support.DomainVo;
+import org.onap.vid.testUtils.TestUtils;
 
 public class CategoryParameterOptionTest {
 
-    private CategoryParameterOption createTestSubject() {
-        return new CategoryParameterOption();
-    }
-
-    @Test
-    public void testGetId() throws Exception {
-        CategoryParameterOption testSubject;
-        Long result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getId();
-    }
-
-    @Test
-    public void testSetId() throws Exception {
-        CategoryParameterOption testSubject;
-        Long id = null;
-
-        // default test
-        testSubject = createTestSubject();
-        testSubject.setId(id);
-    }
-
-    @Test
-    public void testGetAppId() throws Exception {
-        CategoryParameterOption testSubject;
-        String result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getAppId();
-    }
-
-    @Test
-    public void testSetAppId() throws Exception {
-        CategoryParameterOption testSubject;
-        String appId = "";
-
-        // default test
-        testSubject = createTestSubject();
-        testSubject.setAppId(appId);
-    }
-
-    @Test
-    public void testGetName() throws Exception {
-        CategoryParameterOption testSubject;
-        String result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getName();
-    }
-
-    @Test
-    public void testSetName() throws Exception {
-        CategoryParameterOption testSubject;
-        String name = "";
-
-        // default test
-        testSubject = createTestSubject();
-        testSubject.setName(name);
-    }
-
-    @Test
-    public void testGetCategoryParameter() throws Exception {
-        CategoryParameterOption testSubject;
-        CategoryParameter result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getCategoryParameter();
-    }
-
-    @Test
-    public void testSetCategoryParameter() throws Exception {
-        CategoryParameterOption testSubject;
-        CategoryParameter categoryParameter = null;
-
-        // default test
-        testSubject = createTestSubject();
-        testSubject.setCategoryParameter(categoryParameter);
-    }
-
-    @Test
-    public void testGetCreated() throws Exception {
-        CategoryParameterOption testSubject;
-        Date result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getCreated();
-    }
-
-    @Test
-    public void testGetModified() throws Exception {
-        CategoryParameterOption testSubject;
-        Date result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getModified();
-    }
-
-    @Test
-    public void testGetCreatedId() throws Exception {
-        CategoryParameterOption testSubject;
-        Long result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getCreatedId();
-    }
+    final private String[] excludedProperties = TestUtils.allPropertiesOf(DomainVo.class);
 
     @Test
-    public void testGetModifiedId() throws Exception {
-        CategoryParameterOption testSubject;
-        Long result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getModifiedId();
-    }
-
-    @Test
-    public void testGetAuditUserId() throws Exception {
-        CategoryParameterOption testSubject;
-        Serializable result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getAuditUserId();
+    public void shouldHaveValidGettersAndSetters() {
+        assertThat(CategoryParameterOption.class, hasValidGettersAndSetters());
     }
 
     @Test
-    public void testGetRowNum() throws Exception {
-        CategoryParameterOption testSubject;
-        Long result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getRowNum();
+    public void shouldHaveValidBeanHashCode() {
+        assertThat(CategoryParameterOption.class,
+            hasValidBeanHashCodeExcluding(ArrayUtils.addAll(new String[]{"categoryParameter"}, excludedProperties)));
     }
 
     @Test
-    public void testGetAuditTrail() throws Exception {
-        CategoryParameterOption testSubject;
-        Set result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getAuditTrail();
-    }
-
-    @Test
-    public void testEquals() throws Exception {
-        CategoryParameterOption testSubject;
-        Object o = null;
-        boolean result;
-
-        // test 1
-        testSubject = createTestSubject();
-        o = null;
-        result = testSubject.equals(o);
-        Assert.assertEquals(false, result);
-    }
-
-    @Test
-    public void testHashCode() throws Exception {
-        CategoryParameterOption testSubject;
-        int result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.hashCode();
+    public void shouldHaveValidBeanEquals() {
+        assertThat(CategoryParameterOption.class, hasValidBeanEqualsExcluding(excludedProperties));
     }
 
 }
index dc18c30..c515a34 100644 (file)
 
 package org.onap.vid.model;
 
-import java.io.Serializable;
-import java.util.Date;
+import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanEqualsExcluding;
+import static com.google.code.beanmatchers.BeanMatchers.hasValidBeanHashCodeExcluding;
+import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSettersExcluding;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.onap.vid.testUtils.TestUtils.allPropertiesOf;
+
+import com.google.common.collect.ImmutableSet;
 import java.util.Set;
-
+import org.apache.commons.lang3.ArrayUtils;
 import org.junit.Test;
+import org.onap.portalsdk.core.domain.support.DomainVo;
 
 public class CategoryParameterTest {
 
-    private CategoryParameter createTestSubject() {
-        return new CategoryParameter();
-    }
-
-    @Test
-    public void testGetFamily() throws Exception {
-        CategoryParameter testSubject;
-        String result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getFamily();
-    }
-
-    @Test
-    public void testSetFamily() throws Exception {
-        CategoryParameter testSubject;
-        String family = "";
-
-        // default test
-        testSubject = createTestSubject();
-        testSubject.setFamily(family);
-    }
-
-    @Test
-    public void testGetId() throws Exception {
-        CategoryParameter testSubject;
-        Long result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getId();
-    }
-
-    @Test
-    public void testGetCreated() throws Exception {
-        CategoryParameter testSubject;
-        Date result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getCreated();
-    }
-
-    @Test
-    public void testGetModified() throws Exception {
-        CategoryParameter testSubject;
-        Date result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getModified();
-    }
-
-    @Test
-    public void testGetCreatedId() throws Exception {
-        CategoryParameter testSubject;
-        Long result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getCreatedId();
-    }
-
-    @Test
-    public void testGetModifiedId() throws Exception {
-        CategoryParameter testSubject;
-        Long result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getModifiedId();
-    }
-
-    @Test
-    public void testGetName() throws Exception {
-        CategoryParameter testSubject;
-        String result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getName();
-    }
 
-    @Test
-    public void testSetName() throws Exception {
-        CategoryParameter testSubject;
-        String name = "";
+    final private String[] excludedProperties = allPropertiesOf(DomainVo.class);
 
-        // default test
-        testSubject = createTestSubject();
-        testSubject.setName(name);
+    private ImmutableSet<CategoryParameterOption> optionsWithRefTo(CategoryParameter categoryParameter) {
+        return ImmutableSet.of(
+            new CategoryParameterOption("appId1", "name1", categoryParameter),
+            new CategoryParameterOption("appId2", "name2", categoryParameter)
+        );
     }
 
     @Test
-    public void testGetAuditUserId() throws Exception {
-        CategoryParameter testSubject;
-        Serializable result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getAuditUserId();
+    public void shouldHaveValidGettersAndSetters() {
+        assertThat(CategoryParameter.class, hasValidGettersAndSettersExcluding("options"));
     }
 
     @Test
-    public void testGetRowNum() throws Exception {
-        CategoryParameter testSubject;
-        Long result;
+    public void testSetAndGetOptions() {
+        CategoryParameter testSubject = new CategoryParameter();
 
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getRowNum();
-    }
-
-    @Test
-    public void testGetAuditTrail() throws Exception {
-        CategoryParameter testSubject;
-        Set result;
+        Set<CategoryParameterOption> options = optionsWithRefTo(testSubject);
 
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getAuditTrail();
+        testSubject.setOptions(options);
+        assertThat(testSubject.getOptions(), containsInAnyOrder(optionsWithRefTo(testSubject).toArray()));
     }
 
     @Test
-    public void testGetOptions() throws Exception {
-        CategoryParameter testSubject;
-        Set<CategoryParameterOption> result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.getOptions();
+    public void shouldHaveValidBeanHashCodeWithCycleReference() {
+        assertThat(CategoryParameter.class,
+            hasValidBeanHashCodeExcluding(ArrayUtils.addAll(new String[]{"options"}, excludedProperties)));
     }
 
     @Test
-    public void testSetOptions() throws Exception {
-        CategoryParameter testSubject;
-        Set<CategoryParameterOption> options = null;
-
-        // default test
-        testSubject = createTestSubject();
+    public void hashCodeShouldNotExplodeWhenCycleReference() {
+        CategoryParameter testSubject = new CategoryParameter();
+        Set<CategoryParameterOption> options = optionsWithRefTo(testSubject);
         testSubject.setOptions(options);
-    }
 
-    @Test
-    public void testAddOption() throws Exception {
-        CategoryParameter testSubject;
-        CategoryParameterOption option = null;
-        boolean result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.addOption(option);
+        testSubject.hashCode(); // don't stackOverflow
     }
 
     @Test
-    public void testIsIdSupported() throws Exception {
-        CategoryParameter testSubject;
-        boolean result;
-
-        // default test
-        testSubject = createTestSubject();
-        result = testSubject.isIdSupported();
+    public void shouldHaveValidBeanEquals() {
+        assertThat(CategoryParameter.class, hasValidBeanEqualsExcluding(excludedProperties));
     }
 
-    @Test
-    public void testSetIdSupported() throws Exception {
-        CategoryParameter testSubject;
-        boolean idSupported = false;
-
-        // default test
-        testSubject = createTestSubject();
-        testSubject.setIdSupported(idSupported);
-    }
 }
index e2effd5..3a7d469 100644 (file)
 
 package org.onap.vid.testUtils;
 
+import static org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptors;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.RETURNS_DEFAULTS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.withSettings;
+import static org.testng.Assert.fail;
+
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ImmutableList;
+import java.beans.PropertyDescriptor;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import javax.ws.rs.client.Client;
+import javax.ws.rs.client.Invocation;
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import org.apache.log4j.LogManager;
 import org.apache.log4j.Logger;
 import org.json.JSONArray;
@@ -32,28 +55,11 @@ import org.mockito.MockSettings;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
+import org.onap.portalsdk.core.domain.support.DomainVo;
 import org.onap.portalsdk.core.util.SystemProperties;
 import org.onap.vid.asdc.beans.Service;
 import org.springframework.mock.env.MockEnvironment;
 
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.Invocation;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.net.URI;
-import java.util.Iterator;
-import java.util.List;
-
-import static fj.parser.Parser.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.*;
-
 /**
  * Created by Oren on 6/7/17.
  */
@@ -125,6 +131,12 @@ public class TestUtils {
                 valueType);
     }
 
+    public static String[] allPropertiesOf(Class<DomainVo> aClass) {
+        return Arrays.stream(getPropertyDescriptors(aClass))
+            .map(PropertyDescriptor::getDisplayName)
+            .toArray(String[]::new);
+    }
+
 
     public static class JavaxRsClientMocks {
         private final javax.ws.rs.client.Client fakeClient;