/** * 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; import static org.candlepin.util.Util.addDaysToDt; import static org.candlepin.util.Util.addToFields; import static org.candlepin.util.Util.newSet; import static org.candlepin.util.Util.toDate; import static org.candlepin.util.Util.tomorrow; import static org.candlepin.util.Util.yesterday; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.candlepin.test.DatabaseTestFixture; import org.candlepin.util.Util; import org.junit.Test; import java.lang.reflect.Field; import java.math.BigInteger; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.inject.Inject; /** * CertificateSerialCuratorTest */ public class CertificateSerialCuratorTest extends DatabaseTestFixture { @Inject private ProductCurator productCurator; @Inject private EntitlementCurator entitlementCurator; @Inject private CertificateSerialCurator certSerialCurator; private class CertSerialBuilder { private Date dt = new Date(); private boolean collected = false; private boolean revoked = false; public CertSerialBuilder collected(boolean val) { this.collected = val; return this; } public CertSerialBuilder withExpDate(String date) { this.dt = toDate(date); return this; } public CertSerialBuilder withExpDate(Date dt) { this.dt = dt; return this; } public CertSerialBuilder revoked(boolean re) { this.revoked = re; return this; } public CertificateSerial save() { CertificateSerial serial = new CertificateSerial(dt); serial.setCollected(collected); serial.setRevoked(revoked); serial = certSerialCurator.create(serial); return serial; } } public CertSerialBuilder createCS() { return this.new CertSerialBuilder(); } @Test public void testSerialCreation() { CertificateSerial serial = new CertificateSerial(new Date()); serial = certSerialCurator.create(serial); assertNotNull(serial); assertNotNull(serial.getId()); } @Test public void certSerialCreateWithManuallySetId() { Long expectedSerialNumber = Util.generateUniqueLong(); CertificateSerial serial = new CertificateSerial(expectedSerialNumber, new Date()); // When manually setting the id for an entity, hibernate requires that // we call merge instead of save/persist. certSerialCurator.save(serial); assertNotNull(serial); assertNotNull(serial.getId()); assertEquals(expectedSerialNumber, serial.getId()); CandlepinQuery<CertificateSerial> serialQuery = certSerialCurator.listBySerialIds(new String[] {serial.getId().toString()}); assertEquals(1, serialQuery.getRowCount()); } @Test public void testRetrieveToBeCollectedSerials1() { createCS().withExpDate("01/10/2010").collected(false).revoked(true).save(); createCS().withExpDate("02/10/2010").collected(true).revoked(true).save(); createCS().withExpDate("03/10/2010").collected(false).revoked(false).save(); createCS().withExpDate("04/10/2010").collected(true).revoked(true).save(); List<CertificateSerial> lcs = this.certSerialCurator.retrieveTobeCollectedSerials().list(); Set<Date> dates = extractExpiredDates(lcs); assertEquals(1, lcs.size()); assertTrue(dates.contains(toDate("01/10/2010"))); } /** * @param lcs * @return */ private Set<Date> extractExpiredDates(List<CertificateSerial> lcs) { Set<Date> dates = newSet(); for (Iterator<CertificateSerial> iterator = lcs.iterator(); iterator.hasNext();) { CertificateSerial certificateSerial = iterator.next(); dates.add(certificateSerial.getExpiration()); } return dates; } @Test public void testRetrieveToBeCollectedSerials2() { createCS().withExpDate("01/10/2010").collected(true).revoked(true).save(); List<CertificateSerial> lcs = this.certSerialCurator.retrieveTobeCollectedSerials().list(); assertEquals(0, lcs.size()); } @Test public void testGetExpiredSerialsWithFewExpiredAndRevokedSerials() { Date yesterday = yesterday(); Date threeDaysPrev = addDaysToDt(-3); createCS().withExpDate(yesterday).collected(true).revoked(true).save(); createCS().withExpDate(addDaysToDt(3)).collected(true).revoked(true).save(); createCS().withExpDate(threeDaysPrev).collected(true).revoked(true).save(); List<CertificateSerial> lcs = this.certSerialCurator.getExpiredSerials().list(); Set<Date> dates = extractExpiredDates(lcs); assertEquals(2, lcs.size()); assertTrue(dates.contains(yesterday)); assertTrue(dates.contains(threeDaysPrev)); } @Test public void testGetExpiredSerialsWithEmptyDatabase() { List<CertificateSerial> lcs = this.certSerialCurator.getExpiredSerials().list(); assertEquals(0, lcs.size()); } @Test public void testGetExpiredSerialsWithNonRevokedButExpiredSerials() { createCS().withExpDate(yesterday()).revoked(false).save(); List<CertificateSerial> lcs = this.certSerialCurator.getExpiredSerials().list(); assertEquals(0, lcs.size()); } @Test public void testDeleteExpiredSerialsWithEmptyDatabase() { assertEquals(0, this.certSerialCurator.deleteExpiredSerials()); } @Test public void testDeleteExpiredSerialsWithNonRevokedButExpiredSerials() { createCS().withExpDate(yesterday()).revoked(false).save(); createCS().withExpDate(addDaysToDt(-20)).revoked(false).save(); assertEquals(0, this.certSerialCurator.deleteExpiredSerials()); } @Test public void testDeleteExpiredSerialsWithRevokedAndExpiredSerials() { createCS().withExpDate(addDaysToDt(-2)).revoked(true).save(); createCS().withExpDate(addDaysToDt(-10)).revoked(true).save(); assertEquals(2, this.certSerialCurator.deleteExpiredSerials()); } /** * This tests the batching logic for IN clause limit */ @Test public void testDelete50ExpiredSerials() { setPrivateField(CertificateSerialCurator.class, "inClauseLimit", 50); for (int i = 0; i < 50; i++) { createCS().withExpDate(addDaysToDt(-10)).revoked(true).save(); } assertEquals(50, this.certSerialCurator.deleteExpiredSerials()); } @Test public void testDelete55ExpiredSerials() { setPrivateField(CertificateSerialCurator.class, "inClauseLimit", 55); for (int i = 0; i < 55; i++) { createCS().withExpDate(addDaysToDt(-10)).revoked(true).save(); } assertEquals(55, this.certSerialCurator.deleteExpiredSerials()); } private void setPrivateField(Class<CertificateSerialCurator> clazz, String intField, int val) { Field f; try { f = clazz.getDeclaredField(intField); f.setAccessible(true); f.setInt(clazz, val); } catch (Exception e) { throw new RuntimeException(e); } } @Test public void testDeleteExpiredSerialsWithMixedSerials() { createCS().withExpDate(addToFields(0, -3, 0)).revoked(true).save(); createCS().withExpDate(addToFields(0, 0, -1)).revoked(true).save(); createCS().withExpDate(addDaysToDt(-10)).revoked(true).save(); createCS().withExpDate(addDaysToDt(30)).revoked(true).save(); createCS().withExpDate(tomorrow()).revoked(false).save(); assertEquals(3, this.certSerialCurator.deleteExpiredSerials()); } @Test public void testListBySerialIds() { CertificateSerial serial = createCS().withExpDate("03/10/2010") .collected(false).revoked(false).save(); CertificateSerial serial1 = createCS().withExpDate("03/10/2012") .collected(true).revoked(true).save(); String[] ids = new String[2]; ids[0] = String.valueOf(serial.getSerial()); ids[1] = String.valueOf(serial1.getSerial()); List<CertificateSerial> serials = certSerialCurator.listBySerialIds(ids).list(); assertEquals(2, serials.size()); // verify Map<BigInteger, CertificateSerial> values = new HashMap<BigInteger, CertificateSerial>(); for (CertificateSerial s : serials) { values.put(s.getSerial(), s); } assertNotNull(values.get(serial.getSerial())); assertNotNull(values.get(serial1.getSerial())); } @Test public void givenNullReturnsNull() { assertEquals(null, certSerialCurator.listBySerialIds(null)); } }