/**
     * testAddAlarm
     * 
     * @see 0008230: added alarm to event on iOS 6.1 -> description removed
     */
    public function testAddAlarm()
    {
        $syncrotonFolder = $this->testCreateFolder();
        $event = ActiveSync_TestCase::getTestEvent();
        $event->summary = 'testtermin';
        $event->description = 'some text';
        $event->dtstart = new Tinebase_DateTime('2013-10-22 16:00:00');
        $event->dtend = new Tinebase_DateTime('2013-10-22 17:00:00');
        $event = Calendar_Controller_Event::getInstance()->create($event);
        $xml = new SimpleXMLElement('
          <ApplicationData>
            <Timezone xmlns="uri:Calendar">xP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAFAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAFAAMAAAAAAAAAxP///w==</Timezone>
            <AllDayEvent xmlns="uri:Calendar">0</AllDayEvent>
            <BusyStatus xmlns="uri:Calendar">2</BusyStatus>
            <DtStamp xmlns="uri:Calendar">20131021T142015Z</DtStamp>
            <EndTime xmlns="uri:Calendar">20131022T170000Z</EndTime>
            <Reminder xmlns="uri:Calendar">60</Reminder>
            <Sensitivity xmlns="uri:Calendar">0</Sensitivity>
            <Subject xmlns="uri:Calendar">testtermin</Subject>
            <StartTime xmlns="uri:Calendar">20131022T160000Z</StartTime>
            <UID xmlns="uri:Calendar">' . $event->uid . '</UID>
            <MeetingStatus xmlns="uri:Calendar">1</MeetingStatus>
            <Attendees xmlns="uri:Calendar">
              <Attendee>
                <Name>' . Tinebase_Core::getUser()->accountDisplayName . '</Name>
                <Email>' . Tinebase_Core::getUser()->accountEmailAddress . '</Email>
                <AttendeeType>1</AttendeeType>
              </Attendee>
            </Attendees>
          </ApplicationData>
        ');
        $syncrotonEvent = new Syncroton_Model_Event($xml);
        $controller = Syncroton_Data_Factory::factory($this->_class, $this->_getDevice(Syncroton_Model_Device::TYPE_IPHONE), $event->creation_time);
        $serverId = $controller->updateEntry($syncrotonFolder->serverId, $event->getId(), $syncrotonEvent);
        $updatedEvent = Calendar_Controller_Event::getInstance()->get($serverId);
        $this->assertEquals(1, count($updatedEvent->alarms));
        $this->assertEquals($event->description, $updatedEvent->description, 'description mismatch: ' . print_r($updatedEvent->toArray(), true));
    }
 /**
  * test sync of existing events folder
  */
 public function testPingForEvents()
 {
     $personalContainer = Tinebase_Container::getInstance()->getPersonalContainer(Tinebase_Core::getUser(), 'Calendar', Tinebase_Core::getUser(), Tinebase_Model_Grants::GRANT_EDIT)->getFirstRecord();
     // first do a foldersync
     $doc = new DOMDocument();
     $doc->loadXML('<?xml version="1.0" encoding="utf-8"?>
         <!DOCTYPE AirSync PUBLIC "-//AIRSYNC//DTD AirSync//EN" "http://www.microsoft.com/">
         <FolderSync xmlns="uri:FolderHierarchy"><SyncKey>0</SyncKey></FolderSync>');
     $folderSync = new Syncroton_Command_FolderSync($doc, $this->_device, $this->_device->policykey);
     $folderSync->handle();
     $folderSync->getResponse();
     // request initial synckey
     $doc = new DOMDocument();
     $doc->loadXML('<?xml version="1.0" encoding="utf-8"?>
         <!DOCTYPE AirSync PUBLIC "-//AIRSYNC//DTD AirSync//EN" "http://www.microsoft.com/">
         <Sync xmlns="uri:AirSync" xmlns:AirSyncBase="uri:AirSyncBase"><Collections><Collection><Class>Calendar</Class><SyncKey>0</SyncKey><CollectionId>' . $personalContainer->getId() . '</CollectionId><DeletesAsMoves/><GetChanges/><WindowSize>100</WindowSize><Options><FilterType>4</FilterType><AirSyncBase:BodyPreference><AirSyncBase:Type>1</AirSyncBase:Type><AirSyncBase:TruncationSize>5120</AirSyncBase:TruncationSize></AirSyncBase:BodyPreference><Conflict>1</Conflict></Options></Collection></Collections></Sync>');
     $sync = new Syncroton_Command_Sync($doc, $this->_device, $this->_device->policykey);
     $sync->handle();
     $syncDoc = $sync->getResponse();
     #$syncDoc->formatOutput = true; echo $syncDoc->saveXML();
     // now do the first sync
     $doc = new DOMDocument();
     $doc->loadXML('<?xml version="1.0" encoding="utf-8"?>
         <!DOCTYPE AirSync PUBLIC "-//AIRSYNC//DTD AirSync//EN" "http://www.microsoft.com/">
         <Sync xmlns="uri:AirSync" xmlns:AirSyncBase="uri:AirSyncBase"><Collections><Collection><Class>Calendar</Class><SyncKey>1</SyncKey><CollectionId>' . $personalContainer->getId() . '</CollectionId><DeletesAsMoves/><GetChanges/><WindowSize>100</WindowSize><Options><FilterType>4</FilterType><AirSyncBase:BodyPreference><AirSyncBase:Type>1</AirSyncBase:Type><AirSyncBase:TruncationSize>5120</AirSyncBase:TruncationSize></AirSyncBase:BodyPreference><Conflict>1</Conflict></Options></Collection></Collections></Sync>');
     $sync = new Syncroton_Command_Sync($doc, $this->_device, $this->_device->policykey);
     $sync->handle();
     $syncDoc = $sync->getResponse();
     #$syncDoc->formatOutput = true; echo $syncDoc->saveXML();
     sleep(1);
     // add a test event
     $event = ActiveSync_TestCase::getTestEvent($personalContainer);
     $event = Calendar_Controller_Event::getInstance()->create($event);
     // and now we can start the ping request
     $doc = new DOMDocument();
     $doc->loadXML('<?xml version="1.0" encoding="utf-8"?>
         <!DOCTYPE AirSync PUBLIC "-//AIRSYNC//DTD AirSync//EN" "http://www.microsoft.com/">
         <Ping xmlns="uri:Ping"><HeartBeatInterval>10</HeartBeatInterval><Folders><Folder><Id>' . $personalContainer->getId() . '</Id><Class>Calendar</Class></Folder></Folders></Ping>');
     $ping = new Syncroton_Command_Ping($doc, $this->_device, null);
     $ping->handle();
     $responseDoc = $ping->getResponse();
     #$responseDoc->formatOutput = true; echo $responseDoc->saveXML();
     $xpath = new DomXPath($responseDoc);
     $xpath->registerNamespace('Ping', 'uri:Ping');
     $nodes = $xpath->query('//Ping:Ping/Ping:Status');
     $this->assertEquals(1, $nodes->length, $responseDoc->saveXML());
     $this->assertEquals(Syncroton_Command_Ping::STATUS_CHANGES_FOUND, $nodes->item(0)->nodeValue, $responseDoc->saveXML());
     $nodes = $xpath->query('//Ping:Ping/Ping:Folders/Ping:Folder');
     $this->assertEquals(1, $nodes->length, $responseDoc->saveXML());
     $this->assertEquals($personalContainer->getId(), $nodes->item(0)->nodeValue, $responseDoc->saveXML());
 }