Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 48211079 authored by Ricki Hirner's avatar Ricki Hirner
Browse files

Refactoring

* WebDavResource: properties in separate subclass
* improve time zone handling
* always provide task list color
parent fa95bdc6
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -10,13 +10,9 @@ package at.bitfire.davdroid;

import junit.framework.TestCase;

import net.fortuna.ical4j.model.Date;
import net.fortuna.ical4j.model.DateList;
import net.fortuna.ical4j.model.TimeZone;
import net.fortuna.ical4j.model.TimeZoneRegistry;
import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
import net.fortuna.ical4j.model.parameter.Value;
import net.fortuna.ical4j.model.property.DateListProperty;
import net.fortuna.ical4j.model.property.ExDate;
import net.fortuna.ical4j.model.property.RDate;

+1 −1
Original line number Diff line number Diff line
@@ -36,7 +36,7 @@ public class ContactTest extends InstrumentationTestCase {
		Contact c = new Contact("test.vcf", null);

		// should generate VCard 3.0 by default
		assertEquals("text/vcard", c.getMimeType());
		assertEquals("text/vcard;charset=UTF-8", c.getMimeType());
		assertTrue(new String(c.toEntity().toByteArray()).contains("VERSION:3.0"));

		// now let's generate VCard 4.0
+31 −53
Original line number Diff line number Diff line
@@ -9,16 +9,23 @@ package at.bitfire.davdroid.resource;

import android.content.res.AssetManager;
import android.test.InstrumentationTestCase;
import android.text.format.Time;

import net.fortuna.ical4j.data.ParserException;
import net.fortuna.ical4j.model.Date;
import net.fortuna.ical4j.model.DateTime;
import net.fortuna.ical4j.model.TimeZone;
import net.fortuna.ical4j.model.property.DtStart;
import net.fortuna.ical4j.util.TimeZones;

import java.io.IOException;
import java.io.InputStream;

import at.bitfire.davdroid.DateUtils;
import lombok.Cleanup;

public class EventTest extends InstrumentationTestCase {
	protected final TimeZone tzVienna = DateUtils.tzRegistry.getTimeZone("Europe/Vienna");

	AssetManager assetMgr;
	
	Event eOnThatDay, eAllDay1Day, eAllDay10Days, eAllDay0Sec;
@@ -33,6 +40,21 @@ public class EventTest extends InstrumentationTestCase {
	}


	public void testGetTzID() throws Exception {
		// DATE (without time)
		assertEquals(TimeZones.UTC_ID, Event.getTzId(new DtStart(new Date("20150101"))));

		// DATE-TIME without time zone (floating time): should be UTC (because net.fortuna.ical4j.timezone.date.floating=false)
		assertEquals(TimeZones.UTC_ID, Event.getTzId(new DtStart(new DateTime("20150101T000000"))));

		// DATE-TIME without time zone (UTC)
		assertEquals(TimeZones.UTC_ID, Event.getTzId(new DtStart(new DateTime(1438607288000L))));

		// DATE-TIME with time zone
		assertEquals(tzVienna.getID(), Event.getTzId(new DtStart(new DateTime("20150101T000000", tzVienna))));
	}


	public void testRecurringWithException() throws Exception {
		Event event = parseCalendar("recurring-with-exception1.ics");
		assertTrue(event.isAllDay());
@@ -55,73 +77,29 @@ public class EventTest extends InstrumentationTestCase {
	public void testStartEndTimesAllDay() throws IOException, ParserException {
		// event with start date only
		assertEquals(868838400000L, eOnThatDay.getDtStartInMillis());
		assertEquals(Time.TIMEZONE_UTC, eOnThatDay.getDtStartTzID());
		assertEquals(TimeZones.UTC_ID, eOnThatDay.getDtStartTzID());
		// DTEND missing in VEVENT, must have been set to DTSTART+1 day
		assertEquals(868838400000L + 86400000, eOnThatDay.getDtEndInMillis());
		assertEquals(Time.TIMEZONE_UTC, eOnThatDay.getDtEndTzID());
		assertEquals(TimeZones.UTC_ID, eOnThatDay.getDtEndTzID());
		
		// event with start+end date for all-day event (one day)
		assertEquals(868838400000L, eAllDay1Day.getDtStartInMillis());
		assertEquals(Time.TIMEZONE_UTC, eAllDay1Day.getDtStartTzID());
		assertEquals(TimeZones.UTC_ID, eAllDay1Day.getDtStartTzID());
		assertEquals(868838400000L + 86400000, eAllDay1Day.getDtEndInMillis());
		assertEquals(Time.TIMEZONE_UTC, eAllDay1Day.getDtEndTzID());
		assertEquals(TimeZones.UTC_ID, eAllDay1Day.getDtEndTzID());
		
		// event with start+end date for all-day event (ten days)
		assertEquals(868838400000L, eAllDay10Days.getDtStartInMillis());
		assertEquals(Time.TIMEZONE_UTC, eAllDay10Days.getDtStartTzID());
		assertEquals(TimeZones.UTC_ID, eAllDay10Days.getDtStartTzID());
		assertEquals(868838400000L + 10*86400000, eAllDay10Days.getDtEndInMillis());
		assertEquals(Time.TIMEZONE_UTC, eAllDay10Days.getDtEndTzID());
		assertEquals(TimeZones.UTC_ID, eAllDay10Days.getDtEndTzID());
		
		// event with start+end date on some day (invalid 0 sec-event)
		assertEquals(868838400000L, eAllDay0Sec.getDtStartInMillis());
		assertEquals(Time.TIMEZONE_UTC, eAllDay0Sec.getDtStartTzID());
		assertEquals(TimeZones.UTC_ID, eAllDay0Sec.getDtStartTzID());
		// DTEND invalid in VEVENT, must have been set to DTSTART+1 day
		assertEquals(868838400000L + 86400000, eAllDay0Sec.getDtEndInMillis());
		assertEquals(Time.TIMEZONE_UTC, eAllDay0Sec.getDtEndTzID());
	}
	
	public void testTimezoneDefToTzId() {
		// test valid definition
		final String VTIMEZONE_SAMPLE =		// taken from RFC 4791, 5.2.2. CALDAV:calendar-timezone Property 
				"BEGIN:VCALENDAR\n" + 
				"PRODID:-//Example Corp.//CalDAV Client//EN\n" + 
				"VERSION:2.0\n" + 
				"BEGIN:VTIMEZONE\n" + 
				"TZID:US-Eastern\n" + 
				"LAST-MODIFIED:19870101T000000Z\n" + 
				"BEGIN:STANDARD\n" + 
				"DTSTART:19671029T020000\n" + 
				"RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\n" + 
				"TZOFFSETFROM:-0400\n" + 
				"TZOFFSETTO:-0500\n" + 
				"TZNAME:Eastern Standard Time (US & Canada)\n" + 
				"END:STANDARD\n" + 
				"BEGIN:DAYLIGHT\n" + 
				"DTSTART:19870405T020000\n" + 
				"RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4\n" + 
				"TZOFFSETFROM:-0500\n" + 
				"TZOFFSETTO:-0400\n" + 
				"TZNAME:Eastern Daylight Time (US & Canada)\n" + 
				"END:DAYLIGHT\n" + 
				"END:VTIMEZONE\n" + 
				"END:VCALENDAR";
		assertEquals("US-Eastern", Event.TimezoneDefToTzId(VTIMEZONE_SAMPLE));

		// test null value
		try {
			Event.TimezoneDefToTzId(null);
			fail();
		} catch(IllegalArgumentException e) {
			assert(true);
		}
		
		// test invalid time zone
		try {
			Event.TimezoneDefToTzId("/* invalid content */");
			fail();
		} catch(IllegalArgumentException e) {
			assert(true);
		}
		assertEquals(TimeZones.UTC_ID, eAllDay0Sec.getDtEndTzID());
	}
	
	public void testUnfolding() throws IOException, InvalidResourceException {
+0 −11
Original line number Diff line number Diff line
@@ -25,25 +25,14 @@ import android.test.InstrumentationTestCase;
import android.util.Log;

import net.fortuna.ical4j.model.Date;
import net.fortuna.ical4j.model.DateList;
import net.fortuna.ical4j.model.Dur;
import net.fortuna.ical4j.model.TimeZone;
import net.fortuna.ical4j.model.TimeZoneRegistry;
import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
import net.fortuna.ical4j.model.ValidationException;
import net.fortuna.ical4j.model.component.VAlarm;
import net.fortuna.ical4j.model.parameter.Value;
import net.fortuna.ical4j.model.property.DateListProperty;
import net.fortuna.ical4j.model.property.DtEnd;
import net.fortuna.ical4j.model.property.DtStart;
import net.fortuna.ical4j.model.property.ExDate;
import net.fortuna.ical4j.model.property.RDate;
import net.fortuna.ical4j.util.Dates;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import at.bitfire.davdroid.DateUtils;
import lombok.Cleanup;
+95 −0
Original line number Diff line number Diff line
/*
 * Copyright © 2013 – 2015 Ricki Hirner (bitfire web engineering).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 */

package at.bitfire.davdroid.resource;

import junit.framework.TestCase;

import net.fortuna.ical4j.data.CalendarBuilder;
import net.fortuna.ical4j.model.Date;
import net.fortuna.ical4j.model.TimeZone;
import net.fortuna.ical4j.model.component.VTimeZone;
import net.fortuna.ical4j.model.property.DtStart;

import java.io.StringReader;

import at.bitfire.davdroid.DateUtils;

public class iCalendarTest extends TestCase {
	protected final TimeZone tzVienna = DateUtils.tzRegistry.getTimeZone("Europe/Vienna");

	public void testTimezoneDefToTzId() {
		// test valid definition
		assertEquals("US-Eastern", Event.TimezoneDefToTzId("BEGIN:VCALENDAR\n" +
				"PRODID:-//Example Corp.//CalDAV Client//EN\n" +
				"VERSION:2.0\n" +
				"BEGIN:VTIMEZONE\n" +
				"TZID:US-Eastern\n" +
				"LAST-MODIFIED:19870101T000000Z\n" +
				"BEGIN:STANDARD\n" +
				"DTSTART:19671029T020000\n" +
				"RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10\n" +
				"TZOFFSETFROM:-0400\n" +
				"TZOFFSETTO:-0500\n" +
				"TZNAME:Eastern Standard Time (US & Canada)\n" +
				"END:STANDARD\n" +
				"BEGIN:DAYLIGHT\n" +
				"DTSTART:19870405T020000\n" +
				"RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4\n" +
				"TZOFFSETFROM:-0500\n" +
				"TZOFFSETTO:-0400\n" +
				"TZNAME:Eastern Daylight Time (US & Canada)\n" +
				"END:DAYLIGHT\n" +
				"END:VTIMEZONE\n" +
				"END:VCALENDAR"));

		// test invalid time zone
		assertNull(iCalendar.TimezoneDefToTzId("/* invalid content */"));

		// test time zone without TZID
		assertNull(iCalendar.TimezoneDefToTzId("BEGIN:VCALENDAR\n" +
				"PRODID:-//Inverse inc./SOGo 2.2.10//EN\n" +
				"VERSION:2.0\n" +
				"END:VCALENDAR"));
	}

	public void testValidateTimeZone() throws Exception {
		assertNotNull(tzVienna);

		// date (no time zone) should be ignored
		DtStart date = new DtStart(new Date("20150101"));
		iCalendar.validateTimeZone(date);
		assertNull(date.getTimeZone());

		// date-time (Europe/Vienna) should be unchanged
		DtStart dtStart = new DtStart("20150101", tzVienna);
		iCalendar.validateTimeZone(dtStart);
		assertEquals(tzVienna, dtStart.getTimeZone());

		// time zone that is not available on Android systems should be changed to system default
		CalendarBuilder builder = new CalendarBuilder();
		net.fortuna.ical4j.model.Calendar cal = builder.build(new StringReader("BEGIN:VCALENDAR\n" +
				"BEGIN:VTIMEZONE\n" +
				"TZID:CustomTime\n" +
				"BEGIN:STANDARD\n" +
				"TZOFFSETFROM:-0400\n" +
				"TZOFFSETTO:-0500\n" +
				"DTSTART:19600101T000000\n" +
				"END:STANDARD\n" +
				"END:VTIMEZONE\n" +
				"END:VCALENDAR"));
		final TimeZone tzCustom = new TimeZone((VTimeZone)cal.getComponent(VTimeZone.VTIMEZONE));
		dtStart = new DtStart("20150101T000000", tzCustom);
		iCalendar.validateTimeZone(dtStart);

		final TimeZone tzDefault = DateUtils.tzRegistry.getTimeZone(java.util.TimeZone.getDefault().getID());
		assertNotNull(tzDefault);
		assertEquals(tzDefault.getID(), dtStart.getTimeZone().getID());
	}

}
Loading