package org.linagora.linshare.batches;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.linagora.linshare.core.batches.GenericBatch;
import org.linagora.linshare.core.business.service.AccountQuotaBusinessService;
import org.linagora.linshare.core.business.service.DomainDailyStatBusinessService;
import org.linagora.linshare.core.business.service.OperationHistoryBusinessService;
import org.linagora.linshare.core.business.service.ThreadDailyStatBusinessService;
import org.linagora.linshare.core.business.service.UserDailyStatBusinessService;
import org.linagora.linshare.core.domain.entities.AccountQuota;
import org.linagora.linshare.core.domain.entities.DomainDailyStat;
import org.linagora.linshare.core.domain.entities.OperationHistory;
import org.linagora.linshare.core.domain.entities.ThreadDailyStat;
import org.linagora.linshare.core.domain.entities.User;
import org.linagora.linshare.core.domain.entities.UserDailyStat;
import org.linagora.linshare.core.job.quartz.LinShareJobBean;
import org.linagora.linshare.core.repository.UserRepository;
import org.linagora.linshare.service.LoadingServiceTestDatas;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import com.google.common.collect.Lists;
@ContextConfiguration(locations = { "classpath:springContext-datasource.xml",
"classpath:springContext-repository.xml",
"classpath:springContext-dao.xml",
"classpath:springContext-service.xml",
"classpath:springContext-business-service.xml",
"classpath:springContext-facade.xml",
"classpath:springContext-rac.xml",
"classpath:springContext-test.xml",
"classpath:springContext-batches-quota-and-statistics.xml",
"classpath:springContext-fongo.xml",
"classpath:springContext-storage-jcloud.xml",
"classpath:springContext-service-miscellaneous.xml",
"classpath:springContext-ldap.xml" })
public class DailyBatchJobTest extends AbstractTransactionalJUnit4SpringContextTests {
@Autowired
@Qualifier("statisticMonthlyUserBatch")
private GenericBatch monthlyUserBatch;
@Autowired
@Qualifier("statisticMonthlyThreadBatch")
private GenericBatch monthlyThreadBatch;
@Autowired
@Qualifier("statisticMonthlyDomainBatch")
private GenericBatch monthlyDomainBatch;
@Autowired
@Qualifier("statisticWeeklyUserBatch")
private GenericBatch weeklyUserBatch;
@Autowired
@Qualifier("statisticWeeklyThreadBatch")
private GenericBatch weeklyThreadBatch;
@Autowired
@Qualifier("statisticWeeklyDomainBatch")
private GenericBatch weeklyDomainBatch;
@Autowired
@Qualifier("statisticDailyUserBatch")
private GenericBatch dailyUserBatch;
@Autowired
@Qualifier("statisticDailyThreadBatch")
private GenericBatch dailyThreadBatch;
@Autowired
@Qualifier("statisticDailyDomainBatch")
private GenericBatch dailyDomainBatch;
@Autowired
@Qualifier("computeSubDomainQuotaBatch")
private GenericBatch computeSubDomainQuotaBatch;
@Autowired
private OperationHistoryBusinessService operationHistoryBusinessService;
@Autowired
private UserDailyStatBusinessService userdailyStatBusinessService;
@Autowired
private ThreadDailyStatBusinessService threadDailyStatBusinessService;
@Autowired
private AccountQuotaBusinessService accountQuotaBusinessService;
@Autowired
private DomainDailyStatBusinessService domainDailyStatBusinessService;
@Autowired
@Qualifier("userRepository")
private UserRepository<User> userRepository;
LoadingServiceTestDatas dates;
private User jane;
@Before
public void setUp() {
this.executeSqlScript("import-tests-stat.sql", false);
this.executeSqlScript("import-tests-operationHistory.sql", false);
this.executeSqlScript("import-tests-quota.sql", false);
dates = new LoadingServiceTestDatas(userRepository);
dates.loadUsers();
jane = dates.getUser2();
}
@Test
public void test() throws JobExecutionException {
LinShareJobBean job = new LinShareJobBean();
List<GenericBatch> batches = Lists.newArrayList();
batches.add(dailyUserBatch);
batches.add(dailyThreadBatch);
batches.add(dailyDomainBatch);
batches.add(computeSubDomainQuotaBatch);
batches.add(weeklyUserBatch);
batches.add(weeklyThreadBatch);
batches.add(weeklyDomainBatch);
batches.add(monthlyUserBatch);
batches.add(monthlyThreadBatch);
batches.add(monthlyDomainBatch);
job.setBatch(batches);
List<OperationHistory> listOperationHistory = operationHistoryBusinessService.find(null, null, null,
yesterday());
// assertNotEquals(0, listOperationHistory.size());
List<UserDailyStat> listUserDailyStat = userdailyStatBusinessService.findBetweenTwoDates(null, new Date(),
new Date());
assertEquals(0, listUserDailyStat.size());
List<ThreadDailyStat> listThreadDailyStat = threadDailyStatBusinessService.findBetweenTwoDates(null, new Date(),
new Date());
assertEquals(0, listThreadDailyStat.size());
// running all batches.
assertTrue("At least one batch failed.", job.executeExternal());
listOperationHistory = operationHistoryBusinessService.find(null, null, null, yesterday());
assertEquals(0, listOperationHistory.size());
listUserDailyStat = userdailyStatBusinessService.findBetweenTwoDates(null,
new GregorianCalendar(2042, 9, 01, 00, 00).getTime(),
new GregorianCalendar(2042, 9, 16, 00, 00).getTime());
assertEquals(1, listUserDailyStat.size());
UserDailyStat userDailyStat = listUserDailyStat.get(0);
assertEquals(jane, userDailyStat.getAccount());
assertEquals(5, (long) userDailyStat.getOperationCount());
assertEquals(50, (long) userDailyStat.getActualOperationSum());
assertEquals(3, (long) userDailyStat.getCreateOperationCount());
assertEquals(100, (long) userDailyStat.getCreateOperationSum());
assertEquals(2, (long) userDailyStat.getDeleteOperationCount());
assertEquals(-50, (long) userDailyStat.getDeleteOperationSum());
assertEquals(50, (long) userDailyStat.getDiffOperationSum());
AccountQuota quota = accountQuotaBusinessService.find(jane);
assertNotNull(quota);
assertEquals(1100, (long) quota.getCurrentValue());
assertEquals(800, (long) quota.getLastValue());
assertEquals(1600, (long) quota.getQuota());
assertEquals(1480, (long) quota.getQuotaWarning());
assertEquals(5, (long) quota.getMaxFileSize());
listThreadDailyStat = threadDailyStatBusinessService.findBetweenTwoDates(null,
new GregorianCalendar(2042, 10, 01, 00, 00).getTime(),
new GregorianCalendar(2042, 10, 16, 00, 00).getTime());
assertEquals(5, listThreadDailyStat.size());
ThreadDailyStat threadDailyStat = listThreadDailyStat.get(0);
assertEquals(5, (long) threadDailyStat.getOperationCount());
assertEquals(50, (long) threadDailyStat.getActualOperationSum());
assertEquals(3, (long) threadDailyStat.getCreateOperationCount());
assertEquals(100, (long) threadDailyStat.getCreateOperationSum());
assertEquals(2, (long) threadDailyStat.getDeleteOperationCount());
assertEquals(-50, (long) threadDailyStat.getDeleteOperationSum());
assertEquals(50, (long) threadDailyStat.getDiffOperationSum());
accountQuotaBusinessService.createOrUpdate(threadDailyStat.getAccount(), new Date());
quota = accountQuotaBusinessService.find(threadDailyStat.getAccount());
assertNotNull(quota);
assertEquals(0, (long) quota.getCurrentValue());
assertEquals(0, (long) quota.getLastValue());
assertEquals(2000, (long) quota.getQuota());
assertEquals(1500, (long) quota.getQuotaWarning());
assertEquals(5, (long) quota.getMaxFileSize());
List<DomainDailyStat> listDomaindailyStat = domainDailyStatBusinessService.findBetweenTwoDates(jane.getDomain(),
null, null);
assertEquals(5, listDomaindailyStat.size());
listDomaindailyStat = domainDailyStatBusinessService.findBetweenTwoDates(jane.getDomain(),
new GregorianCalendar(2042, 8, 8, 00, 00).getTime(), new GregorianCalendar(2042, 8, 11, 00, 00).getTime());
assertEquals(1, listDomaindailyStat.size());
DomainDailyStat domainDailyStat = listDomaindailyStat.get(0);
assertEquals(jane.getDomain(), domainDailyStat.getDomain());
assertEquals(5, (long) domainDailyStat.getOperationCount());
assertEquals(50, (long) domainDailyStat.getActualOperationSum());
assertEquals(3, (long) domainDailyStat.getCreateOperationCount());
assertEquals(100, (long) domainDailyStat.getCreateOperationSum());
assertEquals(2, (long) domainDailyStat.getDeleteOperationCount());
assertEquals(-50, (long) domainDailyStat.getDeleteOperationSum());
assertEquals(50, (long) domainDailyStat.getDiffOperationSum());
}
private Date yesterday() {
GregorianCalendar dateCalender = new GregorianCalendar();
dateCalender.add(GregorianCalendar.DATE, -1);
dateCalender.set(GregorianCalendar.HOUR_OF_DAY, 23);
dateCalender.set(GregorianCalendar.MINUTE, 59);
dateCalender.set(GregorianCalendar.SECOND, 59);
return dateCalender.getTime();
}
}