/** * Copyright (c) 2009 - 2012 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package org.candlepin.model.dto; import org.candlepin.model.Content; import org.candlepin.util.Util; import static org.junit.Assert.*; import junitparams.JUnitParamsRunner; import junitparams.Parameters; import org.junit.Test; import org.junit.runner.RunWith; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Collection; /** * Test suite for the ContentData class */ @RunWith(JUnitParamsRunner.class) public class ContentDataTest { // public .* (?:get|is)(.*)\(\) {\npublic .* set\1\(.*\) { // @Test // public void testGetSet\1() { // ContentData dto = new ContentData(); // String input = "test_value"; // String output = dto.get\1(); // assertNull(output); // ContentData output2 = dto.set\1(input); // assertSame(output2, dto); // output = dto.get\1(); // assertEquals(input, output); // } protected Object[][] getBadStringValues() { return new Object[][] { new Object[] { null }, new Object[] { "" }, }; } @Test public void testGetSetUuid() { ContentData dto = new ContentData(); String input = "test_value"; String output = dto.getUuid(); assertNull(output); ContentData output2 = dto.setUuid(input); assertSame(output2, dto); output = dto.getUuid(); assertEquals(input, output); } @Test public void testGetSetId() { ContentData dto = new ContentData(); String input = "test_id"; String output = dto.getId(); assertNull(output); ContentData output2 = dto.setId(input); assertSame(output2, dto); output = dto.getId(); assertEquals(input, output); } @Test(expected = IllegalArgumentException.class) @Parameters(method = "getBadStringValues") public void testGetSetIdBadValues(String input) { ContentData dto = new ContentData(); String output = dto.getId(); assertNull(output); dto.setId(input); } @Test public void testGetSetType() { ContentData dto = new ContentData(); String input = "test_value"; String output = dto.getType(); assertNull(output); ContentData output2 = dto.setType(input); assertSame(output2, dto); output = dto.getType(); assertEquals(input, output); } @Test public void testGetSetLabel() { ContentData dto = new ContentData(); String input = "test_value"; String output = dto.getLabel(); assertNull(output); ContentData output2 = dto.setLabel(input); assertSame(output2, dto); output = dto.getLabel(); assertEquals(input, output); } @Test public void testGetSetName() { ContentData dto = new ContentData(); String input = "test_value"; String output = dto.getName(); assertNull(output); ContentData output2 = dto.setName(input); assertSame(output2, dto); output = dto.getName(); assertEquals(input, output); } @Test public void testGetSetVendor() { ContentData dto = new ContentData(); String input = "test_value"; String output = dto.getVendor(); assertNull(output); ContentData output2 = dto.setVendor(input); assertSame(output2, dto); output = dto.getVendor(); assertEquals(input, output); } @Test public void testGetSetContentUrl() { ContentData dto = new ContentData(); String input = "test_value"; String output = dto.getContentUrl(); assertNull(output); ContentData output2 = dto.setContentUrl(input); assertSame(output2, dto); output = dto.getContentUrl(); assertEquals(input, output); } @Test public void testGetSetRequiredTags() { ContentData dto = new ContentData(); String input = "test_value"; String output = dto.getRequiredTags(); assertNull(output); ContentData output2 = dto.setRequiredTags(input); assertSame(output2, dto); output = dto.getRequiredTags(); assertEquals(input, output); } @Test public void testGetSetReleaseVersion() { ContentData dto = new ContentData(); String input = "test_value"; String output = dto.getReleaseVersion(); assertNull(output); ContentData output2 = dto.setReleaseVersion(input); assertSame(output2, dto); output = dto.getReleaseVersion(); assertEquals(input, output); } @Test public void testGetSetGpgUrl() { ContentData dto = new ContentData(); String input = "test_value"; String output = dto.getGpgUrl(); assertNull(output); ContentData output2 = dto.setGpgUrl(input); assertSame(output2, dto); output = dto.getGpgUrl(); assertEquals(input, output); } @Test public void testGetSetMetadataExpire() { ContentData dto = new ContentData(); Long input = 12345L; Long output = dto.getMetadataExpire(); assertNull(output); ContentData output2 = dto.setMetadataExpire(input); assertSame(output2, dto); output = dto.getMetadataExpire(); assertEquals(input, output); } @Test public void testGetSetModifiedProductIds() { ContentData dto = new ContentData(); Collection<String> input = Arrays.asList("1", "2", "3"); Collection<String> output = dto.getModifiedProductIds(); assertNull(output); ContentData output2 = dto.setModifiedProductIds(input); assertSame(output2, dto); output = dto.getModifiedProductIds(); assertTrue(Util.collectionsAreEqual(input, output)); } @Test public void testAddModifiedProductId() { ContentData dto = new ContentData(); Collection<String> pids = dto.getModifiedProductIds(); assertNull(pids); boolean output = dto.addModifiedProductId("1"); pids = dto.getModifiedProductIds(); assertTrue(output); assertNotNull(pids); assertTrue(Util.collectionsAreEqual(Arrays.asList("1"), pids)); output = dto.addModifiedProductId("2"); pids = dto.getModifiedProductIds(); assertTrue(output); assertNotNull(pids); assertTrue(Util.collectionsAreEqual(Arrays.asList("1", "2"), pids)); output = dto.addModifiedProductId("1"); pids = dto.getModifiedProductIds(); assertFalse(output); assertNotNull(pids); assertTrue(Util.collectionsAreEqual(Arrays.asList("1", "2"), pids)); } @Test public void testRemoveModifiedProductId() { ContentData dto = new ContentData(); Collection<String> pids = dto.getModifiedProductIds(); assertNull(pids); boolean output = dto.removeModifiedProductId("1"); pids = dto.getModifiedProductIds(); assertFalse(output); assertNull(pids); dto.setModifiedProductIds(Arrays.asList("1", "2")); pids = dto.getModifiedProductIds(); assertNotNull(pids); assertTrue(Util.collectionsAreEqual(Arrays.asList("1", "2"), pids)); output = dto.removeModifiedProductId("1"); pids = dto.getModifiedProductIds(); assertTrue(output); assertNotNull(pids); assertTrue(Util.collectionsAreEqual(Arrays.asList("2"), pids)); output = dto.removeModifiedProductId("3"); pids = dto.getModifiedProductIds(); assertFalse(output); assertNotNull(pids); assertTrue(Util.collectionsAreEqual(Arrays.asList("2"), pids)); output = dto.removeModifiedProductId("2"); pids = dto.getModifiedProductIds(); assertTrue(output); assertNotNull(pids); assertTrue(Util.collectionsAreEqual(Arrays.<String>asList(), pids)); } @Test public void testGetSetArches() { ContentData dto = new ContentData(); String input = "test_value"; String output = dto.getArches(); assertNull(output); ContentData output2 = dto.setArches(input); assertSame(output2, dto); output = dto.getArches(); assertEquals(input, output); } @Test public void testGetSetLocked() { ContentData dto = new ContentData(); Boolean input = Boolean.TRUE; Boolean output = dto.isLocked(); assertNull(output); ContentData output2 = dto.setLocked(input); assertSame(output2, dto); output = dto.isLocked(); assertEquals(input, output); } protected Object[][] getValuesForEqualityAndReplication() { return new Object[][] { new Object[] { "Uuid", "test_value", "alt_value" }, new Object[] { "Id", "test_value", "alt_value" }, new Object[] { "Type", "test_value", "alt_value" }, new Object[] { "Label", "test_value", "alt_value" }, new Object[] { "Name", "test_value", "alt_value" }, new Object[] { "Vendor", "test_value", "alt_value" }, new Object[] { "ContentUrl", "test_value", "alt_value" }, new Object[] { "RequiredTags", "test_value", "alt_value" }, new Object[] { "ReleaseVersion", "test_value", "alt_value" }, new Object[] { "GpgUrl", "test_value", "alt_value" }, new Object[] { "MetadataExpire", 1234L, 5678L }, new Object[] { "ModifiedProductIds", Arrays.asList("1", "2", "3"), Arrays.asList("4", "5", "6") }, new Object[] { "Arches", "test_value", "alt_value" }, new Object[] { "Locked", Boolean.TRUE, Boolean.FALSE } }; } protected Method[] getAccessorAndMutator(String methodSuffix, Class mutatorInputClass) throws Exception { Method accessor = null; Method mutator = null; try { accessor = ContentData.class.getDeclaredMethod("get" + methodSuffix, null); } catch (NoSuchMethodException e) { accessor = ContentData.class.getDeclaredMethod("is" + methodSuffix, null); } try { mutator = ContentData.class.getDeclaredMethod("set" + methodSuffix, mutatorInputClass); } catch (NoSuchMethodException e) { if (!Collection.class.isAssignableFrom(mutatorInputClass)) { throw e; } mutator = ContentData.class.getDeclaredMethod("set" + methodSuffix, Collection.class); } return new Method[] { accessor, mutator }; } @Test public void testBaseEquality() { ContentData lhs = new ContentData(); ContentData rhs = new ContentData(); assertFalse(lhs.equals(null)); assertTrue(lhs.equals(lhs)); assertTrue(rhs.equals(rhs)); assertTrue(lhs.equals(rhs)); assertTrue(rhs.equals(lhs)); } @Test @Parameters(method = "getValuesForEqualityAndReplication") public void testEquality(String valueName, Object value1, Object value2) throws Exception { Method[] methods = this.getAccessorAndMutator(valueName, value1.getClass()); Method accessor = methods[0]; Method mutator = methods[1]; ContentData lhs = new ContentData(); ContentData rhs = new ContentData(); mutator.invoke(lhs, value1); mutator.invoke(rhs, value1); assertEquals(accessor.invoke(lhs), accessor.invoke(rhs)); assertTrue(lhs.equals(rhs)); assertTrue(rhs.equals(lhs)); assertTrue(lhs.equals(lhs)); assertTrue(rhs.equals(rhs)); assertEquals(lhs.hashCode(), rhs.hashCode()); mutator.invoke(rhs, value2); assertNotEquals(accessor.invoke(lhs), accessor.invoke(rhs)); assertFalse(lhs.equals(rhs)); assertFalse(rhs.equals(lhs)); assertTrue(lhs.equals(lhs)); assertTrue(rhs.equals(rhs)); } @Test @Parameters(method = "getValuesForEqualityAndReplication") public void testClone(String valueName, Object value1, Object value2) throws Exception { Method[] methods = this.getAccessorAndMutator(valueName, value1.getClass()); Method accessor = methods[0]; Method mutator = methods[1]; ContentData base = new ContentData(); mutator.invoke(base, value1); ContentData clone = (ContentData) base.clone(); assertEquals(accessor.invoke(base, null), accessor.invoke(clone, null)); assertEquals(base, clone); assertEquals(base.hashCode(), clone.hashCode()); } @Test @Parameters(method = "getValuesForEqualityAndReplication") public void testPopulateWithDTO(String valueName, Object value1, Object value2) throws Exception { Method[] methods = this.getAccessorAndMutator(valueName, value1.getClass()); Method accessor = methods[0]; Method mutator = methods[1]; ContentData base = new ContentData(); ContentData source = new ContentData(); mutator.invoke(source, value1); base.populate(source); // Verify only the specified field was set for (Method method : ContentData.class.getDeclaredMethods()) { if (method.getName().matches("^(get|is)\\w+")) { Object output = method.invoke(base, null); if (method.getName().equals(accessor.getName())) { if (value1 instanceof Collection) { assertTrue(output instanceof Collection); assertTrue(Util.collectionsAreEqual((Collection) value1, (Collection) output)); } else { assertEquals(value1, output); } } else { assertNull(output); } } } } protected Object[][] getValuesPopulationByEntity() { return new Object[][] { new Object[] { "Uuid", "test_value", null }, new Object[] { "Id", "test_value", null }, new Object[] { "Type", "test_value", null }, new Object[] { "Label", "test_value", null }, new Object[] { "Name", "test_value", null }, new Object[] { "Vendor", "test_value", null }, new Object[] { "ContentUrl", "test_value", null }, new Object[] { "RequiredTags", "test_value", null }, new Object[] { "ReleaseVersion", "test_value", null }, new Object[] { "GpgUrl", "test_value", null }, new Object[] { "MetadataExpire", 1234L, null }, new Object[] { "ModifiedProductIds", Arrays.asList("1", "2", "3"), Arrays.asList() }, new Object[] { "Arches", "test_value", null }, new Object[] { "Locked", Boolean.TRUE, false } }; } @Test @Parameters(method = "getValuesPopulationByEntity") public void testPopulateWithEntity(String valueName, Object input, Object defaultValue) throws Exception { Method accessor = null; Method mutator = null; try { accessor = ContentData.class.getDeclaredMethod("get" + valueName, null); } catch (NoSuchMethodException e) { accessor = ContentData.class.getDeclaredMethod("is" + valueName, null); } try { mutator = Content.class.getDeclaredMethod("set" + valueName, input.getClass()); } catch (NoSuchMethodException e) { if (Collection.class.isAssignableFrom(input.getClass())) { mutator = Content.class.getDeclaredMethod("set" + valueName, Collection.class); } else if (Boolean.class.isAssignableFrom(input.getClass())) { mutator = Content.class.getDeclaredMethod("set" + valueName, boolean.class); } else { throw e; } } ContentData base = new ContentData(); Content source = new Content(); mutator.invoke(source, input); base.populate(source); // Verify only the specified field was set for (Method method : ContentData.class.getDeclaredMethods()) { if (method.getName().matches("^(get|is)\\w+")) { Object output = method.invoke(base, null); if (method.getName().equals(accessor.getName())) { if (input instanceof Collection) { assertTrue(output instanceof Collection); assertTrue(Util.collectionsAreEqual((Collection) input, (Collection) output)); } else { assertEquals(input, output); } } else { for (Object[] values : this.getValuesPopulationByEntity()) { if (method.getName().endsWith((String) values[0])) { if (values[2] instanceof Collection) { assertTrue(output instanceof Collection); assertTrue(Util.collectionsAreEqual((Collection) values[2], (Collection) output)); } else { assertEquals(values[2], output); } } } } } } } }