Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F1820497
InfiniteLoopProblemTest.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Size
2 KB
Subscribers
None
InfiniteLoopProblemTest.php
View Options
<?php
namespace
Sabre\VObject\Recur\EventIterator
;
use
DateTime
,
DateTimeZone
,
Sabre\VObject\Component\VCalendar
,
Sabre\VObject\Recur
;
class
EventIteratorInfiniteLoopProblemTest
extends
\PHPUnit_Framework_TestCase
{
public
function
setUp
()
{
$this
->
vcal
=
new
VCalendar
();
}
/**
* This bug came from a Fruux customer. This would result in a never-ending
* request.
*/
function
testFastForwardTooFar
()
{
$ev
=
$this
->
vcal
->
createComponent
(
'VEVENT'
);
$ev
->
UID
=
'foobar'
;
$ev
->
DTSTART
=
'20090420T180000Z'
;
$ev
->
RRULE
=
'FREQ=WEEKLY;BYDAY=MO;UNTIL=20090704T205959Z;INTERVAL=1'
;
$this
->
assertFalse
(
$ev
->
isInTimeRange
(
new
DateTime
(
'2012-01-01 12:00:00'
),
new
DateTime
(
'3000-01-01 00:00:00'
)));
}
/**
* Different bug, also likely an infinite loop.
*/
function
testYearlyByMonthLoop
()
{
$ev
=
$this
->
vcal
->
createComponent
(
'VEVENT'
);
$ev
->
UID
=
'uuid'
;
$ev
->
DTSTART
=
'20120101T154500'
;
$ev
->
DTSTART
[
'TZID'
]
=
'Europe/Berlin'
;
$ev
->
RRULE
=
'FREQ=YEARLY;INTERVAL=1;UNTIL=20120203T225959Z;BYMONTH=2;BYSETPOS=1;BYDAY=SU,MO,TU,WE,TH,FR,SA'
;
$ev
->
DTEND
=
'20120101T164500'
;
$ev
->
DTEND
[
'TZID'
]
=
'Europe/Berlin'
;
// This recurrence rule by itself is a yearly rule that should happen
// every february.
//
// The BYDAY part expands this to every day of the month, but the
// BYSETPOS limits this to only the 1st day of the month. Very crazy
// way to specify this, and could have certainly been a lot easier.
$this
->
vcal
->
add
(
$ev
);
$it
=
new
Recur\EventIterator
(
$this
->
vcal
,
'uuid'
);
$it
->
fastForward
(
new
DateTime
(
'2012-01-29 23:00:00'
,
new
DateTimeZone
(
'UTC'
)));
$collect
=
array
();
while
(
$it
->
valid
())
{
$collect
[]
=
$it
->
getDTSTART
();
if
(
$it
->
getDTSTART
()
>
new
DateTime
(
'2013-02-05 22:59:59'
,
new
DateTimeZone
(
'UTC'
)))
{
break
;
}
$it
->
next
();
}
$this
->
assertEquals
(
array
(
new
DateTime
(
'2012-02-01 15:45:00'
,
new
DateTimeZone
(
'Europe/Berlin'
))),
$collect
);
}
/**
* Something, somewhere produced an ics with an interval set to 0. Because
* this means we increase the current day (or week, month) by 0, this also
* results in an infinite loop.
*
* @expectedException InvalidArgumentException
* @return void
*/
function
testZeroInterval
()
{
$ev
=
$this
->
vcal
->
createComponent
(
'VEVENT'
);
$ev
->
UID
=
'uuid'
;
$ev
->
DTSTART
=
'20120824T145700Z'
;
$ev
->
RRULE
=
'FREQ=YEARLY;INTERVAL=0'
;
$this
->
vcal
->
add
(
$ev
);
$it
=
new
Recur\EventIterator
(
$this
->
vcal
,
'uuid'
);
$it
->
fastForward
(
new
DateTime
(
'2013-01-01 23:00:00'
,
new
DateTimeZone
(
'UTC'
)));
// if we got this far.. it means we are no longer infinitely looping
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sun, Dec 22, 4:16 AM (5 d, 7 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
916952
Default Alt Text
InfiniteLoopProblemTest.php (2 KB)
Attached To
rDAVCAL DokuWiki DAVCal PlugIn
Event Timeline
Log In to Comment