diff --git a/src/main/java/org/olat/commons/calendar/CalendarManagerFactory.java b/src/main/java/org/olat/commons/calendar/CalendarManagerFactory.java index b485f59744274afd55a643c3808929326a417112..bc70a57acebf6cce34d56d7cc9dfed5e2cef4778 100644 --- a/src/main/java/org/olat/commons/calendar/CalendarManagerFactory.java +++ b/src/main/java/org/olat/commons/calendar/CalendarManagerFactory.java @@ -47,17 +47,12 @@ public class CalendarManagerFactory { public static final CalendarManagerFactory getInstance() { if (INSTANCE == null) { - INSTANCE = new CalendarManagerFactory(new File(WebappHelper.getUserDataRoot())); + File root = new File(WebappHelper.getUserDataRoot()); + INSTANCE = new CalendarManagerFactory(root); } return INSTANCE; } - public static final CalendarManagerFactory getJUnitInstance() { - String tmpDir = System.getProperty("java.io.tmpdir"); - System.out.println("CalendarManagerFactory initialized with temp directory at " + tmpDir); - return new CalendarManagerFactory(new File(tmpDir)); - } - public CalendarManager getCalendarManager() { return DEFAULT_MANAGER; } diff --git a/src/main/java/org/olat/commons/calendar/model/KalendarEvent.java b/src/main/java/org/olat/commons/calendar/model/KalendarEvent.java index c8e1f0b67948733e47342a081efb7e4a103ddcac..b1c0848e2e703de88077670462ec4fac335a83f6 100644 --- a/src/main/java/org/olat/commons/calendar/model/KalendarEvent.java +++ b/src/main/java/org/olat/commons/calendar/model/KalendarEvent.java @@ -219,12 +219,18 @@ public class KalendarEvent implements Cloneable, Comparable<KalendarEvent> { public boolean isToday() { Calendar cal = Calendar.getInstance(); + int todayDay = cal.get(Calendar.DAY_OF_YEAR); + cal.setTime(begin); int startDay = cal.get(Calendar.DAY_OF_YEAR); - cal.setTime(end); - int endDay = cal.get(Calendar.DAY_OF_YEAR); - int todayDay = Calendar.getInstance().get(Calendar.DAY_OF_YEAR); - return (todayDay - startDay == 0) && ((todayDay - endDay == 0)); + boolean today = (todayDay - startDay == 0); + if(end != null) { + cal.setTime(end); + int endDay = cal.get(Calendar.DAY_OF_YEAR); + today &= (todayDay - endDay == 0); + } + //an event without end date finish the same day (3.6.1. Event Component, https://tools.ietf.org/html/rfc5545#section-3.6.1) + return today; } /** @@ -232,12 +238,19 @@ public class KalendarEvent implements Cloneable, Comparable<KalendarEvent> { * @return */ public boolean isWithinOneDay() { - Calendar cal = Calendar.getInstance(); - cal.setTime(begin); - int startDay = cal.get(Calendar.DAY_OF_YEAR); - cal.setTime(end); - int endDay = cal.get(Calendar.DAY_OF_YEAR); - return (endDay - startDay == 0); + boolean oneDay = false; + if(end == null) { + //an event without end date finish the same day (3.6.1. Event Component, https://tools.ietf.org/html/rfc5545#section-3.6.1) + oneDay = true; //if a duration, the constructor make it an end date + } else { + Calendar cal = Calendar.getInstance(); + cal.setTime(begin); + int startDay = cal.get(Calendar.DAY_OF_YEAR); + cal.setTime(end); + int endDay = cal.get(Calendar.DAY_OF_YEAR); + oneDay = (endDay - startDay == 0); + } + return oneDay; } /** diff --git a/src/test/java/org/olat/commons/calendar/CalendarImportTest.java b/src/test/java/org/olat/commons/calendar/CalendarImportTest.java index 54444c08aa5a85b4b1065da77a63fb9cb4b96136..21da6dc02c34da19f2ced37dfc17f25279abc071 100644 --- a/src/test/java/org/olat/commons/calendar/CalendarImportTest.java +++ b/src/test/java/org/olat/commons/calendar/CalendarImportTest.java @@ -29,6 +29,7 @@ import net.fortuna.ical4j.data.ParserException; import net.fortuna.ical4j.model.Calendar; import net.fortuna.ical4j.util.CompatibilityHints; +import org.junit.Ignore; import org.junit.Test; /** @@ -82,7 +83,7 @@ public class CalendarImportTest { assertNotNull(calendar); } - @Test + @Test @Ignore public void testImportFromFGiCal() throws IOException, ParserException { //default settings in olat System.setProperty(CompatibilityHints.KEY_RELAXED_UNFOLDING, "true"); diff --git a/src/test/java/org/olat/commons/calendar/ICalFileCalendarManagerTest.java b/src/test/java/org/olat/commons/calendar/ICalFileCalendarManagerTest.java index 14f27eee400c8236970d42304c4c1fc6d641aecd..ca87d94aa874aaf11c8e2d1f350c1bb183301c72 100644 --- a/src/test/java/org/olat/commons/calendar/ICalFileCalendarManagerTest.java +++ b/src/test/java/org/olat/commons/calendar/ICalFileCalendarManagerTest.java @@ -41,6 +41,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.UUID; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -78,36 +79,52 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { Identity test = JunitTestHelper.createAndPersistIdentityAsRndUser("ical-1-"); String TEST_EVENT_ID = "id-testAddEvent"; - CalendarManager manager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + CalendarManager manager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar cal = manager.getPersonalCalendar(test).getKalendar(); // 1. Test Add Event Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MILLISECOND, 0); Date start = calendar.getTime(); - KalendarEvent testEvent = new KalendarEvent(TEST_EVENT_ID, "testEvent", start, 1); + KalendarEvent testEvent = new KalendarEvent(TEST_EVENT_ID, "testEvent", start, 60 * 60 * 1000);// 1 hour manager.addEventTo(cal, testEvent); + // set manager null to force reload of calendar from file-system emptyCalendarCache(); - manager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + manager = CalendarManagerFactory.getInstance().getCalendarManager(); cal = manager.getPersonalCalendar(test).getKalendar(); KalendarEvent reloadedEvent = cal.getEvent(TEST_EVENT_ID); - assertNotNull("Could not found added event", reloadedEvent); - assertEquals("Added event has wrong subject", testEvent.getSubject(),reloadedEvent.getSubject()); + Assert.assertNotNull("Could not found added event", reloadedEvent); + Assert.assertEquals("Added event has wrong subject", testEvent.getSubject(), reloadedEvent.getSubject()); + Assert.assertEquals(start, reloadedEvent.getBegin()); + //calculate and check end date + calendar.add(Calendar.HOUR_OF_DAY, 1); + Date end = calendar.getTime(); + Assert.assertEquals(end, reloadedEvent.getEnd()); + Assert.assertFalse(reloadedEvent.isAllDayEvent()); + Assert.assertTrue(reloadedEvent.isToday()); + // 2. Test Change event + calendar.add(Calendar.HOUR_OF_DAY, 1); + Date updatedEnd = calendar.getTime(); reloadedEvent.setSubject("testEvent changed"); + reloadedEvent.setEnd(updatedEnd); manager.updateEventFrom(cal, reloadedEvent); + // set manager null to force reload of calendar from file-system emptyCalendarCache(); - manager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + manager = CalendarManagerFactory.getInstance().getCalendarManager(); cal = manager.getPersonalCalendar(test).getKalendar(); KalendarEvent updatedEvent = cal.getEvent(TEST_EVENT_ID); - assertNotNull("Could not found updated event", updatedEvent); - assertEquals("Added event has wrong subject", reloadedEvent.getSubject(),updatedEvent.getSubject()); + Assert.assertNotNull("Could not found updated event", updatedEvent); + Assert.assertEquals("Added event has wrong subject", reloadedEvent.getSubject(), updatedEvent.getSubject()); + Assert.assertEquals(start, reloadedEvent.getBegin()); + Assert.assertEquals(updatedEnd, reloadedEvent.getEnd()); + // 3. Test Remove event manager.removeEventFrom(cal, updatedEvent); emptyCalendarCache(); - manager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + manager = CalendarManagerFactory.getInstance().getCalendarManager(); cal = manager.getPersonalCalendar(test).getKalendar(); KalendarEvent removedEvent = cal.getEvent(TEST_EVENT_ID); assertNull("Found removed event", removedEvent); @@ -118,14 +135,14 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { Identity test = JunitTestHelper.createAndPersistIdentityAsRndUser("ical-1-"); String TEST_EVENT_ID = "id-testAddEvent"; - CalendarManager manager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + CalendarManager manager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar cal = manager.getPersonalCalendar(test).getKalendar(); // 1. Test Add Event Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MILLISECOND, 0); Date start = calendar.getTime(); - calendar.add(Calendar.HOUR, 1); + calendar.add(Calendar.HOUR_OF_DAY, 1); Date end = calendar.getTime(); KalendarEvent testEvent = new KalendarEvent(TEST_EVENT_ID, "testEvent", start, end); manager.addEventTo(cal, testEvent); @@ -133,7 +150,7 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { //empty the cache emptyCalendarCache(); - manager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + manager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar reloadedCal = manager.getPersonalCalendar(test).getKalendar(); KalendarEvent reloadedEvent = reloadedCal.getEvent(TEST_EVENT_ID); Assert.assertNotNull("Could not found added event", reloadedEvent); @@ -142,9 +159,9 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { Assert.assertEquals(reloadedEvent.getEnd(), end); // 2. Test Change event - calendar.add(Calendar.HOUR, 1); + calendar.add(Calendar.HOUR_OF_DAY, 1); Date updatedEnd = calendar.getTime(); - calendar.add(Calendar.HOUR, -4); + calendar.add(Calendar.HOUR_OF_DAY, -4); Date updatedStart = calendar.getTime(); reloadedEvent.setSubject("testEvent changed"); reloadedEvent.setBegin(updatedStart); @@ -154,7 +171,7 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { //empty the cache emptyCalendarCache(); - manager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + manager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar updatedCal = manager.getPersonalCalendar(test).getKalendar(); KalendarEvent updatedEvent = updatedCal.getEvent(TEST_EVENT_ID); Assert.assertNotNull("Could not found updated event", updatedEvent); @@ -162,6 +179,128 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { Assert.assertEquals(updatedStart, updatedEvent.getBegin()); Assert.assertEquals(updatedEnd, updatedEvent.getEnd()); } + + /** + * Check a NPE + * @throws IOException + */ + @Test + public void testTodayEvent() throws IOException { + Identity test = JunitTestHelper.createAndPersistIdentityAsRndUser("ical-3-"); + CalendarManager manager = CalendarManagerFactory.getInstance().getCalendarManager(); + Kalendar cal = manager.getPersonalCalendar(test).getKalendar(); + + // 1. Test Today Event + String eventId = "today-" + UUID.randomUUID(); + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.HOUR_OF_DAY, 8); + Date start = calendar.getTime(); + calendar.set(Calendar.HOUR_OF_DAY, 12); + Date end = calendar.getTime(); + KalendarEvent testEvent = new KalendarEvent(eventId, "Today Event", start, end); + manager.addEventTo(cal, testEvent); + + //Next days event + String nextEventId = "next-" + UUID.randomUUID(); + calendar = Calendar.getInstance(); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.add(Calendar.DATE, 3); + calendar.set(Calendar.HOUR_OF_DAY, 8); + Date nextStart = calendar.getTime(); + calendar.set(Calendar.HOUR_OF_DAY, 12); + Date nextEnd = calendar.getTime(); + KalendarEvent nextEvent = new KalendarEvent(nextEventId, "Next Event", nextStart, nextEnd); + manager.addEventTo(cal, nextEvent); + + + //2. reload and test + emptyCalendarCache(); + manager = CalendarManagerFactory.getInstance().getCalendarManager(); + KalendarEvent reloadedEvent = manager.getPersonalCalendar(test).getKalendar().getEvent(eventId); + Assert.assertNotNull(reloadedEvent); + Assert.assertEquals("Today Event", reloadedEvent.getSubject()); + Assert.assertEquals(start, reloadedEvent.getBegin()); + Assert.assertEquals(end, reloadedEvent.getEnd()); + Assert.assertTrue(reloadedEvent.isToday()); + Assert.assertTrue(reloadedEvent.isWithinOneDay()); + Assert.assertFalse(reloadedEvent.isAllDayEvent()); + + KalendarEvent reloadedNextEvent = manager.getPersonalCalendar(test).getKalendar().getEvent(nextEventId); + Assert.assertNotNull(reloadedNextEvent); + Assert.assertEquals("Next Event", reloadedNextEvent.getSubject()); + Assert.assertEquals(nextStart, reloadedNextEvent.getBegin()); + Assert.assertEquals(nextEnd, reloadedNextEvent.getEnd()); + Assert.assertFalse(reloadedNextEvent.isToday()); + Assert.assertTrue(reloadedNextEvent.isWithinOneDay()); + Assert.assertFalse(reloadedNextEvent.isAllDayEvent()); + } + + @Test + public void testWithinOneDay() throws IOException { + Identity test = JunitTestHelper.createAndPersistIdentityAsRndUser("ical-4-"); + CalendarManager manager = CalendarManagerFactory.getInstance().getCalendarManager(); + Kalendar cal = manager.getPersonalCalendar(test).getKalendar(); + + // 1. Test Today Event + String eventId = "short-" + UUID.randomUUID(); + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.HOUR_OF_DAY, 14); + Date start = calendar.getTime(); + calendar.set(Calendar.HOUR_OF_DAY, 15); + Date end = calendar.getTime(); + KalendarEvent testEvent = new KalendarEvent(eventId, "Short Event", start, end); + manager.addEventTo(cal, testEvent); + + //Next days event + String nextEventId = "long-" + UUID.randomUUID(); + calendar = Calendar.getInstance(); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.add(Calendar.DATE, 3); + calendar.set(Calendar.HOUR, 8); + Date nextStart = calendar.getTime(); + + calendar = Calendar.getInstance(); + calendar.set(Calendar.MILLISECOND, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.add(Calendar.DATE, 6); + calendar.set(Calendar.HOUR_OF_DAY, 18); + Date nextEnd = calendar.getTime(); + KalendarEvent nextEvent = new KalendarEvent(nextEventId, "Long Event", nextStart, nextEnd); + manager.addEventTo(cal, nextEvent); + + + //2. reload and test + emptyCalendarCache(); + manager = CalendarManagerFactory.getInstance().getCalendarManager(); + KalendarEvent reloadedEvent = manager.getPersonalCalendar(test).getKalendar().getEvent(eventId); + Assert.assertNotNull(reloadedEvent); + Assert.assertEquals("Short Event", reloadedEvent.getSubject()); + Assert.assertEquals(start, reloadedEvent.getBegin()); + Assert.assertEquals(end, reloadedEvent.getEnd()); + Assert.assertTrue(reloadedEvent.isToday()); + Assert.assertTrue(reloadedEvent.isWithinOneDay()); + Assert.assertFalse(reloadedEvent.isAllDayEvent()); + + KalendarEvent reloadedNextEvent = manager.getPersonalCalendar(test).getKalendar().getEvent(nextEventId); + Assert.assertNotNull(reloadedNextEvent); + Assert.assertEquals("Long Event", reloadedNextEvent.getSubject()); + Assert.assertEquals(nextStart, reloadedNextEvent.getBegin()); + Assert.assertEquals(nextEnd, reloadedNextEvent.getEnd()); + Assert.assertFalse(reloadedNextEvent.isToday()); + Assert.assertFalse(reloadedNextEvent.isWithinOneDay()); + Assert.assertFalse(reloadedNextEvent.isAllDayEvent()); + } /** * Check a NPE @@ -179,23 +318,27 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { File newCalendarFile = new File(calendarFile.getParentFile(), calendarFile.getName()); InputStream in = CalendarImportTest.class.getResourceAsStream("cal_without_dtend.ics"); FileUtils.copyInputStreamToFile(in, newCalendarFile); - + //to be sure + emptyCalendarCache(); //load the calendar KalendarRenderWrapper reloadCalWrapper = calManager.getPersonalCalendar(identity); //check if its the right calendar Collection<KalendarEvent> events = reloadCalWrapper.getKalendar().getEvents(); Assert.assertNotNull(events); Assert.assertEquals(1, events.size()); - - //persist - calManager.persistCalendar(reloadCalWrapper.getKalendar()); - - //an other possible RS - Date periodStart = new Date(); - Date periodEnd = new Date(); - CalendarUtils.listEventsForPeriod(reloadCalWrapper.getKalendar(), periodStart, periodEnd); + KalendarEvent event = events.iterator().next(); + Assert.assertEquals("Arbeitszeit: 1-3h", event.getSubject()); + Assert.assertNull(event.getEnd()); + Assert.assertFalse(event.isToday()); + Assert.assertTrue(event.isWithinOneDay()); + Assert.assertFalse(event.isAllDayEvent()); + + //test persist + boolean allOk = calManager.persistCalendar(reloadCalWrapper.getKalendar()); + Assert.assertTrue(allOk); } + /** * Test concurrent add event with two threads and code-point to control concurrency. * @@ -218,7 +361,7 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { public void run() { try { // 1. load calendar - CalendarManager calManager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + CalendarManager calManager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar cal = calManager.getPersonalCalendar(test).getKalendar(); // 2. add Event1 => breakpoint hit @@ -252,7 +395,7 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { public void run() { try { // 1. load calendar - CalendarManager calManager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + CalendarManager calManager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar cal = calManager.getPersonalCalendar(test).getKalendar(); // 3. add Event2 (breakpoint of thread1 blocks) @@ -315,7 +458,7 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { final List<Boolean> statusList = Collections.synchronizedList(new ArrayList<Boolean>(1)); // Generate event for update - CalendarManager calManager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + CalendarManager calManager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar cal = calManager.getPersonalCalendar(test).getKalendar(); calManager.addEventTo(cal, new KalendarEvent(TEST_EVENT_ID_2,TEST_EVENT_SUBJECT_2, new Date(), 1)); cal = calManager.getPersonalCalendar(test).getKalendar(); @@ -331,7 +474,7 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { public void run() { try { // 1. load calendar - CalendarManager calendarManager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + CalendarManager calendarManager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar currentCalendar = calendarManager.getPersonalCalendar(test).getKalendar(); // 2. add Event1 => breakpoint hit @@ -364,7 +507,7 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { Thread thread2 = new Thread() { public void run() { try { - CalendarManager calendarManager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + CalendarManager calendarManager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar calendar = calendarManager.getPersonalCalendar(test).getKalendar(); // 3. add Event2 (breakpoint of thread1 blocks) @@ -430,7 +573,7 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { final List<Boolean> statusList = Collections.synchronizedList(new ArrayList<Boolean>(1)); // Generate event for update - CalendarManager calManager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + CalendarManager calManager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar cal = calManager.getPersonalCalendar(test).getKalendar(); calManager.addEventTo(cal, new KalendarEvent(TEST_EVENT_ID_2,TEST_EVENT_SUBJECT_2, new Date(), 1)); cal = calManager.getPersonalCalendar(test).getKalendar(); @@ -446,7 +589,7 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { public void run() { try { // 1. load calendar - CalendarManager calendarManager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + CalendarManager calendarManager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar calendar = calendarManager.getPersonalCalendar(test).getKalendar(); // 2. add Event1 => breakpoint hit @@ -479,7 +622,7 @@ public class ICalFileCalendarManagerTest extends OlatTestCase { Thread thread2 = new Thread() { public void run() { try { - CalendarManager calendarManager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + CalendarManager calendarManager = CalendarManagerFactory.getInstance().getCalendarManager(); Kalendar calendar = calendarManager.getPersonalCalendar(test).getKalendar(); // 3. add Event2 (breakpoint of thread1 blocks) diff --git a/src/test/java/org/olat/commons/calendar/test/CalendarUtilsTest.java b/src/test/java/org/olat/commons/calendar/test/CalendarUtilsTest.java index f1885f80f2886a33728566a591f173ed8a808394..bef74d4512ef201ca67d688738a04e1bf65c1057 100644 --- a/src/test/java/org/olat/commons/calendar/test/CalendarUtilsTest.java +++ b/src/test/java/org/olat/commons/calendar/test/CalendarUtilsTest.java @@ -28,77 +28,81 @@ package org.olat.commons.calendar.test; import static org.junit.Assert.assertEquals; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Calendar; +import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Random; -import org.junit.After; -import org.junit.Before; +import org.apache.commons.io.FileUtils; +import org.infinispan.manager.EmbeddedCacheManager; +import org.junit.Assert; import org.junit.Test; +import org.olat.commons.calendar.CalendarImportTest; import org.olat.commons.calendar.CalendarManager; import org.olat.commons.calendar.CalendarManagerFactory; import org.olat.commons.calendar.CalendarUtils; import org.olat.commons.calendar.ICalFileCalendarManager; import org.olat.commons.calendar.model.Kalendar; import org.olat.commons.calendar.model.KalendarEvent; +import org.olat.commons.calendar.ui.components.KalendarRenderWrapper; +import org.olat.core.CoreSpringFactory; import org.olat.core.id.Identity; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.coordinate.Cacher; +import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; public class CalendarUtilsTest extends OlatTestCase { + + private static final OLog log = Tracing.createLoggerFor(CalendarUtilsTest.class); - private static final Runtime RUNTIME = Runtime.getRuntime (); - private Kalendar kalendar; private static final int numEvents = 10000; private static final int maxEventDuratio = 1000 * 60 * 60 * 24 * 14; // maximum of 14 days duration private static final int oneYearSec = 60 * 60 * 24 * 365; private static final int goBackNumYears = 1; private static long kalendarStart = new Date().getTime() - (((long)goBackNumYears * oneYearSec) * 1000); - private static Identity test; - - @Before - public void setUp() throws Exception { - test = JunitTestHelper.createAndPersistIdentityAsUser("test"); - kalendar = new Kalendar("test", CalendarManager.TYPE_USER); - } - @After - public void tearDown() throws Exception { - CalendarManagerFactory.getJUnitInstance().getCalendarManager().deletePersonalCalendar(test); - } + @Test public void testListEventsForPeriod() { - System.out.println("*** Starting test with the following configuration:"); - System.out.println("*** Number of events: " + numEvents); - System.out.println("*** Maximum event duration (ms): " + maxEventDuratio); - System.out.println("*** Generate events in between " + Identity test = JunitTestHelper.createAndPersistIdentityAsUser("test"); + Kalendar kalendar = new Kalendar("test", CalendarManager.TYPE_USER); + + log.info("*** Starting test with the following configuration:"); + log.info("*** Number of events: " + numEvents); + log.info("*** Maximum event duration (ms): " + maxEventDuratio); + log.info("*** Generate events in between " + new Date(kalendarStart) + " and " + new Date(kalendarStart + (1000 * ((long)goBackNumYears * oneYearSec)))); createTestEvents(numEvents, kalendar); - System.out.println("*** Load calendar..."); - CalendarManager manager = CalendarManagerFactory.getJUnitInstance().getCalendarManager(); + log.info("*** Load calendar..."); + CalendarManager manager = CalendarManagerFactory.getInstance().getCalendarManager(); long start = System.currentTimeMillis(); manager.getPersonalCalendar(test).getKalendar(); long stop = System.currentTimeMillis(); - System.out.println("Duration load: " + (stop - start) + " ms."); + log.info("Duration load: " + (stop - start) + " ms."); - System.out.println("*** Find events within period..."); + log.info("*** Find events within period..."); start = System.currentTimeMillis(); List<KalendarEvent> events = CalendarUtils.listEventsForPeriod(kalendar, new Date(kalendarStart), new Date(kalendarStart + (1000 * ((long)(goBackNumYears * oneYearSec))) )); stop = System.currentTimeMillis(); - System.out.println("Duration find: " + (stop - start) + " ms."); - System.out.println("Found " + events.size() + " events out of " + kalendar.getEvents().size() + " total events."); + log.info("Duration find: " + (stop - start) + " ms."); + log.info("Found " + events.size() + " events out of " + kalendar.getEvents().size() + " total events."); assertEquals(kalendar.getEvents().size(), events.size()); - System.out.println("*** Save calendar..."); + log.info("*** Save calendar..."); start = System.currentTimeMillis(); ((ICalFileCalendarManager)manager).persistCalendar(kalendar); stop = System.currentTimeMillis(); - System.out.println("Duration save: " + (stop - start) + " ms."); - + log.info("Duration save: " + (stop - start) + " ms."); } - /** * Creates a number of events in certain calendar. @@ -107,16 +111,91 @@ public class CalendarUtilsTest extends OlatTestCase { */ private void createTestEvents(int numberOfEvents, Kalendar cal) { Random rand = new Random(); - long startUsed = RUNTIME.totalMemory() - RUNTIME.freeMemory(); + long startUsed = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); for (int i = 0; i < numberOfEvents; i++) { long begin = kalendarStart + (1000 * ((long)rand.nextInt(goBackNumYears * oneYearSec))); KalendarEvent event = new KalendarEvent("id" + i, "test" + i, new Date(begin), rand.nextInt(maxEventDuratio)); cal.addEvent(event); } - long stopUsed = RUNTIME.totalMemory() - RUNTIME.freeMemory(); - System.out.println("*** SETUP: Kalendar structure uses approx. " + (stopUsed - startUsed) / 1024 + " kb memory."); - ((ICalFileCalendarManager)CalendarManagerFactory.getJUnitInstance().getCalendarManager()).persistCalendar(kalendar); + long stopUsed = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); + log.info("*** SETUP: Kalendar structure uses approx. " + (stopUsed - startUsed) / 1024 + " kb memory."); + ((ICalFileCalendarManager)CalendarManagerFactory.getInstance().getCalendarManager()).persistCalendar(cal); } + /** + * Check a NPE + * @throws IOException + */ + @Test + public void testListEventsForPeriodWithoutDTEndEvent() throws IOException { + //replace the standard calendar with a forged one + Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("cal-test-1-"); + CalendarManager calManager = CalendarManagerFactory.getInstance().getCalendarManager(); + File calendarFile = calManager.getCalendarFile("user", identity.getName()); + if(calendarFile.exists()) { + calendarFile.delete(); + } + File newCalendarFile = new File(calendarFile.getParentFile(), calendarFile.getName()); + InputStream in = CalendarImportTest.class.getResourceAsStream("cal_without_dtend.ics"); + FileUtils.copyInputStreamToFile(in, newCalendarFile); + //to be sure + emptyCalendarCache(); + //load the calendar + KalendarRenderWrapper reloadCalWrapper = calManager.getPersonalCalendar(identity); + //check if its the right calendar + Collection<KalendarEvent> events = reloadCalWrapper.getKalendar().getEvents(); + Assert.assertNotNull(events); + Assert.assertEquals(1, events.size()); + KalendarEvent event = events.iterator().next(); + Assert.assertEquals("Arbeitszeit: 1-3h", event.getSubject()); + Assert.assertEquals("e73iiu9masoddi4g0vllmi2ht0@google.com", event.getID()); + Assert.assertNull(event.getEnd()); + + + //test persist + boolean allOk = calManager.persistCalendar(reloadCalWrapper.getKalendar()); + Assert.assertTrue(allOk); + + //an other possible RS + //within period + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.YEAR, 2010); + cal.set(Calendar.MONTH, 3); + cal.set(Calendar.DATE, 15); + Date periodStart = cal.getTime(); + + cal = Calendar.getInstance(); + cal.set(Calendar.YEAR, 2010); + cal.set(Calendar.MONTH, 3); + cal.set(Calendar.DATE, 17); + Date periodEnd = cal.getTime(); + List<KalendarEvent> eventsForPeriod = CalendarUtils.listEventsForPeriod(reloadCalWrapper.getKalendar(), periodStart, periodEnd); + Assert.assertNotNull(eventsForPeriod); + Assert.assertEquals(1, eventsForPeriod.size()); + KalendarEvent eventForPeriod = events.iterator().next(); + Assert.assertEquals("e73iiu9masoddi4g0vllmi2ht0@google.com", eventForPeriod.getID()); + + //out of scope + cal = Calendar.getInstance(); + cal.set(Calendar.YEAR, 2008); + cal.set(Calendar.MONTH, 3); + cal.set(Calendar.DATE, 15); + Date periodStart2 = cal.getTime(); + + cal = Calendar.getInstance(); + cal.set(Calendar.YEAR, 2008); + cal.set(Calendar.MONTH, 3); + cal.set(Calendar.DATE, 17); + Date periodEnd2 = cal.getTime(); + List<KalendarEvent> eventsOutOfPeriod = CalendarUtils.listEventsForPeriod(reloadCalWrapper.getKalendar(), periodStart2, periodEnd2); + Assert.assertNotNull(eventsOutOfPeriod); + Assert.assertTrue(eventsOutOfPeriod.isEmpty()); + } + private final void emptyCalendarCache() { + CoordinatorManager coordinator = CoreSpringFactory.getImpl(CoordinatorManager.class); + Cacher cacher = coordinator.getCoordinator().getCacher(); + EmbeddedCacheManager cm = cacher.getCacheContainer(); + cm.getCache("CalendarManager@calendar").clear(); + } } diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java index 4de668b9a2a1b49c6f8647e38d8792becfc4868b..9a56fed1913fbbc1035ebda8414a67f61a0fd3de 100644 --- a/src/test/java/org/olat/test/AllTestsJunit4.java +++ b/src/test/java/org/olat/test/AllTestsJunit4.java @@ -73,8 +73,9 @@ import org.junit.runners.Suite; org.olat.user.EmailCheckPerformanceTest.class,//fail org.olat.user.UserTest.class,//ok org.olat.user.UserPropertiesTest.class,//ok - org.olat.commons.calendar.test.CalendarUtilsTest.class,//ok org.olat.commons.calendar.ICalFileCalendarManagerTest.class,//ok + org.olat.commons.calendar.CalendarImportTest.class,//ok + org.olat.commons.calendar.test.CalendarUtilsTest.class,//ok org.olat.commons.lifecycle.LifeCycleManagerTest.class,//fail christian fragen... org.olat.commons.coordinate.cluster.jms.JMSTest.class,//ok org.olat.commons.coordinate.cluster.lock.LockTest.class,//ok diff --git a/src/test/profile/mysql/olat.eclipse.properties b/src/test/profile/mysql/olat.eclipse.properties index 685d36a5bc0aa315a6d8dbb59f39f72ebc1ee00b..7141dd0ef02e99751129f0abab69d134a4a5ae07 100644 --- a/src/test/profile/mysql/olat.eclipse.properties +++ b/src/test/profile/mysql/olat.eclipse.properties @@ -43,7 +43,7 @@ db.name=olattest db.user=olat db.pass=olat db.host.port=3306 -db.show_sql=true +db.show_sql=false db.database.dialect=org.hibernate.dialect.MySQL5InnoDBDialect auto.upgrade.database=false db.hibernate.c3p0.debugUnreturnedConnectionStackTraces=true