def test_calendarObjectRevisions_Modified(self): """ Verify that a calendar object created before the revision cut-off, but modified after it is correctly reported as changed after revision clean-up """ # Need to add one non-event change that creates a revision after the last event change revisions in order # for the logic in this test to work correctly home = yield self.homeUnderTest(name="user01") yield home.createCalendarWithName("_ignore_me") yield self.commit() # get initial sync token calendar = yield self.calendarUnderTest(home="user01", name="calendar") initial_token = yield calendar.syncToken() yield self.commit() # Pause to give some space in the modified time time.sleep(1) modified = datetime.datetime.utcnow() time.sleep(1) # Patch the work item to use the modified cut-off we need def _dateCutoff(self): return modified self.patch(FindMinValidRevisionWork, "dateCutoff", _dateCutoff) # Make a change to get a pre-update token cal2Object = yield self.calendarObjectUnderTest( self.transactionUnderTest(), name="cal2.ics", calendar_name="calendar", home="user01") yield cal2Object.remove() yield self.commit() # get changed sync token calendar = yield self.calendarUnderTest(home="user01", name="calendar") pre_update_token = yield calendar.syncToken() yield self.commit() # make changes cal1Object = yield self.calendarObjectUnderTest( self.transactionUnderTest(), name="cal1.ics", calendar_name="calendar", home="user01") yield cal1Object.setComponent(Component.fromString(self.cal1_mod)) yield self.commit() # get changed sync token calendar = yield self.calendarUnderTest(home="user01", name="calendar") update_token = yield calendar.syncToken() yield self.commit() # do FindMinValidRevisionWork and RevisionCleanupWork yield FindMinValidRevisionWork.reschedule(self.transactionUnderTest(), 0) yield self.commit() yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60) # initial sync token fails calendar = yield self.calendarUnderTest(home="user01", name="calendar") yield self.failUnlessFailure( calendar.resourceNamesSinceToken(initial_token), SyncTokenValidException) yield self.commit() # Pre-update sync token returns one item calendar = yield self.calendarUnderTest(home="user01", name="calendar") names = yield calendar.resourceNamesSinceToken(pre_update_token) self.assertEqual(names, (['cal1.ics'], [], [])) yield self.commit() # Post-update sync token returns one item calendar = yield self.calendarUnderTest(home="user01", name="calendar") names = yield calendar.resourceNamesSinceToken(update_token) self.assertEqual(names, ([], [], [])) yield self.commit()
def test_calendarObjectRevisions_Modified(self): """ Verify that a calendar object created before the revision cut-off, but modified after it is correctly reported as changed after revision clean-up """ # Need to add one non-event change that creates a revision after the last event change revisions in order # for the logic in this test to work correctly home = yield self.homeUnderTest(name="user01") yield home.createCalendarWithName("_ignore_me") yield self.commit() # get initial sync token calendar = yield self.calendarUnderTest(home="user01", name="calendar") initial_token = yield calendar.syncToken() yield self.commit() # Pause to give some space in the modified time time.sleep(1) modified = datetime.datetime.utcnow() time.sleep(1) # Patch the work item to use the modified cut-off we need def _dateCutoff(self): return modified self.patch(FindMinValidRevisionWork, "dateCutoff", _dateCutoff) # Make a change to get a pre-update token cal2Object = yield self.calendarObjectUnderTest(self.transactionUnderTest(), name="cal2.ics", calendar_name="calendar", home="user01") yield cal2Object.remove() yield self.commit() # get changed sync token calendar = yield self.calendarUnderTest(home="user01", name="calendar") pre_update_token = yield calendar.syncToken() yield self.commit() # make changes cal1Object = yield self.calendarObjectUnderTest(self.transactionUnderTest(), name="cal1.ics", calendar_name="calendar", home="user01") yield cal1Object.setComponent(Component.fromString(self.cal1_mod)) yield self.commit() # get changed sync token calendar = yield self.calendarUnderTest(home="user01", name="calendar") update_token = yield calendar.syncToken() yield self.commit() # do FindMinValidRevisionWork and RevisionCleanupWork yield FindMinValidRevisionWork.reschedule(self.transactionUnderTest(), 0) yield self.commit() yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60) # initial sync token fails calendar = yield self.calendarUnderTest(home="user01", name="calendar") yield self.failUnlessFailure(calendar.resourceNamesSinceToken(initial_token), SyncTokenValidException) yield self.commit() # Pre-update sync token returns one item calendar = yield self.calendarUnderTest(home="user01", name="calendar") names = yield calendar.resourceNamesSinceToken(pre_update_token) self.assertEqual(names, (['cal1.ics'], [], [])) yield self.commit() # Post-update sync token returns one item calendar = yield self.calendarUnderTest(home="user01", name="calendar") names = yield calendar.resourceNamesSinceToken(update_token) self.assertEqual(names, ([], [], [])) yield self.commit()
def test_calendarObjectRevisions(self): """ Verify that all extra calendar object revisions are deleted by FindMinValidRevisionWork and RevisionCleanupWork """ # get home sync token home = yield self.homeUnderTest(name="user01") hometoken = yield home.syncToken() # get sync token calendar = yield self.calendarUnderTest(home="user01", name="calendar") token = yield calendar.syncToken() # make changes cal1Object = yield self.calendarObjectUnderTest( self.transactionUnderTest(), name="cal1.ics", calendar_name="calendar", home="user01") yield cal1Object.remove() cal2Object = yield self.calendarObjectUnderTest( self.transactionUnderTest(), name="cal2.ics", calendar_name="calendar", home="user01") yield cal2Object.remove() # Get object revisions rev = schema.CALENDAR_OBJECT_REVISIONS revisionRows = yield Select( [rev.REVISION], From=rev, ).on(self.transactionUnderTest()) self.assertNotEqual(len(revisionRows), 0) # do FindMinValidRevisionWork yield FindMinValidRevisionWork.reschedule(self.transactionUnderTest(), 0) yield self.commit() yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60) # Get the minimum valid revision and check it minValidRevision = yield self.transactionUnderTest( ).calendarserverValue("MIN-VALID-REVISION") self.assertEqual(int(minValidRevision), max([row[0] for row in revisionRows]) + 1) # do RevisionCleanupWork yield self.transactionUnderTest().enqueue( RevisionCleanupWork, notBefore=datetime.datetime.utcnow()) yield self.commit() yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60) # Get group1 object revision rev = schema.CALENDAR_OBJECT_REVISIONS revisionRows = yield Select( [rev.REVISION], From=rev, ).on(self.transactionUnderTest()) self.assertEqual(len(revisionRows), 0) # old sync token fails calendar = yield self.calendarUnderTest(home="user01", name="calendar") yield self.failUnlessFailure(calendar.resourceNamesSinceToken(token), SyncTokenValidException) yield self.commit() # old sync token fails home = yield self.homeUnderTest(name="user01") yield self.failUnlessFailure( home.resourceNamesSinceToken(hometoken, 1), SyncTokenValidException) yield self.commit() # calendar sync token changed calendar = yield self.calendarUnderTest(home="user01", name="calendar") newtoken = yield calendar.syncToken() self.assertGreater(newtoken, token) yield self.commit() # home sync token changed home = yield self.homeUnderTest(name="user01") newhometoken = yield home.syncToken() self.assertGreater(newhometoken, hometoken) yield self.commit() # Depth:1 tokens match home = yield self.homeUnderTest(name="user01") yield home.loadChildren() calendar = yield self.calendarUnderTest(home="user01", name="calendar") newtoken1 = yield calendar.syncToken() self.assertEqual(newtoken1, newtoken) yield self.commit()
def test_calendarObjectRevisions(self): """ Verify that all extra calendar object revisions are deleted by FindMinValidRevisionWork and RevisionCleanupWork """ # get home sync token home = yield self.homeUnderTest(name="user01") hometoken = yield home.syncToken() # get sync token calendar = yield self.calendarUnderTest(home="user01", name="calendar") token = yield calendar.syncToken() # make changes cal1Object = yield self.calendarObjectUnderTest(self.transactionUnderTest(), name="cal1.ics", calendar_name="calendar", home="user01") yield cal1Object.remove() cal2Object = yield self.calendarObjectUnderTest(self.transactionUnderTest(), name="cal2.ics", calendar_name="calendar", home="user01") yield cal2Object.remove() # Get object revisions rev = schema.CALENDAR_OBJECT_REVISIONS revisionRows = yield Select( [rev.REVISION], From=rev, ).on(self.transactionUnderTest()) self.assertNotEqual(len(revisionRows), 0) # do FindMinValidRevisionWork yield FindMinValidRevisionWork.reschedule(self.transactionUnderTest(), 0) yield self.commit() yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60) # Get the minimum valid revision and check it minValidRevision = yield self.transactionUnderTest().calendarserverValue("MIN-VALID-REVISION") self.assertEqual(int(minValidRevision), max([row[0] for row in revisionRows]) + 1) # do RevisionCleanupWork yield self.transactionUnderTest().enqueue(RevisionCleanupWork, notBefore=datetime.datetime.utcnow()) yield self.commit() yield JobItem.waitEmpty(self.storeUnderTest().newTransaction, reactor, 60) # Get group1 object revision rev = schema.CALENDAR_OBJECT_REVISIONS revisionRows = yield Select( [rev.REVISION], From=rev, ).on(self.transactionUnderTest()) self.assertEqual(len(revisionRows), 0) # old sync token fails calendar = yield self.calendarUnderTest(home="user01", name="calendar") yield self.failUnlessFailure(calendar.resourceNamesSinceToken(token), SyncTokenValidException) yield self.commit() # old sync token fails home = yield self.homeUnderTest(name="user01") yield self.failUnlessFailure(home.resourceNamesSinceToken(hometoken, 1), SyncTokenValidException) yield self.commit() # calendar sync token changed calendar = yield self.calendarUnderTest(home="user01", name="calendar") newtoken = yield calendar.syncToken() self.assertGreater(newtoken, token) yield self.commit() # home sync token changed home = yield self.homeUnderTest(name="user01") newhometoken = yield home.syncToken() self.assertGreater(newhometoken, hometoken) yield self.commit() # Depth:1 tokens match home = yield self.homeUnderTest(name="user01") yield home.loadChildren() calendar = yield self.calendarUnderTest(home="user01", name="calendar") newtoken1 = yield calendar.syncToken() self.assertEqual(newtoken1, newtoken) yield self.commit()